
    hA                         S SK r S SKrS SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKJr  SSKJr   " S S\5      rg)    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)
OnConflict)Col)timezone)
parse_dateparse_datetime
parse_time)cached_property   )Databasec                   d  ^  \ rS rSrSrSSS.rSr\" / SQ5      rS r	S r
S	 rS
 rS rS1S jrS1S jrS rS rS rS rS rS rS rS rS rS rS rS r\S 5       rSSS.S jrS rS r S  r!U 4S! jr"S" r#S# r$S$ r%S% r&S& r'S' r(U 4S( jr)S) r*S* r+S+ r,S1U 4S, jjr-S- r.U 4S. jr/S/ r0S0r1U =r2$ )2DatabaseOperations   textTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLAN)nullfalsetruec                     [        U5      S:X  a  g[        U5      S:  a,  U R                  R                  R                  [        U5      -  $ [        U5      $ )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).
r   i  )len
connectionfeaturesmax_query_params)selffieldsobjss      W/var/www/html/env/lib/python3.13/site-packages/django/db/backends/sqlite3/operations.pybulk_batch_size"DatabaseOperations.bulk_batch_size   sG     v;![1_??++<<FKKt9    c                 V   [         R                  [         R                  [         R                  4n[         R                  [         R
                  [         R                  [         R                  4n[        X5      (       a?  UR                  5        H+  n UR                  n[        XR5      (       a  [        S5      eM-     [        U[         R                  5      (       a7  UR                  (       a%  [!        UR"                  5      S:  a  [        S5      eg g g ! [        [        4 a     M  f = f)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exprr2   s         r&   check_expression_support+DatabaseOperations.check_expression_support.   s    &&(<(<f>N>NO
 **fjj&//6==Qj11"99;#'#4#4L ",;;/@  < < z6#3#344##J112Q6#0  7 $ 5 '
3  s   DD('D(c                 6    SU S3UR                  5       /UQ74$ )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_sql#DatabaseOperations.date_extract_sqlJ   s)     *#a0;3D3D3F2P2PPPr)   c                 "    UR                  5       $ )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_rows-DatabaseOperations.fetch_returned_insert_rowsR   s    
   r)   c                     U$ )z>Do nothing since formatting is handled in the custom function. )r#   rC   s     r&   format_for_duration_arithmetic1DatabaseOperations.format_for_duration_arithmeticY   s    
r)   c                 X    SU S3UR                  5       /UQU R                  U5      Q74$ )Nzdjango_date_trunc(%s, 	, %s, %s)r@   _convert_tznames_to_sqlr#   rB   rC   rD   tznames        r&   date_trunc_sql!DatabaseOperations.date_trunc_sql]   F    'uI69
9
 ))&19
 
 	
r)   c                 X    SU S3UR                  5       /UQU R                  U5      Q74$ )Nzdjango_time_trunc(%s, rQ   rR   rT   s        r&   time_trunc_sql!DatabaseOperations.time_trunc_sqld   rX   r)   c                 j    U(       a,  [         R                  (       a  XR                  R                  4$ g)N)NN)r   USE_TZr    timezone_name)r#   rU   s     r&   rS   *DatabaseOperations._convert_tznames_to_sqlk   s!    hoo??8888r)   c                 :    SU S3/ UQU R                  U5      Q74$ )Nzdjango_datetime_cast_date(rQ   rS   r#   rC   rD   rU   s       r&   datetime_cast_date_sql)DatabaseOperations.datetime_cast_date_sqlp   8    +C5	: =
=
))&1=
 
 	
r)   c                 :    SU S3/ UQU R                  U5      Q74$ )Nzdjango_datetime_cast_time(rQ   ra   rb   s       r&   datetime_cast_time_sql)DatabaseOperations.datetime_cast_time_sqlv   re   r)   c                 X    SU S3UR                  5       /UQU R                  U5      Q74$ )Nzdjango_datetime_extract(%s, rQ   rR   rT   s        r&   datetime_extract_sql'DatabaseOperations.datetime_extract_sql|   sF    -cU)<?
?
 ))&1?
 
 	
r)   c                 X    SU S3UR                  5       /UQU R                  U5      Q74$ )Nzdjango_datetime_trunc(%s, rQ   rR   rT   s        r&   datetime_trunc_sql%DatabaseOperations.datetime_trunc_sql   sF    +C5	:=
=
 ))&1=
 
 	
r)   c                 6    SU S3UR                  5       /UQ74$ )Nzdjango_time_extract(%s, r>   r?   rA   s       r&   time_extract_sql#DatabaseOperations.time_extract_sql   s'    )#a0;3D3D3F2P2PPPr)   c                     g)NNULLrM   r#   s    r&   pk_default_value#DatabaseOperations.pk_default_value   s    r)   c                    Sn[        U5      U:  a:  Sn[        S[        U5      U5       H  nXXB-    nX0R                  U5      -  nM     U$ SSR                  S/[        U5      -  5      -   nU R                  R                  R                  5       n UR                  Xa5      R                  5       UR                  5         $ ! UR                  5         f = f)zF
Only for last_executed_query! Don't use this to execute SQL queries!
i  rM   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr    rI   executefetchoneclose)r#   rD   
BATCH_SIZEresultsindexchunkrC   rI   s           r&   rz   8DatabaseOperations._quote_params_for_last_executed_query   s     
v;#Gq#f+z:u'9:EEeLL ; N$))ZL3v;$>?? ++224	>>#.779LLNFLLNs   C Cc                     U(       ar  [        U[        [        45      (       a  U R                  U5      nX#-  $ [        UR	                  5       5      nU R                  U5      n[        [        X45      5      nX#-  $ U$ N)r0   listtuplerz   valuesdictzip)r#   rI   rC   rD   r   s        r&   last_executed_query&DatabaseOperations.last_executed_query   sr    
 &4-00CCFK
 < v}}/CCFKc&12< Jr)   c                 h    UR                  S5      (       a  UR                  S5      (       a  U$ SU-  $ )N"z"%s")
startswithendswith)r#   names     r&   
quote_nameDatabaseOperations.quote_name   s.    ??3DMM#$6$6K}r)   c                     g)NrM   rt   s    r&   no_limit_value!DatabaseOperations.no_limit_value   s    r)   c                     SnUSS4nU R                   R                  5        nUR                  X#5      nUR                  5        Vs/ s H  ofS   PM	     snsS S S 5        $ s  snf ! , (       d  f       g = f)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*\(r   )r    rI   r|   rH   )r#   
table_namequeryrD   rI   r   rows          r&   __references_graph%DatabaseOperations.__references_graph   sp     *

 __##%nnU3G&-&6&6&89&8sF&89 &%9 &%s   $A%A A% A%%
A3c                 4    [        SS9" U R                  5      $ )Ni   )maxsize)r   %_DatabaseOperations__references_graphrt   s    r&   _references_graph$DatabaseOperations._references_graph   s     %d&=&=>>r)   F)reset_sequencesallow_cascadec                  ^  U(       a0  U(       a)  [        [        R                  " U 4S jU 5       5      5      nU Vs/ s HM  nUR                  S5      < SUR                  S5      < SUR	                  T R                  U5      5      < S3PMO     nnU(       a4  U Vs/ s H  nSU0PM	     nnUR                  T R                  X5      5        U$ s  snf s  snf )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )r   ).0tabler#   s     r&   	<genexpr>/DatabaseOperations.sql_flush.<locals>.<genexpr>   s     #VveD$:$:5$A$Avs   !DELETE FROM;r   )setr   from_iterableSQL_KEYWORD	SQL_FIELDr   extendsequence_reset_by_name_sql)r#   styletablesr   r   r   rC   	sequencess   `       r&   	sql_flushDatabaseOperations.sql_flush   s    m ###Vv#VVF  
  	 !!(+!!&) 67	   	 
 7=>ve'5)vI>JJt66uHI

 ?s   ACCc                    U(       d  / $ UR                  S5      < SUR                  U R                  S5      5      < SUR                  S5      < SUR                  U R                  S5      5      < SUR                  S5      < SUR                  U R                  S5      5      < SUR                  S	5      < S
SR	                  U Vs/ s H  nSUS   -  PM     sn5      < S3/$ s  snf )NUPDATEr   sqlite_sequenceSETseqz = 0 WHEREr   INz (rx   '%s'r   z);)r   	SQL_TABLEr   r   r{   )r#   r   r   sequence_infos       r&   r   -DatabaseOperations.sequence_reset_by_name_sql   s    I !!(+0A BC!!%( 67!!'* 78!!$'		JST)VmG44)T
 	
 Us   C)$c                     Uc  g [         R                  " U5      (       aK  [        R                  (       a+  [         R                  " XR
                  R                   5      nO[        S5      e[        U5      $ )NzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)r   is_awarer   r]   
make_naiver    
ValueErrorstrr#   values     r&   adapt_datetimefield_value,DatabaseOperations.adapt_datetimefield_value  s\    = U## ++E??3K3KL ' 
 5zr)   c                 l    Uc  g [         R                  " U5      (       a  [        S5      e[        U5      $ )Nz5SQLite backend does not support timezone-aware times.)r   r   r   r   r   s     r&   adapt_timefield_value(DatabaseOperations.adapt_timefield_value  s3    = U##TUU5zr)   c                   > [         TU ]  U5      nUR                  R                  5       nUS:X  a  UR	                  U R
                  5        U$ US:X  a  UR	                  U R                  5        U$ US:X  a  UR	                  U R                  5        U$ US:X  a"  UR	                  U R                  U5      5        U$ US:X  a  UR	                  U R                  5        U$ US:X  a  UR	                  U R                  5        U$ )Nr   r   r+   DecimalField	UUIDFieldBooleanField)superget_db_convertersr2   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r#   r7   
convertersinternal_type	__class__s       r&   r   $DatabaseOperations.get_db_converters   s   W.z:
"//AACO+d>>?  k)d::;  k)d::;  n,d==jIJ
 	 k)d::;  n,d==>r)   c                    Ub  [        U[        R                  5      (       d  [        U5      n[        R                  (       aE  [
        R                  " U5      (       d*  [
        R                  " XR                  R
                  5      nU$ r   )	r0   datetimer   r   r]   r   r   
make_awarer    r#   r   r7   r    s       r&   r   .DatabaseOperations.convert_datetimefield_value1  s[    eX%6%677&u-x'8'8'?'? ++E??3K3KLr)   c                 `    Ub*  [        U[        R                  5      (       d  [        U5      nU$ r   )r0   r   dater   r   s       r&   r   *DatabaseOperations.convert_datefield_value9  (    eX]]33"5)r)   c                 `    Ub*  [        U[        R                  5      (       d  [        U5      nU$ r   )r0   r   timer   r   s       r&   r   *DatabaseOperations.convert_timefield_value?  r   r)   c                   ^^ [         R                  " SS9R                  m[        U[        5      (       aC  [         R
                  " S5      R                  UR                  R                  * 5      mUU4S jnU$ U4S jnU$ )N   )precr   c                 `   > U b*  T" U 5      R                  TUR                  R                  S9$ g )N)context)quantizer2   r   )r   r7   r    create_decimalquantize_values      r&   	converter@DatabaseOperations.get_decimalfield_converter.<locals>.converterN  s<    $)%099&
0G0G0O0O :   %r)   c                    > U b  T" U 5      $ g r   rM   )r   r7   r    r   s      r&   r   r   V  s    $)%00 %r)   )	decimalContextcreate_decimal_from_floatr0   r   Decimalscalebr2   decimal_places)r#   r7   r   r   r   s      @@r&   r   -DatabaseOperations.get_decimalfield_converterE  sk     !b1KKj#&&$__Q/66((777N 	1 r)   c                 8    Ub  [         R                  " U5      nU$ r   )uuidUUIDr   s       r&   r   *DatabaseOperations.convert_uuidfield_value\  s    IIe$Er)   c                 (    US;   a  [        U5      $ U$ )N)r   r   )boolr   s       r&   r   -DatabaseOperations.convert_booleanfield_valuea  s    #votE{858r)   c                    > US:X  a  SSR                  U5      -  $ US:X  a  SSR                  U5      -  $ [        TU ]	  X5      $ )N^z	POWER(%s),#z
BITXOR(%s))r{   r   combine_expression)r#   	connectorsub_expressionsr   s      r&   r  %DatabaseOperations.combine_expressiond  sM     /!:::##((?";;;w))EEr)   c                     US;  a  [        SU-  5      eSU-  /U-   n[        U5      S:  a  [        S5      eSSR                  U5      -  $ )N)+-*/z$Invalid connector for timedelta: %s.r      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rx   )r   r   r   r{   )r#   r  r  	fn_paramss       r&   combine_duration_expression.DatabaseOperations.combine_duration_expressionm  sZ    00 F RSSi'(?:	y>AHII*TYYy-AAAr)   c                     US;   a  gg)N)PositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField)r       )l         r  rM   )r#   r   s     r&   integer_field_range&DatabaseOperations.integer_field_rangeu  s      
 

 ,:r)   c                 `    Uu  pEUu  pg/ UQUQ7nUS:X  a  SU< SU< S3U4$ SU< SU< S3U4$ )Nr+   zdjango_time_diff(rx   r>   zdjango_timestamp_diff(rM   )	r#   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrD   s	            r&   subtract_temporals%DatabaseOperations.subtract_temporals  sN    !!+:+
+K'18'BFJJ (297CVKKr)   c                 H   > U[         R                  :X  a  g[        TU ]  US9$ )NzINSERT OR IGNORE INTO)on_conflict)r   IGNOREr   insert_statement)r#   r*  r   s     r&   r,  #DatabaseOperations.insert_statement  s'    *+++*w'K'@@r)   c                    U(       d  gU Vs/ s HR  nU R                  UR                  R                  R                  5      < SU R                  UR                  5      < 3PMT     nnSSR                  U5      -  S4$ s  snf )N) rM   .zRETURNING %srx   rM   )r   model_metadb_tablecolumnr{   )r#   r$   fieldcolumnss       r&   return_insert_columns(DatabaseOperations.return_insert_columns  s|      
    1 1 : :;-
   	 
 		' 22B66
s   AA>c                 p  > U[         R                  :X  a  U R                  R                  R                  (       af  SSR                  [        U R                  U5      5      < SSR                  [        U R                  U5       Vs/ s H
  nU SU 3PM     sn5      < 3$ [        TU ]%  UUUU5      $ s  snf )NzON CONFLICT(rx   z) DO UPDATE SET z = EXCLUDED.)
r   r   r    r!   %supports_update_conflicts_with_targetr{   mapr   r   on_conflict_suffix_sql)r#   r$   r*  update_fieldsunique_fieldsr5  r   s         r&   r<  )DatabaseOperations.on_conflict_suffix_sql  s    :,,,((NNN 		#doo}=>		 &)-%H%HE !'eW5%H  w-	
 	
s   B3c                 4    [         R                  S:  a  S/$ / $ )N)r  '   zGROUP BY TRUE)r   sqlite_version_infort   s    r&   force_group_by!DatabaseOperations.force_group_by  s    $,$@$@7$J RPRRr)   rM   r   )3__name__
__module____qualname____firstlineno__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr'   r;   rE   rJ   rN   rV   rZ   rS   rc   rg   rj   rm   rp   ru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r'  r,  r7  r<  rC  __static_attributes____classcell__)r   s   @r&   r   r      s   )/&O *N !**C D8Q!






Q6$
:& ? ?
 ;@u *
& ".
9FB	;LA
7
*S S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   baser   r   rM   r)   r&   <module>r\     sI           - > > E 1 , ! I I 3 ]S/ ]Sr)   