o
    <gq<                     @   s   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
d ZG dd deZdS )    N)	lru_cachepartial)settings)BaseDatabaseOperations)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)Cast)_lazy_re_compilec                 C   s   | d u rt jS tt j| dS )N)cls)jsondumpsr   )encoder r   [/var/www/html/venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.pyget_json_dumps   s   r   c                       s  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d ZedZdd Zd^ddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd^d!d"Zd#d$ Zd%d& Zd^d'd(Zd)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d3d4d5d6Z$d7d8 Z%d_d9d:Z&d;d< Z'd=d> Z(d?d@ Z)dAdB Z*erdCdD Z+ndEdD Z+dFdG Z,erdHdI Z-dJdK Z.dLdM Z/dNdO Z0d`dPdQZ1dRdS Z2dTdU Z3 fdVdWZ4d^ fdXdY	Z5 fdZd[Z6 fd\d]Z7  Z8S )a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                 C   s.   |  }|dv rd|| jdd  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_typer   r   r   unification_cast_sql<   s
   z'DatabaseOperations.unification_cast_sqlz[A-Z_]+c                 C   s   |dkrd| d|fS |dkrd| d|fS |dkr$d| d|fS |  }| j|s5t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paramsr   r   r   date_extract_sqlS   s   z#DatabaseOperations.date_extract_sqlNc                 C   *   |  |||\}}d| d|g|R fS NDATE_TRUNC(%s, r@   _convert_sql_to_tzr:   rG   rH   rI   tznamer   r   r   date_trunc_sqlb      z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |\}}}|r|dkrdnd}| | | S |S )N+-r   )r:   rQ   signoffsetr   r   r   _prepare_tzname_deltag   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s4   |rt jr| |}| dg ||R fS ||fS )Nz AT TIME ZONE %s)r   USE_TZrX   )r:   rH   rI   rQ   tzname_paramr   r   r   rO   n   s   

z%DatabaseOperations._convert_sql_to_tzc                 C   "   |  |||\}}d| d|fS )Nr4   z)::daterN   r:   rH   rI   rQ   r   r   r   datetime_cast_date_sqlt      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r[   )Nr4   )::timerN   r\   r   r   r   datetime_cast_time_sqlx   r^   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s@   |  |||\}}|dkrd| ddg|R fS | |||S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))rO   rJ   rP   r   r   r   datetime_extract_sql|   s   z'DatabaseOperations.datetime_extract_sqlc                 C   rK   rL   rN   rP   r   r   r   datetime_trunc_sql   rS   z%DatabaseOperations.datetime_trunc_sqlc                 C   s.   |dkrd| ddg|R fS |  |||S ra   )rJ   rF   r   r   r   time_extract_sql   s   z#DatabaseOperations.time_extract_sqlc                 C   rK   )NrM   r_   rN   rP   r   r   r   time_trunc_sql   s   z!DatabaseOperations.time_trunc_sqlc                 C      dS )Nz DEFERRABLE INITIALLY DEFERREDr   r:   r   r   r   deferrable_sql      z!DatabaseOperations.deferrable_sqlc                 C   s   |  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:   cursorr   r   r   fetch_returned_insert_rows   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s2   d}|dv r|dv rd}nd}|dv rd| }|S )Nr5   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r1   r0   zHOST(%s)z%s::text)rn   rp   rr   rt   z	UPPER(%s)r   )r:   rG   r<   lookupr   r   r   lookup_cast   s   zDatabaseOperations.lookup_castc                 C   s   d S Nr   rh   r   r   r   no_limit_value   rj   z!DatabaseOperations.no_limit_valuec                 C   s   |gS ry   r   )r:   rH   r   r   r   prepare_sql_script   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")rq   rs   )r:   namer   r   r   
quote_name   s   zDatabaseOperations.quote_namec                 C   s   t ||| jS ry   )r
   r8   )r:   rH   rI   r   r   r   compose_sql   s   zDatabaseOperations.compose_sqlc                 C   rg   )Nz(SELECT set_config('TimeZone', %s, false)r   rh   r   r   r   set_time_zone_sql   rj   z$DatabaseOperations.set_time_zone_sqlF)reset_sequencesallow_cascadec                   sd   |sg S  dd fdd|D g}|r | d |r*| d dd| gS )	NTRUNCATE, c                 3   s     | ]}  |V  qd S ry   )	SQL_FIELDr~   ).0tabler:   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)r:   r   tablesr   r   	sql_partsr   r   r   	sql_flush   s   zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}| d|d|| |||f  q|S )Nr   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)r   r   	SQL_TABLEr~   r   )r:   r   	sequencesrH   sequence_info
table_namecolumn_namer   r   r   sequence_reset_by_name_sql   s   z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s    |r	d|  | S d|  | S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r~   )r:   
tablespaceinliner   r   r   tablespace_sql   s   z!DatabaseOperations.tablespace_sqlc                 C   s   ddl m} g }| j}|D ]G}|jjD ]@}t||jrS|d|d|	||jj
||j|||j|||j|d|d|	||jj
f   nqq|S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;r   zIS NOTFROM)	django.dbr   r~   _metalocal_fields
isinstancer&   r   r   r   db_tabler   r   )r:   r   
model_listr   outputqnmodelfr   r   r   sequence_reset_sql   s.   
z%DatabaseOperations.sequence_reset_sqlc                 C      |S ry   r   )r:   xr   r   r   prep_for_iexact_query  rj   z(DatabaseOperations.prep_for_iexact_queryc                 C   rg   )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.
        ?   r   rh   r   r   r   max_name_length  s   z"DatabaseOperations.max_name_lengthc                 C   s0   |rdd |D }dd | g|fS dgg fS )Nc                 S   s   g | ]	}|D ]}|qqS r   r   )r   
param_listparamr   r   r   
<listcomp>#  s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)r   DISTINCTr   )r:   fieldsrI   r   r   r   distinct_sql!  s   
zDatabaseOperations.distinct_sqlc                 C   sR   | j jjrz| ||W S  tjy   Y d S w |jr'|jjd ur'|jj S d S ry   )	r8   featuresuses_server_side_bindingr   r   	DataError_queryquerydecoder:   rl   rH   rI   r   r   r   last_executed_query*  s   
z&DatabaseOperations.last_executed_queryc                 C   s   |j d ur
|j  S d S ry   )r   r   r   r   r   r   r   7  s   

c                    s,   |sdS  fdd|D }dd | dfS )N) r   c                    s,   g | ]}d   |jjj  |jf qS )z%s.%s)r~   r   r   r   r   r   fieldrh   r   r   r   A  s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sr   r   r   )r:   r   columnsr   rh   r   return_insert_columns>  s   
z(DatabaseOperations.return_insert_columnsc                 C   s$   |d u s	t |dr|S | j| |S )Nresolve_expression)hasattrintegerfield_type_map)r:   valuer<   r   r   r   adapt_integerfield_valueM  s   z+DatabaseOperations.adapt_integerfield_valuec                 C   r   ry   r   r:   r   r   r   r   adapt_datefield_valueR  rj   z(DatabaseOperations.adapt_datefield_valuec                 C   r   ry   r   r   r   r   r   adapt_datetimefield_valueU  rj   z,DatabaseOperations.adapt_datetimefield_valuec                 C   r   ry   r   r   r   r   r   adapt_timefield_valueX  rj   z(DatabaseOperations.adapt_timefield_valuec                 C   r   ry   r   )r:   r   
max_digitsdecimal_placesr   r   r   adapt_decimalfield_value[  rj   z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S ry   )r   r   r   r   r   adapt_ipaddressfield_value^  s   z-DatabaseOperations.adapt_ipaddressfield_valuec                 C   s   t |t|dS )N)r   )r   r   )r:   r   r   r   r   r   adapt_json_valuec  s   z#DatabaseOperations.adapt_json_valuec           	         sF   |dkr|\}}|\}}g ||R }d||f |fS t  |||S )N	DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals)	r:   r<   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrI   	__class__r   r   r   f  s   z%DatabaseOperations.subtract_temporalsc                    s   i }|r!dd |  D }| jD ]}||d }|d ur |||< qt j|fi |}|r1||d< |rC|dddd |  D  7 }|S )Nc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)rB   )r   r}   r   r   r   r   
<dictcomp>r  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>FORMATz (%s)r   c                 s   s    | ]}d | V  qdS )z%s %sNr   )r   ir   r   r   r   ~  s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspopr   explain_query_prefixr   )r:   formatoptionsextravalid_optionr   prefixr   r   r   r   n  s    
 z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkr%ddt| j|ddd t| j|D f S t ||||S )NzON CONFLICT DO NOTHINGz ON CONFLICT(%s) DO UPDATE SET %sr   c                 S   s   g | ]	}| d | qS )z = EXCLUDED.r   r   r   r   r   r     s    z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>)r   IGNOREUPDATEr   mapr~   r   on_conflict_suffix_sql)r:   r   on_conflictupdate_fieldsunique_fieldsr   r   r   r     s"   


	z)DatabaseOperations.on_conflict_suffix_sqlc                    s@   t  ||||\}}|| j|| jkrt||}||fS ry   )r   prepare_join_on_clauser7   r8   r   )r:   	lhs_table	lhs_field	rhs_table	rhs_fieldlhs_exprrhs_exprr   r   r   r     s   
z)DatabaseOperations.prepare_join_on_clausery   )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   rC   rJ   rR   rX   rO   r]   r`   rc   rd   re   rf   ri   rm   rx   rz   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   r   r   r   r      s|    	



"

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   r   r   r   r   <module>   s    
