
    Evg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dS )    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d6dZd Zd Zd Zd Zd Zd Zd6dZd Zd Zd Zd7d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)d6 fd0	Z*d1 Z+d6 fd2	Z,d6d3Z- fd4Z. fd5Z/ xZ0S )8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                            |          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/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/backends/mysql/operations.pydate_extract_sqlz#DatabaseOperations.date_extract_sql,   s    *$$&&&&..N**(c(((&00F"" %3$$$f,,J&& =<<<fDD &++--K*44[AA K !I+!I!IJJJ7k77777??    Nc                     |                      |||          \  }}ddd}||v r||         }d| dg ||R fS |dk    rd| d| d	g ||R fS |d
k    rd| 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_strs          r.   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlD   s   --c66BBV
 
 &  ,J:s:::<Qf<Qj<Q<QQQI%%H H H$'H H H"&"6"" 
 F""BsBBsBBBDVfDVvDVDVVV!3>>>6))r0   c                 <    t          |          \  }}}|r| | n|S Nr   )r*   r<   signoffsets       r.   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltaX   s1    1&99f$*6$    6r0   c                     |rHt           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_namerD   r*   r,   r-   r<   s       r.   r:   z%DatabaseOperations._convert_sql_to_tz\   s}     	ho 	$/*G6*Q*Q//// 22-2 **6222 2  
 F{r0   c                 F    |                      |||          \  }}d| d|fS )Nr8   r"   r9   rI   s       r.   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqle   0    --c66BBVs~~~v%%r0   c                 F    |                      |||          \  }}d| d|fS )NTIME(r"   r9   rI   s       r.   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqli   rL   r0   c                 d    |                      |||          \  }}|                     |||          S rA   )r:   r/   )r*   r+   r,   r-   r<   s        r.   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlm   s5    --c66BBV$$[#v>>>r0   c                 j   |                      |||          \  }}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 	 |                    |          dz   }d                    |d |         ||d          z             }	d| dg ||	R fS # t          $ r Y nw xY w||fS )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   so   --c66BBVEEE:@
)##8# 8 8$'8 8 8 76&6"566	7 7
 &  RR R47R R R66&6"5667 7	V[))A-A jn!<==J>s>>>@U&@U*@U@UUU	  	 	 	D	
 F{s   B! !
B.-B.c                     |                      |||          \  }}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)rT   rU   rV   r4   z, %s) AS TIME)rN   r"   r9   r;   s          r.   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s    --c66BBV  
 

 &  ,J:s:::<Qf<Qj<Q<QQQ!3>>>6))r0   c                 *    |                                 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                 B    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NNNr0   c                     dS )Nr   rh   rl   s    r.   no_limit_valuez!DatabaseOperations.no_limit_value   s    ##r0   c                 d    |                     d          r|                    d          r|S d|z  S )N`z`%s`)
startswithendswith)r*   names     r.   
quote_namezDatabaseOperations.quote_name   s8    ??3 	DMM#$6$6 	K}r0   c                 \     |sdS  fd|D             }dd                     |          z  dfS )N)rZ   rh   c                     g | ]C}                     |j        j        j                  d                      |j                  DS ).)r   model_metadb_tablecolumn).0fieldr*   s     r.   
<listcomp>z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>   s^     
 
 
   1 :;;;;---
 
 
r0   zRETURNING %s, rh   )r\   )r*   r=   columnss   `  r.   return_insert_columnsz(DatabaseOperations.return_insert_columns   sX     	6
 
 
 
  
 
 
 		' 2 22B66r0   F)reset_sequencesallow_cascadec                     |sg S dg}|r#|                      fd|D                        n"|                      fd|D                        |                    d           |S )NzSET FOREIGN_KEY_CHECKS = 0;c              3      K   | ]E}                     d           d                                        |                    dV  FdS )TRUNCATE ;NSQL_KEYWORD	SQL_FIELDr   r   
table_namer*   styles     r.   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   ss          %%j1111OODOOJ$?$?@@@@     r0   c           
   3      K   | ][}                     d           d                     d          d                                        |                    dV  \dS )DELETEr   FROMr   Nr   r   s     r.   r   z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s         	 %%h////%%f----OODOOJ$?$?@@@@	     r0   zSET FOREIGN_KEY_CHECKS = 1;)extendappend)r*   r   tablesr   r   r,   s   ``    r.   	sql_flushzDatabaseOperations.sql_flush   s     	I,- 	 JJ      #)       JJ      #)      	

0111
r0   c                 $      fd|D             S )Nc                     g | ]u}                     d           d                     d          d                                        |d                             d                    d          dvS )ALTERr   TABLEtableAUTO_INCREMENTz = 1;r   )r   sequence_infor*   r   s     r.   r   zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>   s     	
 	
 	
  !!'****!!'****g0F G GHHHH 01111	
 	
 	
r0   rh   )r*   r   	sequencess   `` r.   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   s6    	
 	
 	
 	
 	
 "+	
 	
 	
 		
r0   c                 R    |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   s5     A::do6G:R   r0   c                     |d S t          |d          r|S t          j        |          r;t          j        r t          j        || 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   rF   
make_naiverG   r)   strr   s     r.   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value   s    =4 5.// 	L U## 	  +E4?3KLL '   5zzr0   c                     |d S t          |d          r|S t          j        |          rt          d          |                    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  s_    =4 5.// 	L U## 	USTTT777r0   c                     dS )N@   rh   rl   s    r.   max_name_lengthz"DatabaseOperations.max_name_length  s    rr0   c                     dS )Nrk   rh   rl   s    r.   pk_default_valuez#DatabaseOperations.pk_default_value"  s    vr0   c                     |dk    rdd                     |          z  S |dv r"|dk    rdn|}d|                     |          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8 ///(C//YI(9>>/+J+JJJ$&HC5C8P8PPPww)))_EEEr0   c                 X   t                                          |          }|j                                        }|dk    r|                    | j                   nM|dk    r't          j        r|                    | j                   n |dk    r|                    | 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    WW..z::
"/AACCN**d=>>>>o-- D!!$"BCC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??KKEr0   c                 H    |t          j        || j        j                   }|S rA   )r   
make_awarerG   r   s       r.   r   z.DatabaseOperations.convert_datetimefield_valueC  s$    't/GHHEr0   c                 2    |t          j        |          }|S rA   )uuidUUIDr   s       r.   r   z*DatabaseOperations.convert_uuidfield_valueH  s    Ie$$Er0   c                 .    |t          |d          sdndS )Nas_sqlz
_binary %s%s)r   r   s     r.   binary_placeholder_sqlz)DatabaseOperations.binary_placeholder_sqlM  s#    !-geX6N6N-LLTX	
r0   c                     |\  }}|\  }}|dk    rH| j         j        rd||dz  g ||R fS d||dz  t          |          dz  t          |          dz  z   fS g ||R }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01 38
2C2Ca2G%K KK 3  ,:+
++7>wwH&PPr0   c                 L   |r|                                 dk    rd}n|sd| j        j        j        v rd}|                    dd          } t                      j        |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     	fllnn.."FF	!T_%=%WWW F++i//--f@@@@ 	t/H 	 "_=V		6JCV   	,7 	,4?+K 	,lV++Fr0   c                 L    | j         j        r
|dk    rdS dS |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  sC    ?+ 	"g%%,,!>)W44ss#,|;;r0   c                 l    |t           j        k    rdS t                                          |          S )NzINSERT IGNORE INTO)on_conflict)r
   IGNOREr   insert_statement)r*   r  r   s     r.   r  z#DatabaseOperations.insert_statement  s2    *+++''ww''K'@@@r0   c                 :    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  s=    K''/ ,; 
C 
4 
4 ,r0   c                    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   rw   r   )r*   r   r   s     r.   r  zCDatabaseOperations.conditional_expression_supported_in_where_clause  s     j66"233 	4j"344 	9O 	HH%   :}e44 	5wwGG
SSSr0   c                 :   |t           j        k    rfd}| j        j        s| j        j        dk    rd| }dndndd                    fdt          | j        |          D                       }|d	|iz  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                     g | ]	}d |iz  
S )r   rh   )r   r   	field_sqls     r.   r   z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>  s3        % 00  r0   r=   )
r
   UPDATErG   r   mysql_versionr\   mapr   r   on_conflict_suffix_sql)r*   r=   r  update_fieldsunique_fieldsconflict_suffix_sqlr  r   s         @r.   r  z)DatabaseOperations.on_conflict_suffix_sql  s    *+++"F ?3 ;?0J>>*I4G*I*I' ;II ?II ;	YY   !$T_m!D!D   F '(F);;;ww--	
 
 	
r0   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      sT       9O
 
5%/ /#<	   &(*+E(+-#5 2%7) O *0&N *)*55@ @ @0* * * *(7 7 7  & & && & &? ? ?  2* * * *! ! !/ / /- - -   O O O$ $ $  
7 7 7 ;@u     >

 

 

    &8 8 8    F F F F F
 
 
 
 
  
  
  

 
 

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