U
    x^_                     @   s~  d dl 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\Z"Z#G dd de
j$Z%G dd  d e
j$Z&G d!d" d"e
j$Z'd#Z(dS )$    N   )assert_raises_message)config)engines)eq_)expect_warnings)fixtures)is_Column)Table   )event)exc)
ForeignKey)inspect)Integer)MetaData)String)testing)types)	Inspector)DDL)Index)quoted_name)is_false)is_true)NNc                   @   s4   e Zd ZdZedd Zdd Zejj	dd Z
dS )	HasTableTestTc                 C   sX   t d|tdtddtdtd tjjjrTt d|tdtddtdtdtj	d d S )	N
test_tableidTprimary_keydata2   test_table_sschema)
r   r   r   r   r   requiresschemasenabledr   test_schemaclsmetadata r.   P/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/testing/suite/test_reflection.pydefine_tables%   s    
zHasTableTest.define_tablesc              	   C   sV   t j B}tt jj|d tt jj|d tt jj|d W 5 Q R X d S )Nr   r$   nonexistent_table)r   dbbeginr   dialect	has_tabler   selfconnr.   r.   r/   test_has_table6   s    zHasTableTest.test_has_tablec              	   C   sh   t j T}tt jjj|dt jd tt jjj|dt jd tt jjj|dt jd W 5 Q R X d S )Nr   r%   r$   r1   )r   r2   r3   r   r4   r5   r*   r   r6   r.   r.   r/   test_has_table_schema<   s,          z"HasTableTest.test_has_table_schemaN)__name__
__module____qualname____backend__classmethodr0   r9   r   r'   r(   r:   r.   r.   r.   r/   r   "   s   
r   c                   @   s  e Zd Zd ZZdZedd Zedd Zedd Z	ed	d
 Z
edd Zedd Zejjdd Zejjdd Zejjdd ZejdddZejjdd Zejjejjejjdd Zejjdd Zejjejjdd Zejjd d! Zejjejj d"d# Z!dd$d%Z"ejjejj d&d' Z#ejj$d(d) Z%ejj$ejj d*d+ Z&ejjejj$d,d- Z'dd.d/Z(ejjd0d1 Z)ejd2d3 Z*ejjd4d5 Z+ejjd6d7 Z,ejjejd8d9 Z-ejjejj d:d; Z.ejj/d<d= Z0ejj/ejj$ejjd>d? Z1ejj$d@dA Z2ejj$ejj dBdC Z3ejddDdEZ4ejj5dFdG Z6ejjejj5ejj dHdI Z7ejjejdJdK Z8ejddLdMZ9ejjdNdO Z:ejjejj dPdQ Z;ejj<ejj dRdS Z=ejj>dTdU Z?ejj@dVdW ZAejdXdY ZBdZd[ ZCejdd\d]ZDejjEd^d_ ZFejjEejj d`da ZGejdbdc ZHejjEddde ZIejjEdfdg ZJejjKejdhdi ZLejjMdjdk ZNejj/ejjMdldm ZOejj/dndo ZPejjMejj dpdq ZQejddrdsZRejjSdtdu ZTejjSejj dvdw ZUejddxdyZVejddzd{ZWejjd|d} ZXejjejj d~d ZYeZddejdddZ[dd Z\ejj dd Z]ejjejdd Z^dS )ComponentReflectionTestNTc                 C   s4   t jjjr*ddlm} tjt|j	ddS t j
S d S )Nr   )pool)Z	poolclass)options)r   requirementsZindependent_connectionsr)   
sqlalchemyrA   r   testing_enginedictZ
StaticPoolr2   )r,   rA   r.   r.   r/   
setup_bindU   s    

z"ComponentReflectionTest.setup_bindc                 C   s*   |  |d  tjjjr&|  |tjj d S N)define_reflected_tablesr   r'   r(   r)   r   r*   r+   r.   r.   r/   r0   `   s    
z%ComponentReflectionTest.define_tablesc                 C   s  |r|d }nd}t jjjrztd|tdtjddtdtdd	d
tdt	dd	d
tdtj
tjd| dd|dd}nBtd|tdtjddtdtdd	d
tdt	dd	d
|dd}td|tdtj
ddtdtj
td| tdtd|dd td|tdtj
tdtj
t|jjtdtdtjddd|dd td|tdtj
dddtdtdd d!td"tdd#d!|d$d% t jjjrX|d krtd&|tdtj
ddtdtdtd'td(t jj dtjjjd) nntd*|tdtj
ddtd+td,tjjj tdtd|dd td-|tdtj
ddtdtd|dd t jjjr| || |std.|td/tddd0}td1|tdtj
ddtd/tddd0}td2|jj  td3|jj  t jjjr| || |st jjjr| | d S )4N. usersuser_idTr    test1   Fnullabletest2parent_user_idz%susers.user_id
user_id_fkname)r&   test_needs_fk
dingalingsdingaling_id
address_idz%semail_addresses.address_idr"      email_addressesremote_user_idZemail_address   email_ad_pkcomment_testr   
id comment)r!   commentdata % comment)rb   d2)Comment types type speedily ' " \ '' Fun!the test % ' " \ table comment)r&   rb   local_table	remote_idz%s.remote_table_2.id)rW   r&   remote_tablelocal_idz%s.local_table.idremote_table_2noncol_idx_test_nopkqrW   noncol_idx_test_pknoncol_idx_nopknoncol_idx_pk)r   r'   self_referential_foreign_keysr)   r   r   saINTZCHARZFloatr   r   r   crM   ZPrimaryKeyConstraintcross_schema_fk_reflectionr   r*   r2   r4   default_schema_nameindex_reflectiondefine_indexr   rm   descview_column_reflectiondefine_viewstemp_table_reflectiondefine_temp_tables)r,   r-   r&   Zschema_prefixrL   rl   ro   r.   r.   r/   rI   f   s   

 

  

	z/ComponentReflectionTest.define_reflected_tablesc                 C   s   t drdgdd}n
ddgi}td|tdtjd	d
tdtdtdtjtjdddtddf|}t j	j
jrt j	jjrt|dtd t|dtd d S )NoraclezGLOBAL TEMPORARYzPRESERVE ROWS)prefixesZoracle_on_commitr   	TEMPORARYuser_tmpr   Tr    rV   r#   foouser_tmp_uqrU   user_tmp_ixafter_createz:create temporary view user_tmp_v as select * from user_tmpbefore_dropzdrop view user_tmp_v)r   againstr   r   rs   rt   ZVARCHARUniqueConstraintr   r'   view_reflectionr)   temporary_viewsr   listenr   )r,   r-   kwr   r.   r.   r/   r~      s8    



z*ComponentReflectionTest.define_temp_tablesc                 C   s2   t d|jj|jj t d|jj|jj|jj d S )Nusers_t_idxusers_all_idx)r   ru   rN   rR   rM   )r,   r-   rL   r.   r.   r/   ry     s    z$ComponentReflectionTest.define_indexc                 C   s^   dD ]T}|}|rd||f }|d }d||f }t |dt| t |dtd|  qd S )N)rL   r\   z%s.%sZ_vz"CREATE VIEW %s AS SELECT * FROM %sr   r   zDROP VIEW %s)r   r   r   )r,   r-   r&   
table_namefullnameZ	view_namequeryr.   r.   r/   r|     s      
z$ComponentReflectionTest.define_viewsc                 C   s$   t tj}| tjj| k d S rH   )r   r   r2   assert_r   r*   Zget_schema_namesr7   inspr.   r.   r/   test_get_schema_names.  s    
z-ComponentReflectionTest.test_get_schema_namesc                 C   s4   t  }t|jdrtt| t|jds0td S )Nrw   )r   rE   hasattrr4   AssertionErrorr   )r7   Zenginer.   r.   r/   test_dialect_initialize4  s    z/ComponentReflectionTest.test_dialect_initializec                 C   s    t tj}t|jtjjj d S rH   )r   r   r2   r   rw   r4   r   r.   r.   r/   test_get_default_schema_name;  s    
z4ComponentReflectionTest.test_get_default_schema_nametablec           	         s   ddddddg | j }t|j}|dkrR||}|  dd	g}tt|| nl|rld
d ||D }n
||} fdd|D }|dkrdddg}t|| ndddg}tt|| d S )Nr`   ro   rl   rg   ri   rk   viewemail_addresses_vusers_vc                 S   s   g | ]}|d  r|d  qS )r   r.   .0Zrecr.   r.   r/   
<listcomp>W  s   zAComponentReflectionTest._test_get_table_names.<locals>.<listcomp>c                    s   g | ]}| kr|qS r.   r.   r   tZ_ignore_tablesr.   r/   r   ^  s      foreign_keyrL   r\   rX   )	r-   r   bindZget_view_namessortr   sortedZget_sorted_table_and_fkc_namesget_table_names)	r7   r&   
table_typeorder_bymetar   table_namesZanswertablesr.   r   r/   _test_get_table_names@  s2    




z-ComponentReflectionTest._test_get_table_namesc                 C   s&   t | j}| }tt|dg d S )Nr   )r   r   Zget_temp_table_namesr   r   r7   r   temp_table_namesr.   r.   r/   test_get_temp_table_namesg  s    
z1ComponentReflectionTest.test_get_temp_table_namesc                 C   s&   t | j}| }tt|dg d S )N
user_tmp_v)r   r   Zget_temp_view_namesr   r   r   r.   r.   r/   test_get_temp_view_namesm  s    
z0ComponentReflectionTest.test_get_temp_view_namesc                 C   s   |    d S rH   r   r7   r.   r.   r/   test_get_table_namesu  s    z,ComponentReflectionTest.test_get_table_namesc                 C   s   | j dd d S )Nr   )r   r   r   r.   r.   r/   test_get_table_names_fksy  s    z0ComponentReflectionTest.test_get_table_names_fksc                 C   s   |    d S rH   )_test_get_commentsr   r.   r.   r/   test_get_comments~  s    z)ComponentReflectionTest.test_get_commentsc                 C   s   |  tjj d S rH   )r   r   r   r*   r   r.   r.   r/   test_get_comments_with_schema  s    z5ComponentReflectionTest.test_get_comments_with_schemac                 C   st   t tj}t|jd|dddi t|jd|ddd i tdd |jd|dD dd	d
ddd
ddd
g d S )Nr`   r%   textrf   rL   c                 S   s   g | ]}|d  |d dqS )rV   rb   )rV   rb   r.   r   r.   r.   r/   r     s   z>ComponentReflectionTest._test_get_comments.<locals>.<listcomp>ra   r   )rb   rV   rc   r"   re   rd   )r   r   r2   r   Zget_table_commentget_columns)r7   r&   r   r.   r.   r/   r     s"    
z*ComponentReflectionTest._test_get_commentsc                 C   s   |  tjj d S rH   r   r   r   r*   r   r.   r.   r/    test_get_table_names_with_schema  s    z8ComponentReflectionTest.test_get_table_names_with_schemac                 C   s   | j dd d S Nr   )r   r   r   r.   r.   r/   test_get_view_names  s    z+ComponentReflectionTest.test_get_view_namesc                 C   s   | j tjjdd d S r   r   r   r.   r.   r/   test_get_view_names_with_schema  s     z7ComponentReflectionTest.test_get_view_names_with_schemac                 C   s   |    | j dd d S r   r   r   r.   r.   r/   test_get_tables_and_views  s    z1ComponentReflectionTest.test_get_tables_and_viewsc                 C   sl  t tj}| jj| jj }}ddg}|dkr4ddg}t|j}t|||fD ]\}}	|}
|j	||
d}| 
t|dkt| t|	jD ]\}}t|j|| d  || d	 j}|j}t|tjjr|j}td
r|tjtjfkrtj}| 
tt|j|jtjtjtjtjtjtj tj!gdkd|j|j|| d |f  |j"s|| d d kst#qqLd S )NrL   r\   r   r   r   r%   r   rV   typer   z%s(%s), %s(%s)default)$r   r   r2   r   rL   r\   r   r   zipr   r   len	enumeratecolumnsr   rV   	__class__r   
isinstancers   r   Z
TypeEnginer   	sql_typesDateDateTimeset__mro__intersectionr   NumericZTimer   Z_Binaryr!   r   )r7   r&   r   r   rL   	addressesr   r   r   r   Zschema_namecolsicolctypeZ	ctype_defr.   r.   r/   _test_get_columns  sX    


z)ComponentReflectionTest._test_get_columnsc                 C   s   |    d S rH   r   r   r.   r.   r/   test_get_columns  s    z(ComponentReflectionTest.test_get_columnsc                 G   sD   t d| jfdd t|D  }|  dd t| jjdD S )Nr   c                 S   s   g | ]\}}t d | |qS )zt%dr
   )r   r   type_r.   r.   r/   r     s     z<ComponentReflectionTest._type_round_trip.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r.   r   ru   r.   r.   r/   r     s    )r   r-   r   creater   r   r   )r7   r   r   r.   r.   r/   _type_round_trip  s    z(ComponentReflectionTest._type_round_tripc                 C   sD   |  tddD ],}t|tjs&tt|jd t|jd qd S )N   rO   )r   r   r   r   r   r   Z	precisionZscaler7   typr.   r.   r/   test_numeric_reflection  s    z/ComponentReflectionTest.test_numeric_reflectionc                 C   s4   |  tdd }t|tjs$tt|jd d S )N4   r   )r   r   r   r   r   r   lengthr   r.   r.   r/   test_varchar_reflection  s    z/ComponentReflectionTest.test_varchar_reflectionc              	   C   s\   t d| jtdtddtdtdd}|  ttdd t| jj	dD ddd	 d S )
Nr   aTrP   bFc                 s   s   | ]}|d  |d fV  qdS )rV   rQ   Nr.   r   r   r.   r.   r/   	<genexpr>  s   zCComponentReflectionTest.test_nullable_reflection.<locals>.<genexpr>)r   r   )
r   r-   r   r   r   r   rF   r   r   r   )r7   r   r.   r.   r/   test_nullable_reflection  s    z0ComponentReflectionTest.test_nullable_reflectionc                 C   s   | j tjjd d S Nr%   r   r   r   r*   r   r.   r.   r/   test_get_columns_with_schema   s    z4ComponentReflectionTest.test_get_columns_with_schemac                 C   sj   t | j}| jj}t|j}|d}| t|dkt| t|j	D ]\}}t
|j|| d  qHd S )Nr   r   rV   )r   r   r   r   r   r   r   r   r   r   r   rV   )r7   r   r   r   r   r   r   r.   r.   r/   test_get_temp_table_columns%  s    


z3ComponentReflectionTest.test_get_temp_table_columnsc                 C   s2   t | j}|d}tdd |D dddg d S )Nr   c                 S   s   g | ]}|d  qS rU   r.   r   r.   r.   r/   r   6  s     zFComponentReflectionTest.test_get_temp_view_columns.<locals>.<listcomp>r   rV   r   )r   r   r   r   )r7   r   r   r.   r.   r/   test_get_temp_view_columns0  s    

z2ComponentReflectionTest.test_get_temp_view_columnsc                 C   s   | j dd d S r   r   r   r.   r.   r/   test_get_view_columns8  s    z-ComponentReflectionTest.test_get_view_columnsc                 C   s   | j tjjdd d S )Nr   )r&   r   r   r   r.   r.   r/   !test_get_view_columns_with_schema<  s     z9ComponentReflectionTest.test_get_view_columns_with_schemac           
   	   C   s   | j }| jj| jj }}t|j}|j|j|d}|d }t|dg |j|j|d}|d }	t|	dg t	j
j  t|d d W 5 Q R X d S )Nr%   constrained_columnsrM   rZ   rV   r_   )r-   r   rL   r\   r   r   Zget_pk_constraintrV   r   r   r'   Zreflects_pk_namesfail_if)
r7   r&   r   rL   r   r   Z
users_consZusers_pkeysZ	addr_consZ
addr_pkeysr.   r.   r/   _test_get_pk_constraintC  s    
z/ComponentReflectionTest._test_get_pk_constraintc                 C   s   |    d S rH   )r   r   r.   r.   r/   test_get_pk_constraintT  s    z.ComponentReflectionTest.test_get_pk_constraintc                 C   s   | j tjjd d S r   )r   r   r   r*   r   r.   r.   r/   "test_get_pk_constraint_with_schemaX  s    z:ComponentReflectionTest.test_get_pk_constraint_with_schemac                 C   s0   | j }| jj}t|j}ttjd|j|j	 d S )Nz+.*get_primary_keys\(\) method is deprecated)
r-   r   rL   r   r   r   sa_excZSADeprecationWarningZget_primary_keysrV   )r7   r   rL   r   r.   r.   r/    test_deprecated_get_primary_keys^  s    
z8ComponentReflectionTest.test_deprecated_get_primary_keysc           
   	   C   s:  | j }| jj| jj }}t|j}|}tjjj	r|j
|j|d}|d }tjj  t|d d W 5 Q R X t|d | t|d |j t|d dg tjjj	rt|d	 d
g |j
|j|d}	|	d }tjj  | |d d k	 W 5 Q R X t|d | t|d |j t|d dg t|d	 dg d S )Nr%   r   rV   rT   referred_schemareferred_tablereferred_columnsrM   r   rS   r]   )r-   r   rL   r\   r   r   r   r'   rr   r)   get_foreign_keysrV   Znamed_constraintsr   r   Zimplicitly_named_constraintsr   )
r7   r&   r   rL   r   r   Zexpected_schemaZusers_fkeysfkey1Z
addr_fkeysr.   r.   r/   _test_get_foreign_keysk  s,    


z.ComponentReflectionTest._test_get_foreign_keysc                 C   s   |    d S rH   )r   r   r.   r.   r/   test_get_foreign_keys  s    z-ComponentReflectionTest.test_get_foreign_keysc                 C   s   | j tjjd d S r   )r   r   r   r*   r   r.   r.   r/   !test_get_foreign_keys_with_schema  s    z9ComponentReflectionTest.test_get_foreign_keys_with_schemac           	      C   s  |  dtjjj dtjj dtjj \}}}ttj}||j	}t
t|d |d }t
|d tjj t
|d |j	 t
|d d	g t
|d
 dg |j|j	tjjd}t
t|d |d }|d d tjjjfkstt
|d |j	 t
|d d	g t
|d
 dg d S )Nz%s.local_tablez%s.remote_tablez%s.remote_table_2   r   r   r   r   r   r   rh   r%   rj   )r   r   r2   r4   rw   r   r*   r   r   rV   r   r   r   )	r7   rg   ri   rk   r   Zlocal_fkeysr   Zremote_fkeysZfkey2r.   r.   r/   "test_get_inter_schema_foreign_keys  s4    



 
z:ComponentReflectionTest.test_get_inter_schema_foreign_keysc                 C   s   | j dd d S )NZCASCADE)Zondelete_test_get_foreign_key_optionsr   r.   r.   r/   %test_get_foreign_key_options_ondelete  s    z=ComponentReflectionTest.test_get_foreign_key_options_ondeletec                 C   s   | j dd d S )NzSET NULL)Zonupdater  r   r.   r.   r/   %test_get_foreign_key_options_onupdate  s    z=ComponentReflectionTest.test_get_foreign_key_options_onupdatec                    s  | j }td|tdtdddd td|tdtddtdttjdd	d
tdtddd td|tdtddtdtdddtdttjdgdgfddi|dd |  t	|j
}|dd d  tt fdd D i  |dd d  tt fdd D | d S )Nxr   Tr    rn   r   Zx_idzx.idxidrU   test
   userrV   r#   FrP   tidztable.idZmyfkr   rB   c                 3   s"   | ]} | r| | fV  qd S rH   r.   r   koptsr.   r/   r     s      zHComponentReflectionTest._test_get_foreign_key_options.<locals>.<genexpr>c                 3   s"   | ]} | r| | fV  qd S rH   r.   r  r  r.   r/   r     s      )r-   r   r   r   rs   r   r   ZForeignKeyConstraint
create_allr   r   r   r   rF   )r7   rB   r   r   r.   r  r/   r    sJ    	 
z5ComponentReflectionTest._test_get_foreign_key_optionsc                 C   sZ   dd |D }|D ]B}|d |ks&t |||d  }|D ]}t|| ||  q<qd S )Nc                 S   s   g | ]}|d  qS rU   r.   )r   dr.   r.   r/   r     s     z@ComponentReflectionTest._assert_insp_indexes.<locals>.<listcomp>rV   )r   indexr   )r7   indexesexpected_indexesZindex_namesZe_indexr  keyr.   r.   r/   _assert_insp_indexes  s    z,ComponentReflectionTest._assert_insp_indexesc                 C   sP   | j }t|j}|jd|d}dddgddddddgd	dg}| || d S )
NrL   r%   FrN   rR   r   uniquecolumn_namesrV   rM   r   )r-   r   r   get_indexesr  )r7   r&   r   r   r  r  r.   r.   r/   _test_get_indexes  s    
z)ComponentReflectionTest._test_get_indexesc                 C   s   |    d S rH   )r  r   r.   r.   r/   test_get_indexes  s    z(ComponentReflectionTest.test_get_indexesc                 C   s   | j tjjd d S r   )r  r   r   r*   r   r.   r.   r/   test_get_indexes_with_schema  s    z4ComponentReflectionTest.test_get_indexes_with_schemac                 C   s   | j }t|j}||}d|dg}| || t|||jd}tt|jd t	t
|jd j| tt
|jd j| d S )NF)r  rV   )autoload_withr  r   )r-   r   r   r  r  r   r   r   r  r	   listr   rV   )r7   tnameZixnamer   r   r  r  r   r.   r.   r/   _test_get_noncol_index  s    

z.ComponentReflectionTest._test_get_noncol_indexc                 C   s   |  dd d S )Nrl   rp   r"  r   r.   r.   r/   test_get_noncol_index_no_pk%  s    z3ComponentReflectionTest.test_get_noncol_index_no_pkc                 C   s   |  dd d S )Nro   rq   r#  r   r.   r.   r/   test_get_noncol_index_pk)  s    z0ComponentReflectionTest.test_get_noncol_index_pkc              	   C   s   t d| jtdtdtdtd t| jdtd t| jdtd | j  t| jj	}t
d" t|dd	dgd
dg W 5 Q R X d S )Nr   r  r[   yr   z+CREATE INDEX t_idx ON t(lower(x), lower(y))zCREATE INDEX t_idx_2 ON t(x)z>Skipped unsupported reflection of expression-based index t_idxZt_idx_2r   )rV   r  r  )r   r-   r   r   r   r   r   r  r   r   r   r   r  r   r.   r.   r/   %test_reflect_expression_based_indexes-  s2      
z=ComponentReflectionTest.test_reflect_expression_based_indexesc                 C   s   |    d S rH   )_test_get_unique_constraintsr   r.   r.   r/   test_get_unique_constraintsJ  s    z3ComponentReflectionTest.test_get_unique_constraintsc                 C   sB   t | j}|d}|D ]}|dd  qt|dgddg d S )Nr   duplicates_indexrV   r   )r  rV   )r   r   get_unique_constraintspopr   )r7   r   	reflectedreflr.   r.   r/   &test_get_temp_table_unique_constraintsN  s
    

z>ComponentReflectionTest.test_get_temp_table_unique_constraintsc                 C   sN   t | j}|d}|D ]}|dd  qtdd |D ddgddg d S )	Nr   Zdialect_optionsc                 S   s   g | ]}|d  dkr|qS )rV   r   r.   r   idxr.   r.   r/   r   b  s      zGComponentReflectionTest.test_get_temp_table_indexes.<locals>.<listcomp>Fr   r   r  )r   r   r  r,  r   )r7   r   r  indr.   r.   r/   test_get_temp_table_indexesY  s    

z3ComponentReflectionTest.test_get_temp_table_indexesc                 C   s   | j tjjd d S r   )r(  r   r   r*   r   r.   r.   r/   'test_get_unique_constraints_with_schemal  s    z?ComponentReflectionTest.test_get_unique_constraints_with_schemac                 C   s  t ddgdddddgdddddgddd	d
gdddgdddgdgtdd}| j}td|tdtdtdtdtdtjtd	tdtd
td|d}|D ]"}|	tj
|d d|d i q|  t|j}t |jd|dtdd}t }t||D ]0\}	}
|
dd }|r8|| t|	|
 qt }td||j|d}tdd |jD }tdd |jD dg}||rt|rt|| t|t  d S )NZunique_ar   )rV   r  Zunique_a_b_cr   ru   Zunique_c_a_bZunique_asc_keyZascr  zi.have.dotszi have spacesrV   r  Ztesttblr^   r[   r%   r  r*  )r  r&   c                 S   s   g | ]
}|j qS r.   rU   r0  r.   r.   r/   r     s     zHComponentReflectionTest._test_get_unique_constraints.<locals>.<listcomp>c                 S   s   g | ]}t |tjr|jqS r.   )r   rs   r   rV   )r   Zuqr.   r.   r/   r     s   )r   operator
itemgetterr-   r   r   rs   r   r   Zappend_constraintr   r  r   r   r+  r   r   r,  addr   r   r  constraints
differencer   r   )r7   r&   Zuniques	orig_metar   Zuc	inspectorr-  Znames_that_duplicate_indexorigr.  ZdupeZreflected_metadataZ	idx_namesZuq_namesr.   r.   r/   r(  q  sp    






z4ComponentReflectionTest._test_get_unique_constraintsc                 C   s   |    d S rH   )_test_get_check_constraintsr   r.   r.   r/   test_get_check_constraints  s    z2ComponentReflectionTest.test_get_check_constraintsc                 C   s   | j tjjd d S r   )r>  r   r   r*   r   r.   r.   r/   !test_get_check_constraints_schema  s    z9ComponentReflectionTest.test_get_check_constraints_schemac              	      s   | j }td|tdt tjdddtjddd|d |  t|j}t	|j
d|dtd	d
}dd   fdd|D }t|ddddddg d S )NZsa_ccr   za > 1 AND a < 5Zcc1rU   za = 1 OR (a > 2 AND a < 5)Zcc2r%   rV   r5  c                 S   s   d td|  tjS )N zand|\d|=|a|or|<|>)joinrefindalllowerI)sqltextr.   r.   r/   	normalize  s    zFComponentReflectionTest._test_get_check_constraints.<locals>.normalizec                    s"   g | ]}|d   |d dqS )rV   rG  rV   rG  r.   )r   itemrH  r.   r/   r     s   zGComponentReflectionTest._test_get_check_constraints.<locals>.<listcomp>za > 1 and a < 5rI  za = 1 or a > 2 and a < 5)r-   r   r   r   rs   ZCheckConstraintr  r   r   r   Zget_check_constraintsr6  r7  r   )r7   r&   r;  r<  r-  r.   rK  r/   r>    s2    
	

z3ComponentReflectionTest._test_get_check_constraintsc                 C   sL   | j }d}d}t|j}|j||d}| | |j||d}| | d S )Nr   r   r%   )r-   r   r   Zget_view_definitionr   )r7   r&   r   Z
view_name1Z
view_name2r   Zv1Zv2r.   r.   r/   _test_get_view_definition  s    

z1ComponentReflectionTest._test_get_view_definitionc                 C   s   |    d S rH   )rL  r   r.   r.   r/   test_get_view_definition  s    z0ComponentReflectionTest.test_get_view_definitionc                 C   s   | j tjjd d S r   )rL  r   r   r*   r   r.   r.   r/   $test_get_view_definition_with_schema   s    z<ComponentReflectionTest.test_get_view_definition_with_schemaZ
postgresqlzPG specific featurec                 C   s0   | j }t|j}|||}| t|t d S rH   )r-   r   r   Zget_table_oidr   r   int)r7   r   r&   r   r   oidr.   r.   r/   _test_get_table_oid  s    
z+ComponentReflectionTest._test_get_table_oidc                 C   s   |  d d S )NrL   )rQ  r   r.   r.   r/   test_get_table_oid  s    z*ComponentReflectionTest.test_get_table_oidc                 C   s   | j dtjjd d S )NrL   r%   )rQ  r   r   r*   r   r.   r.   r/   test_get_table_oid_with_schema  s    z6ComponentReflectionTest.test_get_table_oid_with_schemac                 C   sN   | j }t|j}dD ]4\}}||}dd |D | }|ddstqdS )a  test that 'autoincrement' is reflected according to sqla's policy.

        Don't mark this test as unsupported for any backend !

        (technically it fails with MySQL InnoDB since "id" comes before "id2")

        A backend is better off not returning "autoincrement" at all,
        instead of potentially returning "False" for an auto-incrementing
        primary key column.

        ))rL   rM   )r\   rZ   )rX   rY   c                 S   s   i | ]}|d  |qS rU   r.   r   r.   r.   r/   
<dictcomp>,  s      zBComponentReflectionTest.test_autoincrement_col.<locals>.<dictcomp>ZautoincrementTN)r-   r   r   r   getr   )r7   r   r   r!  cnamer   Zid_r.   r.   r/   test_autoincrement_col  s    

z.ComponentReflectionTest.test_autoincrement_col)Nr   N)N)Nr   )N)N)N)N)N)N)N)_r;   r<   r=   Zrun_insertsZrun_deletesr>   r?   rG   r0   rI   r~   ry   r|   r   r'   Zschema_reflectionr   r   r   Zprovide_metadatar   r   r   r   r   r   Ztable_reflectionr   Z!foreign_key_constraint_reflectionr   Zcomment_reflectionr   r(   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r}   r   r   r   r   r   Z!primary_key_constraint_reflectionr   r   r   r   r   r   rv   r  Z1foreign_key_constraint_option_reflection_ondeleter  Z1foreign_key_constraint_option_reflection_onupdater  r  r  r  rx   r  r  r"  r$  r%  Zindexes_with_expressionsr'  Zunique_constraint_reflectionr)  r/  r3  r4  r(  Zcheck_constraint_reflectionr?  r@  r>  rL  rM  rN  Zonly_onrQ  rR  rS  rW  r.   r.   r.   r/   r@   P   s>  



 
#




     &





8







 
!


,




	
N
'



r@   c                   @   s0   e Zd ZdZdZedd Zdd Zdd Zd	S )
NormalizedNameTest)Zdenormalized_namesTc                 C   sL   t tddd|tdtdd t tddd|tdtddtdtd d S )	Nt1Tquoter   r    t2t1idzt1.id)r   r   r   r   r   r+   r.   r.   r/   r0   4  s    

z NormalizedNameTest.define_tablesc                 C   s   t tj}ttddd|dd}|jd }|jj|jj	s@t
t tj}|jdd d |jd jj|jd jj	s|t
d S )	Nr\  TrZ  )ZautoloadrY  c                 S   s   |   dkS )NrY  r\  rE  )rV   mr.   r.   r/   <lambda>J      zINormalizedNameTest.test_reflect_lowercase_forced_tables.<locals>.<lambda>)only)r   r   r2   r   r   r   ru   r]  Z
referencesr   r   Zreflect)r7   m2Zt2_refZt1_refZm3r.   r.   r/   $test_reflect_lowercase_forced_tablesB  s    


z7NormalizedNameTest.test_reflect_lowercase_forced_tablesc                 C   sP   dd t tj D }t|d  |d   t|d  |d   d S )Nc                 S   s   g | ]}|  d kr|qS )r^  r_  r   r.   r.   r/   r   N  s   z;NormalizedNameTest.test_get_table_names.<locals>.<listcomp>r   r  )r   r   r2   r   r   upperrE  )r7   Z
tablenamesr.   r.   r/   r   M  s
    z'NormalizedNameTest.test_get_table_namesN)	r;   r<   r=   __requires__r>   r?   r0   re  r   r.   r.   r.   r/   rX  0  s   
rX  )r@   r   rX  ))r6  rC  rD   rs   rK   r   r   r   r   r   r   r	   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   Zengine.reflectionr   r   r   Zsql.elementsr   r   r   r-   rL   Z
TablesTestr   r@   rX  __all__r.   r.   r.   r/   <module>   sL   .       g(