
v^'4                 @   sv   d  d l  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
 Gd d   d e  Z d S)	    N)settings)BaseDatabaseOperations)timezone)duration_microseconds)	force_strc                   s&  e  Z d  Z d Z e j d dX d dY i  Z d d d	 d d
 d d d d d d d d d d d d d d d d d i Z d Z d Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7 d8  Z d9 d:   Z d; d<   Z d= d>   Z d? d@   Z dA dB   Z   f dC dD   Z   f dE dF   Z  dG dH   Z! dI dJ   Z" dK dL   Z# dM dN   Z$ dO dP   Z% dQ   f dR dS  Z& dT dU   Z' d6   f dV dW  Z(   S)ZDatabaseOperationsz!django.db.backends.mysql.compilerZPositiveSmallIntegerFieldr     ZPositiveIntegerField    Z	AutoFieldzsigned integerZBigAutoFieldZSmallAutoFieldZ	CharFieldzchar(%(max_length)s)ZDecimalFieldz+decimal(%(max_digits)s, %(decimal_places)s)Z	TextFieldcharZIntegerFieldZBigIntegerFieldZSmallIntegerFieldzunsigned integerZEXPLAINc             C   sT   | d k r d | S| d k r( d | S| d k r< d | Sd | j    | f Sd  S)NZweek_dayzDAYOFWEEK(%s)weekzWEEK(%s, 3)Ziso_yearz#TRUNCATE(YEARWEEK(%s, 3), -2) / 100zEXTRACT(%s FROM %s))upper)selflookup_type
field_name r   E/tmp/pip-build-8lau8j11/django/django/db/backends/mysql/operations.pydate_extract_sql#   s    z#DatabaseOperations.date_extract_sqlc             C   sv   d d d d i } | | k r6 | | } d | | f S| d k rP d | | f S| d k rj d	 | | f Sd
 | Sd  S)Nyearz	%%Y-01-01monthz
%%Y-%%m-01z#CAST(DATE_FORMAT(%s, '%s') AS DATE)quarterzIMAKEDATE(YEAR(%s), 1) + INTERVAL QUARTER(%s) QUARTER - INTERVAL 1 QUARTERr   z&DATE_SUB(%s, INTERVAL WEEKDAY(%s) DAY)zDATE(%s)r   )r   r   r   fields
format_strr   r   r   date_trunc_sql6   s    
z!DatabaseOperations.date_trunc_sqlc             C   sJ   d | k r# | | j  d  d   Sd | k rF | | j  d  d   S| S)N+-)find)r   tznamer   r   r   _prepare_tzname_deltaI   s
    z(DatabaseOperations._prepare_tzname_deltac             C   sA   t  j r= |  j j | k r= d | |  j j |  j |  f } | S)NzCONVERT_TZ(%s, '%s', '%s'))r   USE_TZ
connectionZtimezone_namer   )r   r   r   r   r   r   _convert_field_to_tzP   s    	z'DatabaseOperations._convert_field_to_tzc             C   s   |  j  | |  } d | S)NzDATE(%s))r    )r   r   r   r   r   r   datetime_cast_date_sqlY   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   |  j  | |  } d | S)NzTIME(%s))r    )r   r   r   r   r   r   datetime_cast_time_sql]   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s"   |  j  | |  } |  j | |  S)N)r    r   )r   r   r   r   r   r   r   datetime_extract_sqla   s    z'DatabaseOperations.datetime_extract_sqlc       
      C   s   |  j  | |  } d d d d d d g } d } d } | d k rV d d j d |  S| d k rr d j d |  Sy | j |  d } Wn t k
 r | } Yn8 Xd j | d  |  | | d    }	 d | |	 f } | S)Nr   r   dayhourminutesecond%%Y-%%m-%%d %%H:%%i:%%s0000-01-01 00:00:00r   z\CAST(DATE_FORMAT(MAKEDATE(YEAR({field_name}), 1) + INTERVAL QUARTER({field_name}) QUARTER - z7INTERVAL 1 QUARTER, '%%Y-%%m-01 00:00:00') AS DATETIME)r   r   zqCAST(DATE_FORMAT(DATE_SUB({field_name}, INTERVAL WEEKDAY({field_name}) DAY), '%%Y-%%m-%%d 00:00:00') AS DATETIME)    z'CAST(DATE_FORMAT(%s, '%s') AS DATETIME))r(   r)   r*   r+   r,   r-   )r.   r/   r0   r1   r2   r3   )r    formatindex
ValueErrorjoin)
r   r   r   r   r   r6   Z
format_defisqlr   r   r   r   datetime_trunc_sqle   s$    
	'z%DatabaseOperations.datetime_trunc_sqlc             C   sH   d d d d d d i } | | k r< | | } d | | f Sd | Sd  S)	Nr%   z	%%H:00:00r&   z
%%H:%%i:00r'   z%%H:%%i:%%sz#CAST(DATE_FORMAT(%s, '%s') AS TIME)zTIME(%s)r   )r   r   r   r   r   r   r   r   time_trunc_sql   s    
z!DatabaseOperations.time_trunc_sqlc             C   s   d t  |  S)NzINTERVAL %s MICROSECOND)r   )r   	timedeltar   r   r   date_interval_sql   s    z$DatabaseOperations.date_interval_sqlc             C   s   d | S)NzINTERVAL %s MICROSECONDr   )r   r;   r   r   r   format_for_duration_arithmetic   s    z1DatabaseOperations.format_for_duration_arithmeticc             C   s   d d g  d f f g S)z
        "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped
        columns. If no ordering would otherwise be applied, we don't want any
        implicit sorting going on.
        NZNULLFr   )r   r   r   r   force_no_ordering   s    z$DatabaseOperations.force_no_orderingc             C   s   t  t | d d   d d S)NZ	_executederrorsreplace)r   getattr)r   cursorr;   paramsr   r   r   last_executed_query   s    z&DatabaseOperations.last_executed_queryc             C   s   d S)Nl    r   )r   r   r   r   no_limit_value   s    z!DatabaseOperations.no_limit_valuec             C   s*   | j  d  r" | j d  r" | Sd | S)N`z`%s`)
startswithendswith)r   namer   r   r   
quote_name   s    zDatabaseOperations.quote_namec             C   s   d S)NzRAND()r   )r   r   r   r   random_function_sql   s    z&DatabaseOperations.random_function_sqlFc             C   s   | r| d g } x@ | D]8 } | j  d | j d  | j |  j |   f  q W| j  d  | j |  j | |   | Sg  Sd  S)NzSET FOREIGN_KEY_CHECKS = 0;z%s %s;ZTRUNCATEzSET FOREIGN_KEY_CHECKS = 1;)appendZSQL_KEYWORDZ	SQL_FIELDrM   extendZsequence_reset_by_name_sql)r   styleZtables	sequencesZallow_cascader;   tabler   r   r   	sql_flush   s    		!zDatabaseOperations.sql_flushc             C   s   | d k r t  d   | S)Nr   z@The database backend does not accept 0 as a value for AutoField.)r8   )r   valuer   r   r   validate_autopk_value   s    z(DatabaseOperations.validate_autopk_valuec             C   sl   | d  k r d  St  | d  r# | St j |  rb t j rV t j | |  j j  } n t d   t |  S)Nresolve_expressionzMMySQL backend does not support timezone-aware datetimes when USE_TZ is False.)	hasattrr   is_awarer   r   Z
make_naiver   r8   str)r   rU   r   r   r   adapt_datetimefield_value   s    	z,DatabaseOperations.adapt_datetimefield_valuec             C   sH   | d  k r d  St  | d  r# | St j |  r> t d   t |  S)NrW   z4MySQL backend does not support timezone-aware times.)rX   r   rY   r8   rZ   )r   rU   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   d S)N@   r   )r   r   r   r   max_name_length   s    z"DatabaseOperations.max_name_lengthc             C   s7   d d   | D } d j  d d   | D  } d | S)Nc             s   s   |  ] } d  j  |  Vq d S)z, N)r9   ).0rowr   r   r   	<genexpr>   s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   |  ] } d  | Vq d S)z(%s)Nr   )r_   r;   r   r   r   ra      s    zVALUES )r9   )r   r   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s    z"DatabaseOperations.bulk_insert_sqlc                sy   | d k r d d j  |  S| d k r: d | j  |  S| d k rf | \ } } d	 d
 | d | i St   j | |  S)N^zPOW(%s),&|<<zCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s))lhsrhs)re   rf   rg   )r9   supercombine_expression)r   Z	connectorZsub_expressionsrh   ri   )	__class__r   r   rk      s    z%DatabaseOperations.combine_expressionc                s   t    j |  } | j j   } | d k r@ | j |  j  nD | d k rh t j r | j |  j  n | d k r | j |  j	  | S)NBooleanFieldNullBooleanFieldZDateTimeFieldZ	UUIDField)rm   rn   )
rj   get_db_convertersZoutput_fieldZget_internal_typerO   convert_booleanfield_valuer   r   convert_datetimefield_valueconvert_uuidfield_value)r   
expression
convertersinternal_type)rl   r   r   ro      s    	z$DatabaseOperations.get_db_convertersc             C   s   | d k r t  |  } | S)Nr   r4   )r   r4   )bool)r   rU   rs   r   r   r   r   rp     s    z-DatabaseOperations.convert_booleanfield_valuec             C   s(   | d  k	 r$ t  j | |  j j   } | S)N)r   Z
make_awarer   )r   rU   rs   r   r   r   r   rq     s    z.DatabaseOperations.convert_datetimefield_valuec             C   s   | d  k	 r t  j |  } | S)N)uuidUUID)r   rU   rs   r   r   r   r   rr     s    z*DatabaseOperations.convert_uuidfield_valuec             C   s$   | d  k	 r  t  | d  r  d Sd S)NZas_sqlz
_binary %sz%s)rX   )r   rU   r   r   r   binary_placeholder_sql  s    z)DatabaseOperations.binary_placeholder_sqlc       	      C   s   | \ } } | \ } } | d k r |  j  j rP d d | d | i | |  f Sd d | d | i t |  d t |  d f S| |  } d | | f | f S)NZ	TimeFieldzGCAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) * 1000000 AS SIGNED)rh   ri   zs((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) - (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))   z"TIMESTAMPDIFF(MICROSECOND, %s, %s))r   mysql_is_mariadbtuple)	r   ru   rh   ri   Zlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsrF   r   r   r   subtract_temporals  s    /z%DatabaseOperations.subtract_temporalsNc                sp   | r | j    d k r d } t   j | |  } | rG | d | 7} |  j j j rl | d  k rl | d 7} | S)NZTEXTZTRADITIONALz
 FORMAT=%sz	 EXTENDED)r   rj   explain_query_prefixr   featuresZneeds_explain_extended)r   r6   optionsprefix)rl   r   r   r~   %  s    
z'DatabaseOperations.explain_query_prefixc             C   sR   |  j  j d	 k  s |  j  j r2 | d k r. d Sd S| d k rD d n d } d | S)
N   r   regexz%s REGEXP BINARY %sz%s REGEXP %scr:   zREGEXP_LIKE(%%s, %%s, '%s'))r   r   r   )r   Zmysql_versionr{   )r   r   Zmatch_optionr   r   r   regex_lookup1  s    zDatabaseOperations.regex_lookupc                s   | r
 d St    j |  S)NzINSERT IGNORE INTO)rj   insert_statement)r   Zignore_conflicts)rl   r   r   r   <  s    z#DatabaseOperations.insert_statement)r   r   )r   r	   ))__name__
__module____qualname__Zcompiler_moduler   Zinteger_field_rangesZcast_data_typesZ"cast_char_field_without_max_lengthZexplain_prefixr   r   r   r    r!   r"   r#   r<   r=   r?   r@   rA   rG   rH   rM   rN   rT   rV   r[   r\   r^   rb   rk   ro   rp   rq   rr   ry   r}   r~   r   r   r   r   )rl   r   r   
   sb   	r   )rw   Zdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.utilsr   Zdjango.utils.durationr   Zdjango.utils.encodingr   r   r   r   r   r   <module>   s   