
    gq<                         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 d d	lmZ ed
        Z G d de      Zy)    N)	lru_cachepartial)settings)BaseDatabaseOperations)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)Cast)_lazy_re_compilec                 \    | t         j                  S t        t         j                  |       S )N)cls)jsondumpsr   )encoders    /var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/backends/postgresql/operations.pyget_json_dumpsr      s"    zz4::7++    c                       e Zd ZdZdZ eg d      ZddddZerKd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d6dZd Zd Zd Zd Zd Zd Zd Zd6dZd Zd Zd6dZd Zd Z d Z!d Z"d Z#ddd d!Z$d" Z%d7d#Z&d$ Z'd% Z(d& Z)d' Z*erd( Z+nd) Z+d* Z,erd+ Z-d, Z.d- Z/d. Z0d8d/Z1d0 Z2d1 Z3 fd2Z4d6 fd3	Z5 fd4Z6 fd5Z7 xZ8S )9DatabaseOperationsvarcharEXPLAIN)	ANALYZEBUFFERSCOSTSGENERIC_PLANSETTINGSSUMMARYTIMINGVERBOSEWALintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldr   )numeric)SmallIntegerFieldIntegerFieldBigIntegerFieldPositiveSmallIntegerFieldPositiveIntegerFieldPositiveBigIntegerFieldc                     |j                         }|dv r0d|j                  | j                        j                  d      d   z  S y)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<   sR    $668 
 
 "L$8$8$I$O$OPS$TUV$WW r   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                         }| j                  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_sqlS   s    *$&se51699N*)#a0&88J&*3%q1699!'')&&00=4[ODEE+fSE3V;;r   c                 F    | j                  |||      \  }}d| d|g|fS NDATE_TRUNC(%s, rE   _convert_sql_to_tzr>   rL   rM   rN   tznames        r   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlb   6    --c66BV Q'+)?)???r   c                 J    t        |      \  }}}|r|dk(  rdnd}| | | S |S )N+-r   )r>   rV   signoffsets       r   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltag   s;    1&9f#+33DXdVF8,,r   c                 h    |r-t         j                  r| j                  |      }| dg ||fS ||fS )Nz AT TIME ZONE %s)r   USE_TZr^   )r>   rM   rN   rV   tzname_params        r   rT   z%DatabaseOperations._convert_sql_to_tzn   sC    hoo55f=LU*+-Dv-D|-DDDF{r   c                 >    | j                  |||      \  }}d| d|fS )Nr8   z)::daterS   r>   rM   rN   rV   s       r   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlt   .    --c66BV3%w''r   c                 >    | j                  |||      \  }}d| d|fS )Nr8   )::timerS   rc   s       r   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlx   re   r   c                 v    | j                  |||      \  }}|dk(  rd| ddg|fS | j                  |||      S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, )))rT   rO   rU   s        r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sql|   sS    --c66BV("8R@8BUfBUUU$$[#v>>r   c                 F    | j                  |||      \  }}d| d|g|fS rQ   rS   rU   s        r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   rX   r   c                 J    |dk(  rd| ddg|fS | j                  |||      S rj   )rO   rK   s       r   time_extract_sqlz#DatabaseOperations.time_extract_sql   s;    ("8R@8BUfBUUU$$[#v>>r   c                 F    | j                  |||      \  }}d| d|g|fS )NrR   rg   rS   rU   s        r   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s6    --c66BV W-/Ef/EEEr   c                      y)Nz DEFERRABLE INITIALLY DEFERRED r>   s    r   deferrable_sqlz!DatabaseOperations.deferrable_sql   s    /r   c                 "    |j                         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                 6    d}|dv r	|dv rd}nd}|dv rd|z  }|S )Nr9   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r5   r4   zHOST(%s)z%s::text)r}   r   r   r   z	UPPER(%s)ru   )r>   rL   r@   lookups       r   lookup_castzDatabaseOperations.lookup_cast   sC     

 

  KK## MM 6)Fr   c                      y Nru   rv   s    r   no_limit_valuez!DatabaseOperations.no_limit_value   s    r   c                     |gS r   ru   )r>   rM   s     r   prepare_sql_scriptz%DatabaseOperations.prepare_sql_script   s	    ur   c                 T    |j                  d      r|j                  d      r|S d|z  S )N"z"%s")r   r   )r>   names     r   
quote_namezDatabaseOperations.quote_name   s(    ??3DMM#$6K}r   c                 0    t        ||| j                        S r   )r   r<   )r>   rM   rN   s      r   compose_sqlzDatabaseOperations.compose_sql   s    sFDOO44r   c                      y)Nz(SELECT set_config('TimeZone', %s, false)ru   rv   s    r   set_time_zone_sqlz$DatabaseOperations.set_time_zone_sql   s    9r   F)reset_sequencesallow_cascadec                    |sg S j                  d      dj                   fd|D              g}|r |j                  j                  d             |r |j                  j                  d             ddj                  |      z  gS )NTRUNCATE, c              3   ^   K   | ]$  }j                  j                  |             & y wr   )	SQL_FIELDr   ).0tabler>   styles     r   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s$     R6%eoodooe&<=6s   *-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R6RR
	 U../ABCU..y9:++,,r   c           
          g }|D ]f  }|d   }|d   xs d}|j                  |j                  d      d|j                  | j                  |            d|j	                  |      d       h |S )Nr   columnidSELECT  setval(pg_get_serial_sequence('','z'), 1, false);)r   r   	SQL_TABLEr   r   )r>   r   	sequencesrM   sequence_info
table_namecolumn_names          r   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   sw     &M&w/J (19TKJJ %%h/OODOOJ$?@OOK0	 ' 
r   c                 V    |rd| j                  |      z  S d| j                  |      z  S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r   )r>   
tablespaceinlines      r   tablespace_sqlz!DatabaseOperations.tablespace_sql   s-    .1LLL"T__Z%@@@r   c                    ddl m} g }| j                  }|D ]7  }|j                  j                  D ]  }t        ||j                        s|j                  |j                  d      d|j                   ||j                  j                              d|j                  |j                        d|j                   ||j                              d|j                   ||j                              d|j                  d	      d
|j                  d      d|j                   ||j                  j                              d        7 : |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   s    $__E [[--a!1!12MM "--h7!OOBu{{/C/C,DE!OOAHH5!OOBqxxL9!OOBqxxL9!--h7!--f5!OOBu{{/C/C,DE  % .  6 r   c                     |S r   ru   )r>   xs     r   prep_for_iexact_queryz(DatabaseOperations.prep_for_iexact_query  s    r   c                      y)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.
        ?   ru   rv   s    r   max_name_lengthz"DatabaseOperations.max_name_length  s     r   c                 z    |r/|D cg c]  }|D ]  }|  }}}ddj                  |      z  g|fS dgg fS c c}}w )NzDISTINCT ON (%s)r   DISTINCT)r   )r>   fieldsrN   
param_listparams        r   distinct_sqlzDatabaseOperations.distinct_sql!  sP    .4Mf
*e*efFM'$))F*;;<fEE<## Ns   7c                 (   | j                   j                  j                  r	 | j                  ||      S |j                  r:|j                  j                  $|j                  j                  j                         S y # t        j
                  $ r Y y w xY wr   )	r<   featuresuses_server_side_bindingr   r	   	DataError_queryquerydecoder>   rz   rM   rN   s       r   last_executed_queryz&DatabaseOperations.last_executed_query*  s{    ''@@ ++C88 ==V]]%8%8%D!==..5577 ''   s   A; ;BBc                 P    |j                   |j                   j                         S y r   )r   r   r   s       r   r   z&DatabaseOperations.last_executed_query7  s$     ||'||**,,r   c                     |sy|D cg c]O  }| j                  |j                  j                  j                        d| j                  |j                        Q }}ddj                  |      z  dfS c c}w )N) ru   .zRETURNING %sr   ru   )r   r   r   r   r   r   )r>   r   fieldcolumnss       r   return_insert_columnsz(DatabaseOperations.return_insert_columns>  s|      
    1 1 : :;-
   	 
 		' 22B66
s   AA4c                 L    |t        |d      r|S  | j                  |   |      S )Nresolve_expression)hasattrintegerfield_type_map)r>   valuer@   s      r   adapt_integerfield_valuez+DatabaseOperations.adapt_integerfield_valueM  s.    }/C D<4--m<UCCr   c                     |S r   ru   r>   r   s     r   adapt_datefield_valuez(DatabaseOperations.adapt_datefield_valueR      r   c                     |S r   ru   r   s     r   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_valueU  r   r   c                     |S r   ru   r   s     r   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_valueX  r   r   c                     |S r   ru   )r>   r   
max_digitsdecimal_placess       r   adapt_decimalfield_valuez+DatabaseOperations.adapt_decimalfield_value[  r   r   c                     |rt        |      S y r   )r   r   s     r   adapt_ipaddressfield_valuez-DatabaseOperations.adapt_ipaddressfield_value^  s    ;r   c                 .    t        |t        |            S )N)r   )r   r   )r>   r   r   s      r   adapt_json_valuez#DatabaseOperations.adapt_json_valuec  s    U."9::r   c                 h    |dk(  r|\  }}|\  }}g ||}d|d|d|fS t         	|   |||      S )N	DateFieldz(interval '1 day' * (z - rl   )supersubtract_temporals)
r>   r@   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrN   	__class__s
            r   r   z%DatabaseOperations.subtract_temporalsf  sR    K'"%GZ"%GZ/z/J/F7>H&PPw)-cBBr   c                 f   i }|r`|j                         D ci c]  \  }}|j                         |rdnd }}}| j                  D ]  }|j                  |d       }||||<    t	        |   |fi |}|r||d<   |r,|ddj                  d |j                         D              z  z  }|S c c}}w )NtruefalseFORMATz (%s)r   c              3   &   K   | ]	  }d |z    yw)z%s %sNru   )r   is     r   r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>~  s     )M}!'A+}s   )itemsrG   explain_optionspopr   explain_query_prefixr   )	r>   formatoptionsextrar   r   valid_optionprefixr  s	           r   r  z'DatabaseOperations.explain_query_prefixn  s     $+==?#2KD% 

f7:#2   !% 4 4L$7$*/E,' !5 -f@@$E(Og		)Mu{{})M MMMFs   B-c                 B   |t         j                  k(  ry|t         j                  k(  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 DO NOTHINGzON CONFLICT(r   z) DO UPDATE SET z = EXCLUDED.)r   IGNOREUPDATEr   mapr   r   on_conflict_suffix_sql)r>   r   on_conflictupdate_fieldsunique_fieldsr   r  s         r   r  z)DatabaseOperations.on_conflict_suffix_sql  s    *++++*+++		#doo}=>		 &)-%H%HE !'eW5%H  w-	
 	
s   3Bc                     t         |   ||||      \  }}|j                  | j                        |j                  | j                        k7  rt	        ||      }||fS r   )r   prepare_join_on_clauser;   r<   r   )r>   	lhs_table	lhs_field	rhs_table	rhs_fieldlhs_exprrhs_exprr  s          r   r  z)DatabaseOperations.prepare_join_on_clause  s_    "W;y)Y
( T__-1B1B4??1SSHi0H!!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   rA   r   rH   rO   rW   r^   rT   rd   rh   rm   ro   rq   rs   rw   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  r  __classcell__)r  s   @r   r   r      s^   )2&N
	
O  $O ) ")#LL&||)0$+LL'.||!
* **5<@
((?@
?F0!2
5: ;@u - &A D$ 			7 	D

;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.db.models.functionsr   django.utils.regex_helperr   r   r   ru   r   r   <module>r7     sL     (   E  8 1 + 6 , ,C"/ C"r   