o
    Dft                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl"m&Z& ddl"m'Z' ddl"m(Z( dd l"m)Z) dd!l"m*Z* dd"l"m+Z+ dd#l,m-Z- dd$l,m.Z. d%d&l/m0Z0 d%d'l1m2Z2 d%d(l3m4Z4 d%d)l3m5Z5 d%d*l6m7Z7 d%d+l6m8Z8 d%d,l0m9Z9 d%d-l:m;Z; ersd d.lm<Z< d d/lm=Z= d d0lm>Z> d d1l?m@Z@ d d2lAmBZB d d3lCmDZD d d4lEmFZF d d5lEmGZG d d6lmHZH d d7lmIZI d d8lmJZJ d d9lKmLZL d d:lKmMZM d d;lNmOZO dd<l"mPZP d%d=lQmRZR d%d>lSmTZT d%d?lUmVZV eWeXZYG d@dA dAe.ZZG dBdC dCe%Z[e;e+dDdodKdLZ\e;e[dDdpdMdNZ]e;e&dDdqdPdQZ^e;e*dDdrdSdTZ_e8`dUe7`dUdVe4jabdWG dXdY dYe4jaZce2jdeecdsd]d^Zfe2jgeedtdcddZhdudedfZidvdidjZjdwdmdnZkdS )x    )annotationsN)Any)cast)Dict)List)Optional)Sequence)Tuple)TYPE_CHECKING)Union)Column)literal_column)Numeric)text)types)BIGINT)ExcludeConstraint)INTEGER)CreateIndex)ColumnClause)
TextClause)FunctionElement)NULLTYPE   )alter_column)alter_table)AlterColumn)ColumnComment)format_column_name)format_table_name)format_type)IdentityColumnDefault)RenameTable)ComparisonResult)DefaultImpl   )util)render)ops)	schemaobj)BatchOperations)
Operations)sqla_compat)compiles)Literal)Index)UniqueConstraint)ARRAY)PGDDLCompiler)HSTORE)JSON)JSONB)ClauseElement)ColumnElement)quoted_name)MetaData)Table)
TypeEngine)_ServerDefault)AutogenContext)_f_name)MigrationContextc                      s$  e Zd ZdZdZejddhf ZdcddZdd Zdd Z											ddde fd%d&Z
d'd( Zd)d* Zed+ed,ed-ed.ed/fZdfd1d2Zdgd6d7Zdhd;d<Zdid@dAZdjdEdFZdkdIdJZ		dldm fdOdPZdndUdVZdodXdYZdpd[d\Zdqd^d_ZdrdadbZ  ZS )sPostgresqlImpl
postgresqlTFLOATzDOUBLE PRECISIONindexr/   kwr   returnNonec                 K  sV   |j dd pd}|D ]}||jjvr|jt|tj q| t	|fi | d S )Npostgresql_include )
kwargsgettablecappend_columnr   sqltypesNullType_execr   )selfrC   rD   rG   colrH   rH   O/home/ubuntu/webapp/venv/lib/python3.10/site-packages/alembic/ddl/postgresql.pycreate_indexU   s   
zPostgresqlImpl.create_indexc                 C  s0   |j D ]}|jd ur|j|jv r| | qd S N)constraintsnamenamed_constraintsdrop_constraint)rQ   
batch_implrK   
constraintrH   rH   rS   prep_table_for_batcha   s   


z#PostgresqlImpl.prep_table_for_batchc           	      C  s   |j r||jju rdS |}||k}|rdS d |||jfv r | S |jj}t|tr@t|jts<t	
dd|}d| d}t|}| j}|d usIJ |tt||k S )NFz^'|'$ ')primary_keyrK   _autoincrement_columnserver_defaultarg
isinstancestrtyper   resubr   
connectionscalarr,   _select)	rQ   inspector_columnmetadata_columnrendered_metadata_defaultrendered_inspector_defaultconn_col_defaultdefaults_equalmetadata_defaultconnrH   rH   rS   compare_server_defaulti   s6   	

z%PostgresqlImpl.compare_server_defaultNF
table_namerd   column_namenullableOptional[bool]ra   %Union[_ServerDefault, Literal[False]]rW   Optional[str]type_Optional[TypeEngine]schemaautoincrementexisting_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementc                   sz   | dd }|d ur|d u rtd|d ur&| t||||||	|
|d t j||f||||||	|
||d	| d S )Npostgresql_usingz6postgresql_using must be used with the type_ parameter)r|   usingr~   r   r   )	rv   ra   rW   r|   r}   r~   r   r   r   )popr&   CommandErrorrP   PostgresqlColumnTypesuperr   )rQ   rt   ru   rv   ra   rW   rz   r|   r}   r~   r   r   r   rD   r   	__class__rH   rS   r      sD   
zPostgresqlImpl.alter_columnc                 C  s   | drAt|d ttfrCtd|d }|rEtj|td|	dd
 }|rG|\}}||d krItd||j| |d= d S d S d S d S d S d S )	Ndefaultre   znextval\('(.+?)'::regclass\)a+  select c.relname, a.attname from pg_class as c join pg_depend d on d.objid=c.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass join pg_class t on t.oid=d.refobjid join pg_attribute a on a.attrelid=t.oid and a.attnum=d.refobjsubid where c.relkind='S' and c.relname=:seqnamer   )seqnamerW   z^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rJ   rc   r   r   rf   matchr,   _exec_on_inspectorr   groupfirstloginforW   )rQ   	inspectorrK   column_info	seq_matchr   r   colnamerH   rH   rS   autogen_column_reflect   s<   

z%PostgresqlImpl.autogen_column_reflectc                 C  s<   dd |D }|D ]}| | q	tjs| || d S d S )Nc                 S  s   h | ]
}|j d r|qS )duplicates_constraint)r   rJ   ).0rC   rH   rH   rS   	<setcomp>   s    
zAPostgresqlImpl.correct_for_autogen_constraints.<locals>.<setcomp>)remover,   sqla_2_skip_functional_indexes)rQ   conn_unique_constraintsconn_indexesmetadata_unique_constraintsmetadata_indexesdoubled_constraintsixrH   rH   rS   correct_for_autogen_constraints   s   z.PostgresqlImpl.correct_for_autogen_constraintsz( asc nulls last)$z(?<! desc)( nulls last)$z( asc)$z( asc) nulls first$z desc( nulls first)$exprc                 C  s\  |  dddd}|jd ur||jj   dd}d|v r)tdd|}|rK|d dkrK|d	 d
krK|dd	 }|rK|d dkrK|d	 d
ks7| jD ]}|| }rl|d\}}|d | ||d   } nqN|r|d dkr|d	 d
kr|dd	 }|r|d dkr|d	 d
ks{t	d}|
|r|d|}tdd|}|dd}|S )N"r]   r^   .z::z(::[\w ]+\w)r   ()r   z	cast\s*\(zas\s+[^)]+\) )lowerreplacerK   rW   rf   rg   _default_modifiers_researchspancompiler   )rQ   rC   r   rsr   startendcast_rerH   rH   rS   _cleanup_index_expr  s.   



z"PostgresqlImpl._cleanup_index_expritemUnion[Index, UniqueConstraint]Tuple[Any, ...]c                 C  s   |j drdS dS )Npostgresql_nulls_not_distinct)nulls_not_distinctrH   )dialect_kwargsrJ   )rQ   r   rH   rH   rS   _dialect_options8  s   zPostgresqlImpl._dialect_optionsmetadata_indexreflected_indexr#   c              
   C  s  g }|  ||}|r|| |j}|j}t|t|kr,|dt| dt|  |r3t|S g }tt||dD ][\}\}	}
| |	}| 	||}| |
}| 	||}||kr^q=|
 drd|v smd|v r|d| d|d td	| d|d
|jd q=|d| d|d| q=| |}| |}||kr|d| d|  |rt|S |rt|S t S )Nzexpression number  to r   _opsr   r   zexpression #z' detected as including operator clause.zExpression #z
 in index a   detected to include an operator clause. Expression compare cannot proceed. Please move the operator clause to the ``postgresql_ops`` dict to enable proper compare of the index expressions: https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classeszoptions )_compare_index_uniqueappendexpressionslenr#   	Different	enumeratezip_compile_elementr   stripendswithr&   warnrW   r   extendSkipEqual)rQ   r   r   msg
unique_msgm_exprsr_exprsskipposm_er_e	m_compilem_text	r_compiler_text	m_options	r_optionsrH   rH   rS   compare_indexesA  sP   








zPostgresqlImpl.compare_indexesmetadata_constraintr0   reflected_constraintc           	      C  s|   |  |}| |}|j}|j}||krtd| d| S | |j}| |j}||kr:td| d| S t S )Nzexpression r   )_create_metadata_constraint_sig _create_reflected_constraint_sigunnamedr#   r   r   constr   )	rQ   r   r   metadata_tupreflected_tupmeta_sigconn_sigmetadata_doconn_dorH   rH   rS   compare_unique_constraint}  s&   z(PostgresqlImpl.compare_unique_constraintreflected_optionsDict[str, Any]kindc                 C  s*   | di  }| ds|dd  |S )Ndialect_optionsrG   )rJ   copyr   )rQ   r   r   optionsrH   rH   rS    adjust_reflected_dialect_options  s   
z/PostgresqlImpl.adjust_reflected_dialect_optionselementUnion[ClauseElement, str]c                 C  s&   t |tr|S |j| jddddjS )NTF)literal_bindsinclude_table)dialectcompile_kwargs)rc   rd   r   r   string)rQ   r   rH   rH   rS   r     s   
zPostgresqlImpl._compile_elementr6   is_server_defaultboolis_indexc                   s0   |rt |ts| }t j|f||d|S )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        )r   r   )rc   r   
self_groupr   render_ddl_sql_expr)rQ   r   r   r   rD   r   rH   rS   r     s   z"PostgresqlImpl.render_ddl_sql_exprr;   autogen_contextr=   Union[str, Literal[False]]c                 C  sF   t |j}|dsdS t| d|j r!t| d|j }|||S dS )Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)re   
__module__
startswithhasattr__visit_name__getattr)rQ   rz   r   modmethrH   rH   rS   render_type  s   


zPostgresqlImpl.render_typer3   c                 C     t tt||ddS )N	text_typez(.+?\(.*text_type=)r   rd   r'   _render_type_w_subtyperQ   rz   r   rH   rH   rS   _render_HSTORE_type     z"PostgresqlImpl._render_HSTORE_typer1   c                 C  r	  )N	item_typez(.+?\()r  r  rH   rH   rS   _render_ARRAY_type  r  z!PostgresqlImpl._render_ARRAY_typer4   c                 C  r	  Nastext_typez(.+?\(.*astext_type=)r  r  rH   rH   rS   _render_JSON_type  r  z PostgresqlImpl._render_JSON_typer5   c                 C  r	  r  r  r  rH   rH   rS   _render_JSONB_type  r  z!PostgresqlImpl._render_JSONB_type)rC   r/   rD   r   rE   rF   )
NFNNNNNNNN)rt   rd   ru   rd   rv   rw   ra   rx   rW   ry   rz   r{   r|   ry   r}   rw   r~   r{   r   r   r   rw   r   rw   rD   r   rE   rF   )rC   r/   r   rd   rE   rd   )r   r   rE   r   )r   r/   r   r/   rE   r#   )r   r0   r   r0   rE   r#   )r   r   r   rd   rE   r   )r   r   rE   rd   )FF)
r   r6   r   r   r   r   rD   r   rE   rd   )rz   r;   r   r=   rE   r   )rz   r3   r   r=   rE   rd   )rz   r1   r   r=   rE   rd   )rz   r4   r   r=   rE   rd   )rz   r5   r   r=   rE   rd   )__name__r  __qualname____dialect__transactional_ddlr$   type_synonymsrT   r\   rs   r   r   r   rf   r   r   r   r   r   r   r   r   r   r  r  r  r  r  __classcell__rH   rH   r   rS   r@   N   sT    
14&

"
	
<

	






r@   c                      s   e Zd Zd
 fdd	Z  ZS )r   rW   rd   ru   rz   r;   rE   rF   c                   s8   | dd }t j||fi | t|| _|| _d S )Nr   )r   r   __init__rN   to_instancerz   r   )rQ   rW   ru   rz   rD   r   r   rH   rS   r    s   
zPostgresqlColumnType.__init__)rW   rd   ru   rd   rz   r;   rE   rF   )r  r  r  r  r  rH   rH   r   rS   r     s    r   rA   r   r"   compilerr2   rE   rd   c                 K  s"   dt || j| jt|| jd f S )Nz%s RENAME TO %s)r   rt   r|   r   new_table_namer   r  rD   rH   rH   rS   visit_rename_table  s   r!  c                 K  sD   dt || j| jt|| jdt|| j | jrd| j f S df S )Nz%s %s %s %szTYPE %szUSING %sr]   )r   rt   r|   r   ru   r    rz   r   r   rH   rH   rS   visit_column_type  s   
r"  r   c                 K  sJ   d}| j d ur|j| j t nd}|jt|| j| jt	|| j
|dS )Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}NULL)rt   ru   comment)r$  sql_compilerrender_literal_valuerN   Stringformatr   rt   r|   r   ru   )r   r  rD   ddlr$  rH   rH   rS   visit_column_comment  s   



r*  r!   c                 K  s   dt || j| jt|| jf }| jd u r|d7 }|S | jd u r.|d7 }||| j7 }|S | j	| j| j\}}}| j}t
|D ]&}|dkrS|d|jrNdnd 7 }qA|d|tjd	i |t||i 7 }qA|S )
Nz%s %s zDROP IDENTITYzADD alwayszSET GENERATED %s ALWAYSz
BY DEFAULTzSET %s rH   )r   rt   r|   r   ru   r   r   visit_identity_columnimpl_compare_identity_defaultsortedr+  get_identity_optionsr,   Identityr  )r   r  rD   r   diff_identityattrrH   rH   rS   r-  -  s0   




r-  create_exclude_constraintbatch_create_exclude_constraintexclude_constraintc                   @  s^   e Zd ZdZdZ			d'd(ddZed)ddZ	d*d+ddZed,d"d#Z	ed-d%d&Z
dS ).CreateExcludeConstraintOpz0Represent a create exclude constraint operation.excludeNconstraint_namesqla_compat._ConstraintNamert   Union[str, quoted_name]elementsIUnion[Sequence[Tuple[str, str]], Sequence[Tuple[ColumnClause[Any], str]]]where)Optional[Union[ColumnElement[bool], str]]r|   ry   _orig_constraintOptional[ExcludeConstraint]rE   rF   c                 K  s.   || _ || _|| _|| _|| _|| _|| _d S rU   )r<  rt   r?  rA  r|   rC  rD   )rQ   r<  rt   r?  rA  r|   rC  rD   rH   rH   rS   r  Z  s   
z"CreateExcludeConstraintOp.__init__r[   r   c                 C  sD   t |}| |j|jdd |jD td|j|j||j|j|j	d	S )Nc                 S  s   g | ]	\}}}||fqS rH   rH   )r   r   rW   oprH   rH   rS   
<listcomp>w  s    z=CreateExcludeConstraintOp.from_constraint.<locals>.<listcomp>zColumnElement[bool] | None)rA  r|   rC  
deferrable	initiallyr   )
r,   _table_for_constraintrW   _render_exprsr   rA  r|   rG  rH  r   )clsr[   constraint_tablerH   rH   rS   from_constrainto  s   

z)CreateExcludeConstraintOp.from_constraintmigration_contextOptional[MigrationContext]c                 C  sx   | j d ur| j S t|}|j| j| jd}t| j| j| j	d| j
}|jD ]\}}}|t|t q'|| |S )N)r|   )rW   rA  )rC  r)   SchemaObjectsrK   rt   r|   r   r?  r<  rA  rD   rJ  rM   r   r   append_constraint)rQ   rN  
schema_objtexclr   rW   operrH   rH   rS   to_constraint  s&   



z'CreateExcludeConstraintOp.to_constraint
operationsr+   rd   r   rD   Optional[Table]c                 O  s   | |||fi |}| |S )a  Issue an alter to create an EXCLUDE constraint using the
        current migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        e.g.::

            from alembic import op

            op.create_exclude_constraint(
                "user_excl",
                "user",
                ("period", "&&"),
                ("group", "="),
                where=("group != 'some group'"),
            )

        Note that the expressions work the same way as that of
        the ``ExcludeConstraint`` object itself; if plain strings are
        passed, quoting rules must be applied manually.

        :param name: Name of the constraint.
        :param table_name: String name of the source table.
        :param elements: exclude conditions.
        :param where: SQL expression or SQL string with optional WHERE
         clause.
        :param deferrable: optional bool. If set, emit DEFERRABLE or
         NOT DEFERRABLE when issuing DDL for this constraint.
        :param initially: optional string. If set, emit INITIALLY <value>
         when issuing DDL for this constraint.
        :param schema: Optional schema name to operate within.

        )invoke)rK  rW  r<  rt   r?  rD   rE  rH   rH   rS   r7    s   +
z3CreateExcludeConstraintOp.create_exclude_constraintr*   c                 O  s.   |j j|d< | ||j j|fi |}||S )a3  Issue a "create exclude constraint" instruction using the
        current batch migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        .. seealso::

            :meth:`.Operations.create_exclude_constraint`

        r|   )r.  r|   rt   rY  )rK  rW  r<  r?  rD   rE  rH   rH   rS   r8    s   
z9CreateExcludeConstraintOp.batch_create_exclude_constraint)NNN)r<  r=  rt   r>  r?  r@  rA  rB  r|   ry   rC  rD  rE   rF   )r[   r   rE   r:  rU   )rN  rO  rE   r   )rW  r+   r<  rd   rt   rd   r?  r   rD   r   rE   rX  )
rW  r*   r<  rd   r?  r   rD   r   rE   rX  )r  r  r  __doc__constraint_typer  classmethodrM  rV  r7  r8  rH   rH   rH   rS   r:  P  s    
-r:  r   r=   rE  c                 C  s   t | | ddS )NT)alter)_exclude_constraintrV  )r   rE  rH   rH   rS   _add_exclude_constraint  s   r_  r[   r   namespace_metadatar9   c                 C  s&   t d| |}|dur|S t| |dS )Nr;  F)r'   _user_defined_renderr^  )r[   r   r`  renderedrH   rH   rS   !_render_inline_exclude_constraint  s   rc  c                 C  s   | j }|d ur|d dS )Nz*from sqlalchemy.dialects import postgresqlzpostgresql.)importsadd)r   rd  rH   rH   rS   _postgresql_autogenerate_prefix  s   
rf  r]  r   c                   s*  g  j }jrdtjf jrdtjf jr,dtjf |s@|r@jjr@dt	jjf |sQj
rQdt j
f  fdd}|rtt j
g}|ss|tt	jj
g7 }||  dt d	|d
 S | }dt d	|d
 S )NrG  rH  r   r|   rW   c                    sN    fddj D } jd ur| dtj   | dd D  | S )Nc                   s$   g | ]\}}}d t | |f qS )z(%s, %r))_render_potential_column)r   sqltextrW   opstring)r   rH   rS   rF    s    	zC_exclude_constraint.<locals>.do_expr_where_opts.<locals>.<listcomp>zwhere=%sc                 S  s   g | ]
\}}d ||f qS )z%s=%rrH   )r   kvrH   rH   rS   rF  $  s    )rJ  rA  r   r'   _render_potential_exprr   )argsr   r[   optsrH   rS   do_expr_where_opts  s   
	
z/_exclude_constraint.<locals>.do_expr_where_optsz-%(prefix)screate_exclude_constraint(%(args)s)z, )prefixrm  z%%(prefix)sExcludeConstraint(%(args)s))
_has_batchrG  r   rd   rH  r   rK   r|   r'   _identrW   _render_gen_namereprr   _alembic_autogenerate_prefixjoinrf  )r[   r   r]  	has_batchrp  rm  rH   rn  rS   r^    s<   
r^  valueGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]]c                 C  sJ   t | tr| jrd}nd}|t|| jd S tj| |t | ttfdS )Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))rq  rW   )wrap_in_text)	rc   r   
is_literalr'   _sqlalchemy_autogenerate_prefixrW   rl  r   r   )ry  r   templaterH   rH   rS   rg  :  s   
rg  )r   r"   r  r2   rE   rd   )r   r   r  r2   rE   rd   )r   r   r  r2   rE   rd   )r   r!   r  r2   )r   r=   rE  r:  rE   rd   )r[   r   r   r=   r`  r9   rE   rd   )r   r=   rE   rd   )r[   r   r   r=   r]  r   rE   rd   )ry  rz  r   r=   rE   rd   )l
__future__r   loggingrf   typingr   r   r   r   r   r   r	   r
   r   
sqlalchemyr   r   r   r   r   rN   sqlalchemy.dialects.postgresqlr   r   r   sqlalchemy.schemar   sqlalchemy.sql.elementsr   r   sqlalchemy.sql.functionsr   sqlalchemy.typesr   baser   r   r   r   r   r   r    r!   r"   r.  r#   r$   r]   r&   autogenerater'   rW  r(   r)   operations.baser*   r+   r,   util.sqla_compatr-   r.   r/   r0   $sqlalchemy.dialects.postgresql.arrayr1   #sqlalchemy.dialects.postgresql.baser2   %sqlalchemy.dialects.postgresql.hstorer3   #sqlalchemy.dialects.postgresql.jsonr4   r5   r6   r7   r8   sqlalchemy.sql.schemar9   r:   sqlalchemy.sql.type_apir;   r<   autogenerate.apir=   autogenerate.renderr>   runtime.migrationr?   	getLoggerr  r   r@   r   r!  r"  r*  r-  register_operationAddConstraintOpregister_add_constraintr:  	renderersdispatch_forr_  _constraint_renderersrc  rf  r^  rg  rH   rH   rH   rS   <module>   s   
   ,
	"
 




?