U
    [+d1                     @   s@   d dl Z d dlmZ d dlmZ d dlmZ G dd deZdS )    N)BaseDatabaseSchemaEditor)IndexColumns)strip_quotesc                       s   e Zd ZdZdZd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dd Zdd Zdd Z fddZd, fdd	Z fddZd-d d!Zd.d"d#Zd/ fd%d&	Zd$d$d'd'd$d(d$d(d$dd$d$d) fd*d+
Z  ZS )0DatabaseSchemaEditorzeUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL; SET CONSTRAINTS ALL IMMEDIATEz1ALTER SEQUENCE IF EXISTS %(sequence)s AS %(type)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEzZCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(include)s%(extra)s%(condition)szgCREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s (%(columns)s)%(include)s%(extra)s%(condition)szDROP INDEX IF EXISTS %(name)sz*DROP INDEX CONCURRENTLY IF EXISTS %(name)szyCONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s; SET CONSTRAINTS %(namespace)s%(name)s IMMEDIATEzRSET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz,DROP FUNCTION %(procedure)s(%(param_types)s)zRALTER TABLE %(table)s ALTER COLUMN %(column)s ADD GENERATED BY DEFAULT AS IDENTITYzEALTER TABLE %(table)s ALTER COLUMN %(column)s DROP IDENTITY IF EXISTSc                 C   s>   t |tr|dd}tj|}t|dr2d|_| 	 S )N%z%%encodingutf8)

isinstancestrreplacepsycopg2
extensionsZadapthasattrr   Z	getquoteddecode)selfvalueZadapted r   H/tmp/pip-unpacked-wheel-n7e__lmp/django/db/backends/postgresql/schema.pyquote_value3   s    

z DatabaseSchemaEditor.quote_valuec                    s0   t  ||}| ||}|d k	r,|| |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   s.   |j r|| jS | jj| || jS r   )Zis_relationZrel_db_type
connection
data_typesgetget_internal_typedb_typer   r   r   r   r   _field_data_typeC   s    
z%DatabaseSchemaEditor._field_data_typec                 c   s4   |j  dkr"| |j E d H  n| |j V  d S )N
ArrayField)Z
base_fieldr#   _field_base_data_typesr&   r%   r   r   r   r(   K   s    z+DatabaseSchemaEditor._field_base_data_typesc                 C   sr   |j | jd}|dk	rn|js"|jrnd|kr.dS |drN| j||gddgdS |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.
        )r    N[varchar_likeZvarchar_pattern_ops)fieldssuffix	opclassestextZtext_pattern_ops)r$   r    db_indexunique
startswith_create_index_sql)r   r   r   r$   r   r   r   r   R   s&    

z+DatabaseSchemaEditor._create_like_index_sqlc              
   C   sT   | j  @}| j j||D ](}|d |kr|d   W  5 Q R  S qW 5 Q R X d S )Ncolumnname)r    cursorZintrospectionZget_sequences)r   tabler4   r6   sequencer   r   r   _get_sequence_namer   s
    $z'DatabaseSchemaEditor._get_sequence_namec                    s  d| _ d}| }| }|dkrV||krVt| |t| |krx|  j |7  _ n"| || |krx|  j |7  _ t|jj}dddh}	||	k}
||	k}|r|
st|j}| j | 	||d g f| j
| 	|| 	|d g fgfS |
rx|sx| | j| 	|| 	t|jd  t|j}t ||||\}}g }| || }rp| jd	| 	|i g fg}||fS |r|
r||krt ||||\}}t|j}d
ddd}g }| || }r| j| 	||| d g fg}||fS t ||||S d S )Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr'   	AutoFieldBigAutoFieldSmallAutoField)r4   type)r7   r4   r8   integerZbigintZsmallint)r:   r;   r<   )r8   r=   )Zsql_alter_column_typer#   listr(   r&   r   _metadb_tabler4   
quote_namesql_add_identityexecutesql_drop_indentityr   _alter_column_type_sqlr9   sql_delete_sequencesql_alter_sequence_type)r   r   	old_field	new_fieldnew_typeZ	using_sqlZnew_internal_typeZold_internal_typer7   Zauto_field_typesZold_is_autoZnew_is_autor4   fragment_Zother_actionsZsequence_nameZdb_typesr   r   r   rF   y   s    


    	   

z+DatabaseSchemaEditor._alter_column_type_sqlFc	              
      s  |j s|jrr|dr |drH|dr4|drH|drr|dsr| j|jj|jgdd}	| | ||	 t	 
|||||||| |j s|js|j s|js|jr| ||}
|
d k	r| |
 |jr
|j s
|js
| j|jj|jgdd}| | || d S )Nr*   r/   Zcitextr+   )r-   )r0   r1   r2   Z_create_index_namer@   rA   r4   rD   _delete_index_sqlr   _alter_fieldr   )r   r   rI   rJ   Zold_typerK   Zold_db_paramsZnew_db_paramsstrictZ
index_namer   Zindex_to_remover   r   r   rO      sX      
  z!DatabaseSchemaEditor._alter_fieldc                    s*   |rt ||| j||dS t ||||S )N)col_suffixesr.   )r   rB   r   _index_columns)r   r7   columnsrQ   r.   r   r   r   rR     s    z#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |dd d d S )Nconcurrently)params)rD   Z
create_sqlr   r   indexrU   r   r   r   	add_index  s     zDatabaseSchemaEditor.add_indexc                 C   s   |  |j|| |d d S )NrT   )rD   Z
remove_sqlrW   r   r   r   remove_index  s    z!DatabaseSchemaEditor.remove_indexNc                    s    |r
| j n| j}t |||S r   )sql_delete_index_concurrentlysql_delete_indexr   rN   )r   r   r5   sqlrU   r   r   r   rN   !  s
    z&DatabaseSchemaEditor._delete_index_sql r   )r,   r5   r-   usingdb_tablespacerQ   r]   r.   	conditionrU   includeexpressionsc                   s4   |s
| j n| j}t j|||||||||	|
||dS )N)r,   r5   r-   r_   r`   rQ   r]   r.   ra   rb   rc   )sql_create_indexsql_create_index_concurrentlyr   r3   )r   r   r,   r5   r-   r_   r`   rQ   r]   r.   ra   rU   rb   rc   r   r   r   r3   )  s$    z&DatabaseSchemaEditor._create_index_sql)F)F)F)NF)__name__
__module____qualname__Zsql_update_with_defaultrH   rG   rd   re   r\   r[   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurerC   rE   r   r   r&   r(   r   r9   rF   rO   rR   rY   rZ   rN   r3   __classcell__r   r   r   r   r      sZ   	 n 0

r   )r   Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   Zdjango.db.backends.utilsr   r   r   r   r   r   <module>   s   