o
    [h9                     @   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dd Z fd d!Z	"d5 fd#d$	Z fd%d&Zd5d'd(Zd5d)d*Zd6 fd,d-	Zd+d+d.d.d+dd+dd+d"d+d+d/ fd0d1
Zd2d3 Z  Z S )7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 u rt  ||S | jjt||}t  |d S N)superexecute
connectionopsZcompose_sqlstr)selfr   params	__class__r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/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 || jjS r   )r   quoter   )r   valuer   r   r   quote_value:   s   z DatabaseSchemaEditor.quote_valuec                    s0   t  ||}| ||}|d u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   )is_relationZrel_db_typer   
data_typesgetget_internal_typedb_typer   r   r   r   r   _field_data_typeD   s   
z%DatabaseSchemaEditor._field_data_typec                 c   s8    |j  dkr| |j E d H  d S | |j V  d S )N
ArrayField)Z
base_fieldr    _field_base_data_typesr#   r"   r   r   r   r%   L   s   z+DatabaseSchemaEditor._field_base_data_typesc                 C   s   |j | jd}|durR|js|jrRd|v rdS t|dd}|s)|jr)t|jdd}|r2| |s2dS |drB| j	||gddgdS |d	rR| 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getattrr   Ztarget_field_is_collation_deterministic
startswith_create_index_sql)r   r   r   r!   collation_namer   r   r   r   S   s0   


z+DatabaseSchemaEditor._create_like_index_sqlc                 C   sn   |j rdS d}| }| }|dkr)||kr)t| |t| |kr'|S dS | || |kr5|S dS )N z USING %(column)s::%(type)sr$   )	generatedr    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   sl   | j  '}| j j||D ]}|d |kr#|d   W  d    S qW d    d S 1 s/w   Y  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                 C   sN   |j s|jo&|dr|d p&|do|d p&|do&|d S )Nr(   r-   Zcitext)r.   r/   r2   )r   r9   old_typenew_typer   r   r   (_is_changing_type_of_indexed_text_column   s   z=DatabaseSchemaEditor._is_changing_type_of_indexed_text_columnc                    s  |j | jd}|d }| |||r'| j|jj|jgdd}	| | ||	 d| _	| 
|| }
r9|  j	|
7  _	| }| }t|jj}h d}||v }||v }|r{|s{t|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 |r|r||krt ||||||\}}t|j}dddd}g }| || }r| j| ||| d g fg}||fS t ||||||S )Nr&   typer)   r+   z2ALTER COLUMN %(column)s TYPE %(type)s%(collation)s>   SmallAutoFieldBigAutoField	AutoFieldr5   )r>   rG   Z	collation)rA   r>   rB   integerZbigintZsmallint)rK   rJ   rI   )rB   rG   )Zdb_parametersr   rF   _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   rE   Zold_collationZnew_collationold_db_paramsrD   Z
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   rT      s   


	

z+DatabaseSchemaEditor._alter_column_type_sqlFc	              
      s   t  |||||||| |js|js|js#|js|js#| |||r2| ||}	|	d ur2| |	 |jrR|jsT|jsV| j|jj	|j
gdd}
| | ||
 d S d S d S d S )Nr)   rH   )r	   _alter_fieldr.   r/   rF   r   r
   rM   rN   rO   r>   rP   )r   r   r9   r8   rD   rE   rW   Znew_db_paramsstrictr   Zindex_to_remover   r   r   rZ     sB   	
z!DatabaseSchemaEditor._alter_fieldc                    s*   |rt ||| j||dS t ||||S )N)col_suffixesr,   )r   rQ   r	   _index_columns)r   rA   columnsr\   r,   r   r   r   r]   1  s   z#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |dd d d S )Nconcurrently)r   )r
   Z
create_sqlr   r   indexr`   r   r   r   	add_index<  s   
zDatabaseSchemaEditor.add_indexc                 C   s   |  |j|| |d d S )Nr_   )r
   Z
remove_sqlra   r   r   r   remove_indexA  s   z!DatabaseSchemaEditor.remove_indexNc                    s    |r| j n| j}t |||S r   )sql_delete_index_concurrentlysql_delete_indexr	   rP   )r   r   r?   r   r`   r   r   r   rP   D  s
   z&DatabaseSchemaEditor._delete_index_sqlr5   )r*   r?   r+   usingdb_tablespacer\   r   r,   	conditionr`   includeexpressionsc                   s8   |p	|s| j n| j}t j|||||||||	|
||dS )N)r*   r?   r+   rg   rh   r\   r   r,   ri   rj   rk   )sql_create_indexsql_create_index_concurrentlyr	   r3   )r   r   r*   r?   r+   rg   rh   r\   r   r,   ri   r`   rj   rk   r   r   r   r3   L  s&   z&DatabaseSchemaEditor._create_index_sqlc                 C   sT   | j  }|d|g | }|r|d nd W  d    S 1 s#w   Y  d S )Nz
                SELECT collisdeterministic
                FROM pg_collation
                WHERE collname = %s
                r   )r   r@   r
   Zfetchone)r   r4   r@   rowr   r   r   r1   q  s   $z0DatabaseSchemaEditor._is_collation_deterministic)r   )F)NF)!__name__
__module____qualname__Zsql_update_with_defaultrV   rU   rl   rm   rf   re   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer
   rR   rS   r   r   r#   r%   r   r=   rC   rF   rT   rZ   r]   rc   rd   rP   r3   r1   __classcell__r   r   r   r   r      sd    	'x*

%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
    