a
    LcòfI  ã                   @   s„   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 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©Úsplit_tzname_delta)ÚExistsÚExpressionWrapperÚLookup)Ú
OnConflict)Útimezone)Ú	force_str)Ú_lazy_re_compilec                       s¶  e Zd ZdZi ej¥ddddœ¥Zdddddd	dddd
d
d
ddœZd	ZdZe	dƒZ
dd„ Zd]dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd^dd „Zd!d"„ Zd#d$„ Zd%d&„ Zd_d'd(„Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d1d2œd3d4„Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#‡ fdCdD„Z$‡ fdEdF„Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*d`‡ fdQdR„	Z+dSdT„ Z,da‡ fdUdV„	Z-dbdWdX„Z.‡ fdYdZ„Z/‡ fd[d\„Z0‡  Z1S )cÚDatabaseOperationsz!django.db.backends.mysql.compiler)r   iÿÿ  )r   l   ÿÿ )r   ì   ÿÿÿÿ )ÚPositiveSmallIntegerFieldÚPositiveIntegerFieldÚPositiveBigIntegerFieldzsigned integerzchar(%(max_length)s)z+decimal(%(max_digits)s, %(decimal_places)s)Úcharzunsigned integer)Z	AutoFieldZBigAutoFieldZSmallAutoFieldZ	CharFieldZDecimalFieldZ	TextFieldZIntegerFieldZBigIntegerFieldZSmallIntegerFieldr   r   r   ZDurationFieldZEXPLAINz[A-Z_]+c                 C   sœ   |dkrd|› d�|fS |dkr0d|› d�|fS |dkrHd|› d	�|fS |d
kr`d|› d�|fS |  ¡ }| j |¡s‚td|›�ƒ‚d|› d|› d�|fS d S )NZweek_dayz
DAYOFWEEK(ú)Ziso_week_dayzWEEKDAY(z) + 1ÚweekzWEEK(z, 3)Ziso_yearzTRUNCATE(YEARWEEK(z, 3), -2) / 100zInvalid loookup type: zEXTRACT(z FROM )ÚupperÚ_extract_format_reÚ	fullmatchÚ
ValueError)ÚselfÚlookup_typeÚsqlÚparams© r   ú`/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/db/backends/mysql/operations.pyÚdate_extract_sql,   s    z#DatabaseOperations.date_extract_sqlNc                 C   sª   |   |||¡\}}dddœ}||v rF|| }d|› d�g |¢|‘R fS |dkrnd|› d|› d	�g |¢|¢R fS |d
kr–d|› d|› d�g |¢|¢R fS d|› d�|fS d S )Nz%Y-01-01z%Y-%m-01)ÚyearÚmonthúCAST(DATE_FORMAT(z, %s) AS DATE)ÚquarterzMAKEDATE(YEAR(ú), 1) + INTERVAL QUARTER(z) QUARTER - INTERVAL 1 QUARTERr   z	DATE_SUB(ú, INTERVAL WEEKDAY(z) DAY)úDATE(r   ©Ú_convert_sql_to_tz©r   r   r   r   ÚtznameÚfieldsÚ
format_strr   r   r   Údate_trunc_sqlD   s     þÿý z!DatabaseOperations.date_trunc_sqlc                 C   s"   t |ƒ\}}}|r|› |› �S |S ©Nr   )r   r*   ÚsignÚoffsetr   r   r   Ú_prepare_tzname_deltaX   s    z(DatabaseOperations._prepare_tzname_deltac                 C   sF   |r>t jr>| jj|kr>d|› d�g |¢| jj‘|  |¡‘R fS ||fS )NzCONVERT_TZ(z	, %s, %s))r   ÚUSE_TZÚ
connectionZtimezone_namer1   ©r   r   r   r*   r   r   r   r(   \   s    ÿþýz%DatabaseOperations._convert_sql_to_tzc                 C   s"   |   |||¡\}}d|› d�|fS )Nr&   r   r'   r4   r   r   r   Údatetime_cast_date_sqle   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s"   |   |||¡\}}d|› d�|fS )NúTIME(r   r'   r4   r   r   r   Údatetime_cast_time_sqli   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s    |   |||¡\}}|  |||¡S r.   )r(   r   )r   r   r   r   r*   r   r   r   Údatetime_extract_sqlm   s    z'DatabaseOperations.datetime_extract_sqlc           
      C   sà   |   |||¡\}}g d¢}d}d}|dkrNd|› d|› d�g |¢|¢d‘R fS |d	krzd
|› d|› d�g |¢|¢d‘R fS z| |¡d }W n tyž   Y n:0 d |d |… ||d …  ¡}	d|› d�g |¢|	‘R fS ||fS )N)r    r!   ÚdayÚhourÚminuteÚsecond)z%Y-z%mz-%dz %H:z%iz:%s)z0000-Z01z-01z 00:Z00z:00r#   zCAST(DATE_FORMAT(MAKEDATE(YEAR(r$   z0) QUARTER - INTERVAL 1 QUARTER, %s) AS DATETIME)z%Y-%m-01 00:00:00r   zCAST(DATE_FORMAT(DATE_SUB(r%   z) DAY), %s) AS DATETIME)z%Y-%m-%d 00:00:00é   Ú r"   z, %s) AS DATETIME))r(   Úindexr   Újoin)
r   r   r   r   r*   r+   ÚformatZ
format_defÚir,   r   r   r   Údatetime_trunc_sqlq   s2    ÿüÿÿýz%DatabaseOperations.datetime_trunc_sqlc                 C   s\   |   |||¡\}}ddddœ}||v rH|| }d|› d�g |¢|‘R fS d|› d�|fS d S )	Nz%H:00:00z%H:%i:00z%H:%i:%s)r:   r;   r<   r"   z, %s) AS TIME)r6   r   r'   r)   r   r   r   Útime_trunc_sqlŠ   s    ýz!DatabaseOperations.time_trunc_sqlc                 C   s   |  ¡ S )z˜
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )Zfetchall)r   Úcursorr   r   r   Úfetch_returned_insert_rows—   s    z-DatabaseOperations.fetch_returned_insert_rowsc                 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.
        NÚNULLFr   ©r   r   r   r   Úforce_no_ordering¡   s    z$DatabaseOperations.force_no_orderingc                 C   s   |S r.   r   )r   ÚvalueZ
max_digitsZdecimal_placesr   r   r   Úadapt_decimalfield_value©   s    z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   t t|dd ƒdd�S )NZ	_executedÚreplace)Úerrors)r   Úgetattr)r   rE   r   r   r   r   r   Úlast_executed_query¬   s    z&DatabaseOperations.last_executed_queryc                 C   s   dS )Nr   r   rI   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                    s,   |sdS ‡ fdd„|D ƒ}dd  |¡ dfS )N)r>   r   c                    s,   g | ]$}d ˆ   |jjj¡ˆ   |j¡f ‘qS )z%s.%s)rV   ÚmodelÚ_metaZdb_tableÚcolumn©Ú.0ÚfieldrI   r   r   Ú
<listcomp>Á   s   û
þÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sú, r   ©r@   )r   r+   Úcolumnsr   rI   r   Úreturn_insert_columns¼   s    
úz(DatabaseOperations.return_insert_columnsF)Úreset_sequencesÚallow_cascadec                   sV   |sg S dg}|r.|  ‡ ‡fdd„|D ƒ¡ n|  ‡ ‡fdd„|D ƒ¡ | d¡ |S )NzSET FOREIGN_KEY_CHECKS = 0;c                 3   s,   | ]$}d ˆ  d¡ˆ ˆ  |¡¡f V  qdS )z%s %s;ZTRUNCATEN©ZSQL_KEYWORDZ	SQL_FIELDrV   ©r[   Z
table_name©r   Ústyler   r   Ú	<genexpr>Ó   s   ûþÿz/DatabaseOperations.sql_flush.<locals>.<genexpr>c              	   3   s4   | ],}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f V  qdS )z	%s %s %s;ÚDELETEZFROMNrd   re   rf   r   r   rh   Þ   s   úýÿzSET FOREIGN_KEY_CHECKS = 1;)ÚextendÚappend)r   rg   Ztablesrb   rc   r   r   rf   r   Ú	sql_flushË   s    ú
ù	
zDatabaseOperations.sql_flushc                    s   ‡ ‡fdd„|D ƒS )Nc                    s>   g | ]6}d ˆ  d¡ˆ  d¡ˆ ˆ  |d ¡¡ˆ d¡f ‘qS )z%s %s %s %s = 1;ZALTERZTABLEÚtableZAUTO_INCREMENTrd   )r[   Zsequence_inforf   r   r   r]   ë   s   ùüÿzADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>r   )r   rg   Ú	sequencesr   rf   r   Úsequence_reset_by_name_sqlê   s    øz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s   |dkr| j jjstdƒ‚|S )Nr   z@The database backend does not accept 0 as a value for AutoField.)r3   ÚfeaturesZallows_auto_pk_0r   ©r   rK   r   r   r   Úvalidate_autopk_valueö   s
    ÿz(DatabaseOperations.validate_autopk_valuec                 C   sL   |d u rd S t |dƒr|S t |¡rDtjr<t || 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   r2   Z
make_naiver3   r   Ústrrq   r   r   r   Úadapt_datetimefield_valueÿ   s    

ÿz,DatabaseOperations.adapt_datetimefield_valuec                 C   s8   |d u rd S t |dƒr|S t |¡r,tdƒ‚|jdd�S )Nrs   z4MySQL backend does not support timezone-aware times.Úmicroseconds)Ztimespec)rt   r
   ru   r   Ú	isoformatrq   r   r   r   Úadapt_timefield_value  s    

z(DatabaseOperations.adapt_timefield_valuec                 C   s   dS )Né@   r   rI   r   r   r   Úmax_name_length   s    z"DatabaseOperations.max_name_lengthc                 C   s   dS )NrH   r   rI   r   r   r   Úpk_default_value#  s    z#DatabaseOperations.pk_default_valuec                 C   s*   dd„ |D ƒ}d  dd„ |D ƒ¡}d| S )Nc                 s   s   | ]}d   |¡V  qdS )r^   Nr_   )r[   Úrowr   r   r   rh   '  ó    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r^   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )r[   r   r   r   r   rh   (  r   zVALUES r_   )r   r+   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   Úbulk_insert_sql&  s    z"DatabaseOperations.bulk_insert_sqlc                    sh   |dkrdd  |¡ S |dv r<|dkr*dn|}d|  |¡ S |dkrZ|\}}d||d	œ S tƒ  ||¡S )
Nú^zPOW(%s)ú,)ú&ú|z<<ú#r…   zCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s))©ÚlhsÚrhs)r@   ÚsuperÚcombine_expression)r   Z	connectorZsub_expressionsr‡   rˆ   ©Ú	__class__r   r   rŠ   +  s    z%DatabaseOperations.combine_expressionc                    s`   t ƒ  |¡}|j ¡ }|dkr,| | j¡ n0|dkrHtjr\| | j¡ n|dkr\| | j	¡ |S )NZBooleanFieldZDateTimeFieldZ	UUIDField)
r‰   Úget_db_convertersZoutput_fieldZget_internal_typerk   Úconvert_booleanfield_valuer   r2   Úconvert_datetimefield_valueÚconvert_uuidfield_value)r   Ú
expressionÚ
convertersÚinternal_typer‹   r   r   r�   8  s    
z$DatabaseOperations.get_db_convertersc                 C   s   |dv rt |ƒ}|S )N)r   r=   )Úbool©r   rK   r‘   r3   r   r   r   rŽ   D  s    z-DatabaseOperations.convert_booleanfield_valuec                 C   s   |d urt  || jj ¡}|S r.   )r
   Z
make_awarer3   r•   r   r   r   r�   I  s    z.DatabaseOperations.convert_datetimefield_valuec                 C   s   |d urt  |¡}|S r.   )ÚuuidÚUUIDr•   r   r   r   r�   N  s    
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |d urt |dƒsdS dS )NZas_sqlz
_binary %sú%s)rt   rq   r   r   r   Úbinary_placeholder_sqlS  s    ÿz)DatabaseOperations.binary_placeholder_sqlc           	      C   s€   |\}}|\}}|dkrb| j jr<d||dœ g |¢|¢R fS d||dœ t|ƒd t|ƒd  fS g |¢|¢R }d||f |fS )NZ	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))r3   Úmysql_is_mariadbÚtuple)	r   r“   r‡   rˆ   Zlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr   r   r   r   Úsubtract_temporalsX  s4    þýÿþúýÿþýz%DatabaseOperations.subtract_temporalsc                    sŽ   |r|  ¡ dkrd}n|s,d| jjjv r,d}| dd¡}tƒ j|fi |¤Ž}|rn| jjjrn| jjrfdn|d }|rŠ|r~| jjrŠ|d| 7 }|S )	NZTEXTZTRADITIONALZTREEÚanalyzeFZANALYZEz ANALYZEz
 FORMAT=%s)	r   r3   rp   Zsupported_explain_formatsÚpopr‰   Úexplain_query_prefixZsupports_explain_analyzer›   )r   rA   Úoptionsrž   Úprefixr‹   r   r   r    r  s    ÿÿÿz'DatabaseOperations.explain_query_prefixc                 C   s0   | j jr|dkrdS dS |dkr$dnd}d| S )NÚregexz%s REGEXP BINARY %sz%s REGEXP %sÚcrB   zREGEXP_LIKE(%%s, %%s, '%s')©r3   r›   )r   r   Zmatch_optionr   r   r   Úregex_lookup‡  s    zDatabaseOperations.regex_lookupc                    s   |t jkrdS tƒ j|d�S )NzINSERT IGNORE INTO)Úon_conflict)r	   ZIGNOREr‰   Úinsert_statement)r   r§   r‹   r   r   r¨   ‘  s    
z#DatabaseOperations.insert_statementc                 C   s$   d}|dkr | j js|dv r d}|S )Nr˜   Z	JSONField)	ZiexactÚcontainsZ	icontainsrS   ZistartswithrT   Z	iendswithr£   ZiregexzJSON_UNQUOTE(%s)r¥   )r   r   r“   Úlookupr   r   r   Úlookup_cast–  s
    zDatabaseOperations.lookup_castc                    sJ   t |ttfƒrdS t |tƒr.|jr.|  |j¡S t|ddƒr>dS tƒ  |¡S )NTÚconditionalF)	Ú
isinstancer   r   r   r¬   Ú0conditional_expression_supported_in_where_clauser‘   rO   r‰   )r   r‘   r‹   r   r   r®   §  s    ÿzCDatabaseOperations.conditional_expression_supported_in_where_clausec                    sz   |t jkrhd}| jjs8| jjdkr2d|› �}d‰ q<d‰ nd‰ d ‡ fdd	„t| j|ƒD ƒ¡}|d
|i S tƒ  	||||¡S )Nz"ON DUPLICATE KEY UPDATE %(fields)s)é   r   é   zAS new z%(field)s = new.%(field)sz%(field)s = VALUES(%(field)s)z%(field)s = VALUE(%(field)s)r^   c                    s   g | ]}ˆ d |i ‘qS )r\   r   rZ   ©Z	field_sqlr   r   r]   Å  s   ÿz=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>r+   )
r	   ZUPDATEr3   r›   Zmysql_versionr@   ÚmaprV   r‰   Úon_conflict_suffix_sql)r   r+   r§   Zupdate_fieldsZunique_fieldsZconflict_suffix_sqlr‹   r±   r   r³   ´  s(    



þÿüz)DatabaseOperations.on_conflict_suffix_sql)N)N)NN)N)N)N)2Ú__name__Ú
__module__Ú__qualname__Zcompiler_moduler   Zinteger_field_rangesZcast_data_typesZ"cast_char_field_without_max_lengthZexplain_prefixr   r   r   r-   r1   r(   r5   r7   r8   rC   rD   rF   rG   rJ   rL   rP   rQ   rV   ra   rl   ro   rr   rw   rz   r|   r}   r€   rŠ   r�   rŽ   r�   r�   r™   r�   r    r¦   r¨   r«   r®   r³   Ú__classcell__r   r   r‹   r   r      s~   ÿüó
	

	

r   )r–   Zdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.db.backends.utilsr   Zdjango.db.modelsr   r   r   Zdjango.db.models.constantsr	   Zdjango.utilsr
   Zdjango.utils.encodingr   Zdjango.utils.regex_helperr   r   r   r   r   r   Ú<module>   s   