
    (phaC                         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\5      rg)    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)
OnConflict)Col)timezone)
parse_dateparse_datetime
parse_time)cached_propertyc                   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(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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).
   i  )len
connectionfeaturesmax_query_params)selffieldsobjss      X/var/www/html/venv/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exprr1   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_sqlH   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_rowsP   s    
   r(   c                     U$ )z>Do nothing since formatting is handled in the custom function. )r"   rB   s     r%   format_for_duration_arithmetic1DatabaseOperations.format_for_duration_arithmeticW   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"   rA   rB   rC   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, rP   rQ   rS   s        r%   time_trunc_sql!DatabaseOperations.time_trunc_sqlb   rW   r(   c                 j    U(       a,  [         R                  (       a  XR                  R                  4$ g)N)NN)r   USE_TZr   timezone_name)r"   rT   s     r%   rR   *DatabaseOperations._convert_tznames_to_sqli   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(rP   rR   r"   rB   rC   rT   s       r%   datetime_cast_date_sql)DatabaseOperations.datetime_cast_date_sqln   8    +C5	: =
=
))&1=
 
 	
r(   c                 :    SU S3/ UQU R                  U5      Q74$ )Nzdjango_datetime_cast_time(rP   r`   ra   s       r%   datetime_cast_time_sql)DatabaseOperations.datetime_cast_time_sqlt   rd   r(   c                 X    SU S3UR                  5       /UQU R                  U5      Q74$ )Nzdjango_datetime_extract(%s, rP   rQ   rS   s        r%   datetime_extract_sql'DatabaseOperations.datetime_extract_sqlz   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, rP   rQ   rS   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>   r@   s       r%   time_extract_sql#DatabaseOperations.time_extract_sql   s'    )#a0;3D3D3F2P2PPPr(   c                     g)NNULLrL   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  rL   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr   rH   executefetchoneclose)r"   rC   
BATCH_SIZEresultsindexchunkrB   rH   s           r%   ry   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)r/   listtuplery   valuesdictzip)r"   rH   rB   rC   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)NrL   rs   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   rH   r{   rG   )r"   
table_namequeryrC   rH   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_graphrs   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   rB   	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 (rw   '%s'r   z);)r   	SQL_TABLEr   r   rz   )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 [        US5      (       a  U$ [        R                  " U5      (       aK  [        R                  (       a+  [        R
                  " XR                  R                  5      nO[        S5      e[        U5      $ )Nresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	hasattrr   is_awarer   r\   
make_naiver   
ValueErrorstrr"   values     r%   adapt_datetimefield_value,DatabaseOperations.adapt_datetimefield_value  sq    = 5.//L U## ++E??3K3KL ' 
 5zr(   c                     Uc  g [        US5      (       a  U$ [        R                  " U5      (       a  [        S5      e[	        U5      $ )Nr   z5SQLite backend does not support timezone-aware times.)r   r   r   r   r   r   s     r%   adapt_timefield_value(DatabaseOperations.adapt_timefield_value  sH    = 5.//L 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_convertersr1   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r"   r6   
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   )	r/   datetimer   r   r\   r   r   
make_awarer   r"   r   r6   r   s       r%   r   .DatabaseOperations.convert_datetimefield_value7  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   )r/   r   dater   r   s       r%   r   *DatabaseOperations.convert_datefield_value?  (    eX]]33"5)r(   c                 `    Ub*  [        U[        R                  5      (       d  [        U5      nU$ r   )r/   r   timer   r   s       r%   r   *DatabaseOperations.convert_timefield_valueE  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)quantizer1   r   )r   r6   r   create_decimalquantize_values      r%   	converter@DatabaseOperations.get_decimalfield_converter.<locals>.converterT  s<    $)%099&
0G0G0O0O :   %r(   c                    > U b  T" U 5      $ g r   rL   )r   r6   r   r   s      r%   r   r   \  s    $)%00 %r(   )	decimalContextcreate_decimal_from_floatr/   r   Decimalscalebr1   decimal_places)r"   r6   r   r   r   s      @@r%   r   -DatabaseOperations.get_decimalfield_converterK  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_valueb  s    IIe$Er(   c                 (    US;   a  [        U5      $ U$ )N)r   r   )boolr   s       r%   r   -DatabaseOperations.convert_booleanfield_valueg  s    #votE{858r(   c                 N    S U 5       nSR                  S U 5       5      nSU 3$ )Nc              3   D   #    U  H  nS R                  U5      v   M     g7f)rw   Nrz   )r   r   s     r%   r   5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>k  s     K:J3		#:Js    rw   c              3   .   #    U  H  nS U S3v   M     g7f)(r=   NrL   )r   rB   s     r%   r   r  l  s     J5Ic3%qz5Is   zVALUES r  )r"   r#   placeholder_rowsplaceholder_rows_sql
values_sqls        r%   bulk_insert_sql"DatabaseOperations.bulk_insert_sqlj  s0    K:JKYYJ5IJJ
%%r(   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))rz   r   combine_expression)r"   	connectorsub_expressionsr   s      r%   r  %DatabaseOperations.combine_expressiono  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)rw   )r   r   r   rz   )r"   r  r  	fn_paramss       r%   combine_duration_expression.DatabaseOperations.combine_duration_expressionx  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)  rL   )r"   r   s     r%   integer_field_range&DatabaseOperations.integer_field_range  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(rw   r=   zdjango_timestamp_diff(rL   )	r"   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrC   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"   r6  r   s     r%   r8  #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) rL   .zRETURNING %srw   rL   )r   model_metadb_tablecolumnrz   )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(rw   z) DO UPDATE SET z = EXCLUDED.)
r   r   r   r    %supports_update_conflicts_with_targetrz   mapr   r   on_conflict_suffix_sql)r"   r#   r6  update_fieldsunique_fieldsrA  r   s         r%   rH  )DatabaseOperations.on_conflict_suffix_sql  s    :,,,((NNN 		#doo}=>		 &)-%H%HE !'eW5%H  w-	
 	
s   B3rL   r   )3__name__
__module____qualname____firstlineno__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr&   r:   rD   rI   rM   rU   rY   rR   rb   rf   ri   rl   ro   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r#  r*  r3  r8  rC  rH  __static_attributes____classcell__)r   s   @r%   r   r      s   )/&O *N !**C D8Q!






Q6$
:& ? ?
 ;@u *
&(".
9&
FB	;LA
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   rL   r(   r%   <module>rb     sD           - > > E 1 , ! I I 3g
/ g
r(   