
    Hwg:                     J    d dl mZ d dlmZ d dlmZ d dlmZ  G d de      Zy)    )BaseDatabaseSchemaEditor)IndexColumns)sql)strip_quotesc                        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# fd	ZdZdZd Z fdZd Zd Zd Zd Zd Z fdZd Z	 d$ fd	Z fdZd$dZd$dZd% fd	Zddddddddddddd  fd!
Zd" Z xZ S )&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                     |t         |   ||      S | j                  j                  j	                  t        |      |      }t         |   |d       S N)superexecute
connectionopscompose_sqlstr)selfr   params	__class__s      [/var/www/horilla/myenv/lib/python3.12/site-packages/django/db/backends/postgresql/schema.pyr   zDatabaseSchemaEditor.execute*   sJ    >7?3//oo!!--c#h?wsD))    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                     t        |t              r|j                  dd      }t        j                  || j
                  j
                        S )N%z%%)
isinstancer   replacer   quoter   )r   values     r   quote_valuez DatabaseSchemaEditor.quote_value:   s7    eS!MM#t,Eyy : :;;r   c                 r    t         |   ||      }| j                  ||      }||j                  |       |S r   )r   _field_indexes_sql_create_like_index_sqlappend)r   modelfieldoutputlike_index_statementr   s        r   r   z'DatabaseSchemaEditor._field_indexes_sql?   s?    +E59#::5%H+MM./r   c                     |j                   r|j                  | j                        S | j                  j                  j	                  |j                         |j                  | j                              S r   )is_relationrel_db_typer   
data_typesgetget_internal_typedb_typer   r#   s     r   _field_data_typez%DatabaseSchemaEditor._field_data_typeF   sY    $$T__55))--##%MM$//*
 	
r   c              #      K   |j                   j                         dk(  r$| j                  |j                         E d {    y | j                  |j                          y 7 #w)N
ArrayField)
base_fieldr+   _field_base_data_typesr.   r-   s     r   r2   z+DatabaseSchemaEditor._field_base_data_typesN   sT     --/<?2253C3CDDD''(8(899 Es   <A$A"$A$c                 \   |j                  | j                        }||j                  s|j                  rvd|v ryt	        |dd      }|r| j                  |      sy|j                  d      r| j                  ||gddg      S |j                  d	      r| j                  ||gdd
g      S y)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[db_collationvarchar_likevarchar_pattern_ops)fieldssuffix	opclassestexttext_pattern_ops)r,   r   db_indexuniquegetattr_is_collation_deterministic
startswith_create_index_sql)r   r"   r#   r,   collation_names        r   r    z+DatabaseSchemaEditor._create_like_index_sqlU   s    
 --4??-;ENNell g~ %UNDANd&F&F~&V!!),--!7"45	 .   ##F+--!7"12	 .   r   c                    d}|j                         }|j                         }|dk(  r=||k(  r8t        | j                  |            t        | j                  |            k7  r|S y| j                  |      | j                  |      k7  r|S y)Nz USING %(column)s::%(type)sr0    )r+   listr2   r.   )r   	new_field	old_field	using_sqlnew_internal_typeold_internal_types         r   
_using_sqlzDatabaseSchemaEditor._using_sqlz   s    1	%779%779,1BFW1WD//	:;t++I6@  !   ""9-1F1Fy1QQr   c                     | j                   j                         5 }| j                   j                  j                  ||      D ]  }|d   |k(  s|d   c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Ncolumnname)r   cursorintrospectionget_sequences)r   tablerP   rR   sequences        r   _get_sequence_namez'DatabaseSchemaEditor._get_sequence_name   sw    __##% 	, OO99GGPUV ,H%/#F++	, 	,,	, 		, s   2A)A)A))A2c           	      ^   |j                  | j                        }|d   }|j                  s|j                  r|j	                  d      r|j	                  d      rD|j	                  d      r|j	                  d      r"|j	                  d      re|j	                  d      sT| j                  |j                  j                  |j                  gd      }	| j                  | j                  ||	             d| _        | j                  ||      x}
r| xj                  |
z  c_        |j                         }|j                         }t        |j                  j                        }h d	}||v }||v }|rn|slt        |j                        }| j                  | j                  |      |d
dz  g f| j                   | j                  |      | j                  |      dz  g fgfS |r|s| j                  | j"                  | j                  |      | j                  t        |j                              dz         t        |j                        }t$        | M  ||||||      \  }}g }| j)                  ||      x}r#| j*                  d| j                  |      iz  g fg}||fS |rz|rx||k7  rst$        | M  ||||||      \  }}t        |j                        }dddd}g }| j)                  ||      x}r'| j,                  | j                  |      ||   dz  g fg}||fS t$        | M  ||||||      S )Nr4   typer7   r=   citextr8   r;   z2ALTER COLUMN %(column)s TYPE %(type)s%(collation)s>   	AutoFieldBigAutoFieldSmallAutoFieldrG   rP   rY   	collation)rU   rP   rV   integerbigintsmallint)r\   r]   r^   )rV   rY   )db_parametersr   r?   r@   rC   _create_index_name_metadb_tablerP   r   _delete_index_sqlsql_alter_column_typerN   r+   r   
quote_namesql_add_identitysql_drop_indentityr   _alter_column_type_sqlrW   sql_delete_sequencesql_alter_sequence_type)r   r"   rJ   rI   new_typeold_collationnew_collationold_db_paramsold_type
index_namerK   rL   rM   rU   auto_field_typesold_is_autonew_is_autorP   fragment_other_actionssequence_namedb_typesr   s                          r   rm   z+DatabaseSchemaEditor._alter_column_type_sql   s   
 "//4??/K ()"2"2  +H4G4G	4R##F+H4G4G4O##H-h6I6I(6S00$$y'7'7&8 1 J LL//zBC A 	" 	9==9=&&)3&%779%779U[[112

 (+;;'+;;{!)"2"23F .."&//&"9 (%'  --%)__U%;&*oof&=
 	 *  LL''!__U3"ool9;K;K.LM ")"2"23F'8y)X}mKHa
 M $ 7 7v FF}F 00&(F ! ]**[->BS-S'8y)X}mKHa ")"2"23F& (",H M $ 7 7v FF}F 44(,(F$,->$?
 	! ]**71y)X}m r   c                     | j                   }| j                  ||      x}r||z  }|| j                  |j                        ||rd| j	                  |      z   nddz  g fS )N rG   r_   )sql_alter_column_collaterN   rj   rP   _collate_sql)r   r"   rI   rp   rr   rJ   r   rK   s           r   _alter_column_collation_sqlz0DatabaseSchemaEditor._alter_column_collation_sql  s{     ++	9==9=9C//)*:*:;   !4#4#4]#CC 

 
	
r   Fc	           
         t         |   ||||||||       |j                  s|j                  s|j                  s|j                  s1|j                  r%| j	                  ||      }	|	| j                  |	       |j                  ro|j                  sb|j                  sU| j                  |j                  j                  |j                  gd      }
| j                  | j                  ||
             y y y y )Nr8   r[   )r   _alter_fieldr?   r@   r    r   re   rf   rg   rP   rh   )r   r"   rJ   rI   rt   rp   rs   new_db_paramsstrictr%   index_to_remover   s              r   r   z!DatabaseSchemaEditor._alter_field  s     			
 ##y'7'7Y=O=O  Y%5%5#'#>#>ui#P #/12 Y%7%79;K;K"55$$y'7'7&8 6 O LL//GH	 <L%7r   c                 `    |rt        ||| j                  ||      S t        |   ||||      S )N)col_suffixesr<   )r   rj   r   _index_columns)r   rU   columnsr   r<   r   s        r   r   z#DatabaseSchemaEditor._index_columns9  s>    )#  w%eWlINNr   c                 N    | j                  |j                  || |      d        y )Nconcurrently)r   )r   
create_sqlr   r"   indexr   s       r   	add_indexzDatabaseSchemaEditor.add_indexD  s*    UD|DT 	 	
r   c                 J    | j                  |j                  || |             y )Nr   )r   
remove_sqlr   s       r   remove_indexz!DatabaseSchemaEditor.remove_indexI  s     U%%eT%MNr   Nc                 Z    |r| j                   n| j                  }t        |   |||      S r   )sql_delete_index_concurrentlysql_delete_indexr   rh   )r   r"   rQ   r   r   r   s        r   rh   z&DatabaseSchemaEditor._delete_index_sqlL  s7      ..&& 	
 w(c::r   rG   )r:   rQ   r;   usingdb_tablespacer   r   r<   	conditionr   includeexpressionsc                v    |xs |s| j                   n| j                  }t        |   |||||||||	|
||      S )N)r:   rQ   r;   r   r   r   r   r<   r   r   r   )sql_create_indexsql_create_index_concurrentlyr   rD   )r   r"   r:   rQ   r;   r   r   r   r   r<   r   r   r   r   r   s                 r   rD   z&DatabaseSchemaEditor._create_index_sqlT  sf    "  
 !!33 	
 w('%# ) 
 	
r   c                     | j                   j                         5 }|j                  d|g       |j                         }|r|d   nd cd d d        S # 1 sw Y   y xY w)Nz
                SELECT collisdeterministic
                FROM pg_collation
                WHERE collname = %s
                r   )r   rR   r   fetchone)r   rE   rR   rows       r   rB   z0DatabaseSchemaEditor._is_collation_deterministicy  s[    __##% 
	+NN
    //#C 3q6d
	+ 
	+ 
	+s   ,AA)r	   )F)NF)!__name__
__module____qualname__sql_update_with_defaultro   rn   r   r   r   r   sql_create_column_inline_fksql_delete_fksql_delete_procedurer   rk   rl   r   r   r.   r2   r    rN   rW   rm   r   r   r   r   r   rh   rD   rB   __classcell__)r   s   @r   r   r      s    	*  RH	9 
	9 " 7$P!
	<  	9  J*	+ 
 	P <

:#Jqf
8 "IH	O

O; #
J+r   r   N)	django.db.backends.base.schemar   !django.db.backends.ddl_referencesr   )django.db.backends.postgresql.psycopg_anyr   django.db.backends.utilsr   r   r	   r   r   <module>r      s     C : 9 1}+3 }+r   