Ë
    bõ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y)é    N)Ú	lru_cacheÚpartial)Úsettings)ÚBaseDatabaseOperations)ÚInetÚJsonbÚerrorsÚis_psycopg3Úmogrify©Úsplit_tzname_delta)Ú
OnConflict)Ú_lazy_re_compilec                 ó\   — | €t         j                  S t        t         j                  | ¬«      S )N)Úcls)ÚjsonÚdumpsr   )Úencoders    ú^/var/www/alwasay/venv/lib/python3.12/site-packages/django/db/backends/postgresql/operations.pyÚget_json_dumpsr      s"   € à€Ü�z‰zÐÜ”4—:‘: 7Ô+Ð+ó    c                   ó  ‡ — e Zd 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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.„ Z0d/„ Z1d0„ Z2d9d1„Z3d2„ Z4d3„ Z5ˆ fd4„Z6d7ˆ fd5„	Z7ˆ fd6„Z8ˆ xZ9S ):ÚDatabaseOperationsz&django.db.backends.postgresql.compilerÚvarcharÚEXPLAIN)ÚANALYZEÚBUFFERSÚCOSTSÚ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Ñ$OÐPSÓ$TÐUVÑ$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_sqlR   s¥   € à˜*Ò$à& s e¨5Ð1°6Ð9Ð9Ø˜NÒ*Ø)¨#¨¨aÐ0°&Ð8Ð8Ø˜JÒ&Ø*¨3¨%¨qÐ1°6Ð9Ð9à!×'Ñ'Ó)ˆØ×&Ñ&×0Ñ0°Ô=ÜÐ4°[°OÐDÓEÐEØ˜+˜ f¨S¨E°Ð3°VÐ;Ð;r   c                 óF   — | j                  |||«      \  }}d|› d�|g|¢­fS ©NúDATE_TRUNC(%s, rC   ©Ú_convert_sql_to_tz©r<   rJ   rK   rL   Útznames        r   Údate_trunc_sqlz!DatabaseOperations.date_trunc_sqla   ó6   € Ø×-Ñ-¨c°6¸6ÓB‰ˆˆVà    QÐ'¨+Ð)?¸Ñ)?Ð?Ð?r   c                 óJ   — t        |«      \  }}}|r|dk(  rdnd}|› |› |› �S |S )Nú+ú-r   )r<   rT   ÚsignÚoffsets       r   Ú_prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltaf   s;   € Ü1°&Ó9Ñˆ��fÙØ #š+‘3¨3ˆDØ�X˜d˜V F 8Ð,Ð,Øˆr   c                 óh   — |r-t         j                  r| j                  |«      }|› d�g |¢|‘­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_tzm   sC   € Ù”h—o’oØ×5Ñ5°fÓ=ˆLØ�UÐ*Ð+Ð-D¨vÐ-D°|Ñ-DÐDÐDØ�Fˆ{Ðr   c                 ó>   — | j                  |||«      \  }}d|› d�|fS )Nr6   z)::daterQ   ©r<   rK   rL   rT   s       r   Údatetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqls   ó.   € Ø×-Ñ-¨c°6¸6ÓB‰ˆˆVØ�3�%�wÐ Ð'Ð'r   c                 ó>   — | j                  |||«      \  }}d|› d�|fS )Nr6   ú)::timerQ   ra   s       r   Údatetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlw   rc   r   c                 óv   — | j                  |||«      \  }}|dk(  rd|› d�dg|¢­fS | j                  |||«      S ©NÚsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, ú)))rR   rM   rS   s        r   Údatetime_extract_sqlz'DatabaseOperations.datetime_extract_sql{   sS   € Ø×-Ñ-¨c°6¸6ÓB‰ˆˆVØ˜(Ò"à8¸¸¸RÐ@À8ÐBUÈfÑBUÐUÐUØ×$Ñ$ [°#°vÓ>Ð>r   c                 óF   — | j                  |||«      \  }}d|› d�|g|¢­fS rO   rQ   rS   s        r   Údatetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql‚   rV   r   c                 óJ   — |dk(  rd|› d�dg|¢­fS | j                  |||«      S rh   )rM   rI   s       r   Útime_extract_sqlz#DatabaseOperations.time_extract_sql‡   s;   € Ø˜(Ò"à8¸¸¸RÐ@À8ÐBUÈfÑBUÐUÐUØ×$Ñ$ [°#°vÓ>Ð>r   c                 óF   — | j                  |||«      \  }}d|› d�|g|¢­fS )NrP   re   rQ   rS   s        r   Útime_trunc_sqlz!DatabaseOperations.time_trunc_sql�   s6   € Ø×-Ñ-¨c°6¸6ÓB‰ˆˆVØ    WÐ-°Ð/E¸fÑ/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                 ó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›   sQ   € Øˆàð 

ñ 

ð Ð KÑKØ#‘àÐ"PÑPØ%‘à#�ð ÐMÑMØ  6Ñ)ˆFàˆr   c                  ó   — y ©Nrs   rt   s    r   Úno_limit_valuez!DatabaseOperations.no_limit_value·   s   € Ør   c                 ó   — |gS rŠ   rs   )r<   rK   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Ô D§M¡M°#Ô$6ØˆKØ˜‰}Ðr   c                 ó0   — t        ||| j                  «      S rŠ   )r   r:   )r<   rK   rL   s      r   Úcompose_sqlzDatabaseOperations.compose_sqlÂ   s   € Ü�s˜F D§O¡OÓ4Ð4r   c                  ó   — y)Nz(SELECT set_config('TimeZone', %s, false)rs   rt   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#   øè ø€ ÒRÀ%�e—o‘o d§o¡o°eÓ&<×=ÑRùs   ƒ*-zRESTART IDENTITYÚCASCADEz%s;ú )ÚSQL_KEYWORDÚjoinÚappend)r<   rŸ   Útablesr–   r—   Ú	sql_partss   ``    r   Ú	sql_flushzDatabaseOperations.sql_flushÈ   s†   ù€ ÙØˆIð
 ×Ñ˜jÓ)Ø�I‰IÔRÈ6Ô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Ÿ   Ú	sequencesrK   Úsequence_infoÚ
table_nameÚcolumn_names          r   Úsequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sqlØ   s|   € ð ˆØ&ò 	ˆMØ& wÑ/ˆJð (¨Ñ1Ò9°TˆKØ�J‰Jð ×%Ñ% hÕ/Ø—O‘O D§O¡O°JÓ$?Õ@Ø—O‘O KÕ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Ø—M‘Mð "×-Ñ-¨hÕ7Ø!ŸO™O©B¨u¯{©{×/CÑ/CÓ,DÕEØ!ŸO™O¨A¯H©HÕ5Ø!ŸO™O©B¨q¯x©x«LÕ9Ø!ŸO™O©B¨q¯x©x«LÕ9Ø!×-Ñ-¨hÕ7Ø!×-Ñ-¨fÕ5Ø!ŸO™O©B¨u¯{©{×/CÑ/CÓ,DÕEðôò  ò%ð	ð6 ˆr   c                 ó   — |S rŠ   rs   )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.
        é?   rs   rt   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<   ÚfieldsrL   Ú
param_listÚparams        r   Údistinct_sqlzDatabaseOperations.distinct_sql#  sS   € ÙØ.4×M 
À*ÒM¸’eÐM�eÐMˆFÑMØ'¨$¯)©)°FÓ*;Ñ;Ð<¸fÐEÐEà�< Ð#Ð#ùó Ns   ˆ7c                 óZ   — 	 | j                  ||«      S # t        j                  $ r Y y w xY wrŠ   )r“   r	   Ú	DataError©r<   rx   rK   rL   s       r   Úlast_executed_queryz&DatabaseOperations.last_executed_query,  s2   € ðØ×'Ñ'¨¨VÓ4Ð4øÜ×#Ñ#ò Ùðús   ‚ ”*©*c                 óP   — |j                   �|j                   j                  «       S y rŠ   )ÚqueryÚdecoder×   s       r   rØ   z&DatabaseOperations.last_executed_query4  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)Ú rs   ú.zRETURNING %srš   rs   )r‘   rÅ   r¾   rÁ   rª   r¤   )r<   rÑ   ÚfieldÚcolumnss       r   Úreturn_insert_columnsz(DatabaseOperations.return_insert_columns;  sw   € ÙØð  ö
ð ð —‘ §¡× 1Ñ 1× :Ñ :Õ;Ø—‘ §¡Ô-òð
ˆð 
ð  §	¡	¨'Ó 2Ñ2°BÐ6Ð6ùò
s   ˆAA4c                 óN   — d„ |D «       }dj                  d„ |D «       «      }d|z   S )Nc              3   ó>   K  — | ]  }d j                  |«      –— Œ y­w)rš   NrÐ   )r�   Úrows     r   r    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>I  s   è ø€ ÒK°3 §	¡	¨#§ÑKùs   ‚rš   c              3   ó&   K  — | ]	  }d |z  –— Œ y­w)z(%s)Nrs   )r�   rK   s     r   r    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>J  s   è ø€ ÒL°˜v¨�|ÑLùó   ‚zVALUES rÐ   )r<   rÑ   Úplaceholder_rowsÚplaceholder_rows_sqlÚ
values_sqls        r   Úbulk_insert_sqlz"DatabaseOperations.bulk_insert_sqlH  s.   € ÙKÐ:JÔKÐØ—Y‘YÑLÐ7KÔLÓLˆ
Ø˜:Ñ%Ð%r   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_valueO  s.   € Øˆ}¤¨Ð/CÔ DØ�Ø<�4×-Ñ-¨mÑ<¸UÓCÐCr   c                 ó   — |S rŠ   rs   ©r<   rï   s     r   Úadapt_datefield_valuez(DatabaseOperations.adapt_datefield_valueT  ó   € Øˆr   c                 ó   — |S rŠ   rs   rò   s     r   Úadapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_valueW  rô   r   c                 ó   — |S rŠ   rs   rò   s     r   Úadapt_timefield_valuez(DatabaseOperations.adapt_timefield_valueZ  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 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_valuee  s   € Ü�U¤.°Ó"9Ô:Ð:r   c                 óh   •— |dk(  r|\  }}|\  }}g |¢|¢­}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_temporalsh  sR   ø€ Ø˜KÒ'Ø"%ÑˆG�ZØ"%ÑˆG�ZØ/�zÐ/ JÑ/‰FÚ7>ÂÐ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 %sNrs   )r�   Úis     r   r    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>€  s   è ø€ Ò)M¸!¨'°A­+Ñ)Mùræ   )ÚitemsrE   Úexplain_optionsÚpopr  Úexplain_query_prefixr¤   )	r<   ÚformatÚoptionsÚextrar�   rï   Úvalid_optionÚprefixr  s	           €r   r  z'DatabaseOperations.explain_query_prefixp  sÍ   ø€ Øˆáð $+§=¡=£?÷á�D˜%ð —
‘
“©™f°7Ñ:ðˆGñ ð !%× 4Ñ 4ò 0�ØŸ™ L°$Ó7�ØÑ$Ø*/�E˜,Ò'ð0ô ‘Ñ-¨fÑ@¸Ñ@ˆÙØ$ˆE�(‰OÙØ�g §	¡	Ñ)M¸u¿{¹{»}Ô)MÓ MÑMÑMˆFØˆùó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¢   ø€ Øœ*×+Ñ+Ò+Ø+Øœ*×+Ñ+Ó+à—	‘	œ#˜dŸo™o¨}Ó=Õ>Ø—	‘	ô &)¨¯©¸-Ó%Höà!ð !˜' ¨e¨WÒ5òôðð ô ‰wÑ-ØØØØó	
ð 	
ùòs   Á3BrŠ   )F)NN):Ú__name__Ú
__module__Ú__qualname__Úcompiler_moduleÚ"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      sc  ø„ Ø>€OØ)2Ð&Ø€NÙò		
ó€Oð Ø Ø$ñ€Oñ Ý)ð ")§¡Ø#ŸL™LØ&Ÿ|™|Ø)0¯©Ø$+§L¡LØ'.§|¡|ñ!
Ðòñ* *¨*Ó5Ðò<ó@ò
òò(ò(ò?ò@ò
?óFò0ò!óò8òòò
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.utils.regex_helperr   r   r   rs   r   r   ú<module>r7     sI   ðÛ ß (å  Ý E÷õ õ 8Ý 1Ý 6ð ñ,ó ð,ô|
Ð/õ |
r   