3
(hu                 @   s(   d dl Z d dlmZ G dd deZdS )    N)BaseDatabaseSchemaEditorc                   sj   e Zd ZdZdZdZdZdZdZdd Z	 fd	d
Z
 fddZdd Z fddZd fdd	Z  ZS )DatabaseSchemaEditorz@ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::%(type)szCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)szMCREATE INDEX %(name)s ON %(table)s (%(columns)s varchar_pattern_ops)%(extra)szJCREATE INDEX %(name)s ON %(table)s (%(columns)s text_pattern_ops)%(extra)sc             C   s   t jj|S )N)psycopg2
extensionsZadapt)selfvalue r   H/tmp/pip-install-q3hcpn_q/Django/django/db/backends/postgresql/schema.pyquote_value   s    z DatabaseSchemaEditor.quote_valuec                s6   t t| j|| | j||}|d k	r2| jj| d S )N)superr   	add_field_create_like_index_sqlZdeferred_sqlappend)r   modelfieldlike_index_statement)	__class__r   r	   r      s    zDatabaseSchemaEditor.add_fieldc                sb   t t| j|}|jj s*|jjs*|jjr.|S x.|jjD ]"}| j||}|d k	r8|j	| q8W |S )N)
r   r   _model_indexes_sqlZ_metaZmanagedproxyZswappedZlocal_fieldsr   r   )r   r   outputr   r   )r   r   r	   r      s    z'DatabaseSchemaEditor._model_indexes_sqlc             C   sr   |j | jd}|dk	rn|js"|jrnd|kr.dS |jdrN| j||gd| jdS |jdrn| j||gd| jdS dS )z
        Return the statement to create an index with varchar operator pattern
        when the column type is 'varchar' or 'text', otherwise return None.
        )
connectionN[Zvarchar_like)suffixZsqltext)db_typer   db_indexunique
startswithZ_create_index_sqlsql_create_varchar_indexsql_create_text_index)r   r   r   r   r   r   r	   r   %   s    

z+DatabaseSchemaEditor._create_like_index_sqlc          
      s   |j  dkr|j}d||f }|j  dkr.dnd}| j| j||d g f| jd| j|i g f| jd| j|i g f| j| j|| j| j|d| j| d	 d
 g f| j| j|| j|| j|d g fgfS t	t
| j||||S dS )z:
        Makes ALTER TYPE with SERIAL make sense.
        serial	bigserialz	%s_%s_seqintegerZbigint)columntypesequenceznextval('%s'))r$   default)tableZchanges)r(   r$   r&   N)r!   r"   )lowerr$   sql_alter_column_typeZ
quote_namesql_delete_sequencesql_create_sequenceZsql_alter_columnZsql_alter_column_defaultsql_set_sequence_maxr   r   _alter_column_type_sql)r   r(   	old_field	new_fieldnew_typer$   Zsequence_nameZcol_type)r   r   r	   r.   ;   s6    

z+DatabaseSchemaEditor._alter_column_type_sqlFc	          	      s   t t| j|||||||| |j rX|j rX|js:|jrX| j||}	|	d k	rX| j|	 |jsd|jr|jpn|j r| j||jgdd}
| j	||jgdd}x*|D ]"}||
kr| j| j
| j|| qW d S )Nr   )r   T)index)r   r   _alter_fieldr   r   r   executeZ_create_index_namer$   Z_constraint_namesZ_delete_constraint_sqlZsql_delete_index)r   r   r/   r0   Zold_typer1   Zold_db_paramsZnew_db_paramsstrictr   Zindex_to_removeZindex_namesZ
index_name)r   r   r	   r3   q   s    


z!DatabaseSchemaEditor._alter_field)F)__name__
__module____qualname__r*   r,   r+   r-   r   r    r
   r   r   r   r.   r3   __classcell__r   r   )r   r	   r      s   7r   )r   Zdjango.db.backends.base.schemar   r   r   r   r   r	   <module>   s   