
    h>                     ^    d dl Z d dl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e      Zy)	    N)settings)BaseDatabaseOperations)timezoneduration_microseconds)	force_strc                   \    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Zd	ZdZd Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zddd d!Zd" Zd# Zd$ Zd% Zd& Z d' Z! fd(Z" fd)Z#d* Z$d+ Z%d, Z&d- Z'd. Z(d3 fd/	Z)d0 Z*d4 fd1	Z+d3d2Z, xZ-S )5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   EXPLAINc                     |dk(  rd|z  S |dk(  rd|z  S |dk(  rd|z  S |dk(  rd|z  S d	|j                         d
|d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(z FROM ))upper)selflookup_type
field_names      f/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/mysql/operations.pydate_extract_sqlz#DatabaseOperations.date_extract_sql%   sm    *$"Z//N*$z11F" !:--J& 9:EE ' -8,=,=,?LL    c                 r    ddd}||v r||   }d|d|dS |dk(  r	d|d	|d
S |dk(  r	d|d|dS d|z  S )Nz	%%Y-01-01z
%%Y-%%m-01)yearmonthCAST(DATE_FORMAT(, 'z') AS DATE)quarterzMAKEDATE(YEAR(z), 1) + INTERVAL QUARTER(z) QUARTER - INTERVAL 1 QUARTERr   z	DATE_SUB(z, INTERVAL WEEKDAY(z) DAY)DATE(%s) r!   r"   r#   fields
format_strs        r$   date_trunc_sqlz!DatabaseOperations.date_trunc_sql:   sk    !
 & ,J<F
SSI%J  F"J  ,,r&   c                 f    d|v r||j                  d      d  S d|v r||j                  d      d  S |S )N+-)find)r!   tznames     r$   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltaM   sC    &=&++c*+,,F]&++c*+,,r&   c                     t         j                  rH| j                  j                  |k7  r/d|d| j                  j                  d| j	                  |      d}|S )NzCONVERT_TZ(r+   z', 'z'))r   USE_TZ
connectiontimezone_namer8   r!   r#   r7   s      r$   _convert_field_to_tzz'DatabaseOperations._convert_field_to_tzT   sG    ??t<<F--**62J
 r&   c                 0    | j                  ||      }d|z  S )Nr-   r>   r=   s      r$   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sql]       ..z6B
J&&r&   c                 0    | j                  ||      }d|z  S )NTIME(%s)r@   r=   s      r$   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqla   rB   r&   c                 J    | j                  ||      }| j                  ||      S N)r>   r%   )r!   r"   r#   r7   s       r$   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqle   s'    ..z6B
$$[*==r&   c                 *   | j                  ||      }g d}d}d}|dk(  rdj                  |      S |dk(  rdj                  |      S 	 |j                  |      d	z   }d
j                  |d | ||d  z         }d|d|d}	|	S # t        $ r |}	Y |	S w xY w)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)    r*   r+   z') AS DATETIME))r>   formatindexjoin
ValueError)
r!   r"   r#   r7   r0   rR   
format_defir1   sqls
             r$   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sqli   s    ..z6B
E@@
)#J f
f+	,
 & 7 f
f+	,
	W[)A-A jn!<=J?I:VC
  	C 
	s   
B BBc                 <    dddd}||v r||   }d|d|dS d|z  S )	Nz	%%H:00:00z
%%H:%%i:00z%%H:%%i:%%s)rK   rL   rM   r*   r+   z') AS TIME)rD   r.   r/   s        r$   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s<    "#

 & ,J<F
SS,,r&   c                     dt        |      z  S NzINTERVAL %s MICROSECONDr   )r!   	timedeltas     r$   date_interval_sqlz$DatabaseOperations.date_interval_sql   s    (+@+KKKr&   c                 "    |j                         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!   cursors     r$   fetch_returned_insert_rowsz-DatabaseOperations.fetch_returned_insert_rows   s    
   r&   c                     d|z  S r]   r.   )r!   rX   s     r$   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmetic   s    (3..r&   c                     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!   s    r$   force_no_orderingz$DatabaseOperations.force_no_ordering   s     E*+,,r&   c                 2    t        t        |dd       d      S )N	_executedreplace)errors)r   getattr)r!   rb   rX   paramss       r$   last_executed_queryz&DatabaseOperations.last_executed_query   s    
 d;INNr&   c                      y)Nr   r.   rh   s    r$   no_limit_valuez!DatabaseOperations.no_limit_value   s    #r&   c                 T    |j                  d      r|j                  d      r|S d|z  S )N`z`%s`)
startswithendswith)r!   names     r$   
quote_namezDatabaseOperations.quote_name   s(    ??3DMM#$6K}r&   c                      y)NzRAND()r.   rh   s    r$   random_function_sqlz&DatabaseOperations.random_function_sql   s    r&   c                     |sy|D cg c]O  }| j                  |j                  j                  j                        d| j                  |j                        Q }}ddj                  |      z  dfS c c}w )N)rQ   r.   .zRETURNING %s, r.   )rx   model_metadb_tablecolumnrT   )r!   r0   fieldcolumnss       r$   return_insert_columnsz(DatabaseOperations.return_insert_columns   sy     
 "	
   1 1 : :;-
 
 		' 22B66
s   AA4F)reset_sequencesallow_cascadec                     |sg S dg}|r|j                   fd|D               n|j                   fd|D               |j                  d       |S )NzSET FOREIGN_KEY_CHECKS = 0;c              3      K   | ]9  }j                  d       dj                  j                  |            d ; yw)TRUNCATE ;NSQL_KEYWORD	SQL_FIELDrx   .0
table_namer!   styles     r$   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s@       ! %%j1OODOOJ$?@s   ?Ac           
   3      K   | ]K  }j                  d       dj                  d      dj                  j                  |            d M yw)DELETEr   FROMr   Nr   r   s     r$   r   z/DatabaseOperations.sql_flush.<locals>.<genexpr>   sN      
 ! %%h/%%f-OODOOJ$?@s   AAzSET FOREIGN_KEY_CHECKS = 1;)extendappend)r!   r   tablesr   r   rX   s   ``    r$   	sql_flushzDatabaseOperations.sql_flush   sd    I,- JJ  %+	  JJ 
 %+  	

01
r&   c                     |D cg c]^  }|j                  d      d|j                  d      d|j                  | j                  |d               d|j                  d      d` c}S c c}w )NALTERr   TABLEtableAUTO_INCREMENTz = 1;r   )r!   r   	sequencessequence_infos       r$   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   sk     $-
  	 !!'*!!'*g0F GH 01	
 	
 
s   A#A+c                 &    |dk(  rt        d      |S )Nr   z@The database backend does not accept 0 as a value for AutoField.)rU   r!   values     r$   validate_autopk_valuez(DatabaseOperations.validate_autopk_value   s     A: 4 5 5r&   c                    |y t        |d      r|S t        j                  |      rPt        j                  r5t        j
                  || 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_naiver;   rU   strr   s     r$   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value   ss    = 5./L U# ++E4??3K3KL 5z !!pqq5zr&   c                 z    |y t        |d      r|S t        j                  |      rt        d      t	        |      S )Nr   z4MySQL backend does not support timezone-aware times.)r   r   r   rU   r   r   s     r$   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value   sB    = 5./L U#STT5zr&   c                      y)N@   r.   rh   s    r$   max_name_lengthz"DatabaseOperations.max_name_length  s    r&   c                 N    d |D        }dj                  d |D              }d|z   S )Nc              3   >   K   | ]  }d j                  |        yw)r}   NrT   )r   rows     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>  s     K3		#Ks   r}   c              3   &   K   | ]	  }d |z    yw)z(%s)Nr.   )r   rX   s     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>  s     Lv|Ls   zVALUES r   )r!   r0   placeholder_rowsplaceholder_rows_sql
values_sqls        r$   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sql  s.    K:JKYYL7KLL
:%%r&   c                     |dk(  rddj                  |      z  S |dv r|dk(  rdn|}d|j                  |      z  S |dk(  r|\  }}d||d	z  S t        | 	  ||      S )
N^zPOW(%s),)&|z<<#r   zCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s))lhsrhs)rT   supercombine_expression)r!   	connectorsub_expressionsr   r   	__class__s        r$   r   z%DatabaseOperations.combine_expression  s    sxx888 //(C/YI(9>>/+JJJ$&HC5C8PPPw))_EEr&   c                 @   t         |   |      }|j                  j                         }|dv r|j	                  | j
                         |S |dk(  r-t        j                  r|j	                  | j                         |S |dk(  r|j	                  | 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   s       r$   r   z$DatabaseOperations.get_db_converters#  s    W.z:
"//AAC@@d==>  o-!!$"B"BC  k)d::;r&   c                 $    |dv rt        |      }|S )N)r   rP   )boolr!   r   r   r;   s       r$   r   z-DatabaseOperations.convert_booleanfield_value/  s    F?KEr&   c                 ^    |*t        j                  || j                  j                         }|S rG   )r   
make_awarer;   r   s       r$   r   z.DatabaseOperations.convert_datetimefield_value4  s)    ''t/G/GHEr&   c                 4    |t        j                  |      }|S rG   )uuidUUIDr   s       r$   r   z*DatabaseOperations.convert_uuidfield_value9  s    IIe$Er&   c                 &    |t        |d      sdS dS )Nas_sqlz
_binary %s%s)r   r   s     r$   binary_placeholder_sqlz)DatabaseOperations.binary_placeholder_sql>  s    $09Q|[W[[r&   c                     |\  }}|\  }}|dk(  rJ| j                   j                  rd||dz  g ||fS d||dz  t        |      dz  t        |      dz  z   fS g ||}d|d|d|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, r}   r   )r;   mysql_is_mariadbtuple)	r!   r   r   r   lhs_sql
lhs_paramsrhs_sql
rhs_paramsro   s	            r$   subtract_temporalsz%DatabaseOperations.subtract_temporalsA  s    !!K'// a"7d -Z-*-. .L01 38
2Ca2G%PZJ[^_J_2_` ` ,:+
+7>H&PPr&   c                    |r|j                         dk(  rd}n&|s$d| j                  j                  j                  v rd}|j	                  dd      }t        |   |fi |}|r=| j                  j                  j                  r| j                  j                  rdn|dz   }|r |r| j                  j                  r|d|z  z  }| j                  j                  j                  r	|s||d	z  }|S )
NTEXTTRADITIONALTREEanalyzeFANALYZEz ANALYZEz
 FORMAT=%sz	 EXTENDED)
r    r;   featuressupported_explain_formatspopr   explain_query_prefixsupports_explain_analyzer   needs_explain_extended)r!   rR   optionsr   prefixr   s        r$   r   z'DatabaseOperations.explain_query_prefixR  s    flln."FFdoo&>&>&X&XXF++i/-f@@t//HH"&//"B"BYQ[H[F74??+K+KlV++F??##::7v~k!Fr&   c                     | j                   j                  dk  s| j                   j                  r|dk(  ryy|dk(  rdnd}d|z  S )N)   r   r   regexz%s REGEXP BINARY %sz%s REGEXP %scrW   zREGEXP_LIKE(%%s, %%s, '%s'))r;   mysql_versionr   )r!   r"   match_options      r$   regex_lookupzDatabaseOperations.regex_lookupf  sI     ??((948X8Xg%,!)W4s#,|;;r&   c                 *    |rdS t         |   |      S )NzINSERT IGNORE INTO)r   insert_statement)r!   ignore_conflictsr   s     r$   r  z#DatabaseOperations.insert_statementq  s    '7#gUW=UVf=ggr&   c                 L    d}|dk(  r| j                   j                  s|dv rd}|S )Nr   	JSONField)	iexactcontains	icontainsru   istartswithrv   	iendswithr   iregexzJSON_UNQUOTE(%s))r;   r   )r!   r"   r   lookups       r$   lookup_castzDatabaseOperations.lookup_castt  s5    K'//; C 4 ,r&   rG   )F).__name__
__module____qualname__compiler_moduler   integer_field_rangescast_data_types"cast_char_field_without_max_lengthexplain_prefixr%   r2   r8   r>   rA   rE   rH   rY   r[   r_   rc   re   ri   rp   rr   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  __classcell__)r   s   @r$   r
   r
   
   s)   9O
 
5
5%/ /#<	 &(*+E(+-#5 2%7O *0&NM*-&''>4
-L!/-O$
7 ;@u 6
 &
F



\Q"(	<hr&   r
   )r   django.confr   "django.db.backends.base.operationsr   django.utilsr   django.utils.durationr   django.utils.encodingr   r
   r.   r&   r$   <module>r     s&       E ! 7 +r/ rr&   