o
    ^"<f>                     @   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)	force_strc                       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dd Z	dXddZ
dd Zdd Zdd Zdd Zdd Zdd ZdXddZd d! Zd"d# Zd$d% ZdYd&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d0d1d2d3Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z! fdBdCZ" fdDdEZ#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dX fdPdQ	Z)dRdS Z*dZ fdTdU	Z+dXdVdWZ,  Z-S )[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EXPLAINc                 C   sP   |dkrd| S |dkrd| S |dkrd| S |dkr d| S d	|  |f S )
Nweek_dayzDAYOFWEEK(%s)iso_week_dayzWEEKDAY(%s) + 1weekzWEEK(%s, 3)iso_yearz#TRUNCATE(YEARWEEK(%s, 3), -2) / 100zEXTRACT(%s FROM %s))upper)selflookup_type
field_name r   Z/var/www/html/kck/venv/lib/python3.10/site-packages/django/db/backends/mysql/operations.pydate_extract_sql%   s   z#DatabaseOperations.date_extract_sqlNc                 C   sb   |  ||}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)_convert_field_to_tzr   r   r   tznamefields
format_strr   r   r    date_trunc_sql:   s    z!DatabaseOperations.date_trunc_sqlc                 C   s8   d|v r|| dd  S d|v r|| dd  S |S )N+-)find)r   r)   r   r   r    _prepare_tzname_deltaN   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s2   |rt jr| jj|krd|| jj| |f }|S )NzCONVERT_TZ(%s, '%s', '%s'))r   USE_TZ
connectiontimezone_namer0   r   r   r)   r   r   r    r'   U   s   z'DatabaseOperations._convert_field_to_tzc                 C      |  ||}d| S )Nr%   r&   r4   r   r   r    datetime_cast_date_sql^      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r5   )NTIME(%s)r&   r4   r   r   r    datetime_cast_time_sqlb   r7   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |  ||}| ||S N)r'   r!   )r   r   r   r)   r   r   r    datetime_extract_sqlf   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||	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$   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   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'   formatindex
ValueErrorjoin)
r   r   r   r)   r*   rD   
format_defisqlr+   r   r   r    datetime_trunc_sqlj   s*   z%DatabaseOperations.datetime_trunc_sqlc                 C   s<   |  ||}dddd}||v r|| }d||f S d| S )Nz	%%H:00:00z
%%H:%%i:00z%%H:%%i:%%s)r=   r>   r?   z#CAST(DATE_FORMAT(%s, '%s') AS TIME)r8   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.
        )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   rJ   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   rN   rJ   paramsr   r   r    last_executed_query   s   z&DatabaseOperations.last_executed_queryc                 C      dS )Nr   r   rR   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)rC   r   c                    s,   g | ]}d   |jjj  |jf qS )z%s.%s)re   model_metadb_tablecolumn).0fieldrR   r   r    
<listcomp>   s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %s, r   rG   )r   r*   columnsr   rR   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_FIELDre   rj   
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FROMNrt   rw   ry   r   r    r{      s    
zSET FOREIGN_KEY_CHECKS = 1;)extendappend)r   rz   tablesrq   rr   rJ   r   ry   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_INCREMENTrt   )rj   sequence_infory   r   r    rl      s    zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>r   )r   rz   	sequencesr   ry   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.)r2   featuresallows_auto_pk_0rF   r   rT   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   r1   
make_naiver2   rF   strr   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 )Nr   z4MySQL backend does not support timezone-aware times.)r   r   r   rF   r   r   r   r   r    adapt_timefield_value   s   

z(DatabaseOperations.adapt_timefield_valuec                 C   r_   )N@   r   rR   r   r   r    max_name_length  rX   z"DatabaseOperations.max_name_lengthc                 C   r_   )NrQ   r   rR   r   r   r    pk_default_value  rX   z#DatabaseOperations.pk_default_valuec                 C   s*   dd |D }d dd |D }d| S )Nc                 s   s    | ]}d  |V  qdS )rm   Nrn   )rj   rowr   r   r    r{     s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rm   c                 s   s    | ]}d | V  qdS )z(%s)Nr   )rj   rJ   r   r   r    r{     s    zVALUES rn   )r   r*   placeholder_rowsplaceholder_rows_sql
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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)rG   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   r1   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   rB   )boolr   rT   r   r2   r   r   r    r   2  s   z-DatabaseOperations.convert_booleanfield_valuec                 C   s   |d urt || jj }|S r:   )r   
make_awarer2   r   r   r   r    r   7  s   z.DatabaseOperations.convert_datetimefield_valuec                 C   s   |d ur	t |}|S r:   )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 %s%s)r   r   r   r   r    binary_placeholder_sqlA  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))r2   mysql_is_mariadbtuple)	r   r   r   r   lhs_sql
lhs_paramsrhs_sql
rhs_paramsr]   r   r   r    subtract_temporalsD  s    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   r2   r   supported_explain_formatspopr   explain_query_prefixsupports_explain_analyzer   )r   rD   optionsr   prefixr   r   r    r   U  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crI   zREGEXP_LIKE(%%s, %%s, '%s'))r2   mysql_versionr   )r   r   match_optionr   r   r    regex_lookupf  s   zDatabaseOperations.regex_lookupc                    s   |rdS t  |S )NzINSERT IGNORE INTO)r   insert_statement)r   ignore_conflictsr   r   r    r   q  s   z#DatabaseOperations.insert_statementc                 C   s$   d}|dkr| j js|dv rd}|S )Nr   	JSONField)	iexactcontains	icontainsrb   istartswithrc   	iendswithr   iregexzJSON_UNQUOTE(%s))r2   r   )r   r   r   lookupr   r   r    lookup_castt  s
   zDatabaseOperations.lookup_castr:   )NN)F).__name__
__module____qualname__compiler_moduler   integer_field_rangescast_data_types"cast_char_field_without_max_lengthexplain_prefixr!   r,   r0   r'   r6   r9   r;   rK   rL   rO   rP   rS   rW   r^   r`   re   rp   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   	   sz    
	


r   )
r   django.confr   "django.db.backends.base.operationsr   django.utilsr   django.utils.encodingr   r   r   r   r   r    <module>   s    