o
    <gH                     @   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" fdAdBZ# fdCdDZ$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)d[ fdOdP	Z*dQdR Z+d[ fdSdT	Z,d[dUdVZ- fdWdXZ. fdYdZZ/  Z0S )]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)	AutoFieldBigAutoFieldSmallAutoField	CharFieldDecimalField	TextFieldIntegerFieldBigIntegerFieldSmallIntegerFieldr   r   r   DurationFieldEXPLAINz[A-Z_]+c                 C   s   |dkrd| d|fS |dkrd| d|fS |dkr$d| d	|fS |d
kr0d| d|fS |  }| j|sAtd|d| d| d|fS )Nweek_dayz
DAYOFWEEK()iso_week_dayzWEEKDAY(z) + 1weekzWEEK(z, 3)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+   V/var/www/html/venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.pydate_extract_sql,   s   z#DatabaseOperations.date_extract_sqlNc                 C   s   |  |||\}}ddd}||v r#|| }d| dg ||R fS |dkr7d| d| d	g ||R fS |d
krKd| d| dg ||R fS d| d|f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'   r8   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
connectiontimezone_namer?   r'   r)   r*   r8   r+   r+   r,   r6   \   s   z%DatabaseOperations._convert_sql_to_tzc                 C   "   |  |||\}}d| d|fS )Nr4   r   r5   rC   r+   r+   r,   datetime_cast_date_sqle      z)DatabaseOperations.datetime_cast_date_sqlc                 C   rD   )NTIME(r   r5   rC   r+   r+   r,   datetime_cast_time_sqli   rF   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s    |  |||\}}| |||S r<   )r6   r-   )r'   r(   r)   r*   r8   r+   r+   r,   datetime_extract_sqlm   s   z'DatabaseOperations.datetime_extract_sqlc           
      C   s   |  |||\}}g d}d}d}|dkr'd| d| dg ||dR fS |d	kr=d
| d| dg ||dR fS z	||d }W n tyR   Y ||fS w d|d | ||d   }	d| dg ||	R fS )N)r.   r/   dayhourminutesecond)z%Y-z%mz-%dz %H:z%iz:%s)z0000-01z-01z 00:00z:00r1   zCAST(DATE_FORMAT(MAKEDATE(YEAR(r2   z0) QUARTER - INTERVAL 1 QUARTER, %s) AS DATETIME)z%Y-%m-01 00:00:00r!   zCAST(DATE_FORMAT(DATE_SUB(r3   z) DAY), %s) AS DATETIME)z%Y-%m-%d 00:00:00    r0   z, %s) AS DATETIME))r6   indexr&   join)
r'   r(   r)   r*   r8   r9   format
format_defir:   r+   r+   r,   datetime_trunc_sqlq   s4   z%DatabaseOperations.datetime_trunc_sqlc                 C   sX   |  |||\}}dddd}||v r$|| }d| dg ||R fS d| d|fS )	Nz%H:00:00z%H:%i:00z%H:%i:%s)rK   rL   rM   r0   z, %s) AS TIME)rG   r   r5   r7   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.
        )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'   value
max_digitsdecimal_placesr+   r+   r,   adapt_decimalfield_value      z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   t t|dd ddS )N	_executedreplace)errors)r   getattr)r'   rZ   r)   r*   r+   r+   r,   last_executed_query   s   z&DatabaseOperations.last_executed_queryc                 C      dS )Nr   r+   r^   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)rQ   r+   c                    s,   g | ]}d   |jjj  |jf qS )z%s.%s)rp   model_metadb_tablecolumn.0fieldr^   r+   r,   
<listcomp>   s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %s, r+   )rS   )r'   r9   columnsr+   r^   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;TRUNCATENSQL_KEYWORD	SQL_FIELDrp   rv   
table_namer'   styler+   r,   	<genexpr>   s    
z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              	   3   s6    | ]}d  d d |f V  qdS )z	%s %s %s;DELETEFROMNr   r   r   r+   r,   r      s    
zSET FOREIGN_KEY_CHECKS = 1;)extendappend)r'   r   tablesr|   r}   r)   r+   r   r,   	sql_flush   s   

	zDatabaseOperations.sql_flushc                    s    fdd|D S )Nc                    s>   g | ]}d  d d |d df qS )z%s %s %s %s = 1;ALTERTABLEtableAUTO_INCREMENTr   )rv   sequence_infor   r+   r,   rx      s    zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>r+   )r'   r   	sequencesr+   r   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.)rA   featuresallows_auto_pk_0r&   r'   r`   r+   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_naiverA   r&   strr   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 )Nr   z4MySQL backend does not support timezone-aware times.microseconds)timespec)r   r
   r   r&   	isoformatr   r+   r+   r,   adapt_timefield_value  s   

z(DatabaseOperations.adapt_timefield_valuec                 C   rj   )N@   r+   r^   r+   r+   r,   max_name_length  rd   z"DatabaseOperations.max_name_lengthc                 C   rj   )Nr]   r+   r^   r+   r+   r,   pk_default_value"  rd   z#DatabaseOperations.pk_default_valuec                    sh   |dkrdd | S |dv r|dkrdn|}d| | S |dkr-|\}}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)rS   supercombine_expression)r'   	connectorsub_expressionsr   r   	__class__r+   r,   r   %  s   z%DatabaseOperations.combine_expressionc                    sd   t  |}|j }|dkr|| j |S |dkr&tjr$|| j |S |dkr0|| j	 |S )NBooleanField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   2  s   
z$DatabaseOperations.get_db_convertersc                 C   s   |dv rt |}|S )N)r   rP   )boolr'   r`   r   rA   r+   r+   r,   r   >  s   z-DatabaseOperations.convert_booleanfield_valuec                 C   s   |d urt || jj }|S r<   )r
   
make_awarerA   r   r+   r+   r,   r   C  s   z.DatabaseOperations.convert_datetimefield_valuec                 C   s   |d ur	t |}|S r<   )uuidUUIDr   r+   r+   r,   r   H  s   
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |d urt |dsdS dS )Nas_sqlz
_binary %s%s)r   r   r+   r+   r,   binary_placeholder_sqlM  s   z)DatabaseOperations.binary_placeholder_sqlc           	      C   s   |\}}|\}}|dkr1| j jrd||d g ||R fS d||d t|d t|d  fS g ||R }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))rA   mysql_is_mariadbtuple)	r'   r   r   r   lhs_sql
lhs_paramsrhs_sql
rhs_paramsr*   r+   r+   r,   subtract_temporalsR  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 |}|r7| jjjr7| jjr3dn|d }|rE|r?| jjrE|d| 7 }|S )	NTEXTTRADITIONALTREEanalyzeFANALYZEz ANALYZEz
 FORMAT=%s)	r#   rA   r   supported_explain_formatspopr   explain_query_prefixsupports_explain_analyzer   )r'   rT   optionsr   prefixr   r+   r,   r   l  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crV   zREGEXP_LIKE(%%s, %%s, '%s')rA   r   )r'   r(   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	   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   	JSONField)	iexactcontains	icontainsrm   istartswithrn   	iendswithr   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   rh   r   )r'   r   r   r+   r,   r     s   zCDatabaseOperations.conditional_expression_supported_in_where_clausec                    sz   |t jkr4d}| jjs| jjdkrd| }d n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)ry   c                    s   g | ]} d |i qS )rw   r+   ru   	field_sqlr+   r,   rx     s    
z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>r9   )
r	   UPDATErA   r   mysql_versionrS   maprp   r   on_conflict_suffix_sql)r'   r9   r   update_fieldsunique_fieldsconflict_suffix_sqlr   r   r,   r     s(   



z)DatabaseOperations.on_conflict_suffix_sqlr<   )NN)1__name__
__module____qualname__compiler_moduler   integer_field_rangescast_data_types"cast_char_field_without_max_lengthexplain_prefixr   r$   r-   r;   r?   r6   rE   rH   rI   rW   rX   r[   r\   r_   rc   ri   rk   rp   r{   r   r   r   r   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   django.confr   "django.db.backends.base.operationsr   django.db.backends.utilsr   django.db.modelsr   r   r   django.db.models.constantsr	   django.utilsr
   django.utils.encodingr   django.utils.regex_helperr   r   r+   r+   r+   r,   <module>   s    