
v^*                 @   s  d  d l  m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d l	 m
 Z
 Gd d   d  Z Gd d	   d	  Z Gd
 d   d  Z Gd d   d  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e e  Z Gd d   d e  Z Gd d   d e e  Z Gd  d!   d! e  Z Gd" d#   d# e e  Z Gd$ d%   d% e  Z Gd& d'   d' e  Z Gd( d)   d) e  Z Gd* d+   d+ e  Z Gd, d-   d- e  Z Gd. d/   d/ e e e  Z Gd0 d1   d1 e e e  Z  Gd2 d3   d3 e e e e  Z! Gd4 d5   d5 e e e e  Z" Gd6 d7   d7 e e e e  Z# Gd8 d9   d9 e  Z$ Gd: d;   d; e  Z% Gd< d=   d= e  Z& Gd> d?   d? e  Z' d@ S)A    )FuncValue)IntegerField)Coalesce)	Transform)NotSupportedErrorc                   s(   e  Z d  Z d Z   f d d   Z   S)BytesToCharFieldConversionMixina"  
    Convert CharField results from bytes to str.

    MySQL returns long data types (bytes) instead of chars when it can't
    determine the length of the result string. For example:
        LPAD(column1, CHAR_LENGTH(column2), ' ')
    returns the LONGTEXT (bytes) instead of VARCHAR.
    c                sP   | j  j r: |  j j   d k r: t | t  r: | j   St   j | | |  S)NZ	CharField)	featuresZ!db_functions_convert_bytes_to_stroutput_fieldZget_internal_type
isinstancebytesdecodesuperconvert_value)selfvalue
expression
connection)	__class__ A/tmp/pip-build-8lau8j11/django/django/db/models/functions/text.pyr      s    $
z-BytesToCharFieldConversionMixin.convert_value)__name__
__module____qualname____doc__r   r   r   )r   r   r      s   r   c                   s"   e  Z d  Z   f d d   Z   S)MySQLSHA2Mixinc                s-   t    j | | d d |  j d d   | S)NtemplatezSHA2(%%(expressions)s, %s)   )r   as_sqlfunction)r   compilerr   extra_content)r   r   r   as_mysql   s
    	zMySQLSHA2Mixin.as_mysql)r   r   r   r"   r   r   )r   r   r      s   r   c                   s"   e  Z d  Z   f d d   Z   S)OracleHashMixinc                s   t    j | | d d | S)Nr   zcLOWER(RAWTOHEX(STANDARD_HASH(UTL_I18N.STRING_TO_RAW(%(expressions)s, 'AL32UTF8'), '%(function)s'))))r   r   )r   r    r   extra_context)r   r   r   	as_oracle#   s
    	zOracleHashMixin.as_oracle)r   r   r   r%   r   r   )r   r   r#   "   s   r#   c                   s"   e  Z d  Z   f d d   Z   S)PostgreSQLSHAMixinc                s+   t    j | | d d d |  j j   | S)Nr   z6ENCODE(DIGEST(%(expressions)s, '%(function)s'), 'hex')r   )r   r   r   lower)r   r    r   r!   )r   r   r   as_postgresql0   s    	z PostgreSQLSHAMixin.as_postgresql)r   r   r   r(   r   r   )r   r   r&   /   s   r&   c                   sR   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   f d d   Z   S)	ChrZCHRchrc                s"   t    j | | d d d d | S)Nr   CHARr   z)%(function)s(%(expressions)s USING utf16))r   r   )r   r    r   r$   )r   r   r   r"   >   s    	zChr.as_mysqlc                s   t    j | | d d | S)Nr   z,%(function)s(%(expressions)s USING NCHAR_CS))r   r   )r   r    r   r$   )r   r   r   r%   E   s    		zChr.as_oraclec                s   t    j | | d d | S)Nr   r+   )r   r   )r   r    r   r$   )r   r   r   	as_sqliteL   s    zChr.as_sqlite)r   r   r   r   lookup_namer"   r%   r,   r   r   )r   r   r)   :   s
   r)   c                   sL   e  Z d  Z d Z d Z   f d d   Z   f d d   Z d d   Z   S)	
ConcatPairz
    Concatenate two arguments together. This is used by `Concat` because not
    all backend databases support more than two arguments.
    ZCONCATc                s4   |  j    } t t |  j | | d d d d | S)Nr   z%(expressions)sZ
arg_joinerz || )coalescer   r.   r   )r   r    r   r$   Z	coalesced)r   r   r   r,   W   s    zConcatPair.as_sqlitec                s"   t    j | | d d d d | S)Nr   Z	CONCAT_WSr   z!%(function)s('', %(expressions)s))r   r   )r   r    r   r$   )r   r   r   r"   ^   s    	zConcatPair.as_mysqlc             C   s0   |  j    } | j d d   | j   D  | S)Nc             S   s%   g  |  ] } t  | t d     q S) )r   r   ).0r   r   r   r   
<listcomp>j   s   	 z'ConcatPair.coalesce.<locals>.<listcomp>)copyZset_source_expressionsZget_source_expressions)r   cr   r   r   r/   f   s    zConcatPair.coalesce)r   r   r   r   r   r,   r"   r/   r   r   )r   r   r.   P   s
   r.   c                   s@   e  Z d  Z d Z d Z d Z   f d d   Z d d   Z   S)Concatz
    Concatenate text fields together. Backends that result in an entire
    null expression when any arguments are null will wrap each argument in
    coalesce functions to ensure a non-null result.
    Nz%(expressions)sc                sD   t  |  d k  r t d   |  j |  } t   j | |  d  S)N   z)Concat must take at least two expressions)len
ValueError_pairedr   __init__)r   expressionsextraZpaired)r   r   r   r:   x   s    zConcat.__init__c             C   s@   t  |  d k r t |   St | d |  j | d d     S)Nr6   r      )r7   r.   r9   )r   r;   r   r   r   r9   ~   s    
zConcat._paired)r   r   r   r   r   r   r:   r9   r   r   )r   r   r5   o   s
   r5   c                   sR   e  Z d  Z d Z d Z   f d d   Z d d   Z d d   Z d	 d
   Z   S)LeftLEFTr6   c                sA   t  | d  s' | d k  r' t d   t   j | | |  d S)z
        expression: the name of a field, or an expression returning a string
        length: the number of characters to return from the start of the string
        resolve_expressionr=   z 'length' must be greater than 0.N)hasattrr8   r   r:   )r   r   lengthr<   )r   r   r   r:      s    zLeft.__init__c             C   s$   t  |  j d t d  |  j d  S)Nr   r=   )Substrsource_expressionsr   )r   r   r   r   
get_substr   s    zLeft.get_substrc             K   s   |  j    j | | |  S)N)rE   r%   )r   r    r   r$   r   r   r   r%      s    zLeft.as_oraclec             K   s   |  j    j | | |  S)N)rE   r,   )r   r    r   r$   r   r   r   r,      s    zLeft.as_sqlite)	r   r   r   r   arityr:   rE   r%   r,   r   r   )r   r   r>      s   
r>   c                   s=   e  Z d  Z d Z d Z d Z e   Z   f d d   Z   S)Lengthz2Return the number of characters in the expression.ZLENGTHrB   c                s   t    j | | d d | S)Nr   ZCHAR_LENGTH)r   r   )r   r    r   r$   )r   r   r   r"      s    zLength.as_mysql)	r   r   r   r   r   r-   r   r
   r"   r   r   )r   r   rG      s
   	rG   c               @   s   e  Z d  Z d Z d Z d S)LowerZLOWERr'   N)r   r   r   r   r-   r   r   r   r   rH      s   rH   c                   s1   e  Z d  Z d Z e d    f d d  Z   S)LPadZLPAD c                sQ   t  | d  r4 | d  k	 r4 | d k  r4 t d   t   j | | | |  d  S)Nr@   r   z''length' must be greater or equal to 0.)rA   r8   r   r:   )r   r   rB   Z	fill_textr<   )r   r   r   r:      s    (zLPad.__init__)r   r   r   r   r   r:   r   r   )r   r   rI      s   rI   c               @   s   e  Z d  Z d Z d Z d S)LTrimZLTRIMZltrimN)r   r   r   r   r-   r   r   r   r   rK      s   rK   c               @   s   e  Z d  Z d  Z d Z d S)MD5md5N)r   r   r   r   r-   r   r   r   r   rL      s   rL   c                   sI   e  Z d  Z d Z d Z e   Z   f d d   Z   f d d   Z   S)OrdASCIIordc                s   t    j | | d d | S)Nr   ZORD)r   r   )r   r    r   r$   )r   r   r   r"      s    zOrd.as_mysqlc                s   t    j | | d d | S)Nr   UNICODE)r   r   )r   r    r   r$   )r   r   r   r,      s    zOrd.as_sqlite)	r   r   r   r   r-   r   r
   r"   r,   r   r   )r   r   rN      s
   	rN   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)RepeatREPEATc                sN   t  | d  r4 | d  k	 r4 | d k  r4 t d   t   j | | |  d  S)Nr@   r   z''number' must be greater or equal to 0.)rA   r8   r   r:   )r   r   numberr<   )r   r   r   r:      s    (zRepeat.__init__c             K   sV   |  j  \ } } | d  k r! d  n t |  | } t | | |  } | j | | |  S)N)rD   rG   RPadr   )r   r    r   r$   r   rT   rB   Zrpadr   r   r   r%      s    "zRepeat.as_oracle)r   r   r   r   r:   r%   r   r   )r   r   rR      s   rR   c                   s1   e  Z d  Z d Z e d    f d d  Z   S)ReplaceZREPLACEr0   c                s   t    j | | | |  d  S)N)r   r:   )r   r   textreplacementr<   )r   r   r   r:      s    zReplace.__init__)r   r   r   r   r   r:   r   r   )r   r   rV      s   rV   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)ReverseZREVERSEreversec                s   t    j | | d d | S)Nr   z(SELECT LISTAGG(s) WITHIN GROUP (ORDER BY n DESC) FROM (SELECT LEVEL n, SUBSTR(%(expressions)s, LEVEL, 1) s FROM DUAL CONNECT BY LEVEL <= LENGTH(%(expressions)s)) GROUP BY %(expressions)s))r   r   )r   r    r   r$   )r   r   r   r%      s    		zReverse.as_oracle)r   r   r   r   r-   r%   r   r   )r   r   rY      s   rY   c               @   s"   e  Z d  Z d Z d d   Z d S)RightRIGHTc             C   s%   t  |  j d |  j d t d   S)Nr   r=   )rC   rD   r   )r   r   r   r   rE      s    zRight.get_substrN)r   r   r   r   rE   r   r   r   r   r[      s   r[   c               @   s   e  Z d  Z d Z d S)rU   ZRPADN)r   r   r   r   r   r   r   r   rU      s   rU   c               @   s   e  Z d  Z d Z d Z d S)RTrimZRTRIMZrtrimN)r   r   r   r   r-   r   r   r   r   r^     s   r^   c               @   s   e  Z d  Z d  Z d Z d S)SHA1sha1N)r   r   r   r   r-   r   r   r   r   r_     s   r_   c               @   s(   e  Z d  Z d  Z d Z d d   Z d S)SHA224sha224c             K   s   t  d   d  S)Nz"SHA224 is not supported on Oracle.)r   )r   r    r   r$   r   r   r   r%     s    zSHA224.as_oracleN)r   r   r   r   r-   r%   r   r   r   r   ra     s   ra   c               @   s   e  Z d  Z d  Z d Z d S)SHA256sha256N)r   r   r   r   r-   r   r   r   r   rc     s   rc   c               @   s   e  Z d  Z d  Z d Z d S)SHA384sha384N)r   r   r   r   r-   r   r   r   r   re     s   re   c               @   s   e  Z d  Z d  Z d Z d S)SHA512sha512N)r   r   r   r   r-   r   r   r   r   rg     s   rg   c                   s=   e  Z d  Z d Z d Z d Z e   Z   f d d   Z   S)StrIndexz
    Return a positive integer corresponding to the 1-indexed position of the
    first occurrence of a substring inside another string, or 0 if the
    substring is not found.
    ZINSTRr6   c                s   t    j | | d d | S)Nr   ZSTRPOS)r   r   )r   r    r   r$   )r   r   r   r(   ,  s    zStrIndex.as_postgresql)	r   r   r   r   r   rF   r   r
   r(   r   r   )r   r   ri   "  s
   	ri   c                   sO   e  Z d  Z d Z d   f d d  Z   f d d   Z   f d d   Z   S)	rC   Z	SUBSTRINGNc                sc   t  | d  s' | d k  r' t d   | | g } | d k	 rL | j |  t   j | |   d S)z
        expression: the name of a field, or an expression returning a string
        pos: an integer > 0, or an expression returning an integer
        length: an optional number of characters to return
        r@   r=   z'pos' must be greater than 0N)rA   r8   appendr   r:   )r   r   posrB   r<   r;   )r   r   r   r:   3  s    zSubstr.__init__c                s   t    j | | d d | S)Nr   SUBSTR)r   r   )r   r    r   r$   )r   r   r   r,   A  s    zSubstr.as_sqlitec                s   t    j | | d d | S)Nr   rl   )r   r   )r   r    r   r$   )r   r   r   r%   D  s    zSubstr.as_oracle)r   r   r   r   r:   r,   r%   r   r   )r   r   rC   0  s   rC   c               @   s   e  Z d  Z d Z d Z d S)TrimZTRIMZtrimN)r   r   r   r   r-   r   r   r   r   rm   H  s   rm   c               @   s   e  Z d  Z d Z d Z d S)UpperZUPPERupperN)r   r   r   r   r-   r   r   r   r   rn   M  s   rn   N)(Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   Zdjango.db.models.functionsr   Zdjango.db.models.lookupsr   Zdjango.db.utilsr   r   r   r#   r&   r)   r.   r5   r>   rG   rH   rI   rK   rL   rN   rR   rV   rY   r[   rU   r^   r_   ra   rc   re   rg   ri   rC   rm   rn   r   r   r   r   <module>   sB   

	