U
    e:                     @   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 )    )BaseDatabaseSchemaEditor)IndexColumns)sql)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d4 fd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dd Z fddZd d! Zd5 fd#d$	Z fd%d&Zd6d'd(Zd7d)d*Zd8 fd,d-	Zd+d+d.d.d+dd+dd+d"d+d+d/ fd0d1
Zd2d3 Z  Z S )9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) c                    s8   |d krt  ||S | jjt||}t  |d S N)superexecute
connectionopsZcompose_sqlstr)selfr   params	__class__r   H/tmp/pip-unpacked-wheel-lctamlir/django/db/backends/postgresql/schema.pyr
   *   s    zDatabaseSchemaEditor.executezRALTER 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jS )N%z%%)
isinstancer   replacer   quoter   )r   valuer   r   r   quote_value:   s    
z DatabaseSchemaEditor.quote_valuec                    s0   t  ||}| ||}|d k	r,|| |S r   )r	   _field_indexes_sql_create_like_index_sqlappend)r   modelfieldoutputlike_index_statementr   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_typer   
data_typesgetget_internal_typedb_typer   r   r   r   r   _field_data_typeF   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'   N   s    z+DatabaseSchemaEditor._field_base_data_typesc                 C   s   |j | jd}|dk	r|js"|jrd|kr.dS t|dd}|rL| |sLdS |drl| j||gddgdS |d	r| 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[Zdb_collationvarchar_likeZvarchar_pattern_ops)fieldssuffix	opclassestextZtext_pattern_ops)r#   r   db_indexuniquegetattr_is_collation_deterministic
startswith_create_index_sql)r   r   r   r#   collation_namer   r   r   r   U   s,    

z+DatabaseSchemaEditor._create_like_index_sqlc                 C   sb   d}|  }|  }|dkrF||krFt| |t| |kr^|S n| || |kr^|S dS )Nz USING %(column)s::%(type)sr&    )r"   listr'   r%   )r   	new_field	old_field	using_sqlnew_internal_typeold_internal_typer   r   r   
_using_sqlz   s    zDatabaseSchemaEditor._using_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   tabler?   rA   sequencer   r   r   _get_sequence_name   s
    $z'DatabaseSchemaEditor._get_sequence_namec                    sd  |j | jd}|d }|js"|jr|dr6|dr^|drJ|dr^|dr|ds| j|jj|jgdd}	| 	| 
||	 d| _| || }
r|  j|
7  _| }| }t|jj}d	d
dh}||k}||k}|r6|s6t|j}| j| ||dd g f| j| || |d g fgfS |r|s| 	| j| || t|jd  t|j}t ||||||\}}g }| || }r| jd| |i g fg}||fS |rJ|rJ||krJt ||||||\}}t|j}dddd}g }| || }rB| j| ||| d g fg}||fS t ||||||S d S )Nr(   typer*   r/   Zcitextr+   r-   z2ALTER COLUMN %(column)s TYPE %(type)s%(collation)s	AutoFieldBigAutoFieldSmallAutoFieldr7   r?   rE   Z	collation)rB   r?   rC   integerZbigintZsmallint)rG   rH   rI   )rC   rE   )Zdb_parametersr   r0   r1   r4   _create_index_name_metadb_tabler?   r
   _delete_index_sqlZsql_alter_column_typer>   r"   r   
quote_namesql_add_identitysql_drop_indentityr	   _alter_column_type_sqlrD   sql_delete_sequencesql_alter_sequence_type)r   r   r:   r9   new_typeZold_collationnew_collationold_db_paramsold_typeZ
index_namer;   r<   r=   rB   Zauto_field_typesZold_is_autoZnew_is_autor?   fragment_Zother_actionsZsequence_nameZdb_typesr   r   r   rS      s      

      	     

     z+DatabaseSchemaEditor._alter_column_type_sqlc                 C   sL   | j }| || }r||7 }|| |j||r>d| | ndd g fS )N r7   rJ   )Zsql_alter_column_collater>   rP   r?   Z_collate_sql)r   r   r9   rV   rW   r:   r   r;   r   r   r   _alter_column_collation_sql  s    
z0DatabaseSchemaEditor._alter_column_collation_sqlFc	              
      s   t  |||||||| |js,|js,|js8|jsV|jrV| ||}	|	d k	rV| |	 |jr|js|js| j|jj|j	gdd}
| | 
||
 d S )Nr+   rF   )r	   _alter_fieldr0   r1   r   r
   rL   rM   rN   r?   rO   )r   r   r:   r9   rY   rV   rX   Znew_db_paramsstrictr   Zindex_to_remover   r   r   r^     s2    
  z!DatabaseSchemaEditor._alter_fieldc                    s*   |rt ||| j||dS t ||||S )N)col_suffixesr.   )r   rP   r	   _index_columns)r   rB   columnsr`   r.   r   r   r   ra   9  s    z#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |dd d d S )Nconcurrently)r   )r
   Z
create_sqlr   r   indexrd   r   r   r   	add_indexD  s     zDatabaseSchemaEditor.add_indexc                 C   s   |  |j|| |d d S )Nrc   )r
   Z
remove_sqlre   r   r   r   remove_indexI  s    z!DatabaseSchemaEditor.remove_indexNc                    s    |r
| j n| j}t |||S r   )sql_delete_index_concurrentlysql_delete_indexr	   rO   )r   r   r@   r   rd   r   r   r   rO   L  s
    z&DatabaseSchemaEditor._delete_index_sqlr7   )r,   r@   r-   usingdb_tablespacer`   r   r.   	conditionrd   includeexpressionsc                   s8   |p|s| j n| j}t j|||||||||	|
||dS )N)r,   r@   r-   rk   rl   r`   r   r.   rm   rn   ro   )sql_create_indexsql_create_index_concurrentlyr	   r5   )r   r   r,   r@   r-   rk   rl   r`   r   r.   rm   rd   rn   ro   r   r   r   r5   T  s&    z&DatabaseSchemaEditor._create_index_sqlc              
   C   sH   | j  4}|d|g | }|r.|d nd W  5 Q R  S Q R X d S )Nz
                SELECT collisdeterministic
                FROM pg_collation
                WHERE collname = %s
                r   )r   rA   r
   Zfetchone)r   r6   rA   rowr   r   r   r3   y  s    z0DatabaseSchemaEditor._is_collation_deterministic)r   )F)F)F)NF)!__name__
__module____qualname__Zsql_update_with_defaultrU   rT   rp   rq   rj   ri   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer
   rQ   rR   r   r   r%   r'   r   r>   rD   rS   r]   r^   ra   rg   rh   rO   r5   r3   __classcell__r   r   r   r   r      sb   	%s $

%r   N)	Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   Z)django.db.backends.postgresql.psycopg_anyr   Zdjango.db.backends.utilsr   r   r   r   r   r   <module>   s   