U
    r\j                     @   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dlm"Z" ddlm#Z# d\Z$Z%G dd  d e	j&Z'G d!d" d"e'Z(G d#d$ d$e	j&Z)G d%d& d&e	j&Z*G d'd( d(e'Z+G d)d* d*e	j,Z-G d+d, d,e	j,Z.G d-d. d.e	j&Z/G d/d0 d0e	j0Z1G d1d2 d2e	j&Z2G d3d4 d4e	j&Z3d5Z4dS )6    N   )config)engines)eq_)expect_warnings)fixtures)is_)get_temp_table_name)temp_table_keyword_argsColumn)Table   )event)
ForeignKey)func)Identity)inspect)Integer)MetaData)String)testing)types)DDL)Index)quoted_name)BLANK_SCHEMA)is_false)is_true)NNc                   @   s   e Zd Zedd ZdS )OneConnectionTablesTestc                 C   s6   t jjjr,ddlm} tjt|j	dddS t j
S d S )Nr   )poolclass)Z	poolclassscope)options)r   requirementsZindependent_connectionsenabled
sqlalchemyr    r   testing_enginedictZ
StaticPooldb)clsr     r+   _/root/pica-gateway/venv/lib/python3.8/site-packages/sqlalchemy/testing/suite/test_reflection.py
setup_bind+   s    
z"OneConnectionTablesTest.setup_bindN)__name__
__module____qualname__classmethodr-   r+   r+   r+   r,   r   *   s   r   c                   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Zd
d Z	e
jjdd Ze
dde
jjdd Ze
jjdd Ze
jje
jje
jjdd Ze
dde
jje
jjdd ZdS )HasTableTestTc                 C   s~   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 tjj
rf| | tjjjrz| | d S )	N
test_tableidTprimary_keydata2   test_table_sschema)r   r   r   r   r   requiresschemasr%   r   test_schemaview_reflectiondefine_viewshas_temp_tabledefine_temp_tablesr*   metadatar+   r+   r,   define_tables=   s$    


zHasTableTest.define_tablesc                 C   sp   d}t |dt| t |dtd tjjjrldtjtjf }t |dt| t |dtdtj  d S )Nz1CREATE VIEW vv AS SELECT id, data FROM test_tableafter_createbefore_dropzDROP VIEW vvz9CREATE VIEW %s.vv AS SELECT id, data FROM %s.test_table_szDROP VIEW %s.vv)	r   listenr   r   r<   r=   r%   r   r>   )r*   rD   queryr+   r+   r,   r@   S   s     
zHasTableTest.define_viewsc                 C   s   t ttjdtjf S Nuser_tmp_%s)r	   r   r)   ident)r*   r+   r+   r,   temp_table_namei   s
      
zHasTableTest.temp_table_namec              	   C   s   t ttj}|  }t||tdtjddtdtdf|}t	j
jjr|t	j
jjr|t|dtdtj  t|dtd	 d S )
Nr4   Tr5   namer8   rF   =create temporary view user_tmp_v as select * from user_tmp_%srG   drop view user_tmp_v)r
   r   r)   rM   r   r   saINTVARCHARr   r<   r?   r%   temporary_viewsr   rH   r   rL   r*   rD   kw
table_nameuser_tmpr+   r+   r,   rB   o   s0    zHasTableTest.define_temp_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 )Nr3   r9   nonexistent_table)r   r)   beginr   dialect	has_tabler   selfconnr+   r+   r,   test_has_table   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 )Nr3   r:   r9   rY   )r   r)   rZ   r   r[   r\   r>   r   r]   r+   r+   r,   test_has_table_schema   s,          z"HasTableTest.test_has_table_schemaoraclezJper #8700 this remains at its previous behavior of not working within 1.4.c                 C   s   t |}t|d d S NZvvr   r   r\   r^   
connectioninspr+   r+   r,   test_has_table_view   s    z HasTableTest.test_has_table_viewc                 C   s"   t |}|  }t|| d S N)r   rM   r   r\   )r^   rf   rg   rM   r+   r+   r,   test_has_table_temp_table   s    z&HasTableTest.test_has_table_temp_tablec                 C   s   t |}t|d d S N
user_tmp_vrd   re   r+   r+   r,   test_has_table_temp_view   s    z%HasTableTest.test_has_table_temp_viewzIper #8700 this remains at its previous behavior of not working within 1.4c                 C   s   t |}t|dtj d S rc   )r   r   r\   r   r>   re   r+   r+   r,   test_has_table_view_schema   s    z'HasTableTest.test_has_table_view_schemaN)r.   r/   r0   __backend__r1   rE   r@   rM   rB   r`   r   r<   r=   ra   Zfails_onviewsrh   rA   rj   r?   rT   rm   rn   r+   r+   r+   r,   r2   :   s>   





r2   c                   @   s4   e Zd ZdZedd Zdd Zejj	dd Z
dS )	HasIndexTestTc                 C   st   t d|tdtddtdtd}td|jj tjj	j
rpt d|tdtddtdtdtjd}td	|jj d S )
Nr3   r4   Tr5   r7   r8   my_idxr:   my_idx_s)r   r   r   r   r   cr7   r   r<   r=   r%   r   r>   )r*   rD   ttr+   r+   r,   rE      s     
zHasIndexTest.define_tablesc              	   C   sr   t j ^}t jj|dds"tt jj|ddr8tt jj|ddrNtt jj|ddrdtW 5 Q R X d S )Nr3   rr   rs   rY   Znonexistent_idx)r   r)   rZ   r[   	has_indexAssertionErrorr]   r+   r+   r,   test_has_index   s"          zHasIndexTest.test_has_indexc              	   C   s   t j v}t jjj|ddt jds(tt jjj|ddt jdrDtt jjj|ddt jdr`tt jjj|ddt jdr|tW 5 Q R X d S )Nr3   rs   r:   rr   rY   Znonexistent_idx_s)r   r)   rZ   r[   rv   r>   rw   r]   r+   r+   r,   test_has_index_schema   s2       
   

z"HasIndexTest.test_has_index_schemaN)r.   r/   r0   ro   r1   rE   rx   r   r<   r=   ry   r+   r+   r+   r,   rq      s   
rq   c                   @   s   e Zd ZdZdZedd Zdd Zedd Zee	j
jd	d
 Zedd Zedd Zedd Zedd Zee	j
jdd Zee	j
jdd Zee	j
jdd ZdS )QuotedNameArgumentTestonceTc                 C   s  t d|tdttdtdtdtdtdttjdddtd	dtjdd
dtjdgdgddtj	dddddd t
jjjrt d|tdttdtdtdtdtdttjdddtddtjdddtjdgdgddtj	dddddd t d|tdtddtdtdd t
jjjrt
jjjr>ddg}ndg}|D ]f}dtjjjd| tjjj|f }t|dt| t|dtd tjjjd|   qHd S )!Nquote ' oner4   rN   r8   r7   Z
related_idzpk quote ' onerN   zix quote ' onezuq quote' onez
related.idzfk quote ' onezname != 'foo'zck quote ' onezquote ' one commentT)commenttest_needs_fkquote " twozpk quote " twozix quote " twozuq quote" twozfk quote " twozck quote " two zquote " two commentrelatedr5   r   "CREATE VIEW %s AS SELECT * FROM %sview %srF   rG   DROP VIEW %s)r   r   r   r   rQ   PrimaryKeyConstraintr   UniqueConstraintForeignKeyConstraintCheckConstraintr   r<   symbol_names_w_double_quoter%   view_column_reflectionr   r)   r[   Zidentifier_preparerquoter   rH   r   )r*   rD   namesrN   rI   r+   r+   r,   rE     s    
  

  

z$QuotedNameArgumentTest.define_tablesc                 C   s   t ddt jjf| S )N)r|   r   )r   combinationsr<   r   )fnr+   r+   r,   quote_fixturesW  s    
z%QuotedNameArgumentTest.quote_fixturesc                 C   s   t tj}|| d S ri   )r   r   r)   Zget_table_optionsr^   rN   rg   r+   r+   r,   test_get_table_options]  s    
z-QuotedNameArgumentTest.test_get_table_optionsc                 C   s    t tj}|d| std S )Nr   )r   r   r)   get_view_definitionrw   r   r+   r+   r,   test_get_view_definitionc  s    
z/QuotedNameArgumentTest.test_get_view_definitionc                 C   s   t tj}||std S ri   )r   r   r)   get_columnsrw   r   r+   r+   r,   test_get_columnsi  s    
z'QuotedNameArgumentTest.test_get_columnsc                 C   s   t tj}||std S ri   )r   r   r)   get_pk_constraintrw   r   r+   r+   r,   test_get_pk_constraintn  s    
z-QuotedNameArgumentTest.test_get_pk_constraintc                 C   s   t tj}||std S ri   )r   r   r)   get_foreign_keysrw   r   r+   r+   r,   test_get_foreign_keyss  s    
z,QuotedNameArgumentTest.test_get_foreign_keysc                 C   s   t tj}||std S ri   )r   r   r)   get_indexesrw   r   r+   r+   r,   test_get_indexesx  s    
z'QuotedNameArgumentTest.test_get_indexesc                 C   s   t tj}||std S ri   )r   r   r)   get_unique_constraintsrw   r   r+   r+   r,   test_get_unique_constraints}  s    
z2QuotedNameArgumentTest.test_get_unique_constraintsc                 C   s   t tj}||std S ri   )r   r   r)   get_table_commentrw   r   r+   r+   r,   test_get_table_comment  s    
z-QuotedNameArgumentTest.test_get_table_commentc                 C   s   t tj}||std S ri   )r   r   r)   get_check_constraintsrw   r   r+   r+   r,   test_get_check_constraints  s    
z1QuotedNameArgumentTest.test_get_check_constraintsN)r.   r/   r0   Zrun_create_tablesro   r1   rE   r   r   r   r<   r   r   r   r   r   r   unique_constraint_reflectionr   comment_reflectionr   check_constraint_reflectionr   r+   r+   r+   r,   rz      s6   
S




rz   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jjdd Zejjdd Zejjdd Zejjdd Zejjejdddddejjfddddddejjfdddddejjfddd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dRd&d'Zejd(ddejjfddejjfddejjejj fd)dd*d+ Z ejj!d,d- Z"ejj!ejj#ejjd.d/ Z$ejd0dejjfd1dejj%d2d3 Z&ejd0dejjfd1dejjd4d5 Z'ejj(ejjd6d7 Z)d8d9 Z*ejd0dejjfd1dd:d; Z+ejd<d=d>dejj,ejj-d?d@ Z.ejj!ejj/dAdB Z0ejj1dCdD Z2ejdejjfd0d1dejj/dEdF Z3ejjejd0dejjfd1ddGdH Z4ejdIdJdejjfdKde5dLdMdNdO Z6ejj7dPdQ Z8dS )SComponentReflectionTestNTc                 C   s*   |  |d  tjjjr&|  |tjj d S ri   )define_reflected_tablesr   r<   r=   r%   r   r>   rC   r+   r+   r,   rE     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 jjjrtd2|jj  td3|jj  t jjjr| || |s t jjjr | | d S )4N. usersuser_idTr5   test1   Fnullabletest2parent_user_idz%susers.user_id
user_id_fkr}   r;   r   
dingalingsdingaling_id
address_idz%semail_addresses.address_idr7      email_addressesremote_user_idZemail_address   email_ad_pkcomment_testr4   
id comment)r6   r~   data % comment)r~   d2)Comment types type speedily ' " \ '' Fun!the test % ' " \ table comment)r;   r~   local_table	remote_idz%s.remote_table_2.id)r   r;   remote_tablelocal_idz%s.local_table.idremote_table_2noncol_idx_test_nopkqr   noncol_idx_test_pknoncol_idx_nopknoncol_idx_pk) r   r<   self_referential_foreign_keysr%   r   r   rQ   rR   ZCHARFloatr   r   r   rt   r   r   cross_schema_fk_reflectionr   r>   r)   r[   default_schema_nameindex_reflectiondefine_indexindexes_with_ascdescr   r   descr   r@   temp_table_reflectionrB   )r*   rD   r;   Zschema_prefixr   r   r   r+   r+   r,   r     s
   

 

  

	z/ComponentReflectionTest.define_reflected_tablesc                 C   s   t ttj}tttjdtj }t||tdtjddtdt	dtdtjtj
ddtj d	td
df|}tjjjrtjjjrt|dtdtj  t|dtd d S )NrK   r4   Tr5   rN   r8   foouser_tmp_uq_%sr}   user_tmp_ixrF   rO   rG   rP   )r
   r   r)   r	   rL   r   r   rQ   rR   rS   r   r   r   r<   r?   r%   rT   r   rH   r   rU   r+   r+   r,   rB   +  s>      

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   rt   r   r   r   )r*   rD   r   r+   r+   r,   r   O  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)r   r   z%s.%s_vr   rF   rG   r   )r   rH   r   )r*   rD   r;   rW   fullnameZ	view_namerI   r+   r+   r,   r@   T  s      
z$ComponentReflectionTest.define_viewsc                 C   s$   t | j}| tjj| k d S ri   )r   bindassert_r   r   r>   get_schema_namesr^   rg   r+   r+   r,   test_get_schema_namese  s    
z-ComponentReflectionTest.test_get_schema_namesc                 C   s:   |j ddttjjid}t|}| tjj| k dS )z
test #7300r   bar)Zschema_translate_mapN)Zexecution_optionsr   r   r   r>   r   r   r   re   r+   r+   r,   %test_get_schema_names_w_translate_mapk  s      z=ComponentReflectionTest.test_get_schema_names_w_translate_mapc                 C   s$   t  }t| t|jds td S )Nr   )r   r'   r   hasattrr[   rw   )r^   enginer+   r+   r,   test_dialect_initializey  s    z/ComponentReflectionTest.test_dialect_initializec                 C   s    t | j}t|j| jjj d S ri   )r   r   r   r   r[   r   r+   r+   r,   test_get_default_schema_name  s    
z4ComponentReflectionTest.test_get_default_schema_name)NTFFF)foreign_keyTFF)NFTF)NTTFz/order_by,include_plain,include_views,use_schemaargnamesc                    s   |rt j}nd }ddddddg t|}|rT||}|  ddg}	tt||	 |r|rrd	d
 ||D }
n
||}
 fdd
|
D }|dkrdddg}	t||	 ndddg}	tt||	 d S )Nr   r   r   r   r   r   email_addresses_vusers_vc                 S   s   g | ]}|d  r|d  qS )r   r+   .0Zrecr+   r+   r,   
<listcomp>  s   z@ComponentReflectionTest.test_get_table_names.<locals>.<listcomp>c                    s   g | ]}| kr|qS r+   r+   r   tZ_ignore_tablesr+   r,   r     s      r   r   r   r   )	r   r>   r   Zget_view_namessortr   sortedZget_sorted_table_and_fkc_namesget_table_names)r^   rf   Zorder_byZinclude_plainZinclude_views
use_schemar;   rg   table_namesZanswertablesr+   r   r,   test_get_table_names  s8    	



z,ComponentReflectionTest.test_get_table_namesc                 C   s,   t | j}| }tt|dtj g d S rJ   )r   r   Zget_temp_table_namesr   r   r   rL   r^   rg   temp_table_namesr+   r+   r,   test_get_temp_table_names  s    
z1ComponentReflectionTest.test_get_temp_table_namesc                 C   s&   t | j}| }tt|dg d S rk   )r   r   Zget_temp_view_namesr   r   r   r+   r+   r,   test_get_temp_view_names  s    
z0ComponentReflectionTest.test_get_temp_view_namesc                 C   s   |    d S ri   )_test_get_commentsr^   r+   r+   r,   test_get_comments  s    z)ComponentReflectionTest.test_get_commentsc                 C   s   |  tjj d S ri   )r   r   r   r>   r   r+   r+   r,   test_get_comments_with_schema  s    z5ComponentReflectionTest.test_get_comments_with_schemac                 C   st   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:   textr   r   c                 S   s   g | ]}|d  |d dqS )rN   r~   )rN   r~   r+   r   r+   r+   r,   r     s   z>ComponentReflectionTest._test_get_comments.<locals>.<listcomp>r   r4   )r~   rN   r   r7   r   r   )r   r   r   r   r   )r^   r;   rg   r+   r+   r,   r     s"    
z*ComponentReflectionTest._test_get_comments)FFzuse_views,use_schemac                 C   sn  |rt j}nd }| jj| jj }}|r0ddg}nddg}t|}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"qqNd S )Nr   r   r   r   r:   r   rN   typerb   z%s(%s), %s(%s)default)#r   r>   r   r   r   r   zipr   r   len	enumeratecolumnsr   rN   	__class__r  
isinstancerQ   r   Z
TypeEnginer   Zagainst	sql_typesDateDateTimeset__mro__intersectionr   NumericZTimer   Z_Binaryr6   rw   )r^   rf   Z	use_viewsr   r;   r   	addressesr   rg   rW   tableZschema_namecolsicolctypeZ	ctype_defr+   r+   r,   r     s\    

z(ComponentReflectionTest.test_get_columnsc                 C   sv   t t| jdtj }| j| }t| j}||}| t|dkt| t	|j
D ]\}}t|j|| d  qTd S )NrK   r   rN   )r	   r   r   rL   r   r   r   r   r  r  r  r   rN   )r^   rW   rX   rg   r  r  r  r+   r+   r,   test_get_temp_table_columns7  s      


z3ComponentReflectionTest.test_get_temp_table_columnsc                 C   s2   t | j}|d}tdd |D dddg d S )Nrl   c                 S   s   g | ]}|d  qS r}   r+   r   r  r+   r+   r,   r   J  s     zFComponentReflectionTest.test_get_temp_view_columns.<locals>.<listcomp>r4   rN   r   )r   r   r   r   )r^   rg   r  r+   r+   r,   test_get_temp_view_columnsD  s    

z2ComponentReflectionTest.test_get_temp_view_columnsFr   c              	   C   s   |rt jj}nd }| jj| jj }}t|}|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_columnsr   r   rN   r   )r   r   r>   r   r   r   r   r   rN   r   r<   Zreflects_pk_namesfail_if)r^   rf   r   r;   r   r  rg   Z
users_consZusers_pkeysZ	addr_consZ
addr_pkeysr+   r+   r,   r   L  s    
z.ComponentReflectionTest.test_get_pk_constraintc              	   C   sB  |rt j}nd }| jj| jj }}t|}|}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   rN   r   referred_schemareferred_tablereferred_columnsr   r  r   r   )r   r>   r   r   r   r   r   r<   r   r%   r   rN   Znamed_constraintsr  r   Zimplicitly_named_constraintsr   )r^   rf   r   r;   r   r  rg   Zexpected_schemaZusers_fkeysfkey1Z
addr_fkeysr+   r+   r,   r   d  s0    

z-ComponentReflectionTest.test_get_foreign_keysc           	      C   s  |  d| jjj dtjj dtjj \}}}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 | 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  r4   r  r   r:   r   )r   r   r[   r   r   r   r>   r   r   rN   r   r  rw   )	r^   r   r   r   rg   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   sZ   dd |D }|D ]B}|d |ks&t |||d  }|D ]}t|| ||  q<qd S )Nc                 S   s   g | ]}|d  qS r}   r+   )r   dr+   r+   r,   r     s     z@ComponentReflectionTest._assert_insp_indexes.<locals>.<listcomp>rN   )rw   indexr   )r^   indexesexpected_indexesZindex_namesZe_indexr$  keyr+   r+   r,   _assert_insp_indexes  s    z,ComponentReflectionTest._assert_insp_indexesc                 C   sZ   |rt j}nd }t| j}|jd|d}dddgddddddgd	dg}| || d S )
Nr   r:   Fr   r   r   uniquecolumn_namesrN   r   r   )r   r>   r   r   r   r(  )r^   rf   r   r;   rg   r%  r&  r+   r+   r,   r     s    
z(ComponentReflectionTest.test_get_indexes)r   r   )r   r   ztname,ixnamec                 C   sz   t |}||}d|dg}| || t|t |d}tt|jd tt	|jd j
| tt	|jd j| d S )NF)r*  rN   autoload_withr!  r   )r   r   r(  r   r   r   r  r%  r   listr  rN   )r^   rf   tnameZixnamerg   r%  r&  r   r+   r+   r,   test_get_noncol_index  s    
z-ComponentReflectionTest.test_get_noncol_indexc                 C   sN   t | j}|dtj }|D ]}|dd  qt|dgdtj dg d S )NrK   duplicates_indexrN   r   )r+  rN   )r   r   r   r   rL   popr   )r^   rg   	reflectedreflr+   r+   r,   &test_get_temp_table_unique_constraints  s    
z>ComponentReflectionTest.test_get_temp_table_unique_constraintsc                 C   s|   t | j}tttjdtj }||}|D ]}|dd  q,ddgddg}tj	j
jrdg |d d< td	d
 |D | d S )NrK   dialect_optionsFr   r   r)  r   include_columnsc                 S   s   g | ]}|d  dkr|qS )rN   r   r+   r   idxr+   r+   r,   r     s      zGComponentReflectionTest.test_get_temp_table_indexes.<locals>.<listcomp>)r   r   r	   r   r)   rL   r   r2  r   r<   index_reflects_included_columnsr%   r   )r^   rg   rW   r%  indexpectedr+   r+   r,   test_get_temp_table_indexes  s"    
  

z3ComponentReflectionTest.test_get_temp_table_indexesc                 C   s  |rt j}nd }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}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|}t|jd|dtdd}	t }
tt|t|	 t||	D ]0\}}|dd }|rT|
| t|| q0t }td|||d}	tdd |	jD }tdd |	jD dg}||rt|
rt|
| t|t  d S )NZunique_aa)rN   r+  Zunique_a_b_cbrt   Zunique_c_a_bZunique_asc_keyascr'  zi.have.dotszi have spacesrN   r'  Ztesttblr   r   r:   r+  r1  )r-  r;   c                 S   s   g | ]
}|j qS r+   r}   r8  r+   r+   r,   r   Y  s     zGComponentReflectionTest.test_get_unique_constraints.<locals>.<listcomp>c                 S   s   g | ]}t |tjr|jqS r+   )r	  rQ   r   rN   )r   Zuqr+   r+   r,   r   [  s   )r   r>   r   operator
itemgetterr   r   rQ   r   r   Zappend_constraintr   creater   r   r  r   r  r  r2  addr   r%  constraints
differencer  rw   )r^   rD   rf   r   r;   Zuniquesr  Zuc	inspectorr3  Znames_that_duplicate_indexorigr4  ZdupeZreflected_metadataZ	idx_namesZuq_namesr+   r+   r,   r     sv    






z3ComponentReflectionTest.test_get_unique_constraintsc           	      C   sT   |rt j}nd }d}d}t|}|j||d}| | |j||d}| | d S )Nr   r   r:   )r   r>   r   r   r   )	r^   rf   r   r;   Z
view_name1Z
view_name2rg   Zv1Zv2r+   r+   r,   r   g  s    
z0ComponentReflectionTest.test_get_view_definition)r   Fr   ztable_name,use_schema
postgresqlzPG specific featurec                 C   s8   |rt j}nd }t|}|||}| t|t d S ri   )r   r>   r   Zget_table_oidr   r	  int)r^   rf   rW   r   r;   rg   oidr+   r+   r,   test_get_table_oidy  s    z*ComponentReflectionTest.test_get_table_oidc                 C   sH   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.

        ))r   r   )r   r   )r   r   c                 S   s   i | ]}|d  |qS r}   r+   r   rt   r+   r+   r,   
<dictcomp>  s      zBComponentReflectionTest.test_autoincrement_col.<locals>.<dictcomp>autoincrementTN)r   r   r   getrw   )r^   rg   r/  cnamer  Zid_r+   r+   r,   test_autoincrement_col  s
    

z.ComponentReflectionTest.test_autoincrement_col)N)9r.   r/   r0   run_insertsrun_deletesro   r1   rE   r   rB   r   r@   r   r<   Zschema_reflectionr   r   r   r   !foreign_key_constraint_reflectionr   r=   r   r   r   r?   rT   r   r   r   r   r   r   r   r  r   r  !primary_key_constraint_reflectionr   r   r   r"  r(  r   r   r   r0  r   r5  Ztemp_table_reflect_indexesr=  r   r   Zonly_onrM  table_reflectionrS  r+   r+   r+   r,   r     s   

 
#






,



?
 
  
 $! 
 


  T 
 
	r   c                   @   s   e Zd ZdZdZejdd Zejdd Zej	j
dd Z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dS )TableNoColumnsTest)reflect_tables_no_columnsTc                 C   s   t d| || d S Nempty)r   
create_allr^   rf   rD   r+   r+   r,   table_no_columns  s    
z#TableNoColumnsTest.table_no_columnsc                 C   sP   t d| || t d| t|dtd t|dtd || d S )Nr\  rF   z*CREATE VIEW empty_v AS SELECT * FROM emptyrG   zDROP VIEW IF EXISTS empty_v)r   r]  r   rH   r   r^  r+   r+   r,   view_no_columns  s    


  z"TableNoColumnsTest.view_no_columnsc                 C   s$   t dt |d}tt|jg  d S )Nr\  r,  r   r   r   r.  rt   )r^   rf   r_  t2r+   r+   r,   test_reflect_table_no_columns  s    z0TableNoColumnsTest.test_reflect_table_no_columnsc                 C   s   t t|dg  d S r[  r   r   r   )r^   rf   r_  r+   r+   r,   !test_get_columns_table_no_columns  s    z4TableNoColumnsTest.test_get_columns_table_no_columnsc                 C   s*   t  }|| t|jdgs&td S r[  )r   reflectr  r   r  rw   )r^   rf   r_  mr+   r+   r,   "test_reflect_incl_table_no_columns  s    
z5TableNoColumnsTest.test_reflect_incl_table_no_columnsc                 C   s$   t dt |d}tt|jg  d S )Nempty_vr,  ra  )r^   rf   r`  rb  r+   r+   r,   test_reflect_view_no_columns  s    z/TableNoColumnsTest.test_reflect_view_no_columnsc                 C   s   t t|dg  d S )Nri  rd  )r^   rf   r`  r+   r+   r,    test_get_columns_view_no_columns  s    z3TableNoColumnsTest.test_get_columns_view_no_columnsN)r.   r/   r0   __requires__ro   r   Zfixturer_  r`  r<   rZ  rc  re  rh  rp   rj  rk  r+   r+   r+   r,   rY    s$   




rY  c                
   @   s   e Zd ZdZejdejjfdddejjdd Z	ejj
dd Zejjd	d
 Zdd Zejjdd Zejjdd Zejjdd Zejdddejjfdddejjfi ddejjfi ddejjfdddejjfdddejjfdddd ZdS )ComponentReflectionTestExtraTr  r   r   c              	      s   |rt j}nd }td|tdt tjdddtjddd|d || t|}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cc1r}   za = 1 OR (a > 2 AND a < 5)Z
UsesCasingr:   rN   rA  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    zJComponentReflectionTestExtra.test_get_check_constraints.<locals>.normalizec                    s"   g | ]}|d   |d dqS )rN   rt  rN   rt  r+   )r   itemru  r+   r,   r     s   zKComponentReflectionTestExtra.test_get_check_constraints.<locals>.<listcomp>za = 1 or a > 2 and a < 5rv  za > 1 and a < 5)r   r>   r   r   r   rQ   r   r]  r   r   r   rB  rC  r   )r^   rD   rf   r   r;   rH  r3  r+   rx  r,   r     s<    
 

z7ComponentReflectionTestExtra.test_get_check_constraintsc              	   C   s   t d|tdtdtdtd}tdt|jjt|jj td|jj |	| t
|}ddgdi dg}tjjjrg |d	 d
< d|jj g i|d	 d< td t|d| W 5 Q R X d S )Nr   xr   yt_idxZt_idx_2F)rN   r+  r*  r6  r   r7  
%s_includer6  z>Skipped unsupported reflection of expression-based index t_idx)r   r   r   r   r   rr  rt   ry  rz  r]  r   r   r<   r:  r%   r   rN   r   r   r   )r^   rD   rf   r   rg   r<  r+   r+   r,   %test_reflect_expression_based_indexes  s2     
	

 zBComponentReflectionTestExtra.test_reflect_expression_based_indexesc                 C   s   t d|tdtdtdtd}td|jj}dg|j|jj d< |	| t
|}t|dddgdgdd|jj dgid	g t dt |d
}tt|jd j|jj d dg d S )Nr   ry  r   rz  r{  includeFr|  )rN   r+  r7  r*  r6  r,  r   )r   r   r   r   rt   ry  r6  r   rN   r]  r   r   r   r   r.  r%  )r^   rD   rf   r   r9  rg   rb  r+   r+   r,   test_reflect_covering_index3  s:    

 z8ComponentReflectionTestExtra.test_reflect_covering_indexc                 G   s@   t d|fdd t|D  }|| dd t|dD S )Nr   c                 S   s   g | ]\}}t d | |qS )zt%dr   )r   r  type_r+   r+   r,   r   ]  s     zAComponentReflectionTestExtra._type_round_trip.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r  r+   rN  r+   r+   r,   r   a  s     )r   r  rD  r   r   )r^   rf   rD   r   r   r+   r+   r,   _type_round_tripY  s    
z-ComponentReflectionTestExtra._type_round_tripc                 C   sH   |  ||tddD ],}t|tjs*tt|jd t|jd qd S )N   r   )r  r
  r  r	  rw   r   	precisionscaler^   rf   rD   typr+   r+   r,   test_numeric_reflectionc  s      
z4ComponentReflectionTestExtra.test_numeric_reflectionc                 C   s8   |  ||tdd }t|tjs(tt|jd d S )N4   r   )r  r
  r   r	  rw   r   lengthr  r+   r+   r,   test_varchar_reflectionl  s      z4ComponentReflectionTestExtra.test_varchar_reflectionc              	   C   sX   t d|tdtddtdtdd}|| ttdd t|dD ddd	 d S )
Nr   r>  Tr   r?  Fc                 s   s   | ]}|d  |d fV  qdS )rN   r   Nr+   r  r+   r+   r,   	<genexpr>~  s   zHComponentReflectionTestExtra.test_nullable_reflection.<locals>.<genexpr>)r>  r?  )r   r   r   rD  r   r(   r   r   )r^   rf   rD   r   r+   r+   r,   test_nullable_reflectiont  s    
z5ComponentReflectionTestExtra.test_nullable_reflectionNZCASCADEzSET NULLz	NO ACTIONZRESTRICTzexpected,ondelete,onupdatec                    s(  i }|r||d< |r||d< |d kr(|}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|}|	dd d  t
t fdd D i  |	dd d  t
 | d S )Nondeleteonupdatery  r4   Tr5   r   r  Zx_idzx.idxidr}   test
   userrN   r8   Fr   tidztable.idZmyfkr   r#   c                 3   s"   | ]} | r| | fV  qd S ri   r+   )r   koptsr+   r,   r    s      zLComponentReflectionTestExtra.test_get_foreign_key_options.<locals>.<genexpr>)r   r   r   rQ   r   r   r   r]  r   r   r   r(   )r^   rf   rD   r<  r  r  r#   rg   r+   r  r,   test_get_foreign_key_options  sV    *	 
z9ComponentReflectionTestExtra.test_get_foreign_key_options)r.   r/   r0   ro   r   r   r<   r=   r   r   Zindexes_with_expressionsr}  r:  r  r  rX  r  r  r  Z1foreign_key_constraint_option_reflection_ondeleteZ1foreign_key_constraint_option_reflection_onupdateZ1fk_constraint_option_reflection_ondelete_noactionZ1fk_constraint_option_reflection_onupdate_restrictZ1fk_constraint_option_reflection_ondelete_restrictr  r+   r+   r+   r,   rm    sj   
  -
$
%



'rm  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r   r4   r5   rb  t1idzt1.id)r   r   r   r   r   rC   r+   r+   r,   rE     s    

z NormalizedNameTest.define_tablesc                 C   s~   t  }ttddd|tjd}|jd }|jj|jj	s>t
t  }|jtjdd d |jd jj|jd jj	szt
d S )	Nrb  Tr  r,  r  c                 S   s   |   dkS )Nr  rb  rr  )rN   rg  r+   r+   r,   <lambda>       zINormalizedNameTest.test_reflect_lowercase_forced_tables.<locals>.<lambda>)only)r   r   r   r   r)   r   rt   r  Z
referencesr4   rw   rf  )r^   m2Zt2_refZt1_refZm3r+   r+   r,   $test_reflect_lowercase_forced_tables  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     s   z;NormalizedNameTest.test_get_table_names.<locals>.<listcomp>r   r!  )r   r   r)   r   r   upperrr  )r^   Z
tablenamesr+   r+   r,   r     s
    z'NormalizedNameTest.test_get_table_namesN)	r.   r/   r0   rl  ro   r1   rE   r  r   r+   r+   r+   r,   r    s   
r  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zejj	d	d
 Z
dS )ComputedReflectionTestc                 C   s^   t tj}|d}dd |D }td|d d k t|d d d  t|d d d  d S )	Ncomputed_default_tablec                 S   s   i | ]}|d  |qS r}   r+   rN  r+   r+   r,   rO    s      zLComputedReflectionTest.test_computed_col_default_not_set.<locals>.<dictcomp>Z42with_defaultr  normalcomputed_col)r   r   r)   r   r   r   )r^   rg   r  Zcol_datar+   r+   r,   !test_computed_col_default_not_set  s    

z8ComputedReflectionTest.test_computed_col_default_not_setc                 C   s   t tj}|d}dd |D }dD ]}td|| k q&|d }td|k td|d k t| |d d d td	|d ktjj	j
 tjj	j
rt|d d	 tjjj
 d S )
Nr  c                 S   s   i | ]}|d  |qS r}   r+   rN  r+   r+   r,   rO    s      zKComputedReflectionTest.test_get_column_returns_computed.<locals>.<dictcomp>)r4   r  r  computedr  rt  	normal+42	persisted)r   r   r)   r   r   r   ru  r   r<   "computed_columns_reflect_persistedr%   "computed_columns_default_persisted)r^   rg   r  r7   r'  compDatar+   r+   r,    test_get_column_returns_computed  s$    




z7ComputedReflectionTest.test_get_column_returns_computedc                 C   sX   t d|| k || d }t| |d | tjjjrTt d|k t|d | d S )Nr  rt  r  )r   r   ru  r   r<   r  r%   r   )r^   r7   columnrt  r  r  r+   r+   r,   check_column.  s    
z#ComputedReflectionTest.check_columnc                 C   sp   t tj}|d}dd |D }| |ddtjjj tjj	jrR| |ddd tjj
jrl| |d	d
d d S )Ncomputed_column_tablec                 S   s   i | ]}|d  |qS r}   r+   rN  r+   r+   r,   rO  :  s      zLComputedReflectionTest.test_get_column_returns_persisted.<locals>.<dictcomp>computed_no_flagr  computed_virtualznormal+2Fcomputed_storedz	normal-42T)r   r   r)   r   r  r   r<   r  r%   computed_columns_virtualcomputed_columns_storedr^   rg   r  r7   r+   r+   r,   !test_get_column_returns_persisted6  s.    



z8ComputedReflectionTest.test_get_column_returns_persistedc                 C   sv   t tj}|jdtjd}dd |D }| |ddtjjj	 tjj
j	rX| |ddd	 tjjj	rr| |d
dd d S )Nr  r:   c                 S   s   i | ]}|d  |qS r}   r+   rN  r+   r+   r,   rO  X  s      zXComputedReflectionTest.test_get_column_returns_persisted_with_schema.<locals>.<dictcomp>r  z	normal/42r  znormal/2Fr  z	normal*42T)r   r   r)   r   r>   r  r   r<   r  r%   r  r  r  r+   r+   r,   -test_get_column_returns_persisted_with_schemaQ  s4    
 

zDComputedReflectionTest.test_get_column_returns_persisted_with_schemaN)r.   r/   r0   r  r  r  r  r   r<   r=   r  r+   r+   r+   r,   r    s   	r  c                   @   sH   e Zd Zd ZZdZdZedd Zdd Z	dd	 Z
ejjd
d ZdS )IdentityReflectionTestNT)Zidentity_columnsrX  c                 C   s|   t d|tdttdtt  t d|tdttdddd	d
ddd tjjjrxt d|tdttdttdddtj	d d S )Nr  r  id1rb  id2Tr   r   *      alwaysstart	incrementminvaluemaxvaluecyclecacher   )r  r  r:   )
r   r   r   r   r   r<   r=   r%   r   r>   rC   r+   r+   r,   rE   v  s>    
z$IdentityReflectionTest.define_tablesc                 C   s   t jjjrd}t|D ]}||kr|| q|rtt|t| |D ]T}|dkrjt|| || k qH|dkrt|| || k qHt|| || | qHqt|| n$t|d |d  t|d |d  d S )Nr  r  >   r  r  r  r  )	r   r<   Zidentity_columns_standardr%   r.  r2  r   r  r   )r^   valueexpapproxZcommon_keysr  r+   r+   r,   check  s     
	zIdentityReflectionTest.checkc                 C   s   t tj}|d|d }|D ]}|d dkr@td|k q"|d dkrt|d dk t|d	 d  td|k | j|d td
ddddd
dddd q"|d dkr"t|d dk t|d	 d  td|k | j|d tddddddddd
d q"d S )Nr  rb  rN   r  identityr  rP  Tautor  Fr!  r  Tr  r  r   r   r  r  r  )	r   r   r)   r   r   r   r   r  r(   r^   rg   r  r  r+   r+   r,   test_reflect_identity  sN    
		z,IdentityReflectionTest.test_reflect_identityc                 C   s   t tj}|jdtjd}|D ]z}|d dkr<td|k q|d dkrt|d dk t|d	 d  td|k | j|d t	d
dddddddd
d qd S )Nr  r:   rN   r  r  r  rP  r  r  Tr   r!  r  Fr  r  )
r   r   r)   r   r>   r   r   r   r  r(   r  r+   r+   r,   test_reflect_identity_schema  s,    
	z3IdentityReflectionTest.test_reflect_identity_schema)r.   r/   r0   rT  rU  ro   rl  r1   rE   r  r  r   r<   r=   r  r+   r+   r+   r,   r  p  s   
!*r  c                   @   s<   e Zd ZdZedd Zejjdd Z	ejj
dd ZdS )	CompositeKeyReflectionTestTc                 C   s   t d|tdttdttdtdtjdddddd dd	}t d
|tdtddtdttdttdtdtjdddg|jj	|jj
|jjgddd dd		 d S )Ntb1r4   attrrN   r   Zpk_tb1r}   Tr   tb2r5   pidpattrpnameZfk_tb1_name_id_attr)r   r   r   r
  rS   rQ   r   r   rt   rN   r4   r  )r*   rD   r  r+   r+   r,   rE     s2    
z(CompositeKeyReflectionTest.define_tablesc                 C   s4   t | j}|| jjj}t|ddddg d S )Nr  rN   r4   r  )r   r   r   r   r  rN   r   rQ  )r^   rg   r6   r+   r+   r,   test_pk_column_order  s    
z/CompositeKeyReflectionTest.test_pk_column_orderc                 C   s`   t | j}|| jjj}tt|d |d }t|ddddg t|ddd	d
g d S )Nr!  r   r  rN   r4   r  r  r  r  r  )	r   r   r   r   r  rN   r   r  rQ  )r^   rg   Zforeign_keysr   r+   r+   r,   test_fk_column_order   s    
z/CompositeKeyReflectionTest.test_fk_column_orderN)r.   r/   r0   ro   r1   rE   r   r<   rW  r  rV  r  r+   r+   r+   r,   r    s   

r  )
r   rm  rY  rz   r2   rq   r  r  r  r  )5rB  rp  r&   rQ   r   r   r   r   r   r   r   Z	provisionr	   r
   r;   r   r   r   r   r   r   r   r   r   r   r   r   r
  r   r   Zsql.elementsr   Z
sql.schemar   r   r   rD   r   Z
TablesTestr   r2   rq   rz   r   ZTestBaserY  rm  r  ZComputedReflectionFixtureTestr  r  r  __all__r+   r+   r+   r,   <module>   sh    ;       7  ,a 1