
    g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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e      Zy)    N)settings)BaseDatabaseOperationssplit_tzname_delta)ExistsExpressionWrapperLookup)
OnConflict)timezone)	force_str)_lazy_re_compilec                       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 Zd5dZd Zd Zd Zd Zd Zd Zd5dZd Zd Zd Zd6d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)d5 fd/	Z*d0 Z+d5 fd1	Z,d5d2Z- fd3Z. fd4Z/ xZ0S )7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                     |dk(  rd| d|fS |dk(  rd| d|fS |dk(  rd| d	|fS |d
k(  rd| d|fS |j                         }| j                  j                  |      st        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paramss       {/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/backends/mysql/operations.pydate_extract_sqlz#DatabaseOperations.date_extract_sql,   s    *$uA&..N*cU%(&00F" 3%t$f,,J& (uO<fDD &++-K**44[A #9+!IJJk]&Q7??    c                     | j                  |||      \  }}ddd}||v r||   }d| dg ||fS |dk(  rd| d| d	g ||fS |d
k(  rd| d| dg ||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_strs          r.   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlD   s    --c66BV
 & ,J&se>:<Qf<Qj<QQQI%  &$$'5(FH"&"6" 
 F"se#6se6BDVfDVvDVVV3%q>6))r0   c                 4    t        |      \  }}}|r| | S |S Nr   )r*   r<   signoffsets       r.   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltaX   s)    1&9f$*$x 66r0   c                     |r[t         j                  rK| j                  j                  |k7  r2d| dg || j                  j                  | j	                  |      fS ||fS )NzCONVERT_TZ(z	, %s, %s))r   USE_TZ
connectiontimezone_namerD   r*   r,   r-   r<   s       r.   r:   z%DatabaseOperations._convert_sql_to_tz\   sr    hoo$//*G*G6*Q Y/ 22--2 **622  
 F{r0   c                 >    | j                  |||      \  }}d| d|fS )Nr8   r"   r9   rI   s       r.   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqle   -    --c66BVse1~v%%r0   c                 >    | j                  |||      \  }}d| d|fS )NTIME(r"   r9   rI   s       r.   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqli   rL   r0   c                 T    | j                  |||      \  }}| j                  |||      S rA   )r:   r/   )r*   r+   r,   r-   r<   s        r.   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlm   s/    --c66BV$$[#v>>r0   c                 6   | j                  |||      \  }}g d}d}d}|dk(  rd| d| dg ||dfS |d	k(  rd
| d| dg ||dfS 	 |j                  |      dz   }dj                  |d | ||d  z         }	d| dg ||	fS # t        $ r Y ||fS w xY w)N)r2   r3   dayhourminutesecond)z%Y-z%mz-%dz %H:z%iz:%s)z0000-01z-01z 00:00z:00r5   zCAST(DATE_FORMAT(MAKEDATE(YEAR(r6   z0) QUARTER - INTERVAL 1 QUARTER, %s) AS DATETIME)z%Y-%m-01 00:00:00r$   zCAST(DATE_FORMAT(DATE_SUB(r7   z) DAY), %s) AS DATETIME)z%Y-%m-%d 00:00:00    r4   z, %s) AS DATETIME))r:   indexjoinr)   )
r*   r+   r,   r-   r<   r=   format
format_defir>   s
             r.   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sqlq   s&   --c66BVE:@
)#1# 7$$'5 )78 76&6"56	7 7
 & 5 3C58PR66&6"567 7	V[)A-A jn!<=J&se+=>@U&@U*@UUU	  	 F{	s   B	 		BBc                 v    | j                  |||      \  }}dddd}||v r||   }d| dg ||fS d| d|fS )	Nz%H:00:00z%H:%i:00z%H:%i:%s)rT   rU   rV   r4   z, %s) AS TIME)rN   r"   r9   r;   s          r.   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   sp    --c66BV  

 & ,J&se>:<Qf<Qj<QQQ3%q>6))r0   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    
   r0   c                     d|z  S )NzINTERVAL %s MICROSECOND )r*   r,   s     r.   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmetic   s    (3..r0   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NULLFrh   r*   s    r.   force_no_orderingz$DatabaseOperations.force_no_ordering   s     E*+,,r0   c                     |S rA   rh   )r*   value
max_digitsdecimal_placess       r.   adapt_decimalfield_valuez+DatabaseOperations.adapt_decimalfield_value   s    r0   c                 2    t        t        |dd       d      S )N	_executedreplace)errors)r   getattr)r*   re   r,   r-   s       r.   last_executed_queryz&DatabaseOperations.last_executed_query   s    
 d;INNr0   c                      y)Nr   rh   rl   s    r.   no_limit_valuez!DatabaseOperations.no_limit_value   s    #r0   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}r0   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)rZ   rh   .zRETURNING %s, rh   )r   model_metadb_tablecolumnr\   )r*   r=   fieldcolumnss       r.   return_insert_columnsz(DatabaseOperations.return_insert_columns   s|      
    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_FIELDr   .0
table_namer*   styles     r.   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   sB       #)J %%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>   sP       #)J	 %%h/%%f-OODOOJ$?@	 #)s   AAzSET FOREIGN_KEY_CHECKS = 1;)extendappend)r*   r   tablesr   r   r,   s   ``    r.   	sql_flushzDatabaseOperations.sql_flush   sd    I,- JJ  #)  JJ  #)  	

01
r0   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   sr     "+	
 "+ !!'*!!'*g0F GH 01 "+	
 		
 	
s   A#A+c                 f    |dk(  r+| j                   j                  j                  st        d      |S )Nr   z@The database backend does not accept 0 as a value for AutoField.)rG   featuresallows_auto_pk_0r)   r*   ro   s     r.   validate_autopk_valuez(DatabaseOperations.validate_autopk_value   s4     A:doo66GGR  r0   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   rF   
make_naiverG   r)   strr   s     r.   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value   s{    = 5./L U# ++E4??3K3KL 5z	 !'  5zr0   c                     |y t        |d      r|S t        j                  |      rt        d      |j	                  d      S )Nr   z4MySQL backend does not support timezone-aware times.microseconds)timespec)r   r   r   r)   	isoformatr   s     r.   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value  sI    = 5./L U#STT77r0   c                      y)N@   rh   rl   s    r.   max_name_lengthz"DatabaseOperations.max_name_length  s    r0   c                      y)Nrk   rh   rl   s    r.   pk_default_valuez#DatabaseOperations.pk_default_value"  s    r0   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)r\   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Er0   c                 B   t         |   |      }|j                  j                         }|dk(  r|j	                  | j
                         |S |dk(  r-t        j                  r|j	                  | j                         |S |dk(  r|j	                  | j                         |S )NBooleanFieldDateTimeField	UUIDField)
r   get_db_convertersoutput_fieldget_internal_typer   convert_booleanfield_valuer   rF   convert_datetimefield_valueconvert_uuidfield_value)r*   
expression
convertersinternal_typer   s       r.   r   z$DatabaseOperations.get_db_converters2  s    W.z:
"//AACN*d==>  o-!!$"B"BC  k)d::;r0   c                 $    |dv rt        |      }|S )N)r   rY   )boolr*   ro   r   rG   s       r.   r   z-DatabaseOperations.convert_booleanfield_value>  s    F?KEr0   c                 ^    |*t        j                  || j                  j                         }|S rA   )r   
make_awarerG   r   s       r.   r   z.DatabaseOperations.convert_datetimefield_valueC  s)    ''t/G/GHEr0   c                 4    |t        j                  |      }|S rA   )uuidUUIDr   s       r.   r   z*DatabaseOperations.convert_uuidfield_valueH  s    IIe$Er0   c                 &    |t        |d      sdS dS )Nas_sqlz
_binary %s%s)r   r   s     r.   binary_placeholder_sqlz)DatabaseOperations.binary_placeholder_sqlM  s     !-geX6NL	
TX	
r0   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"   )rG   mysql_is_mariadbtuple)	r*   r   r   r   lhs_sql
lhs_paramsrhs_sql
rhs_paramsr-   s	            r.   subtract_temporalsz%DatabaseOperations.subtract_temporalsR  s    !!K'//+ #"	 	L01 38
2Ca2G%KK 3  ,:+
+7>H&PPr0   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  }|S )	NTEXTTRADITIONALTREEanalyzeFANALYZEz ANALYZEz
 FORMAT=%s)	r&   rG   r   supported_explain_formatspopr   explain_query_prefixsupports_explain_analyzer   )r*   r]   optionsr   prefixr   s        r.   r   z'DatabaseOperations.explain_query_prefixl  s    flln."F6T__%=%=%W%WW F++i/-f@@t//HH "__==	6JCV  74??+K+KlV++Fr0   c                 X    | j                   j                  r|dk(  ryy|dk(  rdnd}d|z  S )Nregexz%s REGEXP BINARY %sz%s REGEXP %scr_   zREGEXP_LIKE(%%s, %%s, '%s')rG   r   )r*   r+   match_options      r.   regex_lookupzDatabaseOperations.regex_lookup  s6    ??++g%,!)W4s#,|;;r0   c                 L    |t         j                  k(  ryt        |   |      S )NzINSERT IGNORE INTO)on_conflict)r
   IGNOREr   insert_statement)r*   r  r   s     r.   r  z#DatabaseOperations.insert_statement  s'    *+++'w'K'@@r0   c                 L    d}|dk(  r| j                   j                  s|dv rd}|S )Nr   	JSONField)	iexactcontains	icontainsr}   istartswithr~   	iendswithr   iregexzJSON_UNQUOTE(%s)r   )r*   r+   r   lookups       r.   lookup_castzDatabaseOperations.lookup_cast  s5    K'//; 
C 
4 ,r0   c                     t        |t        t        f      ryt        |t              r'|j                  r| j                  |j                        S t        |dd      ryt        |   |      S )NTconditionalF)	
isinstancer   r	   r   r  0conditional_expression_supported_in_where_clauser   rw   r   )r*   r   r   s     r.   r  zCDatabaseOperations.conditional_expression_supported_in_where_clause  sg     j66"23j"349O9OHH%%  :}e4wG
SSr0   c                 R   |t         j                  k(  r}d}| j                  j                  s$| j                  j                  dk\  rd| }d}nd}nd}dj                  t        | j                  |      D cg c]	  }|d|iz   c}      }|d	|iz  S t        | %  ||||      S c c}w )
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   r   r=   )
r
   UPDATErG   r   mysql_versionr\   mapr   r   on_conflict_suffix_sql)	r*   r=   r  update_fieldsunique_fieldsconflict_suffix_sql	field_sqlr   r   s	           r.   r  z)DatabaseOperations.on_conflict_suffix_sql  s    *+++"F ??33??00J>,34G3H*I' ;I ?I ;	YY "%T__m!D!D % 00!DF '(F);;;w-	
 	
s   6B$rA   )NN)1__name__
__module____qualname__compiler_moduler   integer_field_rangescast_data_types"cast_char_field_without_max_lengthexplain_prefixr   r'   r/   r?   rD   r:   rK   rO   rQ   r`   rb   rf   ri   rm   rr   rx   rz   r   r   r   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      sB   9O
 
5
5%/ /#<	 &(*+E(+-#5 2%7)O *0&N **5@0*(7&&?2*!/-O$
7 ;@u >

&8F





Q4*<A
"T
 
r0   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   rh   r0   r.   <module>r0     s2       E 7 > > 1 ! + 6}
/ }
r0   