3
7^                 @   s4   d dl Z d dlmZ d dlmZ G dd deZdS )    N)BaseDatabaseSchemaEditor)IndexColumnsc                   sr   e Zd ZdZdZdZdZdZdZdZ	dZ
d	d
 Z fddZdd Z fddZd fdd	Z 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)szOCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)szDROP INDEX IF EXISTS %(name)szRSET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz,DROP FUNCTION %(procedure)s(%(param_types)s)c             C   s*   t |tr|jdd}tjj|j j S )N%z%%)
isinstancestrreplacepsycopg2
extensionsZadaptZ	getquoteddecode)selfvalue r   F/tmp/pip-build-8app2_gc/Django/django/db/backends/postgresql/schema.pyquote_value   s    
z DatabaseSchemaEditor.quote_valuec                s0   t  j||}| j||}|d k	r,|j| |S )N)super_field_indexes_sql_create_like_index_sqlappend)r   modelfieldoutputlike_index_statement)	__class__r   r   r      s
    
z'DatabaseSchemaEditor._field_indexes_sqlc             C   sr   |j | jd}|dk	rn|js"|jrnd|kr.dS |jdrN| j||gddgdS |jdrn| j||gdd	g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[varchar_likeZvarchar_pattern_ops)suffix	opclassestextZtext_pattern_ops)db_typer   db_indexunique
startswithZ_create_index_sql)r   r   r   r!   r   r   r   r   %   s    

z+DatabaseSchemaEditor._create_like_index_sqlc       	   
      s   |j j}|j dkr|j}d||f }|j dkr6d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 j||||S dS )z'Make 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&   )_metadb_tablelowerr(   sql_alter_column_type
quote_namesql_delete_sequencesql_create_sequenceZsql_alter_columnZsql_alter_column_defaultsql_set_sequence_maxr   _alter_column_type_sql)	r   r   	old_field	new_fieldnew_typer,   r(   Zsequence_nameZcol_type)r   r   r   r5   ;   s6    
z+DatabaseSchemaEditor._alter_column_type_sqlFc	          	      s  |j s|jrx|jdr"|jd sN|jdr8|jd sN|jdrx|jd rx| j|jj|jgdd}	| j| j||	 t	 j
|||||||| |j p|j r|j s|j r|jr| j||}
|
d k	r| j|
 |jo|j p|j r| j|jj|jgdd}| j| j|| d S )Nr   r    Zcitextr   )r   )r"   r#   r$   Z_create_index_namer-   r.   r(   executeZ_delete_index_sqlr   _alter_fieldr   )r   r   r6   r7   Zold_typer8   Zold_db_paramsZnew_db_paramsstrictZ
index_namer   Zindex_to_remove)r   r   r   r:   n   s"    
z!DatabaseSchemaEditor._alter_fieldc                s*   |rt ||| j||dS t j||||S )N)col_suffixesr   )r   r1   r   _index_columns)r   r,   columnsr<   r   )r   r   r   r=      s    z#DatabaseSchemaEditor._index_columns)F)__name__
__module____qualname__r0   r3   r2   r4   Zsql_create_indexZsql_delete_indexZsql_delete_fkZsql_delete_procedurer   r   r   r5   r:   r=   __classcell__r   r   )r   r   r      s   4r   )r	   Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   r   r   r   r   r   <module>   s   