o
    uvXjo2  ã                   @   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                       sX  e Zd ZdZi ej¥dddœ¥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dLd+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Z‡ fd7d8„Z‡ fd9d:„Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dM‡ fdFdG„	Z%dHdI„ Z&dL‡ fdJdK„	Z'‡  Z(S )NÚDatabaseOperationsz!django.db.backends.mysql.compiler)r   iÿÿ  )r   l   ÿÿ )ÚPositiveSmallIntegerFieldÚPositiveIntegerFieldzsigned integerzchar(%(max_length)s)z+decimal(%(max_digits)s, %(decimal_places)s)Úcharzunsigned integer)
Ú	AutoFieldÚBigAutoFieldÚ	CharFieldÚDecimalFieldÚ	TextFieldÚIntegerFieldÚBigIntegerFieldÚSmallIntegerFieldr	   r   ÚEXPLAINc                 C   s@   |dkrd| S |dkrd| S |dkrd| S d|  ¡ |f S )NÚweek_dayzDAYOFWEEK(%s)ÚweekzWEEK(%s, 3)Úiso_yearz#TRUNCATE(YEARWEEK(%s, 3), -2) / 100zEXTRACT(%s FROM %s))Úupper)ÚselfÚlookup_typeÚ
field_name© r   ú`/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.pyÚdate_extract_sql!   s   z#DatabaseOperations.date_extract_sqlc                 C   sV   dddœ}||v r|| }d||f S |dkrd||f S |dkr'd||f 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)ú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   ó   |   ||¡}d| S )Nr!   ©r)   r'   r   r   r   Údatetime_cast_date_sqlL   ó   z)DatabaseOperations.datetime_cast_date_sqlc                 C   r*   )NúTIME(%s)r+   r'   r   r   r   Údatetime_cast_time_sqlP   r-   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |   ||¡}|  ||¡S ©N)r)   r   )r   r   r   r(   r   r   r   Údatetime_extract_sqlT   s   z'DatabaseOperations.datetime_extract_sqlc           
      C   s²   |   ||¡}g d¢}d}d}|dkrdj|d�S |dkr"dj|d�S z	| |¡d	 }W n ty7   |}Y |S w d
 dd„ |d |… D ƒdd„ ||d … D ƒ ¡}	d||	f }|S )N)r   r   ÚdayÚhourÚminuteÚsecond)z%%Y-z%%mz-%%dz %%H:z%%iz:%%s)z0000-Ú01z-01z 00:Ú00z:00r    z“CAST(DATE_FORMAT(MAKEDATE(YEAR({field_name}), 1) + INTERVAL QUARTER({field_name}) QUARTER - INTERVAL 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)   ÚformatÚindexÚ
ValueErrorÚjoin)
r   r   r   r(   r#   r=   Ú
format_defÚiÚsqlr$   r   r   r   Údatetime_trunc_sqlX   s*   üüû2z%DatabaseOperations.datetime_trunc_sqlc                 C   s0   ddddœ}||v r|| }d||f S d| S )Nz	%%H:00:00z
%%H:%%i:00z%%H:%%i:%%s)r3   r4   r5   z#CAST(DATE_FORMAT(%s, '%s') AS TIME)r.   r   r"   r   r   r   Útime_trunc_sqlr   s   ýz!DatabaseOperations.time_trunc_sqlc                 C   s   dt |ƒ S ©NzINTERVAL %s MICROSECONDr   )r   Ú	timedeltar   r   r   Údate_interval_sql~   s   z$DatabaseOperations.date_interval_sqlc                 C   s   d| S rF   r   )r   rC   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.
        NÚNULLFr   ©r   r   r   r   Úforce_no_ordering„   s   z$DatabaseOperations.force_no_orderingc                 C   s$   t |dd ƒ}|d ur|jdd�}|S )NÚ	_executedÚreplace)Úerrors)ÚgetattrÚdecode)r   ÚcursorrC   ÚparamsÚqueryr   r   r   Úlast_executed_queryŒ   s   z&DatabaseOperations.last_executed_queryc                 C   ó   dS )Nl   ÿÿÿÿ r   rK   r   r   r   Úno_limit_value•   s   z!DatabaseOperations.no_limit_valuec                 C   s    |  d¡r| d¡r|S d| S )Nú`z`%s`)Ú
startswithÚendswith)r   Únamer   r   r   Ú
quote_name™   s   zDatabaseOperations.quote_namec                 C   rV   )NzRAND()r   rK   r   r   r   Úrandom_function_sqlž   ó   z&DatabaseOperations.random_function_sqlFc              
   C   s\   |r,dg}|D ]}|  d| d¡| |  |¡¡f ¡ q|  d¡ | |  ||¡¡ |S g S )NzSET FOREIGN_KEY_CHECKS = 0;z%s %s;ÚTRUNCATEzSET FOREIGN_KEY_CHECKS = 1;)ÚappendÚSQL_KEYWORDÚ	SQL_FIELDr\   ÚextendÚsequence_reset_by_name_sql)r   ÚstyleÚtablesÚ	sequencesÚallow_cascaderC   Ú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.)r?   ©r   Úvaluer   r   r   Úvalidate_autopk_value²   s   z(DatabaseOperations.validate_autopk_valuec                 C   sR   |d u rd S t |dƒr|S t |¡r%tjr!t || jj¡}t|ƒS tdƒ‚t|ƒS )NÚresolve_expressionzMMySQL backend does not support timezone-aware datetimes when USE_TZ is False.)	Úhasattrr   Úis_awarer   r&   Ú
make_naiveÚ
connectionr?   Ústrrk   r   r   r   Úadapt_datetimefield_value¹   s   

ÿz,DatabaseOperations.adapt_datetimefield_valuec                 C   s4   |d u rd S t |dƒr|S t |¡rtdƒ‚t|ƒS )Nrn   z4MySQL backend does not support timezone-aware times.)ro   r   rp   r?   rs   rk   r   r   r   Úadapt_timefield_valueÉ   s   

z(DatabaseOperations.adapt_timefield_valuec                 C   rV   )Né@   r   rK   r   r   r   Úmax_name_length×   r^   z"DatabaseOperations.max_name_lengthc                 C   s*   dd„ |D ƒ}d  dd„ |D ƒ¡}d| S )Nc                 s   s   � | ]}d   |¡V  qdS )ú, N©r@   )r:   Úrowr   r   r   Ú	<genexpr>Û   s   € z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rx   c                 s   s   � | ]}d | V  qdS )z(%s)Nr   )r:   rC   r   r   r   r{   Ü   s   € zVALUES ry   )r   r#   Úplaceholder_rowsÚplaceholder_rows_sqlÚ
values_sqlr   r   r   Úbulk_insert_sqlÚ   s   z"DatabaseOperations.bulk_insert_sqlc                    sX   |dkrdd  |¡ S |dv rd|  |¡ S |dkr%|\}}d||dœ S tƒ  ||¡S )	Nú^zPOW(%s)ú,)ú&ú|z<<zCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s))©ÚlhsÚrhs)r@   ÚsuperÚcombine_expression)r   Ú	connectorÚsub_expressionsr…   r†   ©Ú	__class__r   r   rˆ   ß   s   z%DatabaseOperations.combine_expressionc                    sd   t ƒ  |¡}|j ¡ }|dv r| | j¡ |S |dkr&tjr$| | j¡ |S |dkr0| | j	¡ |S )N)ÚBooleanFieldÚNullBooleanFieldÚDateTimeFieldÚ	UUIDField)
r‡   Úget_db_convertersÚoutput_fieldÚget_internal_typer`   Úconvert_booleanfield_valuer   r&   Úconvert_datetimefield_valueÚconvert_uuidfield_value)r   Ú
expressionÚ
convertersÚinternal_typer‹   r   r   r‘   ë   s   
ûþz$DatabaseOperations.get_db_convertersc                 C   s   |dv rt |ƒ}|S )N)r   r8   )Úbool©r   rl   r—   rr   r   r   r   r”   ÷   s   z-DatabaseOperations.convert_booleanfield_valuec                 C   s   |d urt  || jj ¡}|S r0   )r   Ú
make_awarerr   r›   r   r   r   r•   ü   s   z.DatabaseOperations.convert_datetimefield_valuec                 C   s   |d ur	t  |¡}|S r0   )ÚuuidÚUUIDr›   r   r   r   r–     s   
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |d urt |dƒsdS dS )NÚas_sqlz
_binary %sz%s)ro   rk   r   r   r   Úbinary_placeholder_sql  s   z)DatabaseOperations.binary_placeholder_sqlc                 C   sh   |\}}|\}}|dkr*| j jrd||dœ || fS d||dœ |d |d  fS d||f || fS )NÚ	TimeFieldzGCAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) * 1000000 AS SIGNED)r„   zs((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) - (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))é   z"TIMESTAMPDIFF(MICROSECOND, %s, %s))rr   Úmysql_is_mariadb)r   r™   r…   r†   Úlhs_sqlÚ
lhs_paramsÚrhs_sqlÚ
rhs_paramsr   r   r   Úsubtract_temporals	  s   ÿþýýz%DatabaseOperations.subtract_temporalsNc                    sV   |r
|  ¡ dkr
d}tƒ j|fi |¤Ž}|r|d| 7 }| jjjr)|d u r)|d7 }|S )NÚTEXTÚTRADITIONALz
 FORMAT=%sz	 EXTENDED)r   r‡   Úexplain_query_prefixrr   ÚfeaturesÚneeds_explain_extended)r   r=   ÚoptionsÚprefixr‹   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rdnd}d| S )N)é   r   r   Úregexz%s REGEXP BINARY %sz%s REGEXP %sÚcrB   zREGEXP_LIKE(%%s, %%s, '%s'))rr   Úmysql_versionr£   )r   r   Úmatch_optionr   r   r   Úregex_lookup&  s   zDatabaseOperations.regex_lookupc                    s   |rdS t ƒ  |¡S )NzINSERT IGNORE INTO)r‡   Úinsert_statement)r   Úignore_conflictsr‹   r   r   r¶   1  s   z#DatabaseOperations.insert_statement)Fr0   ))Ú__name__Ú
__module__Ú__qualname__Úcompiler_moduler   Úinteger_field_rangesÚcast_data_typesÚ"cast_char_field_without_max_lengthÚexplain_prefixr   r%   r)   r,   r/   r1   rD   rE   rH   rI   rL   rU   rW   r\   r]   rj   rm   rt   ru   rw   r   rˆ   r‘   r”   r•   r–   r    r¨   r«   rµ   r¶   Ú__classcell__r   r   r‹   r   r   	   sh    ÿýö	
r   )
r�   Údjango.confr   Ú"django.db.backends.base.operationsr   Údjango.utilsr   Údjango.utils.durationr   r   r   r   r   r   Ú<module>   s    