B
    CVvg.                 @   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            	       sv  e Zd ZdZdZeddddddd	d
gZddddZdd Zdd Z	dXddZ
dd Zdd Zdd Zdd Zdd Zd d! ZdYd"d#Zd$d% Zd&d' ZdZd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d2d3d4d5Zd6d7 Zd[d8d9Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC Z dDdE Z!dFdG Z"dHdI Z#dJdK Z$dLdM Z%d\dNdOZ&dPdQ Z' fdRdSZ(d] fdTdU	Z)d^ fdVdW	Z*  Z+S )_DatabaseOperationsZvarcharZEXPLAINZANALYZEZBUFFERSZCOSTSZSETTINGSZSUMMARYZTIMINGVERBOSEZWAL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   z%s)Zget_internal_typeZdb_type
connectionsplit)selfZoutput_fieldinternal_type r   L/tmp/pip-install-o3oxmrkh/Django/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_sql5   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   A   s    
z'DatabaseOperations._convert_field_to_tzc             C   s   |  ||}d| S )Nz
(%s)::date)r   )r   r   r   r   r   r   datetime_cast_date_sqlF   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   |  ||}d| S )Nz
(%s)::time)r   )r   r   r   r   r   r   datetime_cast_time_sqlJ   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   |  ||}| ||S )N)r   r   )r   r   r   r   r   r   r   datetime_extract_sqlN   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   |  ||}d||f S )NzDATE_TRUNC('%s', %s))r   )r   r   r   r   r   r   r   datetime_trunc_sqlR   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   |  ||}d||f S )NzDATE_TRUNC('%s', %s)::time)r   )r   r   r   r   r   r   r   time_trunc_sqlW   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 )
Nz%s)	iexactcontains	icontains
startswithistartswithendswith	iendswithregexZiregex)r
   r	   zHOST(%s))ZCICharFieldZCIEmailFieldZCITextFieldz
%s::citextz%s::text)r%   r'   r)   r+   z	UPPER(%s)r   )r   r   r   lookupr   r   r   lookup_caste   s    zDatabaseOperations.lookup_castc             C   s   d S )Nr   )r   r   r   r   no_limit_valuex   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    | dr|dr|S d| S )N"z"%s")r(   r*   )r   namer   r   r   
quote_name~   s    zDatabaseOperations.quote_namec             C   s   dS )NzSET TIME ZONE %sr   )r   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TRUNCATEz, c             3   s   | ]}  |V  qd S )N)	SQL_FIELDr4   ).0table)r   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r   r;   tablesr6   r7   Z	sql_partsr   )r   r;   r   	sql_flush   s    zDatabaseOperations.sql_flushc          
   C   sV   g }xL|D ]D}|d }|d p d}| d|d|| |||f  q
W |S )Nr:   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)r@   r>   	SQL_TABLEr4   r8   )r   r;   	sequencesr0   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)r4   )r   Z
tablespaceinliner   r   r   tablespace_sql   s    z!DatabaseOperations.tablespace_sqlc             C   s   ddl m} g }| j}x|D ]}x|jjD ]~}t||jr*|d|d|	||jj
||j|||j|||j|d|d|	||jj
f  P q*W qW |S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rE   zIS NOTZFROM)Z	django.dbrK   r4   _metaZlocal_fields
isinstancer   r@   r>   rF   db_tabler8   rC   )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 | g|fS dgg fS d S )Nc             S   s   g | ]}|D ]}|qqS r   r   )r9   Z
param_listparamr   r   r   
<listcomp>   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  S d S )N)querydecode)r   r#   r0   r[   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)r4   rQ   rL   rN   rC   )r9   field)r   r   r   rY      s   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sz, r   )r?   )r   rZ   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 )z, N)r?   )r9   rowr   r   r   r<      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r9   r0   r   r   r   r<      s    zVALUES )r?   )r   rZ   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   rf   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   |S )Nr   )r   rf   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   |S )Nr   )r   rf   Z
max_digitsZdecimal_placesr   r   r   adapt_decimalfield_value   s    z+DatabaseOperations.adapt_decimalfield_valuec             C   s   |rt |S d S )N)r   )r   rf   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_paramsr[   )	__class__r   r   rm     s    z%DatabaseOperations.subtract_temporalsc                s   i }|rJdd |  D }x.| jD ]$}||d }|d k	r"||| < q"W t j|f|}|rf||d< |r|dddd |  D  7 }|S )Nc             S   s"   i | ]\}}|rd nd|  qS )truefalse)upper)r9   r3   rf   r   r   r   
<dictcomp>  s   z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)z, c             s   s   | ]}d | V  qdS )z%s %sNr   )r9   ir   r   r   r<      s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspoprs   rl   explain_query_prefixr?   )r   formatoptionsextraZvalid_optionrf   prefix)rp   r   r   ry     s     z'DatabaseOperations.explain_query_prefixc                s   |rdS t  |S )NzON CONFLICT DO NOTHING)rl   ignore_conflicts_suffix_sql)r   Zignore_conflicts)rp   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_prefix	frozensetrw   Zcast_data_typesr   r   r   r   r   r   r   r   r    r!   r"   r$   r.   r/   r1   r4   r5   rB   rH   rJ   rS   rU   rW   r\   r_   rc   re   rg   rh   ri   rj   rk   rm   ry   r~   __classcell__r   r   )rp   r   r      sb   




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   