
    `?iF@                         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 ddlmZ  G d de      Zy)    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)
OnConflict)Col)timezone)
parse_dateparse_datetime
parse_time)cached_property   )Databasec                   J    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.d
Zd.d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& fd&Z'd' Z(d( Z)d) Z*d. fd*	Z+ fd+Z,d, Z- fd-Z. xZ/S )/DatabaseOperationstextTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLAN)nullfalsetruec                     t        t        j                  d |D                    }|r,| j                  j                  j
                  t        |      z  S t        |      S )z~
        SQLite has a variable limit defined by SQLITE_LIMIT_VARIABLE_NUMBER
        (reflected in max_query_params).
        c              3   n   K   | ]-  }t        |t        j                        r|j                  n|g / y wN)
isinstancer	   CompositePrimaryKeyfields).0fields     w/home/cursorai/projects/django-cronjob-utils/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/operations.py	<genexpr>z5DatabaseOperations.bulk_batch_size.<locals>.<genexpr>%   s<        $E "%)C)CD LL! $s   35)listr   from_iterable
connectionfeaturesmax_query_paramslen)selfr"   objss      r%   bulk_batch_sizez"DatabaseOperations.bulk_batch_size   sY    
    $  	
 ??++<<FKKt9    c                 (   t         j                  t         j                  t         j                  f}t         j                  t         j
                  t         j                  t         j                  f}t        ||      r9|j                         D ]&  }	 |j                  }t        ||      st        d       t        |t         j                        r1|j                  r$t!        |j"                        dkD  rt        d      y y y # t        t        f$ r Y w xY w)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StdDevr    get_source_expressionsoutput_fieldr   AttributeErrorr   	Aggregatedistinctr,   source_expressions)r-   
expression
bad_fieldsbad_aggregatesexprr8   s         r%   check_expression_supportz+DatabaseOperations.check_expression_support3   s    &&(<(<f>N>NO
 **fjj&//6==Qj.1"99;#'#4#4L ",
;/@  < z6#3#34##J112Q6#0  7 $ 5 '
3  s   C??DDc                 6    d| d|j                         g|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_sqlO   s)     *#a0;3D3D3F2P2PPPr0   c                     |S )z>Do nothing since formatting is handled in the custom function. )r-   rH   s     r%   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmeticW   s    
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_date_trunc(%s, 	, %s, %s)rE   _convert_tznames_to_sqlr-   rG   rH   rI   tznames        r%   date_trunc_sqlz!DatabaseOperations.date_trunc_sql[   F    'uI69
9
 ))&19
 
 	
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_time_trunc(%s, rO   rP   rR   s        r%   time_trunc_sqlz!DatabaseOperations.time_trunc_sqlb   rU   r0   c                 X    |r(t         j                  r|| j                  j                  fS y)N)NN)r   USE_TZr)   timezone_name)r-   rS   s     r%   rQ   z*DatabaseOperations._convert_tznames_to_sqli   s#    hoo4??8888r0   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_date(rO   rQ   r-   rH   rI   rS   s       r%   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqln   8    +C5	: =
=
))&1=
 
 	
r0   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_time(rO   r\   r]   s       r%   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlt   r_   r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_extract(%s, rO   rP   rR   s        r%   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlz   sF    -cU)<?
?
 ))&1?
 
 	
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_trunc(%s, rO   rP   rR   s        r%   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   sF    +C5	:=
=
 ))&1=
 
 	
r0   c                 6    d| d|j                         g|fS )Nzdjango_time_extract(%s, rC   rD   rF   s       r%   time_extract_sqlz#DatabaseOperations.time_extract_sql   s'    )#a0;3D3D3F2P2PPPr0   c                      y)NNULLrL   r-   s    r%   pk_default_valuez#DatabaseOperations.pk_default_value   s    r0   c                    d}t        |      |kD  r;d}t        dt        |      |      D ]  }||||z    }|| j                  |      z  }  |S ddj                  dgt        |      z        z   }| j                  j                  j                         }	 |j                  ||      j                         |j                          S # |j                          w xY w)zV
        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)   cursorexecutefetchoneclose)r-   rI   
BATCH_SIZEresultsindexchunkrH   rq   s           r%   ro   z8DatabaseOperations._quote_params_for_last_executed_query   s     
v;#Gq#f+z:uuz'9:4EEeLL ; N$))ZL3v;$>?? ++224	>>#v.779LLNFLLNs   C Cc                     |rpt        |t        t        f      r| j                  |      }||z  S t        |j	                               }| j                  |      }t        t        ||            }||z  S |S r   )r    r'   tuplero   valuesdictzip)r-   rq   rH   rI   r{   s        r%   last_executed_queryz&DatabaseOperations.last_executed_query   su    
 &4-0CCFK
 < v}}/CCFKc&&12< Jr0   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                      y)NrL   rj   s    r%   no_limit_valuez!DatabaseOperations.no_limit_value   s    r0   c                     d}|ddf}| j                   j                         5 }|j                  ||      }|j                         D cg c]  }|d   	 c}cd d d        S c c}w # 1 sw Y   y xY w)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)   rq   rr   fetchall)r-   
table_namequeryrI   rq   rv   rows          r%   __references_graphz%DatabaseOperations.__references_graph   st     *

 __##%nnUF3G&-&6&6&89&8sCF&89 &%9 &%s   %A$AA$A$$A-c                 :     t        d      | j                        S )Ni   )maxsize)r   %_DatabaseOperations__references_graphrj   s    r%   _references_graphz$DatabaseOperations._references_graph   s     &y%d&=&=>>r0   F)reset_sequencesallow_cascadec                    |r)|r't        t        j                   fd|D                    }|D cg c]I  }|j                  d      d|j                  d      d|j	                   j                  |            dK }}|r2|D cg c]  }d|i }}|j                   j                  ||             |S c c}w c c}w )Nc              3   @   K   | ]  }j                  |        y wr   )r   )r#   tabler-   s     r%   r&   z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s     #VveD$:$:5$Avs   DELETE FROM;r   )setr   r(   SQL_KEYWORD	SQL_FIELDr   extendsequence_reset_by_name_sql)r-   styletablesr   r   r   rH   	sequencess   `       r%   	sql_flushzDatabaseOperations.sql_flush   s    m ###Vv#VVF  
  	 !!(+!!&) 67	   	 
 7=>ve'5)vI>JJt66uiHI

 ?s   AB7B<c                    |sg S |j                  d      d|j                  | j                  d            d|j                  d      d|j                  | j                  d            d|j                  d      d|j                  | j                  d            d|j                  d	      d
dj	                  |D cg c]
  }d|d   z   c}      dgS c c}w )NUPDATEr   sqlite_sequenceSETseqz = 0 WHEREr   INz (rm   '%s'r   z);)r   	SQL_TABLEr   r   rp   )r-   r   r   sequence_infos       r%   r   z-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                     |y t        j                  |      rPt        j                  r5t        j                  || j
                  j                         }t        |      S t        d      t        |      S )NzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)r   is_awarer   rY   
make_naiver)   
ValueErrorstrr-   values     r%   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value  si    = U# ++E4??3K3KL 5z !' 
 5zr0   c                 ^    |y t        j                  |      rt        d      t        |      S )Nz5SQLite backend does not support timezone-aware times.)r   r   r   r   r   s     r%   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value  s0    = U#TUU5zr0   c                    t         |   |      }|j                  j                         }|dk(  r|j	                  | j
                         |S |dk(  r|j	                  | j                         |S |dk(  r|j	                  | j                         |S |dk(  r"|j	                  | j                  |             |S |dk(  r|j	                  | j                         |S |dk(  r|j	                  | j                         |S )Nr   r   r2   DecimalField	UUIDFieldBooleanField)superget_db_convertersr8   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r-   r=   
convertersinternal_type	__class__s       r%   r   z$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==>r0   c                     |tt        |t        j                        st        |      }t        j                  r?t        j                  |      s*t        j                  || j                  j
                        }|S r   )	r    datetimer   r   rY   r   r   
make_awarer)   r-   r   r=   r)   s       r%   r   z.DatabaseOperations.convert_datetimefield_value/  sW    eX%6%67&u-x'8'8'? ++E4??3K3KLr0   c                 T    |%t        |t        j                        st        |      }|S r   )r    r   dater   r   s       r%   r   z*DatabaseOperations.convert_datefield_value7  %    eX]]3"5)r0   c                 T    |%t        |t        j                        st        |      }|S r   )r    r   timer   r   s       r%   r   z*DatabaseOperations.convert_timefield_value=  r   r0   c                     t        j                  d      j                  t        |t              rAt        j
                  d      j                  |j                  j                         fd}|S fd}|S )N   )precr   c                 d    | - |       j                  |j                  j                        S y )N)context)quantizer8   r   )r   r=   r)   create_decimalquantize_values      r%   	converterz@DatabaseOperations.get_decimalfield_converter.<locals>.converterL  s<    $)%099&
0G0G0O0O :   %r0   c                     |  |       S y r   rL   )r   r=   r)   r   s      r%   r   z@DatabaseOperations.get_decimalfield_converter.<locals>.converterT  s    $)%00 %r0   )	decimalContextcreate_decimal_from_floatr    r   Decimalscalebr8   decimal_places)r-   r=   r   r   r   s      @@r%   r   z-DatabaseOperations.get_decimalfield_converterC  sh     !b1KKj#&$__Q/66((777N 	1 r0   c                 4    |t        j                  |      }|S r   )uuidUUIDr   s       r%   r   z*DatabaseOperations.convert_uuidfield_valueZ  s    IIe$Er0   c                 $    |dv rt        |      S |S )N)r   r   )boolr   s       r%   r   z-DatabaseOperations.convert_booleanfield_value_  s    #votE{858r0   c                     |dk(  rddj                  |      z  S |dk(  rddj                  |      z  S t        | 	  ||      S )N^z	POWER(%s),#z
BITXOR(%s))rp   r   combine_expression)r-   	connectorsub_expressionsr   s      r%   r   z%DatabaseOperations.combine_expressionb  sO     /!:::##((?";;;w))_EEr0   c                     |dvrt        d|z        d|z  g|}t        |      dkD  rt        d      ddj                  |      z  S )N)+-*/z$Invalid connector for timedelta: %s.r      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rm   )r   r,   r   rp   )r-   r   r   	fn_paramss       r%   combine_duration_expressionz.DatabaseOperations.combine_duration_expressionk  sZ    00 F RSSi':/:	y>AHII*TYYy-AAAr0   c                     |dv ryy)N)PositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField)r       )l         r   rL   )r-   r   s     r%   integer_field_rangez&DatabaseOperations.integer_field_ranges  s      
 

 ,:r0   c                 Z    |\  }}|\  }}g ||}|dk(  rd|d|d|fS d|d|d|fS )Nr2   zdjango_time_diff(rm   rC   zdjango_timestamp_diff(rL   )	r-   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrI   s	            r%   subtract_temporalsz%DatabaseOperations.subtract_temporals~  sR    !!+:+
+K'18'BFJJ (297CVKKr0   c                 L    |t         j                  k(  ryt        |   |      S )NzINSERT OR IGNORE INTO)on_conflict)r   IGNOREr   insert_statement)r-   r  r   s     r%   r  z#DatabaseOperations.insert_statement  s'    *+++*w'K'@@r0   c                 Z   |t         j                  k(  r| j                  j                  j                  raddj                  t        | j                  |            ddj                  t        | j                  |      D cg c]	  }| d|  c}      S t        | %  ||||      S c c}w )NzON CONFLICT(rm   z) DO UPDATE SET z = EXCLUDED.)
r   r   r)   r*   %supports_update_conflicts_with_targetrp   mapr   r   on_conflict_suffix_sql)r-   r"   r  update_fieldsunique_fieldsr$   r   s         r%   r  z)DatabaseOperations.on_conflict_suffix_sql  s    :,,,((NN 		#doo}=>		 &)-%H%HE !'eW5%H  w-	
 	
s   ?B(c                 2    t         j                  dk  rdgS g S )N)r   '   zGROUP BY TRUE)r   sqlite_version_inforj   s    r%   force_group_byz!DatabaseOperations.force_group_by  s    $,$@$@7$J RPRRr0   c                 6    |dk  rd|z  S t         |   |      S )Nr   z[#%s])r   format_json_path_numeric_index)r-   numr   s     r%   r  z1DatabaseOperations.format_json_path_numeric_index  s#     #aw}XUW-STW-XXr0   r   )0__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr/   rA   rJ   rM   rT   rW   rQ   r^   ra   rc   re   rg   rk   ro   r~   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 D(8Q






Q6$
:& ? ?
 ;@u *
& ".
9FB	;LA

*SY Yr0   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   rL   r0   r%   <module>r*     sI           - > > E 1 , ! I I 3 PY/ PYr0   