3
[}-                 @   sD   d dl mZ 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)NotSupportedError)BaseDatabaseOperationsc                   s6  e Zd ZdZ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 Zdd Zdd Zdd ZdGddZdd Zdd Zd d! Zd"d# ZdHd%d&Zd'd( ZdId)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z" fdAdBZ#dJ fdCdD	Z$dK fdEdF	Z%  Z&S )LDatabaseOperationsZvarcharZEXPLAINc             C   s.   |j  }|d	kr*d|j| jjdd  S dS )
NGenericIPAddressFieldIPAddressField	TimeField	UUIDFieldzCAST(%%s AS %s)(r   z%s)r   r   r	   r
   )Zget_internal_typeZdb_type
connectionsplit)selfZoutput_fieldinternal_type r   L/tmp/pip-install-j7i95hgp/django/django/db/backends/postgresql/operations.pyunification_cast_sql   s    z'DatabaseOperations.unification_cast_sqlc             C   s    |dkrd| S d||f S d S )NZweek_dayzEXTRACT('dow' FROM %s) + 1zEXTRACT('%s' FROM %s)r   )r   lookup_type
field_namer   r   r   date_extract_sql   s    z#DatabaseOperations.date_extract_sqlc             C   s   d||f S )NzDATE_TRUNC('%s', %s)r   )r   r   r   r   r   r   date_trunc_sql!   s    z!DatabaseOperations.date_trunc_sqlc             C   s   t jrd||f }|S )Nz%s AT TIME ZONE '%s')r   ZUSE_TZ)r   r   tznamer   r   r   _convert_field_to_tz%   s    z'DatabaseOperations._convert_field_to_tzc             C   s   | j ||}d| S )Nz
(%s)::date)r   )r   r   r   r   r   r   datetime_cast_date_sql*   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   | j ||}d| S )Nz
(%s)::time)r   )r   r   r   r   r   r   datetime_cast_time_sql.   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   | j ||}| j||S )N)r   r   )r   r   r   r   r   r   r   datetime_extract_sql2   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   | j ||}d||f S )NzDATE_TRUNC('%s', %s))r   )r   r   r   r   r   r   r   datetime_trunc_sql6   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   d||f S )NzDATE_TRUNC('%s', %s)::timer   )r   r   r   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   dd |j  D S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table that has an auto-incrementing ID, return the
        list of newly created IDs.
        c             S   s   g | ]}|d  qS )r   r   ).0itemr   r   r   
<listcomp>G   s    z@DatabaseOperations.fetch_returned_insert_ids.<locals>.<listcomp>)Zfetchall)r   cursorr   r   r   fetch_returned_insert_idsA   s    z,DatabaseOperations.fetch_returned_insert_idsNc          
   C   s@   d}|dkr,|dkrd}n|dkr(d}nd}|dkr<d| }|S )Nz%siexactcontains	icontains
startswithistartswithendswith	iendswithregexiregexr   r   zHOST(%s)CICharFieldCIEmailFieldCITextFieldz
%s::citextz%s::textz	UPPER(%s))	r$   r%   r&   r'   r(   r)   r*   r+   r,   )r   r   )r-   r.   r/   )r$   r&   r(   r*   r   )r   r   r   lookupr   r   r   lookup_castI   s    zDatabaseOperations.lookup_castc             C   s   d S )Nr   )r   r   r   r   no_limit_value\   s    z!DatabaseOperations.no_limit_valuec             C   s   |gS )Nr   )r   sqlr   r   r   prepare_sql_script_   s    z%DatabaseOperations.prepare_sql_scriptc             C   s    |j dr|jdr|S d| S )N"z"%s")r'   r)   )r   namer   r   r   
quote_nameb   s    zDatabaseOperations.quote_namec             C   s   dS )NzSET TIME ZONE %sr   )r   r   r   r   set_time_zone_sqlg   s    z$DatabaseOperations.set_time_zone_sqlFc                sr   |rjdj  fdd|D }|r@djd|jdf g}ndjd|f g}|j j| |S g S d S )Nz, c             3   s   | ]}j  j|V  qd S )N)	SQL_FIELDr7   )r   table)r   styler   r   	<genexpr>p   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>z	%s %s %s;ZTRUNCATEZCASCADEz%s %s;)joinSQL_KEYWORDextendsequence_reset_by_name_sql)r   r;   tables	sequencesZallow_cascadeZ
tables_sqlr3   r   )r   r;   r   	sql_flushj   s    
zDatabaseOperations.sql_flushc             C   sV   g }xL|D ]D}|d }|d p d}|j d|jd|j| j||j|f  q
W |S )Nr:   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)appendr>   	SQL_TABLEr7   r9   )r   r;   rB   r3   Zsequence_infoZ
table_nameZcolumn_namer   r   r   r@      s    
z-DatabaseOperations.sequence_reset_by_name_sqlc             C   s$   |rd| j | S d| j | S d S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r7   )r   Z
tablespaceinliner   r   r   tablespace_sql   s    z!DatabaseOperations.tablespace_sqlc             C   s8  ddl m} g }| j}x|D ]}x|jjD ]~}t||jr.|jd|jd|j	||jj
|j|j|j||j|j||j|jd|jd|j	||jj
f  P q.W x~|jjD ]r}|jjs|jd|jd|j	||j |jd|j|d|j|d|jd|jd|j	||j f  qW qW |S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rF   zIS NOTZFROMrE   )	django.dbrK   r7   Z_metaZlocal_fields
isinstanceZ	AutoFieldrG   r>   rH   Zdb_tabler9   rD   Zmany_to_manyZremote_fieldZthroughZm2m_db_table)r   r;   Z
model_listrK   outputqnmodelfr   r   r   sequence_reset_sql   s<    
 z%DatabaseOperations.sequence_reset_sqlc             C   s   |S )Nr   )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j | 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   r!      s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)z, ZDISTINCT)r=   )r   fieldsparamsr   r   r   distinct_sql   s    zDatabaseOperations.distinct_sqlc             C   s   |j d k	r|j j S d S )N)querydecode)r   r"   r3   rY   r   r   r   last_executed_query   s    

z&DatabaseOperations.last_executed_queryc             C   s   df fS )NzRETURNING %sr   )r   r   r   r   return_insert_id   s    z#DatabaseOperations.return_insert_idc             C   s*   dd |D }dj dd |D }d| S )Nc             s   s   | ]}d j |V  qdS )z, N)r=   )r   rowr   r   r   r<      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r   r3   r   r   r   r<      s    zVALUES )r=   )r   rX   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s    z"DatabaseOperations.bulk_insert_sqlc             C   s   |S )Nr   )r   valuer   r   r   adapt_datefield_value   s    z(DatabaseOperations.adapt_datefield_valuec             C   s   |S )Nr   )r   ra   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   |S )Nr   )r   ra   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   |rt |S d S )N)r   )r   ra   r   r   r   adapt_ipaddressfield_value   s    z-DatabaseOperations.adapt_ipaddressfield_valuec                s<   |dkr,|\}}|\}}d||f || fS t  j|||S )NZ	DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals)r   r   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_params)	__class__r   r   rg      s
    z%DatabaseOperations.subtract_temporalsc                s:   t  j||\}}|r|dk s*|r2|dkr2td||fS )Nr   zIPostgreSQL only supports UNBOUNDED together with PRECEDING and FOLLOWING.)rf   window_frame_range_start_endr   )r   startendZstart_end_)rj   r   r   rk      s
    z/DatabaseOperations.window_frame_range_start_endc                s`   t  j|}i }|r||d< |r8|jdd |j D  |r\|ddjdd |j D  7 }|S )NZFORMATc             S   s"   i | ]\}}|rd nd|j  qS )truefalse)upper)r   r6   ra   r   r   r   
<dictcomp>  s   z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)z, c             s   s   | ]}d | V  qdS )z%s %sNr   )r   ir   r   r   r<     s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rf   explain_query_prefixupdateitemsr=   )r   formatoptionsprefixextra)rj   r   r   rt     s    
 z'DatabaseOperations.explain_query_prefix)N)F)F)NN)N)'__name__
__module____qualname__Z"cast_char_field_without_max_lengthZexplain_prefixr   r   r   r   r   r   r   r   r   r   r#   r1   r2   r4   r7   r8   rC   r@   rJ   rR   rT   rV   rZ   r]   r^   r`   rb   rc   rd   re   rg   rk   rt   __classcell__r   r   )rj   r   r      sF   


,	r   N)	Zpsycopg2.extrasr   Zdjango.confr   rL   r   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   