
    HwgS                     R   d dl Z d dlZd dlZd dlZd dl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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 d dlm Z   G d d      Z! G d d      Z" G d d      Z#e G d de#e"             Z$ e%d      Z&e"jN                  e"jP                  e"jR                  e"jT                  e"jV                  e"jX                  fD  ci c]k  } | ejZ                  ejZ                  ejZ                  fej\                  ej\                  ej\                  fej^                  ej^                  ej^                  fgm c} e"jN                  e"jP                  e"jR                  e"jT                  e"jV                  fD  ci c]  } | ejZ                  ej^                  ej^                  fej^                  ejZ                  ej^                  fejZ                  ej\                  ej\                  fej\                  ejZ                  ej\                  fg c} e"j`                  e"jb                  e"jd                  e"jf                  e"jh                  fD  ci c]'  } | ejZ                  ejZ                  ejZ                  fg) c} e"jN                  e"jP                  e"jR                  e"jT                  e"jV                  e"jX                  fD  ci c]5  } ejZ                  ej^                  ej\                  fD ]  }| |e&|fe&||fg 7 c}} e"jN                  ejj                  ejl                  ejn                  fejn                  ejl                  ejn                  fejl                  ejj                  ejn                  fejl                  ejn                  ejn                  fejl                  ejl                  ejl                  fejp                  ejl                  ejp                  fejl                  ejp                  ejp                  fgie"jP                  ejj                  ejl                  ejn                  fejn                  ejl                  ejn                  fejj                  ejj                  ejl                  fejj                  ejn                  ejl                  fejn                  ejj                  ejl                  fejn                  ejn                  ejl                  fejl                  ejl                  ejl                  fejp                  ejl                  ejp                  fejp                  ejp                  ejl                  fg	igZ9 ee:      Z;d Z<e9D ]0  Z=e=j}                         D ]  \  Z?Z@e@D ]  \  ZAZBZC e<eAe?eBeC         2  ej                  d      d        ZE G d de!e$      ZF G d deF      ZG G d deF      ZH ed !       G d" d#e"             ZI G d$ d%eI      ZJ G d& d'eI      ZK ed(!       G d) d*e!e$             ZL ed+!       G d, d-e!e$             ZM G d. d/e$      ZN G d0 d1e$      ZO G d2 d3e$      ZP G d4 d5e$      ZQ G d6 d7eL      ZR G d8 d9eL      ZS ed:!       G d; d<e!e$             ZT G d= d>eT      ZU ed?!       G d@ dAe$             ZV edB!       G dC dDe!e$             ZW G dE dFe#e"      ZX G dG dHeX      ZY edI!       G dJ dKe$             ZZ G dL dMe!e$      Z[ G dN dOe$      Z\ G dP dQe\      Z] G dR dSe\      Z^yc c} w c c} w c c} w c c}} w )T    N)defaultdictDecimal)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)RemovedInDjango50Warning)cached_property)make_hashablec                       e Zd ZdZd Zy)SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                      | j                   ||fi |\  }}	 | j                  j                         dk(  rd|z  }||fS # t        $ r Y ||fS w xY w)NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparamss         S/var/www/horilla/myenv/lib/python3.12/site-packages/django/db/models/expressions.py	as_sqlitezSQLiteNumericMixin.as_sqlite   sm    !dkk(JH-HV	  224F+c1 F{  	F{	s   "? 	AAN)__name__
__module____qualname____doc__r!        r    r   r      s    
r'   r   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(y')(
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|z<<z>>#c                 h    t        |d      st        |      }|rt        |||       S t        | ||      S Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreverseds       r    _combinezCombinable._combine>   s7    u23%LE%eY==!$	599r'   c                 <    | j                  d| j                  d      S )NFr;   MULr   s    r    __neg__zCombinable.__neg__K   s    }}R511r'   c                 <    | j                  || j                  d      S NFr;   ADDr   r8   s     r    __add__zCombinable.__add__N       }}UDHHe44r'   c                 <    | j                  || j                  d      S rC   r;   SUBrF   s     r    __sub__zCombinable.__sub__Q   rH   r'   c                 <    | j                  || j                  d      S rC   r>   rF   s     r    __mul__zCombinable.__mul__T   rH   r'   c                 <    | j                  || j                  d      S rC   r;   DIVrF   s     r    __truediv__zCombinable.__truediv__W   rH   r'   c                 <    | j                  || j                  d      S rC   r;   MODrF   s     r    __mod__zCombinable.__mod__Z   rH   r'   c                 <    | j                  || j                  d      S rC   r;   POWrF   s     r    __pow__zCombinable.__pow__]   rH   r'   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      NconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorrF   s     r    __and__zCombinable.__and__`   =    4.75-QV3WT7QuX%%!T
 	
r'   c                 <    | j                  || j                  d      S rC   )r;   BITANDrF   s     r    bitandzCombinable.bitandg       }}UDKK77r'   c                 <    | j                  || j                  d      S rC   )r;   BITLEFTSHIFTrF   s     r    bitleftshiftzCombinable.bitleftshiftj   s    }}UD$5$5u==r'   c                 <    | j                  || j                  d      S rC   )r;   BITRIGHTSHIFTrF   s     r    bitrightshiftzCombinable.bitrightshiftm   s    }}UD$6$6>>r'   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      r\   r_   rF   s     r    __xor__zCombinable.__xor__p   rc   r'   c                 <    | j                  || j                  d      S rC   )r;   BITXORrF   s     r    bitxorzCombinable.bitxorw   rg   r'   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      r\   r_   rF   s     r    __or__zCombinable.__or__z   rc   r'   c                 <    | j                  || j                  d      S rC   )r;   BITORrF   s     r    bitorzCombinable.bitor   s    }}UDJJ66r'   c                 <    | j                  || j                  d      S NTrD   rF   s     r    __radd__zCombinable.__radd__       }}UDHHd33r'   c                 <    | j                  || j                  d      S ry   rJ   rF   s     r    __rsub__zCombinable.__rsub__   r{   r'   c                 <    | j                  || j                  d      S ry   r>   rF   s     r    __rmul__zCombinable.__rmul__   r{   r'   c                 <    | j                  || j                  d      S ry   rP   rF   s     r    __rtruediv__zCombinable.__rtruediv__   r{   r'   c                 <    | j                  || j                  d      S ry   rT   rF   s     r    __rmod__zCombinable.__rmod__   r{   r'   c                 <    | j                  || j                  d      S ry   rX   rF   s     r    __rpow__zCombinable.__rpow__   r{   r'   c                     t        d      Nr^   ra   rF   s     r    __rand__zCombinable.__rand__       !T
 	
r'   c                     t        d      r   r   rF   s     r    __ror__zCombinable.__ror__   r   r'   c                     t        d      r   r   rF   s     r    __rxor__zCombinable.__rxor__   r   r'   c                     t        |       S N)NegatedExpressionr@   s    r    
__invert__zCombinable.__invert__   s     &&r'   N))r"   r#   r$   r%   rE   rK   r?   rQ   rY   rU   re   rv   ri   rl   rq   r;   rA   rG   rL   rN   rR   rV   rZ   rb   rf   rj   rm   ro   rr   rt   rw   rz   r}   r   r   r   r   r   r   r   r   r&   r'   r    r)   r)   %   s     C
C
C
C
C C
 FELMF:2555555
8>?
8
7444444





'r'   r)   c                   T   e Zd ZdZeZdZdZdZdZ	d&dZ
d Zd Zd Zd	 Zd
 Zd Zed        Zed        Zed        Zed        Z	 d'dZed        Zed        Zed        Zed        Zd Zed        Zed        Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd  Z(d! Z)d" Z*d# Z+d$ Z,d% Z-y)(BaseExpressionz%Base class for all query expressions.FTNc                     ||| _         y y r   r   r   r   s     r    __init__zBaseExpression.__init__   s    # ,D $r'   c                 ^    | j                   j                         }|j                  dd        |S )Nconvert_value)__dict__copypop)r   states     r    __getstate__zBaseExpression.__getstate__   s'    ""$		/4(r'   c                     | j                   | j                  u rg n| j                   g| j                  j                  |      z   S r   )r   _convert_value_noopr   get_db_convertersr   r   s     r    r   z BaseExpression.get_db_converters   sG     !!T%=%== $$%//
;	< 	<r'   c                     g S r   r&   r@   s    r    get_source_expressionsz%BaseExpression.get_source_expressions       	r'   c                     |rJ y r   r&   r   exprss     r    set_source_expressionsz%BaseExpression.set_source_expressions   s    y5r'   c                     |D cg c]6  }t        |d      r|n%t        |t              rt        |      n
t	        |      8 c}S c c}w r3   )r5   
isinstancestrFr6   )r   expressionsargs      r    _parse_expressionsz!BaseExpression._parse_expressions   sO    
 #	
  s01 &sC0!C&eCjB
 	
 
s   ;Ac                     t        d      )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

        Different backends can provide their own implementation, by
        providing an `as_{vendor}` method and patching the Expression:

        ```
        def override_as_sql(self, compiler, connection):
            # custom logic
            return super().as_sql(compiler, connection)
        setattr(Expression, 'as_' + connection.vendor, override_as_sql)
        ```

        Arguments:
         * compiler: the query compiler responsible for generating the query.
           Must have a compile method, returning a (sql, [params]) tuple.
           Calling compiler(value) will return a quoted `value`.

         * connection: the database connection used for the current query.

        Return: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()r   r   r   r   s      r    r   zBaseExpression.as_sql   s    4 ""FGGr'   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_aggregate.0exprs     r    	<genexpr>z4BaseExpression.contains_aggregate.<locals>.<genexpr>   s#      
15D,T,,,
   anyr   r@   s    r    r   z!BaseExpression.contains_aggregate   s%     
9=9T9T9V
 
 	
r'   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_over_clauser   s     r    r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>   s#      
37D.T...
r   r   r@   s    r    r   z#BaseExpression.contains_over_clause   s%     
;?;V;V;X
 
 	
r'   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_column_referencesr   s     r    r   z<BaseExpression.contains_column_references.<locals>.<genexpr>   s&      
 4T444
r   r   r@   s    r    r   z)BaseExpression.contains_column_references   %     
335
 
 	
r'   c                 B    t        d | j                         D              S )Nc              3   Z   K   | ]#  }|xr t        |d d      xs |j                   % yw)subqueryFN)r`   contains_subqueryr   s     r    r   z3BaseExpression.contains_subquery.<locals>.<genexpr>  s4      
 QgdJ6P$:P:PQ
s   )+r   r@   s    r    r   z BaseExpression.contains_subquery  r   r'   c                     | j                         }||_        |j                  |j                         D cg c]  }|r|j	                  ||||      nd c}       |S c c}w )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

        Arguments:
         * query: the backend query implementation
         * allow_joins: boolean allowing or denying use of joins
           in this query
         * reuse: a set of reusable joins for multijoins
         * summarize: a terminal aggregate clause
         * for_save: whether this expression about to be used in a save or update

        Return: an Expression to be added to the query.
        N)r   
is_summaryr   r   r4   )r   queryallow_joinsreuse	summarizefor_savecr   s           r    r4   z!BaseExpression.resolve_expression	  sq    " IIK 	  
 446	   ''{E9M	
 s   Ac                 J    t        | j                  t        j                        S r   )r   r   r   BooleanFieldr@   s    r    r]   zBaseExpression.conditional&  s    $++V-@-@AAr'   c                     | j                   S r   r   r@   s    r    fieldzBaseExpression.field*  s       r'   c                 N    | j                         }|d| _        t        d      |S )z+Return the output type of this expressions.Tz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   r   s     r    r   zBaseExpression.output_field.  s2     11326D/STTr'   c                 T    	 | j                   S # t        $ r | j                  s Y yw xY w)z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r   r@   s    r    _output_field_or_nonez$BaseExpression._output_field_or_none7  s3    	$$$ 	66 7	s    ''c           	          d | j                         D        }|D ]\  }|D ]R  }t        ||j                        rt        d|j                  j                  d|j                  j                  d       |c S  y)a}  
        Attempt to infer the output type of the expression.

        As a guess, if the output fields of all source fields match then simply
        infer the same type here.

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c              3   &   K   | ]	  }||  y wr   r&   )r   sources     r    r   z7BaseExpression._resolve_output_field.<locals>.<genexpr>Q  s      
V=OF
s   z!Expression contains mixed types: , . You must set output_field.N)get_source_fieldsr   	__class__r   r"   )r   sources_iterr   r   s       r    r   z$BaseExpression._resolve_output_fieldC  s    
!%!7!7!9
 ) 	 L& 	!,0@0@A$ )22;;",,55	 	  	 r'   c                     | S r   r&   value
expressionr   s      r    r   z"BaseExpression._convert_value_noopa  s    r'   c                     | j                   }|j                         }|dk(  rd S |j                  d      rd S |dk(  rd S | j                  S )z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        
FloatFieldc                      | d S t        |       S r   )floatr   s      r    <lambda>z.BaseExpression.convert_value.<locals>.<lambda>p  s    = 7; 5\ r'   IntegerFieldc                      | d S t        |       S r   )intr   s      r    r   z.BaseExpression.convert_value.<locals>.<lambda>v  s    = 7; Z r'   r   c                      | d S t        |       S r   r   r   s      r    r   z.BaseExpression.convert_value.<locals>.<lambda>|  s    = 7; U^ r'   )r   r   endswithr   )r   r   internal_types      r    r   zBaseExpression.convert_valuee  sk     !!//1L("
 ##N3 
 n,$
 '''r'   c                 8    | j                   j                  |      S r   )r   
get_lookup)r   lookups     r    r   zBaseExpression.get_lookup  s      ++F33r'   c                 8    | j                   j                  |      S r   )r   get_transformr   names     r    r   zBaseExpression.get_transform  s      ..t44r'   c                     | j                         }|j                  | j                         D cg c]  }||j                  |      nd  c}       |S c c}w r   )r   r   r   relabeled_clone)r   
change_mapclonees       r    r   zBaseExpression.relabeled_clone  s\    		$$ 446 23!!*-DH	
 s   Ac                     |j                  |       x}r|S | j                         }|j                         }|j                  |D cg c]  }|r|j	                  |      nd  c}       |S c c}w r   )getr   r   r   replace_expressions)r   replacementsreplacementr   source_expressionsr   s         r    r   z"BaseExpression.replace_expressions  s|    &**400;0		"99;$$ / ;?((6DH	
 s   A*c                 j    t               }| j                         D ]  }||j                         z  } |S r   )setr   get_refs)r   refsr   s      r    r  zBaseExpression.get_refs  s6    u//1 	$DDMMO#D	$r'   c                 ,    t        j                   |       S r   r   r@   s    r    r   zBaseExpression.copy      yyr'   c           	          | j                         }|j                  | j                         D cg c]<  }t        |t              rt	        | |j
                         n|j                  |      > c}       |S c c}w r   )r   r   r   r   r   r   prefix_references)r   prefixr   r   s       r    r  z BaseExpression.prefix_references  s{    		$$
 !779	  dA& VHTYYK()++F34	
 s   AA8c                     | j                   s| gS g }| j                         D ]!  }|j                  |j                                # |S r   )r   r   extendget_group_by_colsr   colsr   s      r    r  z BaseExpression.get_group_by_cols  sI    &&6M113 	4FKK0023	4r'   c                 \    | j                         D cg c]  }|j                   c}S c c}w )z9Return the underlying field types used by this aggregate.)r   r   )r   r   s     r    r   z BaseExpression.get_source_fields  s%    151L1L1NOA''OOOs   )c                     t        | fi |S r   OrderByr   kwargss     r    asczBaseExpression.asc      t&v&&r'   c                     t        | fddi|S N
descendingTr  r  s     r    desczBaseExpression.desc      t7777r'   c                     | S r   r&   r@   s    r    reverse_orderingzBaseExpression.reverse_ordering      r'   c              #      K   |  | j                         D ].  }|st        |d      r|j                         E d{    +| 0 y7 w)zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r5   r#  )r   r   s     r    r#  zBaseExpression.flatten  sK     
 
//1 	D4+#||~--J	 .s   AAA	Ac                 p    t        | j                  d      r| j                  j                  |||      S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r5   r   r%  r   r   r   r   s       r    r%  zBaseExpression.select_format  s9    
 4$$o6$$228S&IIF{r'   r   NTNFF).r"   r#   r$   r%   NotImplementedempty_result_set_valuer   r   
filterablewindow_compatibler   r   r   r   r   r   r   r   r   r   r   r   r4   propertyr]   r   r   r   r   staticmethodr   r   r   r   r   r   r  r   r  r  r   r  r  r   r#  r%  r&   r'   r    r   r      sg   /+J%*"J-
<
H8 
 

 
 

 
 
 
 
 SX: B B ! !   	 	 <   ( (845
P'8r'   r   c                   ,    e Zd ZdZed        Zd Zd Zy)
Expressionz:An expression that can be combined with other expressions.c                 ,   t        j                  | j                        }| j                  \  }} |j                  |i |}|j                          |j                  j                         }| j                  g}|D ]  \  }}t        |t        j                        rQ|j                  r9|j                  r-|j                  j                  j                  |j                  f}nt!        |      }nt#        |      }|j%                  ||f        t'        |      S r   )inspect	signaturer   _constructor_argsbind_partialapply_defaults	argumentsitemsr   r   r   Fieldr   model_metalabeltyper   appendtuple)	r   constructor_signatureargsr  r2  r6  identityr   r   s	            r    rA  zExpression.identity  s     ' 1 1$-- @--f6)66GG	  "''--/	NN## 	*JC%.::%++"[[..44ejjAE KE%e,OOS%L)	* Xr'   c                 `    t        |t              st        S |j                  | j                  k(  S r   )r   r/  r(  rA  rF   s     r    __eq__zExpression.__eq__  s%    %,!!~~..r'   c                 ,    t        | j                        S r   )hashrA  r@   s    r    __hash__zExpression.__hash__  s    DMM""r'   N)r"   r#   r$   r%   r   rA  rC  rF  r&   r'   r    r/  r/    s!    D $/
#r'   r/  c                 :    t         |   j                  | ||f       y)z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr=  )lhsr9   rhsresults       r    register_combinable_fieldsrL  l  s     9%,,c3-?@r'      )maxsizec                     t         j                  | d      }|D ]#  \  }}}t        ||      st        ||      s!|c S  y )Nr&   )rH  r   
issubclass)r9   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_types          r    _resolve_combined_typerW  ~  sL    (,,Y;KCN !?0-h 34):
 ! 	!r'   c                   N     e Zd Zd	 fd	Zd Zd Zd Zd Zd Zd Z		 d
dZ
 xZS )r7   c                 P    t         |   |       || _        || _        || _        y Nr   )superr   r9   rI  rJ  )r   rI  r9   rJ  r   r   s        r    r   zCombinedExpression.__init__  s(    l3"r'   c                 N    dj                  | j                  j                  |       S )Nz<{}: {}>)formatr   r"   r@   s    r    __repr__zCombinedExpression.__repr__  s      !8!8$??r'   c                 d    dj                  | j                  | j                  | j                        S )Nz{} {} {})r]  rI  r9   rJ  r@   s    r    __str__zCombinedExpression.__str__  s#      4>>488DDr'   c                 2    | j                   | j                  gS r   rI  rJ  r@   s    r    r   z)CombinedExpression.get_source_expressions  s    $((##r'   c                 "    |\  | _         | _        y r   rb  r   s     r    r   z)CombinedExpression.set_source_expressions  s    "$(r'   c           	         t        | j                  t        | j                  j                        t        | j
                  j                              }|ot        d| j                  d| j                  j                  j                  j                   d| j
                  j                  j                  j                   d       |       S )NzCannot infer type of z# expression involving these types: r   r   )
rW  r9   r<  rI  r   rJ  r   r   r   r"   )r   rV  s     r    r   z(CombinedExpression._resolve_output_field  s     /NN//0//0

  ''9 :((//99BBC288((22;;< = !  r'   c                 h   g }g }|j                  | j                        \  }}|j                  |       |j                  |       |j                  | j                        \  }}|j                  |       |j                  |       d}|j
                  j                  | j                  |      }||z  |fS Nz(%s))compilerI  r=  r  rJ  opscombine_expressionr9   )r   r   r   r   expression_paramsr   r   expression_wrappers           r    r   zCombinedExpression.as_sql  s    &&txx0V3  (&&txx0V3  (#nn//L!C'):::r'   c                    | j                   j                  |||||      }| j                  j                  |||||      }t        | t        t
        f      s	 |j                  j                         }	 |j                  j                         }	d||	hv rC||	k7  r>t	        | j                   | j                  | j                        j                  |||||      S h d}
| j                  | j                  k(  r<||
v r8||	k(  r3t        | j                   | j                        j                  |||||      S | j                         }||_        ||_         ||_        |S # t        t        f$ r d }Y w xY w# t        t        f$ r d }	Y w xY w)NDurationField>   	DateField	TimeFieldDateTimeField)rI  r4   rJ  r   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r9   rK   r   r   )r   r   r   r   r   r   rI  rJ  rQ  rR  datetime_fieldsr   s               r    r4   z%CombinedExpression.resolve_expression  s    hh));y(
 hh));y(
 $!35H IJ ++==? ++==? 8X"668x;O)HHdnndhh$$ JO$((*/(*488TXX>QQ  IIK C #J/    #J/   s$   E 1E+ E('E(+E?>E?r   r'  )r"   r#   r$   r   r^  r`  r   r   r   r   r4   __classcell__r   s   @r    r7   r7     s4    @E$#"; SX-r'   r7   c                   *     e Zd Zd Z fdZd Z xZS )rq  c                     	 |j                   }|j                         dk(  r1|j                  |      \  }}|j                  j	                  |      |fS |j                  |      S # t
        $ r Y w xY w)Nrm  )r   r   rg  rh  format_for_duration_arithmeticr   )r   sider   r   outputr   r   s          r    rg  zDurationExpression.compile  sy    	R&&F '')_<&..t4V!~~DDSI6QQ%%  		s   A# #	A/.A/c                    |j                   j                  rt        |   ||      S |j                  j                  |        g }g }| j                  | j                  ||      \  }}|j                  |       |j                  |       | j                  | j                  ||      \  }}|j                  |       |j                  |       d}|j                  j                  | j                  |      }||z  |fS rf  )featureshas_native_duration_fieldr[  r   rh  check_expression_supportrg  rI  r=  r  rJ  combine_duration_expressionr9   )	r   r   r   r   rj  r   r   rk  r   s	           r    r   zDurationExpression.as_sql  s    887>(J77//5ll488XzBV3  (ll488XzBV3  (#nn88U!C'):::r'   c                     | j                   ||fi |\  }}| j                  t        j                  t        j                  hv rr	 | j
                  j                  j                         }| j                  j                  j                         }h d}||vs||vrt        d| j                   d      ||fS ||fS # t        t        f$ r Y ||fS w xY w)N>   r   r   r   rm  zInvalid arguments for operator .)r   r9   r)   r?   rQ   rI  r   r   rJ  r
   rs  r   )	r   r   r   r   r   r   rQ  rR  allowed_fieldss	            r    r!   zDurationExpression.as_sqlite  s    !dkk(JH-HV>>jnnjnn==8800BBD8800BBD" >1X^5S'9$..9IK  F{sF{ #J/  F{s   AB: :CC)r"   r#   r$   rg  r   r!   ru  rv  s   @r    rq  rq    s    	&;"r'   rq  c                   F     e Zd Z ej                         Z fdZd Z xZS )rr  c                 <    t         |   || j                  |       y r   )r[  r   rK   )r   rI  rJ  r   s      r    r   zTemporalSubtraction.__init__   s    dhh,r'   c                 "   |j                   j                  |        |j                  | j                        }|j                  | j                        }|j                   j                  | j                  j                  j                         ||      S r   )rh  r  rg  rI  rJ  subtract_temporalsr   r   )r   r   r   rI  rJ  s        r    r   zTemporalSubtraction.as_sql#  sm    //5txx(txx(~~00HH!!335sC
 	
r'   )	r"   r#   r$   r   rm  r   r   r   ru  rv  s   @r    rr  rr    s    '6'')L-
r'   rr  zdjango.db.models.F)pathc                   J    e Zd ZdZd Zd Z	 ddZd Zd Zd Z	d	 Z
d
 Zd Zy)r   zDAn object capable of resolving references to existing query objects.c                     || _         y)z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   s     r    r   z
F.__init__0  s    
 	r'   c                 b    dj                  | j                  j                  | j                        S N{}({}))r]  r   r"   r   r@   s    r    r^  z
F.__repr__7  s!    t~~66		BBr'   Nc                 >    |j                  | j                  |||      S r   )resolve_refr   r   r   r   r   r   r   s         r    r4   zF.resolve_expression:  s       K	JJr'   c                 &    |j                  | |       S r   )r   )r   r   s     r    r   zF.replace_expressions?  s    d++r'   c                     t        | fi |S r   r  r  s     r    r  zF.ascB  r  r'   c                     t        | fddi|S r  r  r  s     r    r  zF.descE  r  r'   c                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r   )r   r   rF   s     r    rC  zF.__eq__H  s'    ~~0LTYY%**5LLr'   c                 ,    t        | j                        S r   )rE  r   r@   s    r    rF  z
F.__hash__K  s    DIIr'   c                 ,    t        j                   |       S r   r  r@   s    r    r   zF.copyN  r	  r'   r'  )r"   r#   r$   r%   r   r^  r4   r   r  r  rC  rF  r   r&   r'   r    r   r   ,  s<    NC SXK
,'8Mr'   r   c                   <     e Zd ZdZdZdZd Z fdZd Zd Z	 xZ
S )ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                     t        d      )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)
ValueErrorr   r@  r  s      r    r   zResolvedOuterRef.as_sql]  s    *
 	
r'   c                     t        |   |i |}|j                  rt        d| j                   d      t
        | j                  v |_        |S )Nz<Referencing outer query window expression is not supported: r  )r[  r4   r   r   r   r   possibly_multivalued)r   r@  r  colr   s       r    r4   z#ResolvedOuterRef.resolve_expressionc  sX    g($9&9###N99+Q   $.#: 
r'   c                     | S r   r&   r   relabelss     r    r   z ResolvedOuterRef.relabeled_clonep  r!  r'   c                     g S r   r&   r@   s    r    r  z"ResolvedOuterRef.get_group_by_colss  r   r'   )r"   r#   r$   r%   r   r   r   r4   r   r  ru  rv  s   @r    r  r  R  s*      
r'   r  c                        e Zd ZdZdZd Zd Zy)OuterRefFc                     t        | j                  | j                        r| j                  S t        | j                        S r   )r   r   r   r  r  s      r    r4   zOuterRef.resolve_expression{  s-    dii099		**r'   c                     | S r   r&   r  s     r    r   zOuterRef.relabeled_clone  r!  r'   N)r"   r#   r$   r   r   r4   r   r&   r'   r    r  r  w  s     +
r'   r  zdjango.db.models.Funcc                   r     e Zd ZdZdZdZdZdZdd fd
Zd Z	d Z
d	 Zd
 Z	 ddZ	 	 	 ddZ fdZ xZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)r   r   c                D   | j                   ht        |      | j                   k7  rPt        d| j                  j                  d| j                   d| j                   dk(  rdnddt        |      d	      t
        |   |	        | j                  | | _        || _	        y )
N'z' takes exactly     argumentr6  z (z given)r   )
aritylen	TypeErrorr   r"   r[  r   r   r  extra)r   r   r   r  r   s       r    r   zFunc.__init__  s    ::!c+&6$**&D NN++JJ"&**/J{B$  	l3"9$"9"9;"G
r'   c                    | j                   j                  d | j                  D              }i | j                  | j	                         }|rVdj                  d t        |j                               D              }dj                  | j                  j                  ||      S dj                  | j                  j                  |      S )Nc              3   2   K   | ]  }t        |        y wr   r   r   r   s     r    r   z Func.__repr__.<locals>.<genexpr>       #PCH#P   r   c              3   V   K   | ]!  \  }}t        |      d z   t        |      z    # yw)=Nr  )r   keyvals      r    r   z Func.__repr__.<locals>.<genexpr>  s*      .6c3C3S)s   ')
{}({}, {})r  )

arg_joinerjoinr  r  _get_repr_optionssortedr7  r]  r   r"   )r   r@  r  s      r    r^  zFunc.__repr__  s    ###P8O8O#PP:4:::!7!7!9:II :@:O E  &&t~~'>'>eLLt~~66==r'   c                     i S )zAReturn a dict of extra __init__() options to include in the repr.r&   r@   s    r    r  zFunc._get_repr_options  s    	r'   c                     | j                   S r   r  r@   s    r    r   zFunc.get_source_expressions  s    &&&r'   c                     || _         y r   r  r   s     r    r   zFunc.set_source_expressions  s
    "'r'   c                     | j                         }||_        t        |j                        D ]'  \  }}|j	                  |||||      |j                  |<   ) |S r   )r   r   	enumerater  r4   )	r   r   r   r   r   r   r   posr   s	            r    r4   zFunc.resolve_expression  sa     IIK !!"6"67 	HC(+(>(>{E9h)A  %	 r'   c                    |j                   j                  |        g }g }| j                  D ]9  }		 |j                  |	      \  }
}|j                  |
       |j                  |       ; i | j                  |}|||d<   n|j                  d| j                         |xs |j                  d| j                        }|xs |j                  d| j                         }|j#                  |      x|d<   |d<   ||z  |fS # t        $ r: t        |	dt              }|t        u r |j                  t        |            \  }
}Y t        $ r! |j                  t        d            \  }
}Y "w xY w)Nr)  Tfunctiontemplater  r   r   )rh  r  r  rg  r   r`   r(  r6   r	   r=  r  r  
setdefaultr  r   r  r  r  )r   r   r   r  r  r  r   	sql_partsr   r   arg_sql
arg_paramsr)  datas                 r    r   zFunc.as_sql  sr    	//5	** 	&C
D&.&6&6s&;# W%MM*%	& /$**.. 'DOOJ6Btxx
DMMBJ488L$//#J
.8ooi.HH]d7m$&&- " V)01>*& *^;&.&6&6u=S7T&U#  D&.&6&6uT{&C#Ds   C<<A E'>%E'&E'c                     t         |          }| j                  d d  |_        | j                  j                         |_        |S r   )r[  r   r  r  )r   r   r   s     r    r   z	Func.copy  s8    w|~"&"9"9!"<ZZ__&
r'   r'  )NNN)r"   r#   r$   r%   r  r  r  r  r   r^  r  r   r   r4   r   r   ru  rv  s   @r    r  r    s]    H.HJE26 >'( SX	 %'N r'   r  zdjango.db.models.Valuec                   ^     e Zd ZdZdZd
 fd	Zd Zd Z	 d fd	Zd Z	d Z
ed	        Z xZS )r6   z9Represent a wrapped value as a node within an expression.Fc                 4    t         |   |       || _        y)a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        r   N)r[  r   r   )r   r   r   r   s      r    r   zValue.__init__  s     	l3
r'   c                 N    | j                   j                   d| j                  dS )N())r   r"   r   r@   s    r    r^  zValue.__repr__  s$    ..))*!DJJ>;;r'   c                 ,   |j                   j                  |        | j                  }| j                  }|U| j                  r|j                  ||      }n|j                  ||      }t        |d      r|j                  |||      |gfS |dg fS d|gfS )N)r   get_placeholderNULLz%s)	rh  r  r   r   r   get_db_prep_saveget_db_prep_valuer5   r  )r   r   r   r  r   s        r    r   zValue.as_sql   s    //5jj11#}}"33CJ3O"44SZ4P|%67#33C:NQTPUUU; 2:cU{r'   c                 <    t         |   |||||      }||_        |S r   )r[  r4   r   )r   r   r   r   r   r   r   r   s          r    r4   zValue.resolve_expression  s(     G&uk5)XV
r'   c                     g S r   r&   r@   s    r    r  zValue.get_group_by_cols  r   r'   c                 H   t        | j                  t              rt        j                         S t        | j                  t
              rt        j                         S t        | j                  t              rt        j                         S t        | j                  t              rt        j                         S t        | j                  t        j                        rt        j                         S t        | j                  t        j                        rt        j                         S t        | j                  t        j                        rt        j                          S t        | j                  t        j"                        rt        j$                         S t        | j                  t&              rt        j(                         S t        | j                  t*              rt        j,                         S t        | j                  t.              rt        j0                         S y r   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimerp  datern  timero  	timedeltarm  r   r   bytesBinaryFieldr   	UUIDFieldr@   s    r    r   zValue._resolve_output_field  sZ   djj#&##%%djj$'&&((djj#&&&((djj%($$&&djj("3"34''))djj(--0##%%djj(--0##%%djj("4"45''))djj'*&&((djj%(%%''djj$'##%% (r'   c                     | j                   S r   )r   r@   s    r    r)  zValue.empty_result_set_value4  s    zzr'   r   r'  )r"   r#   r$   r%   r   r   r^  r   r4   r  r   r,  r)  ru  rv  s   @r    r6   r6     sF    C H
<& SX&0  r'   r6   c                   @     e Zd Zd fd	Zd Zd Zd Z	 d fd	Z xZS )RawSQLc                 p    |t        j                         }||c| _        | _        t        |   |       y rZ  )r   r8  r   r   r[  r   )r   r   r   r   r   s       r    r   zRawSQL.__init__:  s4    !<<>L #V$+l3r'   c                 x    dj                  | j                  j                  | j                  | j                        S Nr  )r]  r   r"   r   r   r@   s    r    r^  zRawSQL.__repr__@  s)    ""4>>#:#:DHHdkkRRr'   c                 8    d| j                   z  | j                  fS rf  )r   r   r   s      r    r   zRawSQL.as_sqlC  s     $++--r'   c                     | gS r   r&   r@   s    r    r  zRawSQL.get_group_by_colsF  	    vr'   c                    |j                   r|j                   j                  j                         D ]z  }|j                  j                  D ]_  }|j	                         \  }}	|	j                         | j                  j                         v sA|j                  |j                  |||        z | t        
| )  |||||      S r   )r9  r:  get_parent_listlocal_fieldsget_attname_columnlowerr   r  r   r[  r4   )r   r   r   r   r   r   parentparent_field_column_namer   s             r    r4   zRawSQL.resolve_expressionI  s     ;;++++;;= $*LL$=$= L%1%D%D%FNA{"((*dhhnn.>>))(--{E9  w);y(
 	
r'   r   r'  )	r"   r#   r$   r   r^  r   r  r4   ru  rv  s   @r    r  r  9  s)    4S. SX
 
r'   r  c                       e Zd Zd Zd Zy)Starc                      y)Nz'*'r&   r@   s    r    r^  zStar.__repr__\  s    r'   c                 
    dg fS )Nr,   r&   r   s      r    r   zStar.as_sql_  s    Bwr'   N)r"   r#   r$   r^  r   r&   r'   r    r  r  [  s    r'   r  c                   F     e Zd ZdZdZd	 fd	Zd Zd Zd Zd Z	d Z
 xZS )
ColTFc                 L    ||}t         |   |       ||c| _        | _        y rZ  )r[  r   aliastarget)r   r   r  r   r   s       r    r   zCol.__init__g  s.    !Ll3"'
DKr'   c                     | j                   | j                  }}|r|t        |      fnt        |      f}dj                  | j                  j
                  dj                  |            S )Nr  r   )r   r  r   r]  r   r"   r  )r   r   r  identifierss       r    r^  zCol.__repr__m  sO    

DKKv.3uc&k*#f+t~~66		+8NOOr'   c                     | j                   | j                  j                  }}|r||fn|f}dj                  t	        |j
                  |            }|g fS )Nr  )r   r  columnr  mapquote_name_unless_alias)r   r   r   r   r  r  r   s          r    r   z
Col.as_sqlr  sL    

DKK$6$6v).ufoVIhhs8;;[IJBwr'   c                     | j                   | S | j                  |j                  | j                   | j                         | j                  | j                        S r   )r   r   r   r  r   r  s     r    r   zCol.relabeled_clonex  sF    ::K~~LLTZZ0$++t?P?P
 	
r'   c                     | gS r   r&   r@   s    r    r  zCol.get_group_by_cols  r  r'   c                     | j                   | j                  k(  r| j                  j                  |      S | j                  j                  |      | j                   j                  |      z   S r   )r  r   r   r   s     r    r   zCol.get_db_converters  s^    ;;$+++$$66zBB  22
KK))*56 	6r'   r   )r"   r#   r$   r   r  r   r^  r   r   r  r   ru  rv  s   @r    r  r  c  s.    !% 0P

6r'   r  c                   V     e Zd ZdZ fdZd Zd Zd Z	 ddZd Z	d Z
d	 Zd
 Z xZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                 @    t         |           ||c| _        | _        y r   )r[  r   r  r   )r   r  r   r   s      r    r   zRef.__init__  s    !%v	4;r'   c                 x    dj                  | j                  j                  | j                  | j                        S r  )r]  r   r"   r  r   r@   s    r    r^  zRef.__repr__  s)    ""4>>#:#:DIIt{{SSr'   c                     | j                   gS r   r   r@   s    r    r   zRef.get_source_expressions  s    }r'   c                     |\  | _         y r   r  r   s     r    r   zRef.set_source_expressions  s    r'   c                     | S r   r&   r  s         r    r4   zRef.resolve_expression  s	    
 r'   c                     | j                   hS r   )r  r@   s    r    r  zRef.get_refs  s    		{r'   c                 f    | j                         }| j                  j                  |      |_        |S r   )r   r   r   )r   r  r   s      r    r   zRef.relabeled_clone  s(    		{{228<r'   c                 P    |j                   j                  | j                        g fS r   )rh  
quote_namer  r   s      r    r   z
Ref.as_sql  s     ~~((3R77r'   c                     | gS r   r&   r@   s    r    r  zRef.get_group_by_cols  r  r'   r'  )r"   r#   r$   r%   r   r^  r   r   r4   r  r   r   r  ru  rv  s   @r    r  r    s=    
.T SX
8r'   r  c                   8     e Zd ZdZdZ fdZd Zd Zd Z xZ	S )ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                 l    |s"t        d| j                  j                  z        t        |   |i | y )Nz$%s requires at least one expression.)r  r   r"   r[  r   r   r   r  r   s      r    r   zExpressionList.__init__  s9    69P9PP  	+//r'   c                 Z    | j                   j                  d | j                  D              S )Nc              3   2   K   | ]  }t        |        y wr   r  r  s     r    r   z)ExpressionList.__str__.<locals>.<genexpr>  r  r  )r  r  r  r@   s    r    r`  zExpressionList.__str__  s#    ###P8O8O#PPPr'   c                 *     | j                   ||fi |S r   )r   )r   r   r   r   s       r    r!   zExpressionList.as_sqlite  s    t{{8ZA=AAr'   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   r  r  )r   group_by_cols	partitions      r    r  z ExpressionList.get_group_by_cols  s>    446 	@I  !<!<!>?	@r'   )
r"   r#   r$   r%   r  r   r`  r!   r  ru  rv  s   @r    r  r    s%     !H0QBr'   r  c                   2     e Zd ZdZ fdZ fdZd Z xZS )OrderByListzORDER BY %(expressions)sc                 6    d |D        }t        |   |i | y )Nc              3      K   | ]7  }t        |t              r!|d    dk(  rt        t        |dd       d      n| 9 yw)r   r+   r  NTr  )r   r   r  r   r   s     r    r   z'OrderByList.__init__.<locals>.<genexpr>  sI      
  dC(T!W^ $qr(5
s   =?)r[  r   r  s      r    r   zOrderByList.__init__  s(    
 $
 	+//r'   c                 <    | j                   syt        |   |i |S )N) r&   )r  r[  r   )r   r@  r  r   s      r    r   zOrderByList.as_sql  s#    &&w~t.v..r'   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   )r   r!  order_bys      r    r  zOrderByList.get_group_by_cols  s<    335 	?H  !;!;!=>	?r'   )r"   r#   r$   r  r   r   r  ru  rv  s   @r    r$  r$    s    )H	0/
r'   r$  z"django.db.models.ExpressionWrapperc                   D     e Zd ZdZ fdZd Zd Z fdZd Zd Z	 xZ
S )ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                 4    t         |   |       || _        y rZ  )r[  r   r   )r   r   r   r   s      r    r   zExpressionWrapper.__init__  s    l3$r'   c                     |d   | _         y Nr   r   r   s     r    r   z(ExpressionWrapper.set_source_expressions      (r'   c                     | j                   gS r   r1  r@   s    r    r   z(ExpressionWrapper.get_source_expressions        r'   c                     t        | j                  t              r;| j                  j                         }| j                  |_        |j                         S t        |          S r   )r   r   r/  r   r   r  r[  r   r   r   s     r    r  z#ExpressionWrapper.get_group_by_cols  sP    dooz2--/J&*&7&7J#//11 w(**r'   c                 8    |j                  | j                        S r   )rg  r   r   s      r    r   zExpressionWrapper.as_sql  s    00r'   c                 b    dj                  | j                  j                  | j                        S r  )r]  r   r"   r   r@   s    r    r^  zExpressionWrapper.__repr__  s!    t~~66HHr'   )r"   r#   r$   r%   r   r   r   r  r   r^  ru  rv  s   @r    r-  r-    s'    
%#!+1Ir'   r-  c                   F     e Zd ZdZ fdZd Z fdZ	 d fd	Zd Z xZ	S )r   z1The logical negation of a conditional expression.c                 L    t         |   |t        j                                y rZ  )r[  r   r   r   r6  s     r    r   zNegatedExpression.__init__  s    &2E2E2GHr'   c                 6    | j                   j                         S r   )r   r   r@   s    r    r   zNegatedExpression.__invert__  s    ##%%r'   c                 F   	 t         |   ||      \  }}|j                  j                  }|j                  | j                        sd| d|fS d| |fS # t        $ rA |j                  j                  }|j
                  sY y|j                  t        d            cY S w xY w)N)z1=1r&   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )r[  r   r   r   r}  &supports_boolean_expr_in_select_clauserg  r6   rh  0conditional_expression_supported_in_where_clauser   )r   r   r   r   r   r}  rh  r   s          r    r   zNegatedExpression.as_sql  s    	1'.:>KC !!%% CCDOOTu$:;VCCcU|V##  	1**33HBB ##E$K00		1s   A +B B B c                 r    t         |   |||||      }t        |j                  dd      st	        d      |S )Nr]   Fz*Cannot negate non-conditional expressions.)r[  r4   r`   r   r  )r   r   r   r   r   r   resolvedr   s          r    r4   z$NegatedExpression.resolve_expression%  sD     7-;y(
 x**M5AHIIr'   c                     |j                   j                  j                  }|j                   j                  j                  s# || j
                        rdj                  |      }||fS NzCASE WHEN {} THEN 1 ELSE 0 END)r   rh  r>  r}  r=  r   r]  )r   r   r   r   $expression_supported_in_where_clauses        r    r%  zNegatedExpression.select_format/  s[    
 ##TT 	- ##,,SS4T__E299#>CF{r'   r'  )
r"   r#   r$   r%   r   r   r   r4   r%  ru  rv  s   @r    r   r     s'    ;I&$" SXr'   r   zdjango.db.models.Whenc                   ^     e Zd ZdZdZd fd	Zd Zd Zd Zd Z	d Z
	 dd	Zdd
Zd Z xZS )Whenz"WHEN %(condition)s THEN %(result)sFc                 2   |r+|t        di |d }}nt        |dd      rt        |fi |d }}|t        |dd      r|rt        d      t        |t               r|st	        d      t
        |   d        || _        | j                  |      d   | _	        y )Nr]   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.r   r   r&   )
r   r`   r  r   r  r[  r   	conditionr   rK  )r   rG  thenlookupsr   s       r    r   zWhen.__init__E  s     %&\\47	M59%&y%<G%<d7	GI}e$LPW"  i#IPQQd+"--d3A6r'   c                 :    d| j                   d| j                  S )NzWHEN z THEN rG  rK  r@   s    r    r`  zWhen.__str__V  s    $(NNDKK@@r'   c                 <    d| j                   j                  d| dS N<z: >r   r"   r@   s    r    r^  zWhen.__repr__Y      !^^44d;;r'   c                 2    | j                   | j                  gS r   rK  r@   s    r    r   zWhen.get_source_expressions\  s    ,,r'   c                 "    |\  | _         | _        y r   rK  r   s     r    r   zWhen.set_source_expressions_  s    &+#r'   c                 0    | j                   j                  gS r   )rK  r   r@   s    r    r   zWhen.get_source_fieldsb  s    1122r'   c                     | j                         }||_        t        |j                  d      r$|j                  j	                  ||||d      |_        |j
                  j	                  |||||      |_        |S )Nr4   F)r   r   r5   rG  r4   rK  )r   r   r   r   r   r   r   s          r    r4   zWhen.resolve_expressionf  sp     IIK 1;; 45++88{E9eAK 88..;y(
 r'   c                    |j                   j                  |        |}g }|j                  | j                        \  }}||d<   |j                  | j                        \  }	}
|	|d<   |xs | j
                  }||z  g |||
fS )NrG  rK  )rh  r  rg  rG  rK  r  )r   r   r   r  r   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramss              r    r   zWhen.as_sqlt  s    //5'
*2*:*:4>>*J'''4$$,$4$4T[[$A!
M$.!,t}}/) ,
,
,
 ,
 
 	
r'   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   r  s      r    r  zWhen.get_group_by_cols  s9    113 	4FKK0023	4r'   NNr'  r   )r"   r#   r$   r  r]   r   r`  r^  r   r   r   r4   r   r  ru  rv  s   @r    rE  rE  ?  sB    3HK7"A<-,3
 SX
r'   rE  zdjango.db.models.Casec                   r     e Zd ZdZdZdZddd fd
Zd Zd Zd	 Z	d
 Z
	 ddZ fdZ	 ddZ fdZ xZS )Casez
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s ENDr  N)defaultr   c                    t        d |D              st        d      t        |   |       t	        |      | _        | j                  |      d   | _        || _        y )Nc              3   <   K   | ]  }t        |t                y wr   )r   rE  )r   cases     r    r   z Case.__init__.<locals>.<genexpr>  s     <d:dD)<r   z.Positional arguments must all be When objects.r   )	allr  r[  r   listcasesr   ra  r  )r   ra  r   rg  r  r   s        r    r   zCase.__init__  sS    <e<<LMM&%[
..w7:
r'   c                 f    ddj                  d | j                  D              d| j                  S )NzCASE r   c              3   2   K   | ]  }t        |        y wr   r  )r   r   s     r    r   zCase.__str__.<locals>.<genexpr>  s     1c!f1r  z, ELSE )r  rg  ra  r@   s    r    r`  zCase.__str__  s)    II1djj11LL
 	
r'   c                 <    d| j                   j                  d| dS rM  rP  r@   s    r    r^  zCase.__repr__  rQ  r'   c                 6    | j                   | j                  gz   S r   rg  ra  r@   s    r    r   zCase.get_source_expressions  s    zzT\\N**r'   c                 "    |^ | _         | _        y r   rl  r   s     r    r   zCase.set_source_expressions  s    $)!T\r'   c                     | j                         }||_        t        |j                        D ]'  \  }}|j	                  |||||      |j                  |<   ) |j
                  j	                  |||||      |_        |S r   )r   r   r  rg  r4   ra  )	r   r   r   r   r   r   r   r  rd  s	            r    r4   zCase.resolve_expression  s     IIK "177+ 	IC22{E9hAGGCL	 II00;y(
	 r'   c                 L    t         |          }|j                  d d  |_        |S r   )r[  r   rg  )r   r   r   s     r    r   z	Case.copy  s"    GLN''!*r'   c                 $   |j                   j                  |        | j                  s|j                  | j                        S i | j
                  |}g }g }|j                  | j                        \  }	}
| j                  D ]9  }	 |j                  |      \  }}|j                  |       |j                  |       ; |s|	|
fS |xs | j                  }|j                  |      |d<   |	|d<   |j                  |
       |xs |j                  d| j                        }||z  }| j                  (|j                   j!                  | j"                        |z  }||fS # t        $ r Y t        $ r" |j                  |j                        \  }	}
Y  w xY w)Nrg  ra  r  )rh  r  rg  rg  ra  r  r   r	   rK  r=  r  case_joinerr  r   r  r   unification_cast_sqlr   )r   r   r   r  rq  r   rW  
case_partsrX  default_sqldefault_paramsrd  case_sqlcase_paramsr   s                  r    r   zCase.as_sql  s    	//5zz##DLL119TZZ9=9

&.&6&6t||&D#^JJ 		+D(0(8(8(>%+ h'k*		+ ..!5T%5%5#.#3#3J#? %0	".)M22:t}}M(%%1..55d6G6GH3NCJ# "   .6.>.>t{{.K+^s   E	F%&FFc                 l    | j                   s| j                  j                         S t        | 	         S r   )rg  ra  r  r[  )r   r   s    r    r  zCase.get_group_by_cols  s+    zz<<1133w(**r'   r'  r^  )r"   r#   r$   r%   r  rq  r   r`  r^  r   r   r4   r   r   r  ru  rv  s   @r    r`  r`    sZ    
 5HK'+$ 
<+* SX @D@+ +r'   r`  c                   t     e Zd ZdZdZdZdZdZd fd	Zd Z	d Z
d	 Z fd
Zed        Zd ZddZd Z xZS )Subqueryz
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNTc                     t        |d|      j                         | _        d| j                  _        || _        t
        |   |       y )Nr   T)r`   r   r   r   r  r[  r   )r   querysetr   r  r   s       r    r   zSubquery.__init__  s<    Xw9??A
"


&r'   c                     | j                   gS r   r   r@   s    r    r   zSubquery.get_source_expressions  s    

|r'   c                     |d   | _         y r0  r~  r   s     r    r   zSubquery.set_source_expressions  s    1X
r'   c                 .    | j                   j                  S r   )r   r   r@   s    r    r   zSubquery._resolve_output_field  s    zz&&&r'   c                 b    t         |          }|j                  j                         |_        |S r   )r[  r   r   r   )r   r   r   s     r    r   zSubquery.copy  s'    kk'')r'   c                 .    | j                   j                  S r   )r   external_aliasesr@   s    r    r  zSubquery.external_aliases  s    zz***r'   c                 6    | j                   j                         S r   )r   get_external_colsr@   s    r    r  zSubquery.get_external_cols  s    zz++--r'   c                     |j                   j                  |        i | j                  |}| j                  j	                  ||      \  }}|dd |d<   |xs |j                  d| j                        }||z  }||fS )Nr  r=   r   r  )rh  r  r  r   r   r   r  )	r   r   r   r  r   rW  subquery_sqlrX  r   s	            r    r   zSubquery.as_sql  s    //59TZZ9=9#'::#4#4Xz#J j&21R&8
#M22:t}}M(Jr'   c                 :    | j                   j                  |       S )N)wrapper)r   r  r@   s    r    r  zSubquery.get_group_by_cols  s    zz++D+99r'   r   )r"   r#   r$   r%   r  r   r)  r   r   r   r   r   r   r,  r  r  r   r  ru  rv  s   @r    rz  rz    s\    
  H!H''
 + +.:r'   rz  c                   N     e Zd ZdZ ej
                         ZdZ fdZd Z	 xZ
S )ExistszEXISTS(%(subquery)s)Fc                 d    t        |   |fi | | j                  j                         | _        y r   )r[  r   r   exists)r   r|  r  r   s      r    r   zExists.__init__&  s)    ,V,ZZ&&(
r'   c                 l    |j                   j                  j                  sdj                  |      }||fS rB  )r   r}  r=  r]  r&  s       r    r%  zExists.select_format*  s3     ""++RR299#>CF{r'   )r"   r#   r$   r  r   r   r   r)  r   r%  ru  rv  s   @r    r  r  !  s(    %H&6&&(L")r'   r  zdjango.db.models.OrderByc                   T    e Zd ZdZdZddZd Zd Zd ZddZ	d	 Z
d
 Zd Zd Zd Zy)r  z%(expression)s %(ordering)sFNc                     |r|rt        d      |du s|du rt        j                  dt        d       || _        || _        || _        t        |d      st        d      || _        y )Nz1nulls_first and nulls_last are mutually exclusiveFzNPassing nulls_first=False or nulls_last=False is deprecated, use None instead.   )
stacklevelr4   z%expression must be an expression type)	r  warningswarnr   nulls_first
nulls_lastr  r5   r   )r   r   r  r  r  s        r    r   zOrderBy.__init__8  sq    :PQQ%:#6
 MM(	 '$$z#78DEE$r'   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz{}({}, descending={}))r]  r   r"   r   r  r@   s    r    r^  zOrderBy.__repr__M  s.    &--NN##T__doo
 	
r'   c                     |d   | _         y r0  r1  r   s     r    r   zOrderBy.set_source_expressionsR  r2  r'   c                     | j                   gS r   r1  r@   s    r    r   zOrderBy.get_source_expressionsU  r4  r'   c                 R   |xs | j                   }|j                  j                  r$| j                  rd|z  }ny| j                  rmd|z  }ng| j                  r(| j
                  r|j                  j                  sd|z  }n3| j                  r'| j
                  s|j                  j                  sd|z  }|j                  j                  |        |j                  | j                        \  }}|| j
                  rdndd|}||j                  d      z  }||z  j                         |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)r   orderingz%(expression)s)r  r}   supports_order_by_nulls_modifierr  r  r  order_by_nulls_firstrh  r  rg  r   countrstrip)r   r   r   r  r   expression_sqlr   placeholderss           r    r   zOrderBy.as_sqlX  s
   ,t}}??*X5!!+h6J$7$7$L$L88C!!OO
(;(;(P(P<xG//5!)!1!1$//!B("&//u
 

 	(..!122<'//1699r'   c                    |j                   j                  | j                        rJ| j                         }t	        t        | j                  d      d      |_         |j                  ||      S | j                  ||      S )NT)rH  F)ra  )rh  r>  r   r   r`  rE  r   )r   r   r   r   s       r    	as_oraclezOrderBy.as_oracler  sm     >>JJOO
 99;D"T__40DO 4;;x44{{8Z00r'   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   r  s      r    r  zOrderBy.get_group_by_cols  s9    113 	4FKK0023	4r'   c                     | j                    | _         | j                  rd| _        d | _        | S | j                  rd| _        d | _        | S ry   )r  r  r  r@   s    r    r   zOrderBy.reverse_ordering  sL    "oo-"DO#D  __#D"DOr'   c                     d| _         y rC   r'  r@   s    r    r  zOrderBy.asc  s	    r'   c                     d| _         y ry   r'  r@   s    r    r  zOrderBy.desc  s	    r'   )FNNr   )r"   r#   r$   r  r]   r   r^  r   r   r   r  r  r   r  r  r&   r'   r    r  r  3  s>    ,HK%*

#!:41 r'   r  c                   j     e Zd ZdZdZdZ	 	 	 	 d fd	Zd Zd Zd Z	ddZ
 fd	Zd
 Zd Zd Z xZS )Windowz %(expression)s OVER (%(window)s)FTc                    || _         || _        || _        t        |dd      s"t	        d|j
                  j                  z        | j                   It        | j                   t        t        f      s| j                   f| _         t        | j                    | _         | j                  ~t        | j                  t        t        f      rt        | j                   | _        nFt        | j                  t        t        f      rt        | j                        | _        nt	        d      t        | =  |       | j!                  |      d   | _        y )Nr+  Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.r   r   )partition_byr+  framer`   r  r   r"   r   r>  rf  r  r$  r   r   r[  r   r   source_expression)r   r   r  r+  r  r   r   s         r    r   zWindow.__init__  s    ) 
z#6>E&&//0 
 (d//%?%)%6%6$8! .0A0A BD==$$--$7 +T]] ;DMMNC+@A +DMM : H  	l3!%!8!8!DQ!Gr'   c                 .    | j                   j                  S r   )r  r   r@   s    r    r   zWindow._resolve_output_field  s    %%222r'   c                 ^    | j                   | j                  | j                  | j                  gS r   r  r  r+  r  r@   s    r    r   zWindow.get_source_expressions  s%    &&(9(94==$**UUr'   c                 :    |\  | _         | _        | _        | _        y r   r  r   s     r    r   zWindow.set_source_expressions  s    OTL 14=$*r'   c                    |j                   j                  |        |j                  j                  st	        d      |j                  | j                        \  }}g d}}| j                  @| j                  j                  ||d      \  }}	|j                  |       |t        |	      z  }| j                  =|j                  | j                        \  }
}|j                  |
       |t        |      z  }| j                  r=|j                  | j                        \  }}|j                  |       |t        |      z  }|xs | j                  }||dj                  |      j                         dz  g ||fS )Nz1This backend does not support window expressions.r&   zPARTITION BY %(expressions)s)r   r   r  r  )r   window)rh  r  r}  supports_over_clauser   rg  r  r  r   r=  r>  r+  r  r  r  strip)r   r   r   r  expr_sqlr   
window_sqlwindow_paramssql_exprrX  	order_sqlorder_params	frame_sqlframe_paramss                 r    r   zWindow.as_sql  sj   //5""77#$WXX#++D,B,BC&$&M
(#'#4#4#;#;!%7 $< $ Hj
 h'U:..M==$&.&6&6t}}&E#I|i(U<00M::&.&6&6tzz&B#I|i(U<00M,t}} h#((::N:T:T:VWW%f%}%
 	
r'   c                 6   t        | j                  t        j                        rc| j	                         } |j
                         }t        j                         |d   _         |j                  |       t        t        |+  ||      S | j                  ||      S r0  )r   r   r   r   r   r   r   r   r[  r  r!   r   )r   r   r   r   r  r   s        r    r!   zWindow.as_sqlite  s    d'')<)<=99;D!<!<!<!>171B1B1Dq!.'D''(:;0:FF{{8Z00r'   c           	          dj                  t        | j                        | j                  rdt        | j                        z   ndt        | j                  xs d      t        | j
                  xs d            S )Nz{} OVER ({}{}{})zPARTITION BY r)  )r]  r   r  r  r+  r  r@   s    r    r`  zWindow.__str__  sb    !((&&'8<8I8IOc$"3"344r#$

 b!	
 	
r'   c                 <    d| j                   j                  d| dS rM  rP  r@   s    r    r^  zWindow.__repr__  rQ  r'   c                     g }| j                   r)|j                  | j                   j                                | j                  )|j                  | j                  j                                |S r   )r  r  r  r+  )r   r!  s     r    r  zWindow.get_group_by_cols  sX      !2!2!D!D!FG==$  !@!@!BCr'   )NNNNr   )r"   r#   r$   r  r   r   r   r   r   r   r   r!   r`  r^  r  ru  rv  s   @r    r  r    sV    1H 
 "HH3VU
B1
<r'   r  c                   F    e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zy)WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z,%(frame_type)s BETWEEN %(start)s AND %(end)sNc                 D    t        |      | _        t        |      | _        y r   )r6   startendr   r  r  s      r    r   zWindowFrame.__init__  s    5\
:r'   c                 "    |\  | _         | _        y r   r  r  r   s     r    r   z"WindowFrame.set_source_expressions  s    $
DHr'   c                 2    | j                   | j                  gS r   r  r@   s    r    r   z"WindowFrame.get_source_expressions  s    

DHH%%r'   c                     |j                   j                  |        | j                  || j                  j                  | j
                  j                        \  }}| j                  | j                  ||dz  g fS )N
frame_typer  r  )rh  r  window_frame_start_endr  r   r  r  r  )r   r   r   r  r  s        r    r   zWindowFrame.as_sql   sp    //500

(($((..

s MM"oo 
 	
r'   c                 <    d| j                   j                  d| dS rM  rP  r@   s    r    r^  zWindowFrame.__repr__/  rQ  r'   c                     g S r   r&   r@   s    r    r  zWindowFrame.get_group_by_cols2  r   r'   c                 j   | j                   j                  V| j                   j                  dk  r=dt        | j                   j                        t        j                  j
                  fz  }nd| j                   j                  4| j                   j                  dk(  rt        j                  j                  }nt        j                  j                  }| j                  j                  M| j                  j                  dkD  r4d| j                  j                  t        j                  j                  fz  }nd| j                  j                  4| j                  j                  dk(  rt        j                  j                  }nt        j                  j                  }| j                  | j                  ||dz  S )Nr   z%d %sr  )r  r   absr   rh  	PRECEDINGCURRENT_ROWUNBOUNDED_PRECEDINGr  	FOLLOWINGUNBOUNDED_FOLLOWINGr  r  r  s      r    r`  zWindowFrame.__str__5  s&   ::'DJJ,<,<q,@s4::#3#34jnn6N6NOOEZZ)djj.>.>!.CNN..ENN66E88>>%$((..1*<TXX^^Z^^-E-EFFCXX^^'DHHNNa,?..,,C..44C}}// 
 
 	
r'   c                     t        d      )Nz3Subclasses must implement window_frame_start_end().r   r   r   r  r  s       r    r  z"WindowFrame.window_frame_start_endI  s    !"WXXr'   r^  )r"   r#   r$   r%   r  r   r   r   r   r^  r  r`  r  r&   r'   r    r  r    s7     >H%&
<
(Yr'   r  c                       e Zd ZdZd Zy)RowRangeROWSc                 :    |j                   j                  ||      S r   )rh  window_frame_rows_start_endr  s       r    r  zRowRange.window_frame_start_endP  s    ~~99%EEr'   Nr"   r#   r$   r  r  r&   r'   r    r  r  M  s    JFr'   r  c                       e Zd ZdZd Zy)
ValueRangeRANGEc                 :    |j                   j                  ||      S r   )rh  window_frame_range_start_endr  s       r    r  z!ValueRange.window_frame_start_endW  s    ~~::5#FFr'   Nr  r&   r'   r    r  r  T  s    JGr'   r  )_r   r  	functoolsr1  r  collectionsr   decimalr   uuidr   django.core.exceptionsr   r   r	   	django.dbr
   r   r   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.deprecationr   django.utils.functionalr   django.utils.hashabler   r   r)   r   r/  r<  NoneTyperE   rK   r?   rQ   rU   rY   r   r   r   re   rv   ri   rl   rq   rn  rm  rp  ro  _connector_combinationsrf  rH  rL  dr7  r9   field_typesrI  rJ  rK  	lru_cacherW  r7   rq  rr  r   r  r  r  r6   r  r  r  r  r  r$  r-  r   rE  r`  rz  r  r  r  r  r  r  )r9   
field_types   00r    <module>r     s        #   L L B B # 1 * 4 = 3 /  A' A'Ht tn	 # # #J : NNNNNN NNNNNN	
  	  &"5"5v7J7JK 1 163D3DE  &"5"5v7J7JK
 	
4 NNNNNNNNNN
  	  &"5"5v7J7JK  &"5"5v7J7JK  &"3"3V5F5FG 3 3V5F5FG	
 	
* ##$$
	  	  &"5"5v7J7JK
 	
& NNNNNNNNNNNN

  "..0C0CVEVEVW  	:.z:.
 	
" 	v33V5I5IJ!!6#7#79M9MN!!6#3#3V5I5IJ!!6#7#79M9MN!!6#7#79M9MNv33V5E5EF!!6#3#3V5E5EF
 	v33V5I5IJ!!6#7#79M9MNv//1E1EFv33V5I5IJ!!6#3#3V5I5IJ!!6#7#79M9MN!!6#7#79M9MNv33V5E5EFv//1E1EF
__ B %T* 	A 
! DA"#'') D	; + 	DCf&sIsFC	DDD S!! "!_+Z _D0+ 0f
, 
 *+"
 " ,"J"q "J
q 
 -.az a /aH ./L
 L 0L^
Z 
D: $6* $6N&* &RT <$ 4 :;I*J I <I@0) 0f -.H: H /HV -.]+z ]+ /]+@2:~z 2:jX $ 01`j ` 2`Fq qh?Y* ?YDF{ FG GU*$ s   "A0\B\,\:\#