
    afaC                         d dl Z d dlZ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mZm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mZmZ d dlmZ  G d de          ZdS )    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)
OnConflict)Col)timezone)
parse_dateparse_datetime
parse_time)cached_propertyc                   X    e Zd ZdZdddZdZ eg d          Zd Zd Z	d Z
d	 Zd
 Zd0dZd0d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ed             ZddddZd Zd Zd  Z  fd!Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z( fd)Z)d* Z*d+ Z+d, Z,d0 fd-	Z-d. Z. fd/Z/ xZ0S )1DatabaseOperationstextTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLAN)nullfalsetruec                     t          |          dk    rdS t          |          dk    r!| j        j        j        t          |          z  S t          |          S )z
        SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
        999 variables per query.

        If there's only a single field to insert, the limit is 500
        (SQLITE_MAX_COMPOUND_SELECT).
           i  )len
connectionfeaturesmax_query_params)selffieldsobjss      W/var/www/html/env/lib/python3.11/site-packages/django/db/backends/sqlite3/operations.pybulk_batch_sizez"DatabaseOperations.bulk_batch_size   sN     v;;!3[[1__?+<FKKt99    c                 
   t           j        t           j        t           j        f}t           j        t           j        t           j        t           j        f}t          ||          rU|	                                D ]@}	 |j
        }t          ||          rt          d          *# t          t          f$ r Y =w xY wt          |t           j                  r.|j        r)t!          |j                  dk    rt          d          d S d S d S )Nz{You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.r   zTSQLite doesn't support DISTINCT on aggregate functions accepting multiple arguments.)r	   r   r   	TimeFieldSumAvgVarianceStdDev
isinstanceget_source_expressionsoutput_fieldr   AttributeErrorr   	Aggregatedistinctr   source_expressions)r!   
expression
bad_fieldsbad_aggregatesexprr/   s         r$   check_expression_supportz+DatabaseOperations.check_expression_support,   s.   &(<f>NO
 *fj&/6=Qj.11 	"99;;  #'#4L ",
;; /@   '
3    D z6#344	#	 J122Q66#0  	 	 	 	 76s   9B  B43B4c                 >    d| d|                                 g|R fS )z
        Support EXTRACT with a user-defined function django_date_extract()
        that's registered in connect(). Use single quotes because this is a
        string and could otherwise cause a collision with a field name.
        zdjango_date_extract(%s, )lowerr!   lookup_typesqlparamss       r$   date_extract_sqlz#DatabaseOperations.date_extract_sqlH   s1     1#000;3D3D3F3F2P2P2PPPr&   c                 *    |                                 S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the list of returned data.
        )fetchall)r!   cursors     r$   fetch_returned_insert_rowsz-DatabaseOperations.fetch_returned_insert_rowsP   s    
    r&   c                     |S )z>Do nothing since formatting is handled in the custom function. )r!   r?   s     r$   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmeticW   s    
r&   Nc                 h    d| d|                                 g||                     |          R fS )Nzdjango_date_trunc(%s, 	, %s, %s)r<   _convert_tznames_to_sqlr!   r>   r?   r@   tznames        r$   date_trunc_sqlz!DatabaseOperations.date_trunc_sql[   S    66669
9
 ))&119
 9
 
 	
r&   c                 h    d| d|                                 g||                     |          R fS )Nzdjango_time_trunc(%s, rJ   rK   rM   s        r$   time_trunc_sqlz!DatabaseOperations.time_trunc_sqlb   rP   r&   c                 >    |rt           j        r|| j        j        fS dS )N)NN)r   USE_TZr   timezone_name)r!   rN   s     r$   rL   z*DatabaseOperations._convert_tznames_to_sqli   s(     	9ho 	94?888zr&   c                 B    d| dg ||                      |          R fS )Nzdjango_datetime_cast_date(rJ   rL   r!   r?   r@   rN   s       r$   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqln   B    :C::: =
=
))&11=
 =
 
 	
r&   c                 B    d| dg ||                      |          R fS )Nzdjango_datetime_cast_time(rJ   rW   rX   s       r$   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlt   rZ   r&   c                 h    d| d|                                 g||                     |          R fS )Nzdjango_datetime_extract(%s, rJ   rK   rM   s        r$   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlz   sS    <c<<<?
?
 ))&11?
 ?
 
 	
r&   c                 h    d| d|                                 g||                     |          R fS )Nzdjango_datetime_trunc(%s, rJ   rK   rM   s        r$   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   sS    :C:::=
=
 ))&11=
 =
 
 	
r&   c                 >    d| d|                                 g|R fS )Nzdjango_time_extract(%s, r:   r;   r=   s       r$   time_extract_sqlz#DatabaseOperations.time_extract_sql   s/    0#000;3D3D3F3F2P2P2PPPr&   c                     dS )NNULLrG   r!   s    r$   pk_default_valuez#DatabaseOperations.pk_default_value   s    vr&   c                    d}t          |          |k    rJd}t          dt          |          |          D ]'}||||z            }||                     |          z  }(|S dd                    dgt          |          z            z   }| j        j                                        }	 |                    ||                                          |                                 S # |                                 w xY w)zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        i  rG   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr   rD   executefetchoneclose)r!   r@   
BATCH_SIZEresultsindexchunkr?   rD   s           r$   rj   z8DatabaseOperations._quote_params_for_last_executed_query   s     
v;;##Gq#f++z:: M Muuz'99:4EEeLLLN$))ZL3v;;$>??? +2244	>>#v..7799LLNNNNFLLNNNNs   ('C$ $C:c                    |rt          |t          t          f          r|                     |          }nSt          |                                          }|                     |          }t          t          ||                    }||z  S |S N)r-   listtuplerj   valuesdictzip)r!   rD   r?   r@   rw   s        r$   last_executed_queryz&DatabaseOperations.last_executed_query   s    
  	&4-00 3CCFKKv}}//CCFKKc&&1122< Jr&   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}r&   c                     dS )NrG   re   s    r$   no_limit_valuez!DatabaseOperations.no_limit_value   s    rr&   c                     d}|ddf}| j                                         5 }|                    ||          }d |                                D             cd d d            S # 1 swxY w Y   d S )Nz
        WITH tables AS (
            SELECT %s name
            UNION
            SELECT sqlite_master.name
            FROM sqlite_master
            JOIN tables ON (sql REGEXP %s || tables.name || %s)
        ) SELECT name FROM tables;
        z(?i)\s+references\s+("|\')?z("|\')?\s*\(c                     g | ]
}|d          S )r   rG   .0rows     r$   
<listcomp>z9DatabaseOperations.__references_graph.<locals>.<listcomp>   s    999sCF999r&   )r   rD   rl   rC   )r!   
table_namequeryr@   rD   rp   s         r$   __references_graphz%DatabaseOperations.__references_graph   s     *

 _##%% 	:nnUF33G99g&6&6&8&8999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s   4A""A&)A&c                 >     t          d          | j                  S )Ni   )maxsize)r   %_DatabaseOperations__references_graphre   s    r$   _references_graphz$DatabaseOperations._references_graph   s"     &y%%%d&=>>>r&   F)reset_sequencesallow_cascadec                     |r/|r-t          t          j         fd|D                                 } fd|D             }|r5d |D             }|                                         |                     |S )Nc              3   B   K   | ]}                     |          V  d S rt   )r   )r   tabler!   s     r$   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s1      #V#VeD$:$:5$A$A#V#V#V#V#V#Vr&   c                     g | ]Y}                     d           d                     d          d                                        |                    dZS )DELETE FROM;)SQL_KEYWORD	SQL_FIELDr   )r   r   r!   styles     r$   r   z0DatabaseOperations.sql_flush.<locals>.<listcomp>   s|     
 
 
 	 !!(++++!!&)))) 6 67777	
 
 
r&   c                     g | ]}d |iS )r   rG   )r   r   s     r$   r   z0DatabaseOperations.sql_flush.<locals>.<listcomp>   s    >>>e'5)>>>r&   )setr   from_iterableextendsequence_reset_by_name_sql)r!   r   tablesr   r   r?   	sequencess   ``     r$   	sql_flushzDatabaseOperations.sql_flush   s     	m 	 ##V#V#V#Vv#V#V#VVV F
 
 
 
 
  
 
 
  	J>>v>>>IJJt66uiHHIII
r&   c                    |sg S |                     d          d|                    |                     d                    d|                     d          d|                    |                     d                    d|                     d          d|                    |                     d                    d|                     d	          d
d                    d |D                       dgS )NUPDATEr   sqlite_sequenceSETseqz = 0 WHEREr   INz (rh   c                 $    g | ]}d |d         z  S )'%s'r   rG   )r   sequence_infos     r$   r   zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>   s"    TTTVmG44TTTr&   z);)r   	SQL_TABLEr   r   rk   )r!   r   r   s      r$   r   z-DatabaseOperations.sequence_reset_by_name_sql   s    	I !!(++++0A B BCCCC!!%(((( 6 67777!!'**** 7 78888!!$''''		TT)TTT   
 	
r&   c                     |d S t          |d          r|S t          j        |          r;t          j        r t          j        || j        j                  }nt          d          t          |          S )Nresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	hasattrr   is_awarer   rT   
make_naiver   
ValueErrorstrr!   values     r$   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value  s    =4 5.// 	L U## 	  +E4?3KLL '  
 5zzr&   c                     |d S t          |d          r|S t          j        |          rt          d          t	          |          S )Nr   z5SQLite backend does not support timezone-aware times.)r   r   r   r   r   r   s     r$   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value  sW    =4 5.// 	L U## 	VTUUU5zzr&   c                 "   t                                          |          }|j                                        }|dk    r|                    | j                   n|dk    r|                    | j                   n|dk    r|                    | j                   np|dk    r)|                    |                     |                     nA|dk    r|                    | j	                   n |dk    r|                    | j
                   |S )Nr   r   r(   DecimalField	UUIDFieldBooleanField)superget_db_convertersr/   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r!   r4   
convertersinternal_type	__class__s       r$   r   z$DatabaseOperations.get_db_converters&  s   WW..z::
"/AACCO++d>????k))d:;;;;k))d:;;;;n,,d==jIIJJJJk))d:;;;;n,,d=>>>r&   c                     |ht          |t          j                  st          |          }t          j        r3t          j        |          st          j        || j        j                  }|S rt   )	r-   datetimer   r   rT   r   r   
make_awarer   r!   r   r4   r   s       r$   r   z.DatabaseOperations.convert_datetimefield_value7  sd    eX%677 .&u-- Mx'8'?'? M +E4?3KLLr&   c                 \    |)t          |t          j                  st          |          }|S rt   )r-   r   dater   r   s       r$   r   z*DatabaseOperations.convert_datefield_value?  .    eX]33 *"5))r&   c                 \    |)t          |t          j                  st          |          }|S rt   )r-   r   timer   r   s       r$   r   z*DatabaseOperations.convert_timefield_valueE  r   r&   c                     t          j        d          j        t          |t                    r9t          j        d                              |j        j                   fd}nfd}|S )N   )precr   c                 `    | * |                                |j        j                  S d S )N)context)quantizer/   r   )r   r4   r   create_decimalquantize_values      r$   	converterz@DatabaseOperations.get_decimalfield_converter.<locals>.converterT  sC    $)>%0099&
0G0O :    %$r&   c                 "    |  |           S d S rt   rG   )r   r4   r   r   s      r$   r   z@DatabaseOperations.get_decimalfield_converter.<locals>.converter\  s!    $)>%000 %$r&   )	decimalContextcreate_decimal_from_floatr-   r   Decimalscalebr/   decimal_places)r!   r4   r   r   r   s      @@r$   r   z-DatabaseOperations.get_decimalfield_converterK  s     !b111Kj#&& 	1$_Q//66(77 N      1 1 1 1 1 r&   c                 2    |t          j        |          }|S rt   )uuidUUIDr   s       r$   r   z*DatabaseOperations.convert_uuidfield_valueb  s    Ie$$Er&   c                 ,    |dv rt          |          n|S )N)r   r   )boolr   s       r$   r   z-DatabaseOperations.convert_booleanfield_valueg  s    #vootE{{{58r&   c                 b    d |D             }d                     d |D                       }d| S )Nc              3   @   K   | ]}d                      |          V  dS )rh   Nrk   r   s     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>k  s,      KK3		#KKKKKKr&   rh   c              3   "   K   | ]
}d | dV  dS )(r:   NrG   )r   r?   s     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>l  s*      JJcz3zzzJJJJJJr&   zVALUES r   )r!   r"   placeholder_rowsplaceholder_rows_sql
values_sqls        r$   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sqlj  sF    KK:JKKKYYJJ5IJJJJJ
%%%%r&   c                     |dk    rdd                     |          z  S |dk    rdd                     |          z  S t                                          ||          S )N^z	POWER(%s),#z
BITXOR(%s))rk   r   combine_expression)r!   	connectorsub_expressionsr   s      r$   r   z%DatabaseOperations.combine_expressiono  sc     /!:!:::##((?";";;;ww)))_EEEr&   c                     |dvrt          d|z            d|z  g|z   }t          |          dk    rt          d          dd                    |          z  S )N)+-*/z$Invalid connector for timedelta: %s.r      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rh   )r   r   r   rk   )r!   r   r   	fn_paramss       r$   combine_duration_expressionz.DatabaseOperations.combine_duration_expressionx  sk    000 F RSSSi'(?:	y>>AHIII*TYYy-A-AAAr&   c                     |dv rdS dS )N)PositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField)r       )l         r	  rG   )r!   r   s     r$   integer_field_rangez&DatabaseOperations.integer_field_range  s$      
 
 

 ,+::r&   c                 \    |\  }}|\  }}g ||R }|dk    rd|d|d|fS d|d|d|fS )Nr(   zdjango_time_diff(rh   r:   zdjango_timestamp_diff(rG   )	r!   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsr@   s	            r$   subtract_temporalsz%DatabaseOperations.subtract_temporals  sk    !!+:+
++K'''18'''BFJJ (29''777CVKKr&   c                 l    |t           j        k    rdS t                                          |          S )NzINSERT OR IGNORE INTO)on_conflict)r   IGNOREr   insert_statement)r!   r  r   s     r$   r  z#DatabaseOperations.insert_statement  s2    *+++**ww''K'@@@r&   c                 \     |sdS  fd|D             }dd                     |          z  dfS )N) rG   c                     g | ]C}                     |j        j        j                  d                      |j                  DS ).)r   model_metadb_tablecolumn)r   fieldr!   s     r$   r   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>  s^     
 
 
   1 :;;;;---
 
 
r&   zRETURNING %srh   rG   r   )r!   r"   columnss   `  r$   return_insert_columnsz(DatabaseOperations.return_insert_columns  sX     	6
 
 
 
  
 
 
 		' 2 22B66r&   c           
      J   |t           j        k    ro| j        j        j        r^dd                    t          | j        |                    dd                    d t          | j        |          D                       S t                      	                    ||||          S )NzON CONFLICT(rh   z) DO UPDATE SET c                     g | ]	}| d | 
S )z = EXCLUDED.rG   )r   r  s     r$   r   z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>  s6       ! !55e55  r&   )
r   r   r   r   %supports_update_conflicts_with_targetrk   mapr   r   on_conflict_suffix_sql)r!   r"   r  update_fieldsunique_fieldsr   s        r$   r&  z)DatabaseOperations.on_conflict_suffix_sql  s    :,,,(N -, 		#do}==>>>>		 %(-%H%H      ww--	
 
 	
r&   rt   )1__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr%   r8   rA   rE   rH   rO   rR   rL   rY   r\   r^   r`   rb   rf   rj   rz   r   r   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      s       )/& O *N !*	*C*C*C D D    8Q Q Q! ! !  
 
 
 

 
 
 
  

 
 

 
 

 
 

 
 
Q Q Q    6  $  
  : : :& ? ? _?
 ;@u     *
 
 
&  (      "        .  
9 9 9& & &
F F F F FB B B	; 	; 	;L L LA A A A A A
7 7 7
 
 
 
 
 
 
 
 
r&   r   )r   r   r   	functoolsr   	itertoolsr   django.confr   django.core.exceptionsr   	django.dbr   r   r	   "django.db.backends.base.operationsr
   django.db.models.constantsr   django.db.models.expressionsr   django.utilsr   django.utils.dateparser   r   r   django.utils.functionalr   r   rG   r&   r$   <module>r=     s=                              - - - - - - > > > > > > > > > > E E E E E E 1 1 1 1 1 1 , , , , , , ! ! ! ! ! ! I I I I I I I I I I 3 3 3 3 3 3g
 g
 g
 g
 g
/ g
 g
 g
 g
 g
r&   