3
7^o2                 @   sL   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ G dd deZ	dS )    N)settings)BaseDatabaseOperations)timezone)duration_microsecondsc                   sT  e Zd ZdZejdMdNdZddddd	dddd
d
d
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d'd( Zd)d* ZdOd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z fd8d9Z fd:d;Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dP fdGdH	Z%dIdJ Z&dQ fdKdL	Z'  Z(S )RDatabaseOperationsz!django.db.backends.mysql.compilerr         )PositiveSmallIntegerFieldPositiveIntegerFieldzsigned integerzchar(%(max_length)s)z+decimal(%(max_digits)s, %(decimal_places)s)charzunsigned integer)
Z	AutoFieldZBigAutoFieldZ	CharFieldZDecimalFieldZ	TextFieldZIntegerFieldZBigIntegerFieldZSmallIntegerFieldr
   r	   ZEXPLAINc             C   sD   |dkrd| S |dkr d| S |dkr0d| S d|j  |f S d 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-8app2_gc/Django/django/db/backends/mysql/operations.pydate_extract_sql!   s    z#DatabaseOperations.date_extract_sqlc             C   sZ   ddd}||kr&|| }d||f S |dkr:d||f S |dkrNd||f S d	| S d S )
Nz	%%Y-01-01z
%%Y-%%m-01)yearmonthz#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_sql4   s    

z!DatabaseOperations.date_trunc_sqlc             C   s   t jrd||f }|S )NzCONVERT_TZ(%s, 'UTC', '%s'))r   USE_TZ)r   r   tznamer   r   r   _convert_field_to_tzG   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_sqlL   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_sqlP   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   | j ||}| j||S )N)r   r   )r   r   r   r   r   r   r   datetime_extract_sqlT   s    z'DatabaseOperations.datetime_extract_sqlc       
      C   s   | j ||}ddddddg}d}d}|dkr8d j|dS |dkrLdj|dS y|j|d }W n tk
rv   |}Y n@X djdd |d | D dd ||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)    c             S   s   g | ]}|qS r   r   ).0fr   r   r   
<listcomp>n   s    z9DatabaseOperations.datetime_trunc_sql.<locals>.<listcomp>z'CAST(DATE_FORMAT(%s, '%s') AS DATETIME))r$   r%   r&   r'   r(   r)   )r*   r+   r,   r-   r.   r/   zCAST(DATE_FORMAT(MAKEDATE(YEAR({field_name}), 1) + INTERVAL QUARTER({field_name}) QUARTER - INTERVAL 1 QUARTER, '%%Y-%%m-01 00:00:00') AS DATETIME))r   formatindex
ValueErrorjoin)
r   r   r   r   r   r5   Z
format_defisqlr   r   r   r   datetime_trunc_sqlX   s$     
2z%DatabaseOperations.datetime_trunc_sqlc             C   s4   dddd}||kr(|| }d||f S d| S d S )Nz	%%H:00:00z
%%H:%%i:00z%%H:%%i:%%s)r!   r"   r#   z#CAST(DATE_FORMAT(%s, '%s') AS TIME)zTIME(%s)r   )r   r   r   r   r   r   r   r   time_trunc_sqlr   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 |dd }|d k	r |jdd}|S )NZ	_executedreplace)errors)getattrdecode)r   cursorr:   paramsqueryr   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|S d| 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   sd   |r\dg}x0|D ](}|j d|jd|j| j|f  qW |j d |j| j|| |S g S d S )NzSET FOREIGN_KEY_CHECKS = 0;z%s %s;ZTRUNCATEzSET FOREIGN_KEY_CHECKS = 1;)appendZSQL_KEYWORDZ	SQL_FIELDrN   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.)r7   )r   valuer   r   r   validate_autopk_value   s    z(DatabaseOperations.validate_autopk_valuec             C   sL   |d krd S t |dr|S tj|rDtjr<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_naive
connectionr7   str)r   rV   r   r   r   adapt_datetimefield_value   s    

z,DatabaseOperations.adapt_datetimefield_valuec             C   s4   |d krd S t |dr|S tj|r,tdt|S )NrX   z4MySQL backend does not support timezone-aware times.)rY   r   rZ   r7   r\   )r   rV   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   s*   dd |D }dj dd |D }d| S )Nc             s   s   | ]}d j |V  qdS )z, N)r8   )r2   rowr   r   r   	<genexpr>   s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r2   r:   r   r   r   rb      s    zVALUES )r8   )r   r   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s    z"DatabaseOperations.bulk_insert_sqlc                sX   |dkrddj | S |dkr,d|j | S |dkrJ|\}}d	||d
 S t j||S )N^zPOW(%s),&|<<zCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s)))lhsrhs)rf   rg   rh   )r8   supercombine_expression)r   Z	connectorZsub_expressionsri   rj   )	__class__r   r   rl      s    z%DatabaseOperations.combine_expressionc                s`   t  j|}|jj }|dkr,|j| j n0|dkrHtjr\|j| j n|dkr\|j| j	 |S )NBooleanFieldNullBooleanFieldZDateTimeFieldZ	UUIDField)rn   ro   )
rk   get_db_convertersZoutput_fieldZget_internal_typerP   convert_booleanfield_valuer   r   convert_datetimefield_valueconvert_uuidfield_value)r   
expression
convertersinternal_type)rm   r   r   rp      s    
z$DatabaseOperations.get_db_convertersc             C   s   |dkrt |}|S )Nr   r0   )r   r0   )bool)r   rV   rt   r[   r   r   r   rq      s    z-DatabaseOperations.convert_booleanfield_valuec             C   s   |d k	rt j|| jj }|S )N)r   Z
make_awarer[   )r   rV   rt   r[   r   r   r   rr      s    z.DatabaseOperations.convert_datetimefield_valuec             C   s   |d k	rt j|}|S )N)uuidUUID)r   rV   rt   r[   r   r   r   rs     s    
z*DatabaseOperations.convert_uuidfield_valuec             C   s   |d k	rt |d rdS dS )NZas_sqlz
_binary %sz%s)rY   )r   rV   r   r   r   binary_placeholder_sql  s    z)DatabaseOperations.binary_placeholder_sqlc             C   sl   |\}}|\}}|dkrT| j jr6d||d || fS d||d |d |d  fS d||f || fS d S )NZ	TimeFieldzGCAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) * 1000000 AS SIGNED))ri   rj   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)r   rv   ri   rj   Zlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr   r   r   subtract_temporals	  s    

z%DatabaseOperations.subtract_temporalsNc                sR   |r|j  dkrd}t j|f|}|r4|d| 7 }| jjjrN|d krN|d7 }|S )NZTEXTZTRADITIONALz
 FORMAT=%sz	 EXTENDED)r   rk   explain_query_prefixr[   featuresZneeds_explain_extended)r   r5   optionsprefix)rm   r   r   r~     s    z'DatabaseOperations.explain_query_prefixc             C   s<   | j jd	k s| j jr$|dkr dS dS |dkr0dnd}d| S )
N   r   regexz%s REGEXP BINARY %sz%s REGEXP %scr9   zREGEXP_LIKE(%%s, %%s, '%s'))r   r   r   )r[   Zmysql_versionr|   )r   r   Zmatch_optionr   r   r   regex_lookup&  s    zDatabaseOperations.regex_lookupc                s   |rdS t  j|S )NzINSERT IGNORE INTO)rk   insert_statement)r   Zignore_conflicts)rm   r   r   r   1  s    z#DatabaseOperations.insert_statement)r   r   )r   r   )F)N)F))__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@   rH   rI   rN   rO   rU   rW   r]   r^   r`   rc   rl   rp   rq   rr   rs   rz   r}   r~   r   r   __classcell__r   r   )rm   r   r   	   s^   
	
r   )
rx   Zdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.utilsr   Zdjango.utils.durationr   r   r   r   r   r   <module>   s
   