U
    Ha,                     @   s8   d dl mZ d dlmZ d dlmZ G dd deZdS )    Inet)settings)BaseDatabaseOperationsc                       s^  e Zd ZdZdZddddZdd Zd	d
 ZdPddZdd Z	dd Z
dd Zdd Zdd Zdd ZdQddZdd Zdd ZdRd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d*d+d,d-Zd.d/ ZdSd0d1Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dTdFdGZ$dHdI Z% fdJdKZ&dU fdLdM	Z'dV fdNdO	Z(  Z)S )WDatabaseOperationsZvarcharZEXPLAINintegerZbigintZsmallint)	AutoFieldZBigAutoFieldZSmallAutoFieldc                 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_type r   L/tmp/pip-unpacked-wheel-3jxiddxt/django/db/backends/postgresql/operations.pyunification_cast_sql   s    z'DatabaseOperations.unification_cast_sqlc                 C   s@   |dkrd| S |dkr d| S |dkr0d| S d||f S d S )NZweek_dayzEXTRACT('dow' FROM %s) + 1Ziso_week_dayzEXTRACT('isodow' FROM %s)Ziso_yearzEXTRACT('isoyear' FROM %s)zEXTRACT('%s' FROM %s)r   )r   lookup_type
field_namer   r   r   date_extract_sql   s    z#DatabaseOperations.date_extract_sqlNc                 C   s   |  ||}d||f S NzDATE_TRUNC('%s', %s)_convert_field_to_tzr   r   r   tznamer   r   r   date_trunc_sql)   s    z!DatabaseOperations.date_trunc_sqlc                 C   s,   d|kr| ddS d|kr(| ddS |S )N+-)replace)r   r   r   r   r   _prepare_tzname_delta.   s
    z(DatabaseOperations._prepare_tzname_deltac                 C   s    |rt jrd|| |f }|S )Nz%s AT TIME ZONE '%s')r   ZUSE_TZr    r   r   r   r   r   r   r   5   s    
z'DatabaseOperations._convert_field_to_tzc                 C   s   |  ||}d| S )Nz
(%s)::dater   r!   r   r   r   datetime_cast_date_sql:   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s   |  ||}d| S )Nz
(%s)::timer   r!   r   r   r   datetime_cast_time_sql>   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |  ||}| ||S N)r   r   r   r   r   r   datetime_extract_sqlB   s    z'DatabaseOperations.datetime_extract_sqlc                 C   s   |  ||}d||f S r   r   r   r   r   r   datetime_trunc_sqlF   s    z%DatabaseOperations.datetime_trunc_sqlc                 C   s   |  ||}d||f S )NzDATE_TRUNC('%s', %s)::timer   r   r   r   r   time_trunc_sqlK   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   r   r   r   r   deferrable_sqlO   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_rowsR   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)r,   r.   r0   r2   z	UPPER(%s)r   )r   r   r   lookupr   r   r   lookup_castY   s    zDatabaseOperations.lookup_castc                 C   s   d S r$   r   r(   r   r   r   no_limit_valuel   s    z!DatabaseOperations.no_limit_valuec                 C   s   |gS r$   r   )r   sqlr   r   r   prepare_sql_scripto   s    z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")r/   r1   )r   namer   r   r   
quote_namer   s    zDatabaseOperations.quote_namec                 C   s   dS )NzSET TIME ZONE %sr   r(   r   r   r   set_time_zone_sqlw   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 r$   )	SQL_FIELDr;   ).0tabler   styler   r   	<genexpr>   s     z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r   rD   Ztablesr=   r>   Z	sql_partsr   rC   r   	sql_flushz   s    zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]D}|d }|d pd}| d|d|| |||f  q|S )NrB   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rI   rG   	SQL_TABLEr;   r@   )r   rD   	sequencesr7   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)r;   )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;rM   zIS NOTZFROM)Z	django.dbrS   r;   _metaZlocal_fields
isinstancer   rI   rG   rN   db_tabler@   rK   )r   rD   Z
model_listrS   outputqnmodelfr   r   r   sequence_reset_sql   s*    
z%DatabaseOperations.sequence_reset_sqlc                 C   s   |S r$   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   r(   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   )rA   Z
param_listparamr   r   r   
<listcomp>   s       z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)r?   ZDISTINCTrH   )r   fieldsparamsr   r   r   distinct_sql   s    zDatabaseOperations.distinct_sqlc                 C   s   |j d k	r|j  S d S r$   )querydecode)r   r*   r7   rd   r   r   r   last_executed_query   s    

z&DatabaseOperations.last_executed_queryc                    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;   rY   rT   rV   rK   )rA   fieldr(   r   r   ra      s
   
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sr?   r   rb   )r   rc   columnsr   r(   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?   Nrb   )rA   rowr   r   r   rE      s     z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r?   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )rA   r7   r   r   r   rE      s     zVALUES rb   )r   rc   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s    z"DatabaseOperations.bulk_insert_sqlc                 C   s   |S r$   r   r   valuer   r   r   adapt_datefield_value   s    z(DatabaseOperations.adapt_datefield_valuec                 C   s   |S r$   r   ro   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec                 C   s   |S r$   r   ro   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec                 C   s   |S r$   r   )r   rp   Z
max_digitsZdecimal_placesr   r   r   adapt_decimalfield_value   s    z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S r$   r   ro   r   r   r   adapt_ipaddressfield_value   s    z-DatabaseOperations.adapt_ipaddressfield_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_paramsrd   	__class__r   r   rw      s    z%DatabaseOperations.subtract_temporalsc                    s`   t  |}i }|r||d< |r8|dd | D  |r\|dddd | D  7 }|S )NZFORMATc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)upper)rA   r:   rp   r   r   r   
<dictcomp>
  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)r?   c                 s   s   | ]}d | V  qdS )z%s %sNr   )rA   ir   r   r   rE     s     z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rv   explain_query_prefixupdateitemsrH   )r   formatoptionsprefixextrarz   r   r   r     s    
 z'DatabaseOperations.explain_query_prefixc                    s   |rdS t  |S )NzON CONFLICT DO NOTHING)rv   ignore_conflicts_suffix_sql)r   Zignore_conflictsrz   r   r   r     s    z.DatabaseOperations.ignore_conflicts_suffix_sql)N)N)N)F)NN)N)N)*__name__
__module____qualname__Z"cast_char_field_without_max_lengthZexplain_prefixZcast_data_typesr   r   r   r    r   r"   r#   r%   r&   r'   r)   r+   r5   r6   r8   r;   r<   rJ   rP   rR   r[   r]   r_   re   rh   rl   rn   rq   rr   rs   rt   ru   rw   r   r   __classcell__r   r   rz   r   r      sR   




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   