U
    ©}ag:  ã                   @   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Ú
connectionZopsZcompose_sqlÚstr)Úselfr   Úparams©Ú	__class__r   ú\/var/www/html/publicvenv/lib/python3.8/site-packages/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rŒd|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>   r@   Ú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ÚSmallAutoFieldr6   ©r>   rD   Z	collation)rA   r>   rB   ÚintegerZbigintZsmallint)rF   rG   rH   )rB   rD   )Zdb_parametersr   r/   r0   r3   Ú_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_sqlrC   Úsql_delete_sequenceÚsql_alter_sequence_type)r   r   r9   r8   Únew_typeZold_collationÚnew_collationÚold_db_paramsÚold_typeZ
index_namer:   r;   r<   rA   Zauto_field_typesZold_is_autoZnew_is_autor>   ÚfragmentÚ_Zother_actionsZsequence_nameZdb_typesr   r   r   rR   �   sä    ÿÿþþýý  ÿÿý
ýÿùþÿúÿöþÿÿ
     ÿ ÿÿûÿ	     ÿ
ýþÿúÿ
     ÿz+DatabaseSchemaEditor._alter_column_type_sqlc                 C   sL   | j }|  ||¡ }r||7 }||  |j¡||r>d|  |¡ nddœ g fS )Nú r6   rI   )Zsql_alter_column_collater=   rO   r>   Z_collate_sql)r   r   r8   rU   rV   r9   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*   rE   )r	   Ú_alter_fieldr/   r0   r   r
   rK   rL   rM   r>   rN   )r   r   r9   r8   rX   rU   rW   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   rO   r	   Ú_index_columns)r   rA   Úcolumnsr_   r-   r   r   r   r`   9  s    ûz#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |d�d d� d S )N©Úconcurrently)r   )r
   Z
create_sql©r   r   Úindexrc   r   r   r   Ú	add_indexD  s     ÿzDatabaseSchemaEditor.add_indexc                 C   s   |   |j|| |d�¡ d S )Nrb   )r
   Z
remove_sqlrd   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	   rN   )r   r   r?   r   rc   r   r   r   rN   L  s
    ÿýz&DatabaseSchemaEditor._delete_index_sqlr6   )r+   r?   r,   ÚusingÚdb_tablespacer_   r   r-   Ú	conditionrc   ÚincludeÚexpressionsc                   s8   |p|s| j n| j}tƒ j|||||||||	|
||d�S )N)r+   r?   r,   rj   rk   r_   r   r-   rl   rm   rn   )Úsql_create_indexÚsql_create_index_concurrentlyr	   r4   )r   r   r+   r?   r,   rj   rk   r_   r   r-   rl   rc   rm   rn   r   r   r   r4   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   r@   r
   Zfetchone)r   r5   r@   Úrowr   r   r   r2   y  s    úz0DatabaseSchemaEditor._is_collation_deterministic)r   )F)F)F)NF)!Ú__name__Ú
__module__Ú__qualname__Zsql_update_with_defaultrT   rS   ro   rp   ri   rh   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer
   rP   rQ   r   r   r$   r&   r   r=   rC   rR   r\   r]   r`   rf   rg   rN   r4   r2   Ú__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   