B
    CVvgS+  ã               @   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d„ Z‡ f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 )-ÚDatabaseSchemaEditorzCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)sz9ALTER SEQUENCE %(sequence)s OWNED BY %(table)s.%(column)szZCREATE 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             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-install-o3oxmrkh/Django/django/db/backends/postgresql/schema.pyÚquote_value&   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 )N)Zis_relationZrel_db_typeÚ
connectionZ
data_typesÚgetÚget_internal_typeÚdb_type)r   r   r   r   r   Ú_field_data_type6   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   r$   >   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   E   s"    



z+DatabaseSchemaEditor._create_like_index_sqlc                sþ  d| _ d}| ¡ }| ¡ }|dkrV||krVt|  |¡ƒt|  |¡ƒkrx|  j |7  _ n"|  |¡|  |¡krx|  j |7  _ t|jjƒ}ddddœ}	| ¡ |	k�r†t|j	ƒ}
d||
f }| j |  
|
¡|	| ¡  d	œ g f| jd
|  
|¡i g f| jd
|  
|¡i g f| j|  
|¡| j|  
|
¡d|  
|¡ dœ dœ g f| j|  
|¡|  
|
¡|  
|¡dœ g f| j|  
|¡|  
|
¡|  
|¡dœ g fgfS |j| jd�d |	k�rèt|j	ƒ}
d||
f }tƒ  ||||¡\}}|| jd
|  
|¡i g fgfS tƒ  ||||¡S d S )Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr#   ZbigintÚintegerZsmallint)Z	bigserialÚserialZsmallserialz	%s_%s_seq)ÚcolumnÚtypeÚsequenceznextval('%s'))r2   Údefault)ÚtableZchanges)r6   r2   r4   )r   r3   )Zsql_alter_column_typer    Úlistr$   r"   r   Ú_metaÚdb_tableÚlowerr2   Ú
quote_nameÚsql_delete_sequenceÚsql_create_sequenceZsql_alter_columnZsql_alter_column_defaultÚsql_set_sequence_maxÚsql_set_sequence_ownerZdb_parametersr   r   Ú_alter_column_type_sql)r   r   Ú	old_fieldÚ	new_fieldÚnew_typeZ	using_sqlZnew_internal_typeZold_internal_typer6   Zserial_fields_mapr2   Zsequence_nameÚfragmentÚ_)r   r   r   r@   e   sb    



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)   )r,   r-   r.   Z_create_index_namer8   r9   r2   ÚexecuteÚ_delete_index_sqlr   Ú_alter_fieldr   )r   r   rA   rB   Zold_typerC   Zold_db_paramsZnew_db_paramsÚstrictZ
index_namer   Zindex_to_remove)r   r   r   rH   ¸   s"    
z!DatabaseSchemaEditor._alter_fieldc                s*   |rt ||| j||d�S tƒ  ||||¡S )N)Úcol_suffixesr*   )r   r;   r   Ú_index_columns)r   r6   ÚcolumnsrJ   r*   )r   r   r   rK   Ô   s    z#DatabaseSchemaEditor._index_columnsc             C   s   | j |j|| |d�d d� d S )N)Úconcurrently)Úparams)rF   Z
create_sql)r   r   ÚindexrM   r   r   r   Ú	add_indexÙ   s    zDatabaseSchemaEditor.add_indexc             C   s   |   |j|| |d�¡ d S )N)rM   )rF   Z
remove_sql)r   r   rO   rM   r   r   r   Úremove_indexÜ   s    z!DatabaseSchemaEditor.remove_indexNc                s    |r
| j n| j}tƒ  |||¡S )N)Úsql_delete_index_concurrentlyÚsql_delete_indexr   rG   )r   r   ÚnameÚsqlrM   )r   r   r   rG   ß   s    z&DatabaseSchemaEditor._delete_index_sqlÚ r   )r(   rT   r)   ÚusingÚdb_tablespacerJ   rU   r*   Ú	conditionrM   ÚincludeÚexpressionsc               s4   |s
| j n| j}tƒ j|||||||||	|
||d�S )N)r(   rT   r)   rW   rX   rJ   rU   r*   rY   rZ   r[   )Úsql_create_indexÚsql_create_index_concurrentlyr   r/   )r   r   r(   rT   r)   rW   rX   rJ   rU   r*   rY   rM   rZ   r[   )r   r   r   r/   ã   s    
z&DatabaseSchemaEditor._create_index_sql)F)F)F)NF)Ú__name__Ú
__module__Ú__qualname__r=   r<   r>   r?   r\   r]   rS   rR   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer   r   r"   r$   r   r@   rH   rK   rP   rQ   rG   r/   Ú__classcell__r   r   )r   r   r      s2   	 T

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   