U
    eI;                     @   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 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)_lazy_re_compilec                 C   s   | d krt jS tt j| dS )N)cls)jsondumpsr   )encoder r   L/tmp/pip-unpacked-wheel-lctamlir/django/db/backends/postgresql/operations.pyget_json_dumps   s    r   c                	       s  e Zd ZdZdZeddddddd	d
gZddddZerbd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deddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zdfd(d)Zd*d+ Zd,d- Zdgd.d/Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d:d;d<d=Z$d>d? Z%dhd@dAZ&dBdC Z'dDdE Z(dFdG Z)dHdI Z*erZdJdK Z+ndLdK Z+dMdN Z,dOdP Z-erdQdR Z.dSdT Z/dUdV Z0dWdX Z1didYdZZ2d[d\ Z3d]d^ Z4 fd_d`Z5dj fdadb	Z6 fdcddZ7  Z8S )kDatabaseOperationsZvarcharZEXPLAINZANALYZEZBUFFERSZCOSTSZSETTINGSZSUMMARYZTIMINGVERBOSEZWALintegerZbigintZsmallint)	AutoFieldZBigAutoFieldZSmallAutoFieldr   )numeric)ZSmallIntegerFieldZIntegerFieldZBigIntegerFieldZPositiveSmallIntegerFieldZPositiveIntegerFieldZPositiveBigIntegerFieldc                 C   s.   |  }|dkr*d|| jdd  S dS )N)GenericIPAddressFieldIPAddressFieldZ	TimeFieldZ	UUIDFieldzCAST(%%s AS %s)(r   %s)Zget_internal_typeZdb_type
connectionsplit)selfZ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r0d| d|fS |dkrHd| d|fS |  }| j|sjtd	|d
| d| d|fS )NZweek_dayzEXTRACT(DOW FROM z) + 1Ziso_week_dayzEXTRACT(ISODOW FROM )Z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_sqlQ   s    z#DatabaseOperations.date_extract_sqlNc                 C   s(   |  |||\}}d| d|f|fS NDATE_TRUNC(%s, r$   _convert_sql_to_tzr!   r*   r+   r,   tznamer   r   r   date_trunc_sql`   s    z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |\}}}|r2|dkrdnd}| | | S |S )N+-r   )r!   r3   signoffsetr   r   r   _prepare_tzname_deltae   s
    z(DatabaseOperations._prepare_tzname_deltac                 C   s0   |r(t jr(| |}| d||ffS ||fS )Nz AT TIME ZONE %s)r   ZUSE_TZr9   )r!   r+   r,   r3   Ztzname_paramr   r   r   r1   l   s    

z%DatabaseOperations._convert_sql_to_tzc                 C   s"   |  |||\}}d| d|fS )Nr   z)::dater0   r!   r+   r,   r3   r   r   r   datetime_cast_date_sqlr   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s"   |  |||\}}d| d|fS )Nr   )::timer0   r:   r   r   r   datetime_cast_time_sqlv   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s<   |  |||\}}|dkr.d| dd|fS | |||S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))r?   )r1   r-   r2   r   r   r   datetime_extract_sqlz   s    z'DatabaseOperations.datetime_extract_sqlc                 C   s(   |  |||\}}d| d|f|fS r.   r0   r2   r   r   r   datetime_trunc_sql   s    z%DatabaseOperations.datetime_trunc_sqlc                 C   s*   |dkrd| dd|fS |  |||S r>   )r-   r)   r   r   r   time_extract_sql   s    z#DatabaseOperations.time_extract_sqlc                 C   s(   |  |||\}}d| d|f|fS )Nr/   r<   r0   r2   r   r   r   time_trunc_sql   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   r!   r   r   r   deferrable_sql   s    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.
        )Zfetchall)r!   cursorr   r   r   fetch_returned_insert_rows   s    z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s@   d}|dkr,|dkrd}n|dkr(d}nd}|dkr<d	| }|S )
Nr   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexZiregex)r   r   zHOST(%s))ZCICharFieldZCIEmailFieldZCITextFieldz
%s::citextz%s::text)rH   rJ   rL   rN   z	UPPER(%s)r   )r!   r*   r"   lookupr   r   r   lookup_cast   s    zDatabaseOperations.lookup_castc                 C   s   d S Nr   rD   r   r   r   no_limit_value   s    z!DatabaseOperations.no_limit_valuec                 C   s   |gS rR   r   )r!   r+   r   r   r   prepare_sql_script   s    z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")rK   rM   )r!   namer   r   r   
quote_name   s    zDatabaseOperations.quote_namec                 C   s   t ||| jS rR   )r
   r   )r!   r+   r,   r   r   r   compose_sql   s    zDatabaseOperations.compose_sqlc                 C   s   dS )Nz(SELECT set_config('TimeZone', %s, false)r   rD   r   r   r   set_time_zone_sql   s    z$DatabaseOperations.set_time_zone_sqlF)reset_sequencesallow_cascadec                   sd   |sg S  dd fdd|D g}|r@| d |rT| d dd| gS )	NZTRUNCATE, c                 3   s   | ]}  |V  qd S rR   )	SQL_FIELDrW   ).0tabler!   styler   r   	<genexpr>   s     z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r!   ra   ZtablesrZ   r[   Z	sql_partsr   r`   r   	sql_flush   s    zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]D}|d }|d pd}| d|d|| |||f  q|S )Nr_   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rf   rd   	SQL_TABLErW   r]   )r!   ra   	sequencesr+   Zsequence_infoZ
table_nameZcolumn_namer   r   r   sequence_reset_by_name_sql   s    z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s$   |rd|  | S d|  | S d S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rW   )r!   Z
tablespaceinliner   r   r   tablespace_sql   s    z!DatabaseOperations.tablespace_sqlc                 C   s   ddl m} g }| j}|D ]}|jjD ]}t||jr&|d|d|	||jj
||j|||j|||j|d|d|	||jj
f   qq&q|S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rj   zIS NOTZFROM)Z	django.dbrp   rW   _metaZlocal_fields
isinstancer   rf   rd   rk   db_tabler]   rh   )r!   ra   Z
model_listrp   outputqnmodelfr   r   r   sequence_reset_sql   s*    
z%DatabaseOperations.sequence_reset_sqlc                 C   s   |S rR   r   )r!   xr   r   r   prep_for_iexact_query  s    z(DatabaseOperations.prep_for_iexact_queryc                 C   s   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.
        ?   r   rD   r   r   r   max_name_length  s    z"DatabaseOperations.max_name_lengthc                 C   s4   |r&dd |D }dd | g|fS dgg fS d S )Nc                 S   s   g | ]}|D ]}|qqS r   r   )r^   Z
param_listparamr   r   r   
<listcomp>$  s       z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)r\   ZDISTINCTre   )r!   fieldsr,   r   r   r   distinct_sql"  s    zDatabaseOperations.distinct_sqlc                 C   s,   z|  ||W S  tjk
r&   Y d S X d S rR   )rX   r   Z	DataErrorr!   rF   r+   r,   r   r   r   last_executed_query+  s    z&DatabaseOperations.last_executed_queryc                 C   s   |j d k	r|j  S d S rR   )querydecoder   r   r   r   r   3  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)rW   rv   rq   rs   rh   r^   fieldrD   r   r   r~   =  s   
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sr\   r   r   )r!   r   columnsr   rD   r   return_insert_columns:  s    
z(DatabaseOperations.return_insert_columnsc                 C   s*   dd |D }d dd |D }d| S )Nc                 s   s   | ]}d  |V  qdS )r\   Nr   )r^   rowr   r   r   rb   H  s     z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r\   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )r^   r+   r   r   r   rb   I  s     zVALUES r   )r!   r   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sqlG  s    z"DatabaseOperations.bulk_insert_sqlc                 C   s$   |d kst |dr|S | j| |S )NZresolve_expression)hasattrintegerfield_type_map)r!   valuer"   r   r   r   adapt_integerfield_valueN  s    z+DatabaseOperations.adapt_integerfield_valuec                 C   s   |S rR   r   r!   r   r   r   r   adapt_datefield_valueS  s    z(DatabaseOperations.adapt_datefield_valuec                 C   s   |S rR   r   r   r   r   r   adapt_datetimefield_valueV  s    z,DatabaseOperations.adapt_datetimefield_valuec                 C   s   |S rR   r   r   r   r   r   adapt_timefield_valueY  s    z(DatabaseOperations.adapt_timefield_valuec                 C   s   |S rR   r   )r!   r   Z
max_digitsZdecimal_placesr   r   r   adapt_decimalfield_value\  s    z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S rR   )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_valued  s    z#DatabaseOperations.adapt_json_valuec           	         s@   |dkr0|\}}|\}}||}d||f |fS t  |||S )NZ	DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals)	r!   r"   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr,   	__class__r   r   r   g  s    z%DatabaseOperations.subtract_temporalsc                    s   i }|rBdd |  D }| jD ] }||d }|d k	r |||< q t j|f|}|r^||d< |r|dddd |  D  7 }|S )Nc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)r%   )r^   rV   r   r   r   r   
<dictcomp>s  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)r\   c                 s   s   | ]}d | V  qdS )z%s %sNr   )r^   ir   r   r   rb     s     z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspopr   explain_query_prefixre   )r!   formatoptionsextraZvalid_optionr   prefixr   r   r   r   o  s    

 z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkrJd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   ZIGNOREZUPDATEre   maprW   r   on_conflict_suffix_sql)r!   r   Zon_conflictZupdate_fieldsZunique_fieldsr   r   r   r     s"    


	z)DatabaseOperations.on_conflict_suffix_sql)N)N)N)F)NN)N)9__name__
__module____qualname__Z"cast_char_field_without_max_lengthZexplain_prefix	frozensetr   Zcast_data_typesr	   Zpsycopg.typesr   ZInt2ZInt4ZInt8r   r#   r   r&   r-   r4   r9   r1   r;   r=   r@   rA   rB   rC   rE   rG   rQ   rS   rT   rW   rX   rY   rg   rm   ro   rx   rz   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   Zdjango.confr   Z"django.db.backends.base.operationsr   Z)django.db.backends.postgresql.psycopg_anyr   r   r   r	   r
   Zdjango.db.backends.utilsr   Zdjango.db.models.constantsr   Zdjango.utils.regex_helperr   r   r   r   r   r   r   <module>   s   
