
     hI;                         d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ ed	             Z G d
 de          ZdS )    N)	lru_cachepartial)settings)BaseDatabaseOperations)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)_lazy_re_compilec                 T    | t           j        S t          t           j        |           S )N)cls)jsondumpsr   )encoders    g/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/db/backends/postgresql/operations.pyget_json_dumpsr      s$    z4:7++++    c                       e Zd ZdZdZ eg d          ZddddZer-dd	l	m
Z
 e
j        e
j        e
j        e
j        e
j        e
j        d
Zd Z ed          Zd Zd7dZd Zd Zd Zd Zd Zd Zd Zd7dZd Zd Zd7dZd Zd Z d Z!d Z"d Z#d d d!d"Z$d# Z%d8d$Z&d% Z'd& Z(d' Z)d( Z*erd) Z+nd* Z+d+ Z,d, Z-erd- Z.d. Z/d/ Z0d0 Z1d9d1Z2d2 Z3d3 Z4 fd4Z5d7 fd5	Z6 fd6Z7 xZ8S ):DatabaseOperationsvarcharEXPLAIN)ANALYZEBUFFERSCOSTSSETTINGSSUMMARYTIMINGVERBOSEWALintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldr   )numeric)SmallIntegerFieldIntegerFieldBigIntegerFieldPositiveSmallIntegerFieldPositiveIntegerFieldPositiveBigIntegerFieldc                     |                                 }|dv r6d|                    | j                                      d          d         z  S dS )N)GenericIPAddressFieldIPAddressField	TimeField	UUIDFieldzCAST(%%s AS %s)(r   %s)get_internal_typedb_type
connectionsplit)selfoutput_fieldinternal_types      r   unification_cast_sqlz'DatabaseOperations.unification_cast_sql:   s`    $6688 
 
 
 "L$8$8$I$I$O$OPS$T$TUV$WW tr   z[A-Z_]+c                     |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EXTRACT(DOW FROM z) + 1iso_week_dayzEXTRACT(ISODOW FROM )iso_yearzEXTRACT(ISOYEAR FROM zInvalid lookup type: zEXTRACT(z FROM )upper_extract_format_re	fullmatch
ValueErrorr<   lookup_typesqlparamss       r   date_extract_sqlz#DatabaseOperations.date_extract_sqlQ   s    *$$1s111699N**0#000&88J&&13111699!''))&00== 	FD[DDEEE3+33S333V;;r   Nc                 N    |                      |||          \  }}d| d|g|R fS NDATE_TRUNC(%s, rC   _convert_sql_to_tzr<   rJ   rK   rL   tznames        r   date_trunc_sqlz!DatabaseOperations.date_trunc_sql`   >    --c66BBV''''+)?)?)???r   c                 T    t          |          \  }}}|r|dk    rdnd}| | | S |S )N+-r   )r<   rT   signoffsets       r   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltae   sJ    1&99f 	-#++333D,d,F,,,r   c                 h    |r-t           j        r!|                     |          }| dg ||R fS ||fS )Nz AT TIME ZONE %s)r   USE_TZr\   )r<   rK   rL   rT   tzname_params        r   rR   z%DatabaseOperations._convert_sql_to_tzl   sT     	Eho 	E55f==L+++-Dv-D|-D-DDDF{r   c                 F    |                      |||          \  }}d| d|fS )Nr6   z)::daterQ   r<   rK   rL   rT   s       r   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlr   3    --c66BBV3''r   c                 F    |                      |||          \  }}d| d|fS )Nr6   )::timerQ   ra   s       r   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlv   rc   r   c                     |                      |||          \  }}|dk    rd| ddg|R fS |                     |||          S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, )))rR   rM   rS   s        r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlz   sa    --c66BBV(""@@@@8BUfBUBUUU$$[#v>>>r   c                 N    |                      |||          \  }}d| d|g|R fS rO   rQ   rS   s        r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   rV   r   c                 T    |dk    rd| ddg|R fS |                      |||          S rh   )rM   rI   s       r   time_extract_sqlz#DatabaseOperations.time_extract_sql   sF    (""@@@@8BUfBUBUUU$$[#v>>>r   c                 N    |                      |||          \  }}d| d|g|R fS )NrP   re   rQ   rS   s        r   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s>    --c66BBV----/Ef/E/EEEr   c                     dS )Nz DEFERRABLE INITIALLY DEFERRED r<   s    r   deferrable_sqlz!DatabaseOperations.deferrable_sql   s    //r   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    
    r   c                 D    d}|dv r|dv rd}n	|dv rd}nd}|dv rd	|z  }|S )
Nr7   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r3   r2   zHOST(%s))CICharFieldCIEmailFieldCITextFieldz
%s::citextz%s::text)r{   r}   r   r   z	UPPER(%s)rs   )r<   rJ   r>   lookups       r   lookup_castzDatabaseOperations.lookup_cast   sc     

 

 

  KKK#"PPP%# MMM 6)Fr   c                     d S Nrs   rt   s    r   no_limit_valuez!DatabaseOperations.no_limit_value   s    tr   c                     |gS r   rs   )r<   rK   s     r   prepare_sql_scriptz%DatabaseOperations.prepare_sql_script   s	    ur   c                 d    |                     d          r|                    d          r|S d|z  S )N"z"%s")r~   r   )r<   names     r   
quote_namezDatabaseOperations.quote_name   s8    ??3 	DMM#$6$6 	K}r   c                 .    t          ||| j                  S r   )r   r:   )r<   rK   rL   s      r   compose_sqlzDatabaseOperations.compose_sql   s    sFDO444r   c                     dS )Nz(SELECT set_config('TimeZone', %s, false)rs   rt   s    r   set_time_zone_sqlz$DatabaseOperations.set_time_zone_sql   s    99r   F)reset_sequencesallow_cascadec                V    |sg S                      d          d                     fd|D                       g}|r(|                                         d                     |r(|                                         d                     dd                    |          z  gS )NTRUNCATE, c              3   h   K   | ],}                                         |                    V  -d S r   )	SQL_FIELDr   ).0tabler<   styles     r   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s;      RR%eoodooe&<&<==RRRRRRr   zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)r<   r   tablesr   r   	sql_partss   ``    r   	sql_flushzDatabaseOperations.sql_flush   s     	I
 j))IIRRRRR6RRRRR
	  	DU../ABBCCC 	;U..y99:::+++,,r   c           
         g }|D ]~}|d         }|d         pd}|                     |                    d          d|                    |                     |                    d|                    |          d           |S )Nr   columnidSELECT  setval(pg_get_serial_sequence('','z'), 1, false);)r   r   	SQL_TABLEr   r   )r<   r   	sequencesrK   sequence_info
table_namecolumn_names          r   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   s     & 	 	M&w/J (19TKJJ %%h////OODOOJ$?$?@@@@OOK0000	    
r   c                 f    |rd|                      |          z  S d|                      |          z  S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r   )r<   
tablespaceinlines      r   tablespace_sqlz!DatabaseOperations.tablespace_sql   s9     	A.1L1LLL"T__Z%@%@@@r   c                    ddl m} g }| j        }|D ]8}|j        j        D ]'}t          ||j                  r|                    |                    d          d|	                     ||j        j
                            d|                    |j                  d|                     ||j                            d|                     ||j                            d|                    d	          d
|                    d          d|	                     ||j        j
                            d            n):|S )Nr   )modelsr   r   r   z'), coalesce(max(z), 1), max(z) zIS NOTz null) FROMr   ;)	django.dbr   r   _metalocal_fields
isinstancer'   r   r   r   db_tabler   r   )r<   r   
model_listr   outputqnmodelfs           r   sequence_reset_sqlz%DatabaseOperations.sequence_reset_sql   sm   $$$$$$_ 	 	E [-  a!122 MM "--h7777!OOBBu{/C,D,DEEEE!OOAH5555!OOBBqxLL9999!OOBBqxLL9999!--h7777!--f5555!OOBBu{/C,D,DEEEE    E#$ r   c                     |S r   rs   )r<   xs     r   prep_for_iexact_queryz(DatabaseOperations.prep_for_iexact_query  s    r   c                     dS )a  
        Return the maximum length of an identifier.

        The maximum length of an identifier is 63 by default, but can be
        changed by recompiling PostgreSQL after editing the NAMEDATALEN
        macro in src/include/pg_config_manual.h.

        This implementation returns 63, but can be overridden by a custom
        database backend that inherits most of its behavior from this one.
        ?   rs   rt   s    r   max_name_lengthz"DatabaseOperations.max_name_length  s	     rr   c                 ^    |r'd |D             }dd                     |          z  g|fS dgg fS )Nc                     g | ]	}|D ]}|
S rs   rs   )r   
param_listparams      r   
<listcomp>z3DatabaseOperations.distinct_sql.<locals>.<listcomp>$  s%    MMM
*MMeMMMMr   zDISTINCT ON (%s)r   DISTINCTr   )r<   fieldsrL   s      r   distinct_sqlzDatabaseOperations.distinct_sql"  sI     	$MMfMMMF'$))F*;*;;<fEE<##r   c                 \    	 |                      ||          S # t          j        $ r Y d S w xY wr   )r   r	   	DataErrorr<   rx   rK   rL   s       r   last_executed_queryz&DatabaseOperations.last_executed_query+  sB    ''V444#   tts    ++c                 F    |j         |j                                         S d S r   )querydecoder   s       r   r   z&DatabaseOperations.last_executed_query3  s%     |'|**,,,4r   c                 \     |sdS  fd|D             }dd                     |          z  dfS )N) rs   c                     g | ]C}                     |j        j        j                  d                      |j                  DS ).)r   r   r   r   r   )r   fieldr<   s     r   r   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>=  s^     
 
 
   1 :;;;;---
 
 
r   zRETURNING %sr   rs   r   )r<   r   columnss   `  r   return_insert_columnsz(DatabaseOperations.return_insert_columns:  sX     	6
 
 
 
  
 
 
 		' 2 22B66r   c                 b    d |D             }d                     d |D                       }d|z   S )Nc              3   @   K   | ]}d                      |          V  dS )r   Nr   )r   rows     r   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>H  s,      KK3		#KKKKKKr   r   c              3       K   | ]	}d |z  V  
dS )z(%s)Nrs   )r   rK   s     r   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>I  s&      LLv|LLLLLLr   zVALUES r   )r<   r   placeholder_rowsplaceholder_rows_sql
values_sqls        r   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sqlG  sC    KK:JKKKYYLL7KLLLLL
:%%r   c                 V    |t          |d          r|S  | j        |         |          S )Nresolve_expression)hasattrintegerfield_type_map)r<   valuer>   s      r   adapt_integerfield_valuez+DatabaseOperations.adapt_integerfield_valueN  s3    }/C D D}<4-m<UCCCr   c                     |S r   rs   r<   r   s     r   adapt_datefield_valuez(DatabaseOperations.adapt_datefield_valueS      r   c                     |S r   rs   r   s     r   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_valueV  r   r   c                     |S r   rs   r   s     r   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_valueY  r   r   c                     |S r   rs   )r<   r   
max_digitsdecimal_placess       r   adapt_decimalfield_valuez+DatabaseOperations.adapt_decimalfield_value\  r   r   c                 (    |rt          |          S d S r   )r   r   s     r   adapt_ipaddressfield_valuez-DatabaseOperations.adapt_ipaddressfield_value_  s     	;;tr   c                 >    t          |t          |                    S )N)r   )r   r   )r<   r   r   s      r   adapt_json_valuez#DatabaseOperations.adapt_json_valued  s    U."9"9::::r   c                     |dk    r|\  }}|\  }}g ||R }d|d|d|fS t                                          |||          S )N	DateFieldz(interval '1 day' * (z - rj   )supersubtract_temporals)
r<   r>   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrL   	__class__s
            r   r  z%DatabaseOperations.subtract_temporalsg  sj    K''"%GZ"%GZ/z/J//FF7>wwH&PPww))-cBBBr   c                 N   i }|rEd |                                 D             }| j        D ]}|                    |d           }||||<     t                      j        |fi |}|r||d<   |r7|dd                    d |                                 D                       z  z  }|S )Nc                 F    i | ]\  }}|                                 |rd ndS )truefalse)rE   )r   r   r   s      r   
<dictcomp>z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>s  s?       D% 

:ff7  r   FORMATz (%s)r   c              3       K   | ]	}d |z  V  
dS )z%s %sNrs   )r   is     r   r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>  s&      )M)M!'A+)M)M)M)M)M)Mr   )itemsexplain_optionspopr  explain_query_prefixr   )r<   formatoptionsextravalid_optionr   prefixr  s          r   r  z'DatabaseOperations.explain_query_prefixo  s     	0 #*==??  G !% 4 0 0L$77$*/E,'--f@@@@ 	%$E(O 	Ng		)M)Mu{{}})M)M)M M MMMFr   c           
      L   |t           j        k    rdS |t           j        k    r^dd                    t	          | j        |                    dd                    d t	          | j        |          D                       S t                                          ||||          S )NzON CONFLICT DO NOTHINGzON CONFLICT(r   z) DO UPDATE SET c                     g | ]	}| d | 
S )z = EXCLUDED.rs   )r   r   s     r   r   z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>  s6       ! !55e55  r   )r   IGNOREUPDATEr   mapr   r  on_conflict_suffix_sql)r<   r   on_conflictupdate_fieldsunique_fieldsr  s        r   r$  z)DatabaseOperations.on_conflict_suffix_sql  s    *+++++*++++		#do}==>>>>		 %(-%H%H      ww--	
 
 	
r   r   )F)NN)9__name__
__module____qualname__"cast_char_field_without_max_lengthexplain_prefix	frozensetr  cast_data_typesr
   psycopg.typesr*   Int2Int4Int8r   r?   r   rF   rM   rU   r\   rR   rb   rf   rk   rm   ro   rq   ru   ry   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  r$  __classcell__)r  s   @r   r   r      s       )2&Ni		
 		
 		
 O  $ O  

)))))) ")#L&|)0$+L'.|!
 !
  * *)*55< < <@ @ @ @
    ( ( (( ( (? ? ?@ @ @
? ? ?F F F F0 0 0! ! !   8      
5 5 5: : : ;@u - - - - -   &A A A A     D    $ $ $  	 	 	 		 	 	7 7 7& & &
  D	D 	D 	D
           
; ; ;C C C C C     &
 
 
 
 
 
 
 
 
r   r   )r   	functoolsr   r   django.confr   "django.db.backends.base.operationsr   )django.db.backends.postgresql.psycopg_anyr   r   r	   r
   r   django.db.backends.utilsr   django.db.models.constantsr   django.utils.regex_helperr   r   r   rs   r   r   <module>r;     s"    ( ( ( ( ( ( ( (             E E E E E E              8 7 7 7 7 7 1 1 1 1 1 1 6 6 6 6 6 6 , , ,{
 {
 {
 {
 {
/ {
 {
 {
 {
 {
r   