U
    ¾mœdlÇ ã                   @  sÆ  d Z ddlmZ ddlZddlmZ ddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlZddlZddlZddlmZ ddlm  mZ dd	lmZmZ ddlZdd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 zddl9Z9dZ:W n e;k
�r\   dZ:Y nX ddddœddddœddddœdœZ<ddœdd„Z=d d!d"œd#d$„Z>d!dd%œd&d'„Z?d(d)„ Z@ddœd*d+„ZAd d,d-œd.d/„ZBd,dd0œd1d2„ZCd3d4œd5d6„ZDdd7œd8d9„ZEejFd:d;„ ƒZGejFd<d=„ ƒZHejFd>d?„ ƒZIejFd@dA„ ƒZJejFdBdC„ ƒZKejFdDdE„ ƒZLejFdFdG„ ƒZMejFdHdI„ ƒZNejFdJdK„ ƒZOejFdLdM„ ƒZPejFdNdO„ ƒZQejFdPdQ„ ƒZRejFdRdS„ ƒZSejFdTdU„ ƒZTejFdVdW„ ƒZUejFdXdY„ ƒZVejFdZd[„ ƒZWdEdGgZXdIdKgZYdOdQdMgZZdUdWdSgZ[eXeY eZ Z\eXeY e[ Z]e\dYg Z^e]d[g Z_ej`jaej` bd\e^¡d]d^„ ƒƒZcej`jaej` bd\e^¡d_d`„ ƒƒZdej`jaej` bd\e^¡dadb„ ƒƒZeej`jaej` bd\e^¡ej` bdcdddg¡dedf„ ƒƒƒZfej`jaej` bd\e^¡ej` bdgdhdig¡djdk„ ƒƒƒZgej`jaej` bd\e^¡dldm„ ƒƒZhej`jaej` bd\e_¡dndo„ ƒƒZiej`jaej` bd\e_¡dpdq„ ƒƒZjej`jaej` bd\e]¡drds„ ƒƒZkej`jaej` bd\e_¡dtdu„ ƒƒZlej`jaej` bd\e]¡dvdw„ ƒƒZmej`jaej` bd\e]¡dxdy„ ƒƒZnej`jaej` bd\e\¡dzd{„ ƒƒZoej`jaej` bd\eX¡d|d}„ ƒƒZpej`jaej` bd\eX¡d~d„ ƒƒZqej`jaej` bd\eY¡ej` bd€d�d‚g¡dƒd„„ ƒƒƒZrd…d†„ Zsd‡dˆ„ ZtG d‰dŠ„ dŠƒZuG d‹dŒ„ dŒeuƒZvG d�dŽ„ dŽeuƒZwG d�d�„ d�ƒZxG d‘d’„ d’exƒZyej`jze: d“d”�G d•d–„ d–eweyƒƒZ{G d—d˜„ d˜eveyƒZ|ej`jze: d“d”�G d™dš„ dšewexƒƒZ}G d›dœ„ dœe}ƒZ~ej`jaG d�dž„ dže}ƒƒZej`jaG dŸd „ d e}ƒƒZ€G d¡d¢„ d¢evexƒZ�ed£j‚eƒd£j‚ej„d£j‚e…d£j‚e†d¤j‚e‡d¥j‚eˆdƒd¦d§„ ej‰d¨j‚eŠd©j‚i	Z‹dªd«„ ZŒd°d¬d­„Z�G d®d¯„ d¯ƒZŽdS )±a·  SQL io tests

The SQL tests are broken down in different classes:

- `PandasSQLTest`: base class with common methods for all test classes
- Tests for the public API (only tests with sqlite3)
    - `_TestSQLApi` base class
    - `TestSQLApi`: test the public API with sqlalchemy engine
    - `TestSQLiteFallbackApi`: test the public API with a sqlite DBAPI
      connection
- Tests for the different SQL flavors (flavor specific type conversions)
    - Tests for the sqlalchemy mode: `_TestSQLAlchemy` is the base class with
      common methods. The different tested flavors (sqlite3, MySQL,
      PostgreSQL) derive from the base class
    - Tests for the fallback mode (`TestSQLiteFallback`)

é    )ÚannotationsN)Úclosing)ÚdateÚdatetimeÚtimeÚ	timedelta)ÚStringIO©ÚPath)Úlib)Úis_datetime64_dtypeÚis_datetime64tz_dtype)
Ú	DataFrameÚIndexÚ
MultiIndexÚSeriesÚ	TimestampÚconcatÚ
date_rangeÚisnaÚto_datetimeÚto_timedelta)ÚArrowStringArrayÚStringArray)ÚVersion)Úsql)ÚSQLAlchemyEngineÚSQLDatabaseÚSQLiteDatabaseÚ
get_engineÚpandasSQL_builderÚread_sql_queryÚread_sql_tableTFz1SELECT * FROM iris WHERE Name=? AND SepalLength=?z7SELECT * FROM iris WHERE `Name`=%s AND `SepalLength`=%sz7SELECT * FROM iris WHERE "Name"=%s AND "SepalLength"=%s)ÚsqliteÚmysqlÚ
postgresqlz]
                SELECT * FROM iris WHERE Name=:name AND SepalLength=:length
                zw
                SELECT * FROM iris WHERE
                `Name`=%(name)s AND `SepalLength`=%(length)s
                zw
                SELECT * FROM iris WHERE
                "Name"=%(name)s AND "SepalLength"=%(length)s
                z&SELECT * FROM iris WHERE Name LIKE '%'z(SELECT * FROM iris WHERE `Name` LIKE '%'z(SELECT * FROM iris WHERE "Name" LIKE '%')Úread_parametersÚread_named_parametersÚread_no_parameters_with_percentÚstr)Údialectc           
      C  sp   ddl m}m}m}m}m}m} | dkr,|n|}|ƒ }|d||d|ƒ|d|ƒ|d|ƒ|d|ƒ|d	|d
ƒƒƒ}	|	S )Nr   )ÚREALÚColumnÚFloatÚMetaDataÚStringÚTabler%   ÚirisÚSepalLengthÚ
SepalWidthZPetalLengthZ
PetalWidthÚNameéÈ   )Ú
sqlalchemyr+   r,   r-   r.   r/   r0   )
r*   r+   r,   r-   r.   r/   r0   ÚdtypeÚmetadatar1   © r9   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pandas/tests/io/test_sql.pyÚiris_table_metadatam   s     	ù	r;   zsqlite3.Connectionr
   )ÚconnÚ	iris_filec              	   C  sT   |   ¡ }d}| |¡ |jd d��(}t |¡}t|ƒ d}| ||¡ W 5 Q R X d S )Nz³CREATE TABLE iris (
            "SepalLength" REAL,
            "SepalWidth" REAL,
            "PetalLength" REAL,
            "PetalWidth" REAL,
            "Name" TEXT
        )©Únewlinez&INSERT INTO iris VALUES(?, ?, ?, ?, ?))ÚcursorÚexecuteÚopenÚcsvÚreaderÚnextÚexecutemany)r<   r=   ÚcurÚstmtÚcsvfilerD   r9   r9   r:   Úcreate_and_load_iris_sqlite3…   s    

rJ   )r=   r*   c           
        sþ   ddl m} ddlm} t|ƒ}|jd d��È}t |¡}t|ƒ‰ ‡ fdd„|D ƒ}||ƒ 	|¡}	t
| |ƒr¸|  ¡ �>} |  ¡ �* |j| dd� |j| d	� |  |	¡ W 5 Q R X W 5 Q R X n8|  ¡ �* |j| dd� |j| d	� |  |	¡ W 5 Q R X W 5 Q R X d S )
Nr   ©Úinsert©ÚEnginer>   c                   s   g | ]}t tˆ |ƒƒ‘qS r9   ©ÚdictÚzip©Ú.0Úrow©Úheaderr9   r:   Ú
<listcomp>Ÿ   s     z(create_and_load_iris.<locals>.<listcomp>T©Z
checkfirst©Úbind)r6   rL   Úsqlalchemy.enginerN   r;   rB   rC   rD   rE   ÚvaluesÚ
isinstanceÚconnectÚbeginÚdropÚcreaterA   )
r<   r=   r*   rL   rN   r1   rI   rD   ÚparamsrH   r9   rU   r:   Úcreate_and_load_iris–   s$    



 
rc   c              
   C  s¤   d}t | tjƒr$|  ¡ }| |¡ n|ddlm} ddlm} ||ƒ}t | |ƒr‚|  	¡ �$} |  
¡ � |  |¡ W 5 Q R X W 5 Q R X n|  
¡ � |  |¡ W 5 Q R X d S )Nz+CREATE VIEW iris_view AS SELECT * FROM irisr   ©ÚtextrM   )r]   Úsqlite3Ú
Connectionr@   rA   r6   re   r[   rN   r^   r_   )r<   rH   rG   re   rN   r9   r9   r:   Úcreate_and_load_iris_view®   s    


 
rh   c                 C  sÂ   ddl m}m}m}m}m}m}m}m} | dkr4|n|}	| dkrD|n|}
|ƒ }|d||d|ƒ|d|	ƒ|d|ƒ|d|ƒ|d	|ƒ|d
|ƒ|d|
ƒ|d|ƒ|d|
ƒƒ}| dkr¾| 	|d|dd�ƒ¡ |S )Nr   )ÚTEXTÚBooleanr,   ÚDateTimer-   ÚIntegerr.   r0   r#   ÚtypesÚTextColÚDateColÚ
IntDateColÚIntDateOnlyColÚFloatColÚIntColÚBoolColÚIntColWithNullÚBoolColWithNullr%   ÚDateColWithTzT)Útimezone)
r6   ri   rj   r,   rk   r-   rl   r.   r0   Úappend_column)r*   ri   rj   r,   rk   r-   rl   r.   r0   Z	date_typeZ	bool_typer8   rm   r9   r9   r:   Útypes_table_metadataÁ   s(    (õrz   z
list[dict])r<   Ú
types_datac                 C  s*   |   ¡ }d}| |¡ d}| ||¡ d S )Na”  CREATE TABLE types (
                    "TextCol" TEXT,
                    "DateCol" TEXT,
                    "IntDateCol" INTEGER,
                    "IntDateOnlyCol" INTEGER,
                    "FloatCol" REAL,
                    "IntCol" INTEGER,
                    "BoolCol" INTEGER,
                    "IntColWithNull" INTEGER,
                    "BoolColWithNull" INTEGER
                )zY
            INSERT INTO types
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
            )r@   rA   rF   )r<   r{   rG   rH   r9   r9   r:   Úcreate_and_load_types_sqlite3â   s
    
r|   )r{   r*   c              
   C  sÂ   ddl m} ddlm} t|ƒ}||ƒ |¡}t| |ƒr†|  ¡ �>} |  ¡ �* |j	| dd� |j
| d� |  |¡ W 5 Q R X W 5 Q R X n8|  ¡ �* |j	| dd� |j
| d� |  |¡ W 5 Q R X d S )Nr   rK   rM   TrX   rY   )r6   rL   r[   rN   rz   r\   r]   r^   r_   r`   ra   rA   )r<   r{   r*   rL   rN   rm   rH   r9   r9   r:   Úcreate_and_load_typesø   s    


 
r}   r   ©Úframec                 C  sP   | j d j}| jd }t|tjƒs&t‚t |j	dddddg¡ | j
dksLt‚d S )Nr   çffffff@ç      @çffffffö?çš™™™™™É?úIris-setosa))é–   é   )é   r†   )ÚdtypesÚtypeÚilocÚ
issubclassÚnpÚfloatingÚAssertionErrorÚtmÚequalContentsr\   Úshape)r   ZpytyperT   r9   r9   r:   Úcheck_iris_frame  s
    
r’   )Ú
table_namec              
   C  sâ   d|› �}t | tjƒr0|  ¡ }| |¡ ¡ d S ddlm} ddlm	} t | t
ƒršz:|| ƒ}| ¡ � } |  |¡ ¡ W  5 Q R £ W ¢S Q R X W 5 | ¡  X nDt | |ƒrÐ|  ¡ �} |  |¡ ¡ W  5 Q R £ S Q R X n|  |¡ ¡ S d S )Nz SELECT count(*) AS count_1 FROM r   )Úcreate_enginerM   )r]   rf   rg   r@   rA   Úfetchoner6   r”   r[   rN   r)   Údisposer^   Úexec_driver_sqlZ
scalar_one)r<   r“   rH   rG   r”   rN   Úenginer9   r9   r:   Ú
count_rows  s     


(

"r™   c                 C  s   | ddddƒ}t |ƒS )NÚioÚdatarC   ziris.csvr	   )ÚdatapathÚ	iris_pathr9   r9   r:   r�   +  s    r�   c                   C  s4   ddddddddddd	œ
dd
dddddd d dd	œ
gS )NÚfirstú2000-01-03 00:00:00i wði’·2g333333$@é   Fz2000-01-01 00:00:00-08:00)
rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   ú2000-01-04 00:00:00i 'âPi\¸2z2000-06-01 00:00:00-07:00r9   r9   r9   r9   r:   r{   1  s.    ööór{   c              
   C  s2   ddddddddddœ	}t | ƒ}|| ¡   |¡S )Nr)   Úint64Úfloat)	rn   ro   rp   rq   rr   rs   rt   ru   rv   )r   ÚkeysÚastype)r{   rˆ   Údfr9   r9   r:   Útypes_data_frameO  s    ÷r§   c                  C  s&   dddddg} dddd	g}t || d
�S )NÚindexÚAÚBÚCÚD)rŸ   gNÿ\^ï?g9\›x`|@g%Ú TO×¿gá(nIŽò¿)r¡   gî}ÒCÄð?çc×^ÜV¥¿g~q"B¶Ä¿gˆ”æÐ4Ë?)ú2000-01-05 00:00:00gGà Í¿èß?ç2rÂ¹eç?gˆŽ>Ý¦4á¿gÑ‘öÙRŠõ?)ú2000-01-06 00:00:00gÔ?{mXìñ?ç$ôó­ùù?gnk3¥AÓm?gØ
S«›å?©Úcolumns©r   ©r³   r›   r9   r9   r:   Útest_frame1`  s    êr¶   c                  C  s"   dddg} ddddg}t || d�S )	Nr¨   r©   rª   )rŸ   iÿÿÿgZØÓÍÿ¿)r¡   iãÿÿÿr­   )r®   i N  r¯   )r°   iÍ�ûÿr±   r²   r´   rµ   r9   r9   r:   Útest_frame3„  s    
ür·   c           	   
   c  sÊ   t  d¡}t  d¡}|jdd|jjji|jjd�}| |¡}| 	d¡sRt
|| dƒ | 	d¡s||D ]}| d	¡ q`t||dƒ |V  | ¡ �.}| ¡ � | d
¡}| |¡ W 5 Q R X W 5 Q R X | ¡  d S )Nr6   Úpymysqlz*mysql+pymysql://root@localhost:3306/pandasÚclient_flag)Úconnect_argsÚ	poolclassr1   r$   rm   rw   ú DROP TABLE IF EXISTS test_frame;)ÚpytestÚimportorskipr”   Ú	constantsÚCLIENTÚMULTI_STATEMENTSÚpoolÚNullPoolÚinspectÚ	has_tablerc   Úpopr}   r^   r_   re   rA   r–   )	r�   r{   r6   r¸   r˜   ÚinspÚentryr<   rH   r9   r9   r:   Úmysql_pymysql_engine�  s(    

ý





rÉ   c              	   c  s   |   ¡ �}|V  W 5 Q R X d S ©N©r^   )rÉ   r<   r9   r9   r:   Úmysql_pymysql_conn¨  s    
rÌ   c              
   c  sª   t  d¡}t  d¡ |jd|jjd�}| |¡}| d¡sFt|| dƒ | d¡s\t||dƒ |V  | 	¡ �.}| 
¡ � | d¡}| |¡ W 5 Q R X W 5 Q R X | ¡  d S )	Nr6   Úpsycopg2z=postgresql+psycopg2://postgres:postgres@localhost:5432/pandas©r»   r1   r%   rm   r¼   )r½   r¾   r”   rÂ   rÃ   rÄ   rÅ   rc   r}   r^   r_   re   rA   r–   )r�   r{   r6   r˜   rÇ   r<   rH   r9   r9   r:   Úpostgresql_psycopg2_engine®  s"    

þ





rÏ   c              	   c  s   |   ¡ �}|V  W 5 Q R X d S rÊ   rË   )rÏ   r<   r9   r9   r:   Úpostgresql_psycopg2_connÃ  s    
rÐ   c               	   c  s,   t  d¡ t ¡ �} d|  V  W 5 Q R X d S )Nr6   ú
sqlite:///)r½   r¾   r�   Úensure_clean©Únamer9   r9   r:   Ú
sqlite_strÉ  s    

rÕ   c                 c  s.   t  d¡}|j| |jjd�}|V  | ¡  d S )Nr6   rÎ   )r½   r¾   r”   rÂ   rÃ   r–   )rÕ   r6   r˜   r9   r9   r:   Úsqlite_engineÐ  s    
rÖ   c              	   c  s   |   ¡ �}|V  W 5 Q R X d S rÊ   rË   )rÖ   r<   r9   r9   r:   Úsqlite_connØ  s    
r×   c                 C  s,   t  d¡}| | ¡}t||dƒ | ¡  | S )Nr6   r#   )r½   r¾   r”   rc   r–   )rÕ   r�   r6   r˜   r9   r9   r:   Úsqlite_iris_strÞ  s
    

rØ   c                 C  s   t | |dƒ | S )Nr#   )rc   )rÖ   r�   r9   r9   r:   Úsqlite_iris_engineç  s    rÙ   c              	   c  s   |   ¡ �}|V  W 5 Q R X d S rÊ   rË   )rÙ   r<   r9   r9   r:   Úsqlite_iris_conní  s    
rÚ   c               
   c  s6   t  t d¡¡�} | �}|V  W 5 Q R X W 5 Q R X d S ©Nú:memory:)Ú
contextlibr   rf   r^   )Zclosing_connr<   r9   r9   r:   Úsqlite_buildinó  s    rÞ   c                 C  s   t | |ƒ | S rÊ   )rJ   )rÞ   r�   r9   r9   r:   Úsqlite_buildin_irisú  s    
rß   r<   c                 C  s    |  | ¡} |jd| ddd� d S )NÚtestÚappendF©Ú	if_existsr¨   )ÚgetfixturevalueÚto_sql)r<   r¶   Úrequestr9   r9   r:   Útest_dataframe_to_sql"  s    
rç   c              	   C  s’   t  d¡ ttjdgdd�tjtdddƒgdd�tjtdƒgdd�tjdgd	d�d
œƒ}| | ¡} tj	t
dd�� |jd| ddd� W 5 Q R X d S )NÚpyarrowr    zint8[pyarrow]©r7   éç  útimestamp[ns][pyarrow]zduration[ns][pyarrow]Úazstring[pyarrow])Úintr   r   Ústringzthe 'timedelta'©ÚmatchÚ
test_arrowÚreplaceFrâ   )r½   r¾   r   ÚpdÚarrayr   r   rä   r�   Úassert_produces_warningÚUserWarningrå   ©r<   ræ   r¦   r9   r9   r:   Ú"test_dataframe_to_sql_arrow_dtypes*  s    
 ÿúÿ

rø   c                 C  sL   t  d¡ tdtjtdddƒ|gdd�iƒ}| | ¡} |jd| dd	d
� d S )Nrè   r   rê   r    rë   ré   rñ   rò   Frâ   )r½   r¾   r   ró   rô   r   rä   rå   )r<   ræ   Znulls_fixturer¦   r9   r9   r:   Ú*test_dataframe_to_sql_arrow_dtypes_missing>  s    
  ÿÿÿ
rù   ÚmethodÚmultic              	   C  sZ   |  | ¡} t| dd��$}|j|d|d� | d¡s6t‚W 5 Q R X t| dƒt|ƒksVt‚d S )NT©Zneed_transactionÚ
test_frame©rú   ©rä   r    rå   rÅ   rŽ   r™   Úlen)r<   rú   r¶   ræ   Ú	pandasSQLr9   r9   r:   Útest_to_sqlN  s
    
r  zmode, num_row_coef)rò   r    )rá   é   c              	   C  sn   |  | ¡} t| dd��4}|j|ddd� |j|d|d� | d¡sFt‚W 5 Q R X t| dƒ|t|ƒ ksjt‚d S )NTrü   rý   Úfail©rã   rÿ   )r<   ÚmodeZnum_row_coefr¶   ræ   r  r9   r9   r:   Útest_to_sql_existY  s    
r  c              
   C  sr   |  | ¡} t| dd��R}|j|ddd� | d¡s6t‚d}tjt|d�� |j|ddd� W 5 Q R X W 5 Q R X d S )NTrü   rý   r  r  z!Table 'test_frame' already existsrï   )rä   r    rå   rÅ   rŽ   r½   ÚraisesÚ
ValueError)r<   r¶   ræ   r  Úmsgr9   r9   r:   Útest_to_sql_exist_faile  s    
r  c                 C  s\   |  | ¡} td| ƒ}t|ƒ t d| ¡}t|ƒ t d| ¡}|jdksJt‚d|jksXt‚d S )NúSELECT * FROM irisúSELECT * FROM iris where 0=1©r   r†   r3   )rä   r!   r’   ró   Úread_sqlr‘   rŽ   r³   ©r<   ræ   Ú
iris_framer9   r9   r:   Útest_read_iris_queryr  s    

r  c                 C  st   |  | ¡} ttd| dd�ƒ}t|ƒ ttjd| dd�ƒ}t|ƒ ttjd| dd�ƒ}|jdksbt‚d|jkspt‚d S )Nr  é   ©Ú	chunksizer  r  r3   )	rä   r   r!   r’   ró   r  r‘   rŽ   r³   r  r9   r9   r:   Útest_read_iris_query_chunksize  s    
r  c           
      C  s‚   |  | ¡} ddlm}m}m}m} |ƒ }t| tƒr:|| ƒn| }|d||d�}t||ƒ| dddœd�}	t	|	ƒ t| tƒr~| 
¡  d S )	Nr   )r.   r0   r”   Úselectr1   )Zautoload_withr„   r€   ©rÔ   Úlength©rb   )rä   r6   r.   r0   r”   r  r]   r)   r!   r’   r–   )
r<   ræ   r.   r0   r”   r  r8   Zautoload_conr1   r  r9   r9   r:   Ú.test_read_iris_query_expression_with_parameterŒ  s    
  ÿ
r  c                 C  sV   t d  ¡ D ]\}}|| kr q2qtd| › d�ƒ‚| | ¡} t|| dd�}t|ƒ d S )Nr&   zNo part of z( found in SQL_STRINGS['read_parameters']©r„   r€   r  )ÚSQL_STRINGSÚitemsÚKeyErrorrä   r!   r’   )r<   ræ   ÚdbÚqueryr  r9   r9   r:   Ú*test_read_iris_query_string_with_parameter¢  s    
r"  c                 C  s4   |  | ¡} td| ƒ}t|ƒ t d| ¡}t|ƒ d S ©Nr1   )rä   r"   r’   ró   r  r  r9   r9   r:   Útest_read_iris_table¯  s
    

r$  c                 C  sD   |  | ¡} ttd| dd�ƒ}t|ƒ ttjd| dd�ƒ}t|ƒ d S )Nr1   r  r  )rä   r   r"   r’   ró   r  r  r9   r9   r:   Útest_read_iris_table_chunksizeº  s
    
r%  c              	     sx   |  | ¡} g ‰ ‡ fdd„}t| dd��$}|j|d|d� | d¡sFt‚W 5 Q R X ˆ dgks^t‚t| dƒt|ƒkstt‚d S )Nc                   s2   ˆ  d¡ ‡ fdd„|D ƒ}| | j ¡ |¡ d S )Nr    c                   s   g | ]}t tˆ |ƒƒ‘qS r9   rO   rR   ©r¤   r9   r:   rW   Í  s     z8test_to_sql_callable.<locals>.sample.<locals>.<listcomp>)rá   rA   ÚtablerL   )Zpd_tabler<   r¤   Ú	data_iterr›   ©Úcheckr&  r:   ÚsampleË  s    
z$test_to_sql_callable.<locals>.sampleTrü   rý   rþ   r    rÿ   )r<   r¶   ræ   r+  r  r9   r)  r:   Útest_to_sql_callableÄ  s    
r,  c                 C  sˆ   |  | ¡} t d| ¡}t|jjjtjƒs,t	‚t|j
jjtjƒsBt	‚t|jjjtjƒsXt	‚t|jjjtjƒsnt	‚t|jjjtjƒs„t	‚d S ©Nrm   )rä   r   r"   r‹   rr   r7   r‰   rŒ   r�   rŽ   rs   Úintegerrt   ru   rv   r÷   r9   r9   r:   Útest_default_type_conversion×  s    
r/  c           	   
   C  sè   |  | ¡} ddlm} ddlm} tdddgddd	gd
œƒ}|jd| dd� d}||ƒ}t| |ƒr–|  ¡ �$}| 	¡ � | 
|¡ W 5 Q R X W 5 Q R X n|  	¡ � |  
|¡ W 5 Q R X t d| ¡}t ||¡ t d| ¡}t ||¡ d S )Nr   rd   rM   r    r  é   çš™™™™™¹?rƒ   ç333333Ó?©rì   Úbrý   F©r¨   z}DROP PROCEDURE IF EXISTS get_testdb;

    CREATE PROCEDURE get_testdb ()

    BEGIN
        SELECT * FROM test_frame;
    ENDzCALL get_testdb();)rä   r6   re   r[   rN   r   rå   r]   r^   r_   rA   r   r!   r�   Úassert_frame_equalr  )	r<   ræ   re   rN   r¦   ÚprocZengine_connÚres1Úres2r9   r9   r:   Útest_read_procedureê  s"    



 
r:  Úexpected_countr  zSuccess!c                   s„   ‡ fdd„}|  | ¡} tddgddgddgd	œƒ}|jd
| d|d�}tˆ tƒs\|d ksht‚n|ˆ ksht‚t d
| ¡}t 	||¡ d S )Nc              	     s–   |j }| ¡ �~}tƒ }t |¡}| |¡ | d¡ d dd„ |D ƒ¡}| jrb| j› d| j	› �}	n| j	}	d|	› d|› d�}
|j
|
|d	� W 5 Q R X ˆ S )
Nr   z, c                 S  s   g | ]}d |› d �‘qS )ú"r9   )rS   Úkr9   r9   r:   rW      s     zVtest_copy_from_callable_insertion_method.<locals>.psql_insert_copy.<locals>.<listcomp>Ú.zCOPY z (z) FROM STDIN WITH CSV)r   Úfile)Ú
connectionr@   r   rC   ÚwriterÚ	writerowsÚseekÚjoinÚschemarÔ   Zcopy_expert)r'  r<   r¤   r(  Z
dbapi_connrG   Zs_bufrA  r³   r“   Z	sql_query©r;  r9   r:   Úpsql_insert_copy  s    



zBtest_copy_from_callable_insertion_method.<locals>.psql_insert_copyr    r  r1  rƒ   rì   Ún©Úcol1Úcol2Zcol3rý   F)r¨   rú   )
rä   r   rå   r]   rí   rŽ   r   r"   r�   r6  )r<   r;  ræ   rG  ÚexpectedÚresult_countÚresultr9   rF  r:   Ú(test_copy_from_callable_insertion_method  s    
   ÿ
rO  c              
   C  sD   t jtdd��, tjtdd�� t d| ¡ W 5 Q R X W 5 Q R X d S )Nz+pandas.io.sql.execute requires a connectionrï   úP`pandas.io.sql.execute` is deprecated and will be removed in the future version.úselect * from iris)r½   r  Ú	TypeErrorr�   rõ   ÚFutureWarningr   rA   )rÙ   r9   r9   r:   Útest_execute_typeerror8  s    þrT  c              	   C  s*   t jtdd�� t d| ¡ W 5 Q R X d S )NrP  rï   rQ  )r�   rõ   rS  r   rA   )rß   r9   r9   r:   Útest_execute_deprecatedB  s
    þrU  c                   @  s   e Zd Zdd„ ZdS )Ú	MixInBasec              	   C  sŒ   t | dƒr| j ¡  z|  ¡ }W n tjjtjfk
r>   Y nJX |�> |  |¡D ]}|  	||¡ qP|  
|¡D ]}|  ||¡ qlW 5 Q R X d S )Nr<   )Úhasattrr<   Úcloser^   r6   ÚexcÚOperationalErrorrf   Ú_get_all_viewsÚ	drop_viewÚ_get_all_tablesÚ
drop_table)Úselfr<   ÚviewÚtblr9   r9   r:   Úteardown_methodM  s    

zMixInBase.teardown_methodN)Ú__name__Ú
__module__Ú__qualname__rb  r9   r9   r9   r:   rV  L  s   rV  c                   @  s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSQLiteMixInc                 C  s
   t  d¡S rÛ   ©rf   r^   ©r_  r9   r9   r:   r^   _  s    zSQLiteMixIn.connectc                 C  s"   |  dt |¡› �¡ | ¡  d S ©NzDROP TABLE IF EXISTS ©rA   r   Ú_get_valid_sqlite_nameÚcommit©r_  r“   r<   r9   r9   r:   r^  b  s    zSQLiteMixIn.drop_tablec                 C  s   |  d¡}dd„ | ¡ D ƒS )Nz1SELECT name FROM sqlite_master WHERE type='table'c                 S  s   g | ]}|d  ‘qS ©r   r9   )rS   r'  r9   r9   r:   rW   h  s     z/SQLiteMixIn._get_all_tables.<locals>.<listcomp>©rA   Úfetchall©r_  r<   Úcr9   r9   r:   r]  f  s    
zSQLiteMixIn._get_all_tablesc                 C  s"   |  dt |¡› �¡ | ¡  d S ©NzDROP VIEW IF EXISTS rj  )r_  Ú	view_namer<   r9   r9   r:   r\  j  s    zSQLiteMixIn.drop_viewc                 C  s   |  d¡}dd„ | ¡ D ƒS )Nz0SELECT name FROM sqlite_master WHERE type='view'c                 S  s   g | ]}|d  ‘qS rn  r9   )rS   r`  r9   r9   r:   rW   p  s     z.SQLiteMixIn._get_all_views.<locals>.<listcomp>ro  rq  r9   r9   r:   r[  n  s    
zSQLiteMixIn._get_all_viewsN)rc  rd  re  r^   r^  r]  r\  r[  r9   r9   r9   r:   rf  ^  s
   rf  c                   @  s@   e Zd Zedd„ ƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚSQLAlchemyMixInc                 C  s   | j  ¡  d S rÊ   )r˜   r–   ©Úclsr9   r9   r:   Úteardown_classt  s    zSQLAlchemyMixIn.teardown_classc                 C  s
   | j  ¡ S rÊ   )r˜   r^   rh  r9   r9   r:   r^   x  s    zSQLAlchemyMixIn.connectc              	   C  s<   |  ¡ r| ¡  ¡  | ¡ � t |¡ |¡ W 5 Q R X d S rÊ   )Úin_transactionÚget_transactionÚrollbackr_   r   r   r^  rm  r9   r9   r:   r^  {  s    
zSQLAlchemyMixIn.drop_tablec                 C  s   ddl m} ||ƒ ¡ S ©Nr   ©rÄ   )r6   rÄ   Zget_table_names©r_  r<   rÄ   r9   r9   r:   r]  �  s    zSQLAlchemyMixIn._get_all_tablesc              	   C  sL   |j jj |¡}| ¡ r$| ¡  ¡  | ¡ � | d|› �¡ W 5 Q R X d S rs  )	r˜   r*   Zidentifier_preparerZquote_identifierry  rz  r{  r_   r—   )r_  rt  r<   Zquoted_viewr9   r9   r:   r\  †  s    
ÿ
zSQLAlchemyMixIn.drop_viewc                 C  s   ddl m} ||ƒ ¡ S r|  )r6   rÄ   Zget_view_namesr~  r9   r9   r:   r[  �  s    zSQLAlchemyMixIn._get_all_viewsN)
rc  rd  re  Úclassmethodrx  r^   r^  r]  r\  r[  r9   r9   r9   r:   ru  s  s   
	ru  c                   @  sj   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPandasSQLTestzT
    Base class with common private methods for SQLAlchemy and fallback cases.

    c                 C  s>   |   d| j¡ t| jtjƒr*t| j|ƒ nt| j|| jƒ d S r#  )r^  r<   r]   rf   rg   rJ   rc   Úflavor)r_  r�   r9   r9   r:   Úload_iris_data›  s    zPandasSQLTest.load_iris_datac                 C  s\   | j dkr|D ]}| d¡ qt| jtjƒrHdd„ |D ƒ}t| j|ƒ nt| j|| j ƒ d S )Nr%   rw   c                 S  s   g | ]}t | ¡ ƒ‘qS r9   )Útupler\   )rS   rÈ   r9   r9   r:   rW   §  s     z1PandasSQLTest.load_types_data.<locals>.<listcomp>)r�  rÆ   r]   r<   rf   rg   r|   r}   )r_  r{   rÈ   r9   r9   r:   Úload_types_data¢  s    
zPandasSQLTest.load_types_datac                 C  s.   t d | j }d}| jj||d�}t|ƒ d S )Nr&   r  r  ©r  r�  r  Ú
read_queryr’   ©r_  r!  rb   r  r9   r9   r:   Ú_read_sql_iris_parameter¬  s    z&PandasSQLTest._read_sql_iris_parameterc                 C  s4   t d | j }dddœ}| jj||d�}t|ƒ d S )Nr'   r„   r€   r  r  r…  r‡  r9   r9   r:   Ú_read_sql_iris_named_parameter²  s    
z,PandasSQLTest._read_sql_iris_named_parameterc                 C  s*   t d | j }| jj|d d�}t|ƒ d S )Nr(   r  r…  )r_  r!  r  r9   r9   r:   Ú(_read_sql_iris_no_parameter_with_percent¸  s    z6PandasSQLTest._read_sql_iris_no_parameter_with_percentc                 C  s2   |   d| j¡ | j |jd d… d¡dks.t‚d S )Nr¶   r   )r^  r<   r  rå   rŠ   rŽ   ©r_  r¶   r9   r9   r:   Ú_to_sql_empty½  s    zPandasSQLTest._to_sql_emptyÚautoc                 K  sr   |   d| j¡ | jj|dfd|i|—Ždks0t‚| j d¡s@t‚t|ƒ}t| jdƒ}||ks`t‚|   d| j¡ dS )z `to_sql` with the `engine` paramr¶   r˜   é   N)r^  r<   r  rå   rŽ   rÅ   r   r™   )r_  r¶   r˜   Zengine_kwargsÚnum_entriesÚnum_rowsr9   r9   r:   Ú_to_sql_with_sql_engineÁ  s"     ÿÿÿýÿz%PandasSQLTest._to_sql_with_sql_enginec                 C  sV   |   d| j¡ | j |d¡dks$t‚| j d¡}|jddd� d |j_t	 
||¡ d S )NÚtest_frame_roundtriprŽ  ú"SELECT * FROM test_frame_roundtripÚlevel_0T©Zinplace)r^  r<   r  rå   rŽ   r†  Ú	set_indexr¨   rÔ   r�   r6  ©r_  r¶   rN  r9   r9   r:   Ú
_roundtripÕ  s    zPandasSQLTest._roundtripc                 C  s.   | j  d¡}| ¡ }t |dddddg¡ d S ©Nr  r€   r�   r‚   rƒ   r„   )r  rA   r•   r�   r�   )r_  Úiris_resultsrT   r9   r9   r:   Ú_execute_sqlá  s    zPandasSQLTest._execute_sqlc                 C  sP   t jddgdddgdgd�}| j |d¡dks2t‚|  d¡}|dggksLt‚d S )	N©r    çÍÌÌÌÌÌ @Úline1©r  ç      ø?Úline2r©   rª   r«   ©r³   r¨   Ztest_to_sql_saves_indexr  )r   Úfrom_recordsr  rå   rŽ   Ú_get_index_columns)r_  r¦   Úix_colsr9   r9   r:   Ú_to_sql_save_indexç  s      ÿ
z PandasSQLTest._to_sql_save_indexc              	   C  s$  | j  ¡ �@}d}t| j tƒr(| |¡ nddlm} ||ƒ}| |¡ W 5 Q R X G dd„ dtƒ}d}t| j tƒr„ddlm} ||ƒ}z,| j  ¡ �}| |¡ |dƒ‚W 5 Q R X W n |k
rÄ   Y nX | j  	d¡}t
|ƒdksât‚| j  ¡ �}| |¡ W 5 Q R X | j  	d¡}t
|ƒd	k�s t‚d S )
Nz'CREATE TABLE test_trans (A INT, B TEXT)r   rd   c                   @  s   e Zd ZdS )z7PandasSQLTest._transaction_test.<locals>.DummyExceptionN)rc  rd  re  r9   r9   r9   r:   ÚDummyExceptionú  s   r§  z/INSERT INTO test_trans (A,B) VALUES (1, 'blah')ÚerrorzSELECT * FROM test_transr    )r  Zrun_transactionr]   r   rA   r6   re   Ú	Exceptionr   r†  r   rŽ   )r_  ZtransrH   re   r§  Zins_sqlÚresr9  r9   r9   r:   Ú_transaction_testï  s0    
zPandasSQLTest._transaction_testN)r�  )rc  rd  re  Ú__doc__r‚  r„  rˆ  r‰  rŠ  rŒ  r‘  r˜  r›  r¦  r«  r9   r9   r9   r:   r€  •  s   

r€  c                
   @  sª  e Zd ZU dZdZded< ejdd�dd„ ƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zej d#d$d%d&g¡ej d'ejd(d)fejd*d+fejd(d)fejd*d+fg¡d,d-„ ƒƒZd.d/„ Zd0d1„ Zd2d3„ Zej d4d5d6d7d8d9d:g¡d;d<„ ƒZ d=d>„ Z!d?d@„ Z"ej dAdBe#e$e#e$dCœg¡dDdE„ ƒZ%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dBS )ZÚ_TestSQLApiañ  
    Base class to test the public API.

    From this two classes are derived to run these tests for both the
    sqlalchemy mode (`TestSQLApi`) and the fallback mode
    (`TestSQLiteFallbackApi`).  These tests are run with sqlite3. Specific
    tests for the different sql flavours are included in `_TestSQLAlchemy`.

    Notes:
    flavor can always be passed even in SQLAlchemy mode,
    should be correctly ignored.

    we don't use drop_table because that isn't part of the public api

    r#   r)   r  T©Zautousec                 C  s*   |   ¡ | _|  |¡ |  |¡ |  ¡  d S rÊ   )r^   r<   r‚  r„  Úload_test_data_and_sql©r_  r�   r{   r9   r9   r:   Úsetup_method,  s    


z_TestSQLApi.setup_methodc                 C  s   t | jƒ d S rÊ   )rh   r<   rh  r9   r9   r:   r¯  3  s    z"_TestSQLApi.load_test_data_and_sqlc                 C  s   t  d| j¡}t|ƒ d S )NzSELECT * FROM iris_view)r   r!   r<   r’   ©r_  r  r9   r9   r:   Útest_read_sql_view6  s    z_TestSQLApi.test_read_sql_viewc                 C  s8   d}t j|| jdd�}t  || j¡}t t|ƒ|¡ d S )Nz/SELECT * FROM iris_view WHERE SepalLength < 0.0r†   r  )r   r!   r<   r�   r6  r   )r_  r!  Z
with_batchZwithout_batchr9   r9   r:   Ú&test_read_sql_with_chunksize_no_result:  s    z2_TestSQLApi.test_read_sql_with_chunksize_no_resultc                 C  s&   t  |d| j¡ t  d| j¡s"t‚d S )Nr¶   )r   rå   r<   rÅ   rŽ   r‹  r9   r9   r:   r  @  s    z_TestSQLApi.test_to_sqlc              	   C  s\   t j|d| jdd� t  d| j¡s&t‚d}tjt|d�� t j|d| jdd� W 5 Q R X d S )NÚtest_frame2r  r  z"Table 'test_frame2' already existsrï   )r   rå   r<   rÅ   rŽ   r½   r  r	  ©r_  r¶   r
  r9   r9   r:   Útest_to_sql_failD  s
    z_TestSQLApi.test_to_sql_failc                 C  s^   t j|d| jdd� t j|d| jdd� t  d| j¡s:t‚t|ƒ}t| jdƒ}||ksZt‚d S )Nr·   r  r  rò   )r   rå   r<   rÅ   rŽ   r   r™   ©r_  r¶   r�  r�  r9   r9   r:   Útest_to_sql_replaceL  s    z_TestSQLApi.test_to_sql_replacec                 C  sr   t j|d| jdd�dkst‚t j|d| jdd�dks8t‚t  d| j¡sJt‚dt|ƒ }t| jdƒ}||ksnt‚d S )NÚtest_frame4r  r  rŽ  rá   r  )r   rå   r<   rŽ   rÅ   r   r™   r¸  r9   r9   r:   Útest_to_sql_appendW  s    ÿz_TestSQLApi.test_to_sql_appendc                 C  s2   t j|d| jdd� t  d| j¡}t ||¡ d S )NZtest_frame5Fr5  zSELECT * FROM test_frame5)r   rå   r<   r  r�   r6  )r_  r·   rN  r9   r9   r:   Útest_to_sql_type_mappinge  s    z$_TestSQLApi.test_to_sql_type_mappingc                 C  sL   t tjddd�dd�}tj|d| jdd� t d	| j¡}t | 	¡ |¡ d S )
Nr†   r¢   ré   ZseriesrÓ   Ztest_seriesFr5  zSELECT * FROM test_series)
r   rŒ   Úaranger   rå   r<   r!   r�   r6  Úto_frame)r_  ÚsÚs2r9   r9   r:   Útest_to_sql_seriesk  s    z_TestSQLApi.test_to_sql_seriesc                 C  s\   t j|d| jd� t jd| jd�}|j|_|jddd� |j t¡ d |j_t	 
||¡ d S )Nr’  ©Úconr“  r”  Tr•  )r   rå   r<   r!   r¨   r–  r¥   rí   rÔ   r�   r6  r—  r9   r9   r:   Útest_roundtripq  s    z_TestSQLApi.test_roundtripc                 C  s6   t j|d| jddd� t jd| jd�}t ||¡ d S )Nr’  Fr  )rÃ  r¨   r  r“  rÂ  )r   rå   r<   r!   r�   r6  r—  r9   r9   r:   Útest_roundtrip_chunksize|  s    ûz$_TestSQLApi.test_roundtrip_chunksizec              	   C  sD   t  | j¡�}| d¡}W 5 Q R X | ¡ }t |dddddg¡ d S r™  )r   r    r<   rA   r•   r�   r�   )r_  Ú
pandas_sqlrš  rT   r9   r9   r:   Útest_execute_sql‡  s    z_TestSQLApi.test_execute_sqlc              	   C  sò  t  d| j¡}t|jjjtjƒr$t	‚t jd| jdgd�}t|jjjtjƒsNt	‚|j 
¡ tddddddƒtddddddƒgks€t	‚t jd| jdd	id�}t|jjjtjƒs¬t	‚|j 
¡ tddddddƒtddddddƒgksÞt	‚t jd| jd
gd�}t|jjjtjƒ�s
t	‚|j 
¡ tddddddƒtddddddƒgk�s>t	‚t jd| jd
did�}t|jjjtjƒ�slt	‚|j 
¡ tddddddƒtddddddƒgk�s t	‚t jd| jddid�}t|jjjtjƒ�sÎt	‚|j 
¡ tdƒtdƒgk�sît	‚d S )NúSELECT * FROM typesro   ©Úparse_datesiÐ  r    r0  r   rŽ  ú%Y-%m-%d %H:%M:%Srp   iÂ  é   é   iÝ  r¿  rq   z%Y%m%dz
2010-10-10z
2010-12-12)r   r!   r<   r‹   ro   r7   r‰   rŒ   Ú
datetime64rŽ   Útolistr   rp   rq   ©r_  r¦   r9   r9   r:   Útest_date_parsingŽ  sh      ÿþ
ýþ
  ÿþ  ÿþýþz_TestSQLApi.test_date_parsingr¨  ÚignoreÚraiseÚcoercezread_sql, text, moderÈ  )r6   Úfallbackrm   r6   c                 C  s@   | j |kr<| ddi¡}||| jdd|iid�}t ||¡ d S )Nro   zdatetime64[ns]Úerrors)rÃ  rÊ  )r  r¥   r<   r�   r6  )r_  r  re   r  r¨  r§   rL  rN  r9   r9   r:   Útest_custom_dateparsing_errorÅ  s    
 ÿýz)_TestSQLApi.test_custom_dateparsing_errorc                 C  sH   t jd| jdddgd�}t|jjjtjƒs.t	‚t|j
jjtjƒsDt	‚d S )NrÈ  ro   rp   )Ú	index_colrÊ  )r   r!   r<   r‹   r¨   r7   r‰   rŒ   rÎ  rŽ   rp   rÐ  r9   r9   r:   Útest_date_and_indexã  s    üz_TestSQLApi.test_date_and_indexc              	   C  st   t tddgdd�ƒ ¡ }t t¡� | d| j¡}W 5 Q R X |dksHt‚t	 
d| j¡}t |d |d  d¡¡ d S )	Nz00:00:01z00:00:03ÚfoorÓ   Útest_timedeltar  zSELECT * FROM test_timedeltar¢   )r   r   r¾  r�   rõ   rö   rå   r<   rŽ   r   r!   Úassert_series_equalr`  )r_  r¦   rM  rN  r9   r9   r:   rÛ  ð  s    z_TestSQLApi.test_timedeltac              	   C  sH   t dddgiƒ}d}tjt|d�� | d| j¡d ks:t‚W 5 Q R X d S )Nrì   y      ð?      ð?y               @zComplex datatypes not supportedrï   Ztest_complex)r   r½   r  r	  rå   r<   rŽ   )r_  r¦   r
  r9   r9   r:   Útest_complex_raisesù  s    z_TestSQLApi.test_complex_raiseszindex_name,index_label,expected)NNr¨   )NÚother_labelrÞ  )Ú
index_nameNrß  )rß  rÞ  rÞ  )r   NÚ0)Nr   rà  c                 C  sT   t dtdƒiƒ}||j_d}tj|d| j|d� t || j¡}|jd |ksPt	‚d S )NrJ  rŽ  úSELECT * FROM test_index_labelÚtest_index_label©Úindex_labelr   )
r   Úranger¨   rÔ   r   rå   r<   r!   r³   rŽ   )r_  rß  rä  rL  Ú
temp_framer!  r   r9   r9   r:   Útest_to_sql_index_labelÿ  s    z#_TestSQLApi.test_to_sql_index_labelc              	   C  sª  d}t dtdƒit ddg¡d�}t |d| j¡}||ks>t‚t d| j¡}|j	d d	ks^t‚|j	d
 dkspt‚tj|d| jdddgd�}||ks–t‚t d| j¡}|j	d d…  
¡ ddgksÂt‚ddg|j_tj|d| jdd�}||ksît‚t d| j¡}|j	d d…  
¡ ddgk�st‚tj|d| jdddgd�}||k�sDt‚t d| j¡}|j	d d…  
¡ ddgk�srt‚d}tjt|d�� tj|d| jddd� W 5 Q R X d S )NrŽ  rJ  )ZA0ÚA1)ÚB0ZB1r5  râ  rá  r   r”  r    Zlevel_1rò   r©   rª   )rã   rä  r  r  r«   r¬   zALength of 'index_label' should match number of levels, which is 2rï   )r   rå  r   Zfrom_productr   rå   r<   rŽ   r!   r³   rÏ  r¨   Únamesr½   r  r	  )r_  Zexpected_row_countræ  rN  r   r
  r9   r9   r:   Ú"test_to_sql_index_label_multiindex  sb    
þû   ÿ û ûz._TestSQLApi.test_to_sql_index_label_multiindexc                 C  sV   t jddgdddgddgd�}| d| j¡ tjd| jddgd	�}tj||d
d� d S )Nrœ  rŸ  r©   rª   r«   r¢  Útest_multiindex_roundtripz'SELECT * FROM test_multiindex_roundtrip©rØ  T©Zcheck_index_type)r   r£  rå   r<   r   r!   r�   r6  ©r_  r¦   rN  r9   r9   r:   rì  Q  s    ý  ÿz%_TestSQLApi.test_multiindex_roundtripr7   N©r©   rª   c                 C  s^   t ddgddggddgd�}| d| j¡d	ks2t‚| |¡}tjd
| j|d�}t ||¡ d S )Nç333333ó?g333333@çffffff@g333333@r©   rª   r²   Útest_dtype_argumentr  z$SELECT A, B FROM test_dtype_argument©rÃ  r7   )	r   rå   r<   rŽ   r¥   r   r!   r�   r6  )r_  r7   r¦   rL  rN  r9   r9   r:   ró  ^  s    
  ÿz_TestSQLApi.test_dtype_argumentc                 C  s4   t ddgddggddgd�}tj|d| jdd	� d S )
Nr    r  r0  rŽ  r   r²   Ztest_frame_integer_col_namesrò   r  )r   r   rå   r<   rÐ  r9   r9   r:   Útest_integer_col_namess  s    z"_TestSQLApi.test_integer_col_namesc                 C  s"   t j|d| jd�}d|kst‚d S )Nrà   rÂ  ÚCREATE©r   Ú
get_schemar<   rŽ   ©r_  r¶   Ú
create_sqlr9   r9   r:   Útest_get_schemaw  s    z_TestSQLApi.test_get_schemac                 C  s$   t j|d| jdd�}d|ks t‚d S )Nrà   Úpypi)rÃ  rE  zCREATE TABLE pypi.r÷  rù  r9   r9   r:   Útest_get_schema_with_schema{  s    z'_TestSQLApi.test_get_schema_with_schemac                 C  sj   | j dkrddlm} |}nd}tddgddgd	œƒ}tj|d
| jd|id�}d|ksZt‚d|ksft‚d S )Nr6   r   )rl   ÚINTEGERçš™™™™™ñ?rñ  r�  çš™™™™™@r3  rà   r4  rô  rö  )r  r6   rl   r   r   rø  r<   rŽ   )r_  rl   r7   Zfloat_framerú  r9   r9   r:   Útest_get_schema_dtypes€  s    
   ÿz"_TestSQLApi.test_get_schema_dtypesc                 C  sf   t ddgddgdœƒ}tj|d| jdd�}d	}||ks:t‚tj|d| jd
dgd�}d}||ksbt‚d S )Nrÿ  rñ  r�  r   )ÚCol1ZCol2rà   r  )rÃ  r¤   z'CONSTRAINT test_pk PRIMARY KEY ("Col1")r©   rª   z)CONSTRAINT test_pk PRIMARY KEY ("A", "B"))r   r   rø  r<   rŽ   )r_  r¶   r   rú  Zconstraint_sentencer9   r9   r:   Útest_get_schema_keys�  s    z _TestSQLApi.test_get_schema_keysc                 C  s  t tj dd¡tdƒd�}|jd| jdd� t d| j¡}t ƒ }d	}ddddd
g}tjd| jdd�D ]0}t	||gdd�}t
|ƒ|| ksŒt‚|d7 }qdt ||¡ | jdk�rt ƒ }d	}ddddd
g}tjd| jdd�D ]2}t	||gdd�}t
|ƒ|| k�st‚|d7 }qØt ||¡ d S )Né   r†   Zabcder²   Ztest_chunksizeFr5  zselect * from test_chunksizer   r  r  T©Zignore_indexr    r6   )r   rŒ   ÚrandomZrandnÚlistrå   r<   r   r!   r   r   rŽ   r�   r6  r  r"   )r_  r¦   r8  r9  ÚiÚsizesÚchunkÚres3r9   r9   r:   Útest_chunksize_readš  s0      ÿ


z_TestSQLApi.test_chunksize_readc                 C  sd   t dddgdddgdœƒ}| ¡ }|d  d¡|d< |jd	| jd
d� t d| j¡}t ||¡ d S )Nr    r  r0  zJohn P. Doez	Jane Dove)Z	person_idÚperson_namer  ÚcategoryÚtest_categoricalFr5  zSELECT * FROM test_categorical)	r   Úcopyr¥   rå   r<   r   r!   r�   r6  )r_  r¦   Údf2rª  r9   r9   r:   r  ¼  s    þÿz_TestSQLApi.test_categoricalc                 C  s2   t ddgddggddgd�}|jd| jd	d
� d S )Nr    r  r0  rŽ  õ   Ã©r4  r²   Ztest_unicodeFr5  )r   rå   r<   rÐ  r9   r9   r:   Útest_unicode_column_nameÍ  s    z$_TestSQLApi.test_unicode_column_namec                 C  sL   t dddgdtjdgdœƒ}|jd| jdd	� t d
| j¡}t ||¡ d S )Nr   r    r  rƒ   rò  rð  zd1187b08-4943-4c8d-a7f6Fr5  z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)	r   rŒ   Únanrå   r<   r   r!   r�   r6  ©r_  r¦   rª  r9   r9   r:   Útest_escaped_table_nameÒ  s    z#_TestSQLApi.test_escaped_table_namec                 C  s~   t dddgdddgddœƒ}|jd| jd	d
� t d| j¡}t ddddgddddgddddggddddgd�}t ||¡ d S )Nr    r  r0  r1  rƒ   r2  )rì   r4  rr  Ú
test_tableFr5  z*SELECT a, b, a +1 as a, c FROM test_table;rŽ  rì   r4  rr  r²   )r   rå   r<   ró   r  r�   r6  )r_  r¦   rN  rL  r9   r9   r:   Útest_read_sql_duplicate_columnsÛ  s     
þz+_TestSQLApi.test_read_sql_duplicate_columns)0rc  rd  re  r¬  r�  Ú__annotations__r½   Úfixturer±  r¯  r³  r´  r  r·  r¹  r»  r¼  rÁ  rÄ  rÅ  rÇ  rÑ  ÚmarkÚparametrizer   r  r!   r"   r×  rÙ  rÛ  rÝ  rç  rë  rì  rí   r£   ró  rõ  rû  rý  r  r  r  r  r  r  r  r9   r9   r9   r:   r­    s„   


7

ý
øþ	ôþ
9üþ	
"	r­  zSQLAlchemy not installed©Úreasonc                   @  sô   e Zd ZdZdZdZedd„ ƒZdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zej ddddddddddddd d!d"ee e¡jd#kr’d$nd%fg¡d&d'„ ƒZej d(d)d*g¡d+d,„ ƒZd-d.„ Ze d/¡d0d1„ ƒZd2d3„ Zd4d5„ Zd6d7„ Zd8S )9Ú
TestSQLApizŸ
    Test the public API as it would be used directly

    Tests for `read_sql_table` are included here, as this is specific for the
    sqlalchemy mode.

    r#   r6   c                 C  s   t  d¡| _d S ©Nzsqlite:///:memory:©r6   r”   r˜   rv  r9   r9   r:   Úsetup_classõ  s    zTestSQLApi.setup_classc                 C  s@   t  |d| j¡ ddg}t jd| j|d�}|j ¡ |ks<t‚d S )Nrý   r©   rª   r²   )r   rå   r<   r"   r³   rÏ  rŽ   )r_  r¶   ÚcolsrN  r9   r9   r:   Útest_read_table_columnsù  s    z"TestSQLApi.test_read_table_columnsc                 C  s¨   t  |d| j¡ t jd| jdd�}|jjdgks4t‚t jd| jddgd�}|jjddgks^t‚t jd| jddgddgd�}|jjddgksŽt‚|j ¡ ddgks¤t‚d S )	Nrý   r¨   rí  r©   rª   r«   r¬   )rØ  r³   )	r   rå   r<   r"   r¨   rê  rŽ   r³   rÏ  r—  r9   r9   r:   Útest_read_table_index_col  s       ÿz$TestSQLApi.test_read_table_index_colc                 C  sT   t  d| j¡}t  d| j¡}t ||¡ t  d| j¡}t  d| j¡}t ||¡ d S )Nr  r1   )r   r!   r<   r  r�   r6  r"   )r_  Úiris_frame1Úiris_frame2r9   r9   r:   Útest_read_sql_delegate  s    z!TestSQLApi.test_read_sql_delegatec                 C  sÌ   ddl m} ddlm} |dƒ|dƒg}|D ]h}t| j|ƒrr| j ¡ �$}| ¡ � | |¡ W 5 Q R X W 5 Q R X q,| j ¡ � | j |¡ W 5 Q R X q,t	 
d ¡�" t d| j¡ t d| j¡ W 5 Q R X d S )Nr   rd   rM   z,CREATE TABLE invalid (x INTEGER, y UNKNOWN);z0CREATE TABLE other_table (x INTEGER, y INTEGER);Zother_tablezSELECT * FROM other_table)r6   re   r[   rN   r]   r<   r^   r_   rA   r�   rõ   r   r"   r!   )r_  re   rN   Z
query_listr!  r<   r9   r9   r:   Útest_not_reflect_all_tables  s    þ
 z&TestSQLApi.test_not_reflect_all_tablesc              	   C  sV   t jtdd�� t | j¡ dd¡ W 5 Q R X t  d ¡� | d| j¡ W 5 Q R X d S )Nz¶The provided table name 'TABLE1' is not found exactly as such in the database after writing the table, possibly due to case sensitivity issues. Consider using lower case table names.rï   ZTABLE1Ú ZCaseSensitive)r�   rõ   rö   r   r   r<   Zcheck_case_sensitiverå   r‹  r9   r9   r:   Ú(test_warning_case_insensitive_table_name0  s    ýz3TestSQLApi.test_warning_case_insensitive_table_namec                 C  s6   ddl m} |j | j¡}| d¡}dd„ |D ƒ}|S )Nr   )Ú
reflectionZtest_index_savedc                 S  s   g | ]}|d  ‘qS ©Zcolumn_namesr9   ©rS   r  r9   r9   r:   rW   E  s     z1TestSQLApi._get_index_columns.<locals>.<listcomp>)r[   r,  Z	InspectorZfrom_enginer<   Úget_indexes)r_  Útbl_namer,  rÇ   Úixsr9   r9   r:   r¤  @  s
    
zTestSQLApi._get_index_columnsc                 C  s\   ddl m} tdtddgdd�iƒ}t | j¡}tjd||d	�}t|j	j
d j|ƒsXt‚d S )
Nr   )Ú	TIMESTAMPr   ú2014-12-12 01:54ú2014-12-11 02:54T©ÚutcÚ	test_typer~   )r6   r2  r   r   r   r   r<   ÚSQLTabler]   r'  rr  r‰   rŽ   )r_  r2  r¦   r   r'  r9   r9   r:   Útest_sqlalchemy_type_mappingH  s    ÿz'TestSQLApi.test_sqlalchemy_type_mappingzinteger, expected)Zint8ÚSMALLINT)ZInt8r:  )Zuint8r:  )ZUInt8r:  )Zint16r:  )ZInt16r:  )Zuint16rþ  )ZUInt16rþ  )Úint32rþ  )ZInt32rþ  )Zuint32ÚBIGINT)ZUInt32r<  )r¢   r<  )ÚInt64r<  r¢   r<  rþ  c                 C  sP   t ddgdg|d�}t | j¡}tjd||d�}t|jjjj	ƒ}||ksLt
‚d S )Nr   r    rì   ©r³   r7   r7  r~   )r   r   r   r<   r8  r)   r'  rr  rì   r‰   rŽ   )r_  r.  rL  r¦   r   r'  rN  r9   r9   r:   Útest_sqlalchemy_integer_mappingT  s
    z*TestSQLApi.test_sqlalchemy_integer_mappingr.  Zuint64ZUInt64c              	   C  sN   t ddgdg|d�}t | j¡}tjtdd�� tjd||d� W 5 Q R X d S )	Nr   r    rì   r>  z1Unsigned 64 bit integer datatype is not supportedrï   r7  r~   )r   r   r   r<   r½   r  r	  r8  )r_  r.  r¦   r   r9   r9   r:   Ú(test_sqlalchemy_integer_overload_mappingq  s     ÿz3TestSQLApi.test_sqlalchemy_integer_overload_mappingc           	   	   C  s‚   t  ¡ �L}d| }d}|j||ddd� t ||¡}t ||¡}d}t ||¡}W 5 Q R X t  ||¡ t  ||¡ t  ||¡ d S )NrÑ   r1   rò   Frâ   r  )r�   rÒ   rå   r   r  r"   r!   r6  )	r_  r¶   rÔ   Údb_urir'  rµ  r·   r!  rº  r9   r9   r:   Útest_database_uri_string{  s    
z#TestSQLApi.test_database_uri_stringÚpg8000c              	   C  s.   d}t jtdd�� t d|¡ W 5 Q R X d S )Nz)postgresql+pg8000://user:pass@host/dbnamerC  rï   zselect * from table©r½   r  ÚImportErrorr   r  )r_  rA  r9   r9   r:   Ú(test_pg8000_sqlalchemy_passthrough_errorŒ  s    z3TestSQLApi.test_pg8000_sqlalchemy_passthrough_errorc                 C  sH   ddl m} |dƒ}tj|| jddid�}t|d ƒ}|dhksDt‚d S )Nr   rd   z#select * from iris where name=:namerÔ   zIris-versicolorr  r4   )r6   re   r   r  r<   ÚsetrŽ   )r_  re   Z	name_textÚiris_dfÚ	all_namesr9   r9   r:   Útest_query_by_text_obj”  s
    z!TestSQLApi.test_query_by_text_objc                 C  sh   ddl m}m} t| jƒ}||ƒ |jj|dƒk¡}tj	|| j
ddid�}t|d ƒ}|dhksdt‚d S )Nr   )Ú	bindparamr  rÔ   r„   r  r4   )r6   rK  r  r;   r�  Úwhererr  r4   r   r  r<   rG  rŽ   )r_  rK  r  r1   Zname_selectrH  rI  r9   r9   r:   Útest_query_by_select_obj�  s    
z#TestSQLApi.test_query_by_select_objc                 C  sJ   t dddgdddgdœƒ}|jd| jd	d
� t d| j¡}t ||¡ d S )Nr   r    r  r0  rŽ  r†   )r©   z%_variationZtest_column_percentageFr5  )r   rå   r<   r   r"   r�   r6  r  r9   r9   r:   Útest_column_with_percentageª  s    z&TestSQLApi.test_column_with_percentageN)rc  rd  re  r¬  r�  r  r  r"  r$  r%  r(  r)  r+  r¤  r9  r½   r  r  rí   rŒ   r7   rÔ   r?  r@  rB  ÚtdZskip_if_installedrF  rJ  rM  rN  r9   r9   r9   r:   r  è  sP   
	ñþ
	
	
	r  c                   @  sz   e Zd ZdZdZdZddd„Zdd„ Zej	j
ed	d
�dd„ ƒZej	j
ed	d
�dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestSQLiteFallbackApiz9
    Test the public sqlite connection fallback API

    r#   rÕ  rÜ   c                 C  s
   t  |¡S rÊ   rg  )r_  Zdatabaser9   r9   r:   r^   ½  s    zTestSQLiteFallbackApi.connectc              
   C  s~   t  ¡ �`}t|  |¡ƒ� }tj|d|dd�dks4t‚W 5 Q R X t|  |¡ƒ�}t d|¡}W 5 Q R X W 5 Q R X t  ||¡ d S )NZtest_frame3_legacyFr5  rŽ  z!SELECT * FROM test_frame3_legacy;)	r�   rÒ   r   r^   r   rå   rŽ   r!   r6  )r_  r·   rÔ   r<   rN  r9   r9   r:   Útest_sql_open_closeÀ  s    
ÿÿ z)TestSQLiteFallbackApi.test_sql_open_closezSQLAlchemy is installedr  c              	   C  s2   d}d}t jt|d�� t d|¡ W 5 Q R X d S )Nzmysql://root@localhost/pandasz-Using URI string without sqlalchemy installedrï   r  rD  )r_  r<   r
  r9   r9   r:   Útest_con_string_import_errorÐ  s    z2TestSQLiteFallbackApi.test_con_string_import_errorc              
   C  sN   G dd„ dƒ}t  |dƒ¡�(}t t¡� t d|¡ W 5 Q R X W 5 Q R X d S )Nc                   @  s*   e Zd Zddœdd„Zdd„ Zdd„ Zd	S )
z~TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnectionÚNone©Úreturnc                 _  s   t j||Ž| _d S rÊ   )rf   rg   r<   )r_  ÚargsÚkwargsr9   r9   r:   Ú__init__Ü  s    z‡TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__init__c                 S  s   t | j|ƒS rÊ   )Úgetattrr<   )r_  rÔ   r9   r9   r:   Ú__getattr__ß  s    zŠTestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__getattr__c                 S  s   | j  ¡  d S rÊ   )r<   rX  rh  r9   r9   r:   rX  â  s    z„TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.closeN)rc  rd  re  rX  rZ  rX  r9   r9   r9   r:   ÚMockSqliteConnectionÛ  s   r[  rÜ   zSELECT 1)rÝ   r   r�   rõ   rö   r   r  )r_  r[  r<   r9   r9   r:   ÚJtest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed×  s    
z`TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installedc              	   C  sZ   t  d| j¡}t  d| j¡}t ||¡ d}tjt j|d�� t  d| j¡ W 5 Q R X d S )Nr  z9Execution failed on sql 'iris': near "iris": syntax errorrï   r1   )	r   r!   r<   r  r�   r6  r½   r  ÚDatabaseError)r_  r&  r'  r
  r9   r9   r:   r(  é  s    z,TestSQLiteFallbackApi.test_read_sql_delegatec                 C  s   t  |d¡}d|kst‚d S )Nrà   rö  )r   rø  rŽ   rù  r9   r9   r:   Útest_get_schema2ò  s    z&TestSQLiteFallbackApi.test_get_schema2c                 C  sJ   |  d¡D ]*}|  ¡ d  d¡|kr
|  ¡ d   S q
td|› d�ƒ‚d S )NÚ
r   r<  r    zColumn ú
 not found)ÚsplitÚstripr	  )r_  rE  ÚcolumnÚcolr9   r9   r:   Ú_get_sqlite_column_type÷  s    z-TestSQLiteFallbackApi._get_sqlite_column_typec                 C  sT   t dtddgdd�iƒ}t | j¡}tjd||d�}| ¡ }|  |d¡dksPt‚d S )	Nr   r3  r4  Tr5  r7  r~   r2  )	r   r   r   r   r<   ZSQLiteTableZ
sql_schemare  rŽ   )r_  r¦   r   r'  rE  r9   r9   r:   Útest_sqlite_type_mappingý  s    ÿz.TestSQLiteFallbackApi.test_sqlite_type_mappingN)rÜ   )rc  rd  re  r¬  r�  r  r^   rQ  r½   r  ÚskipifÚSQLALCHEMY_INSTALLEDrR  r\  r(  r^  re  rf  r9   r9   r9   r:   rP  ´  s   


	rP  c                   @  sp  e Zd ZU dZded< edd„ ƒZejdd�dd	„ ƒZ	ed
d„ ƒZ
edd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Z d8d9„ Z!d:d;„ Z"d<d=„ Z#d>d?„ Z$d@dA„ Z%dBdC„ Z&dDdE„ Z'dFdG„ Z(dHdI„ Z)dJdK„ Z*dLdM„ Z+dNdO„ Z,dPdQ„ Z-ej. /dRdSe0j1gidSe0j1 gie0j1 gdTgdUœg¡dVdW„ ƒZ2dXdY„ Z3dZd[„ Z4d\d]„ Z5d^d_„ Z6d`da„ Z7dbdc„ Z8ej. /dddedfg¡dgdh„ ƒZ9ej. /dddedig¡djdk„ ƒZ:ej. /dddedidfg¡dldm„ ƒZ;dndoœdpdq„Z<dndoœdrds„Z=dtdu„ Z>ej. /dve?j@dwg¡ej. /dddedfg¡dxdy„ ƒƒZAdzS ){Ú_TestSQLAlchemyz¶
    Base class for testing the sqlalchemy backend.

    Subclasses for specific database types are created below. Tests that
    deviate for each flavor are overwritten there.

    r)   r�  c                 C  s   |   ¡  |  ¡  d S rÊ   )Úsetup_driverÚsetup_enginerv  r9   r9   r:   r"    s    z_TestSQLAlchemy.setup_classTr®  c                 C  sd   z| j  ¡ | _t | j¡| _W n, tjjk
rJ   t	 
d| j› d�¡ Y nX |  |¡ |  |¡ d S )NzCan't connect to z server)r˜   r^   r<   r   r   r  r6   rY  rZ  r½   Úskipr�  r‚  r„  r°  r9   r9   r:   r±    s    
z_TestSQLAlchemy.setup_methodc                 C  s
   t ƒ ‚d S rÊ   ©ÚNotImplementedErrorrv  r9   r9   r:   rj  '  s    z_TestSQLAlchemy.setup_driverc                 C  s
   t ƒ ‚d S rÊ   rm  rv  r9   r9   r:   rk  +  s    z_TestSQLAlchemy.setup_enginec                 C  s   |   ¡  d S rÊ   ©rˆ  rh  r9   r9   r:   Útest_read_sql_parameter/  s    z'_TestSQLAlchemy.test_read_sql_parameterc                 C  s   |   ¡  d S rÊ   ©r‰  rh  r9   r9   r:   Útest_read_sql_named_parameter2  s    z-_TestSQLAlchemy.test_read_sql_named_parameterc                 C  s   |   |¡ d S rÊ   ©rŒ  r‹  r9   r9   r:   Útest_to_sql_empty5  s    z!_TestSQLAlchemy.test_to_sql_emptyc              	   C  sz   ddl m} |  ¡ }tddddgddddgdœƒ}tj|dd	��}| |d
¡dksVt‚W 5 Q R X ||ƒ}| d
¡svt‚d S )Nr   r}  ç      ð?ç       @ç      @ç      @©ÚoneÚtwoTrü   ræ  rŽ  )	r6   rÄ   r^   r   r   r   rå   rŽ   rÅ   ©r_  rÄ   Z	temp_connræ  r  rÇ   r9   r9   r:   Útest_create_table8  s    ÿz!_TestSQLAlchemy.test_create_tablec                 C  s¤   ddl m} |  ¡ }tddddgddddgdœƒ}t |¡}| |d¡d	ksPt‚||ƒ}| d¡sft‚| 	d¡ z| 
¡  W n tk
r�   Y nX | d¡r t‚d S )
Nr   r}  ru  rv  rw  rx  ry  ræ  rŽ  )r6   rÄ   r^   r   r   r   rå   rŽ   rÅ   r^  Úclear_cacheÚAttributeErrorr|  r9   r9   r:   Útest_drop_tableE  s    ÿ

z_TestSQLAlchemy.test_drop_tablec                 C  s   |   |¡ d S rÊ   ©r˜  r‹  r9   r9   r:   rÄ  Y  s    z_TestSQLAlchemy.test_roundtripc                 C  s   |   ¡  d S rÊ   ©r›  rh  r9   r9   r:   rÇ  \  s    z _TestSQLAlchemy.test_execute_sqlc                 C  s   t jd| jd�}t|ƒ d S )Nr1   rÂ  )r   r"   r<   r’   r²  r9   r9   r:   Útest_read_table_  s    z_TestSQLAlchemy.test_read_tablec                 C  s.   t jd| jddgd�}t |jjddg¡ d S )Nr1   r2   )rÃ  r³   )r   r"   r<   r�   r�   r³   r\   r²  r9   r9   r:   r$  c  s      ÿz'_TestSQLAlchemy.test_read_table_columnsc              	   C  s2   d}t jt|d�� tjd| jd� W 5 Q R X d S )Nz!Table this_doesnt_exist not foundrï   Zthis_doesnt_existrÂ  )r½   r  r	  r   r"   r<   )r_  r
  r9   r9   r:   Útest_read_table_absent_raisesi  s    z-_TestSQLAlchemy.test_read_table_absent_raisesc                 C  s~   t  d| j¡}t|jjjtjƒs$t	‚t|j
jjtjƒs:t	‚t|jjjtjƒsPt	‚t|jjjtjƒsft	‚t|jjjtƒszt	‚d S r-  )r   r"   r<   r‹   rr   r7   r‰   rŒ   r�   rŽ   rs   r.  rt   Zbool_ru   rv   ÚobjectrÐ  r9   r9   r:   r/  n  s    z,_TestSQLAlchemy.test_default_type_conversionc                 C  sH   t ddgid�}|jd| jdd�dks*t‚t d| j¡}t ||¡ d S )NÚi64l            )r›   Útest_bigintFr5  r    )r   rå   r<   rŽ   r   r"   r�   r6  rï  r9   r9   r:   r‡  z  s    z_TestSQLAlchemy.test_bigintc                 C  s(   t  d| j¡}t|jjjtjƒs$t	‚d S r-  ©
r   r"   r<   r‹   ro   r7   r‰   rŒ   rÎ  rŽ   rÐ  r9   r9   r:   Útest_default_date_load‚  s    z&_TestSQLAlchemy.test_default_date_loadc                 C  s@  dd„ }t d| jƒ}t|dƒs4|j tjjdd�¡ |j}t	|j
ƒsHt‚t d| jdgd�}t|dƒsz|j tjjdd�¡ |j}t	|j
ƒsŽt‚t|jjƒdks¢t‚||jƒ ttt d| jd	d
�ƒdd�}|j}t	|j
ƒsÜt‚t|jjƒdksðt‚t d| j¡}|j}t	|j
ƒ�st‚t |j|j¡ t d| j¡}||jƒ d S )Nc                 S  sš   t | jƒr4| d tdƒkst‚| d tdƒks–t‚nbt| jƒr†t| jjƒdksRt‚tddd�tddd�g}t|| j	d�}t
 | |¡ ntd| j› �ƒ‚d S )	Nr   z2000-01-01 08:00:00r    z2000-06-01 07:00:00ÚUTC)ÚtzrÓ   z&DateCol loaded with incorrect type -> )r   r7   r   rŽ   r   r)   Údtr‹  r   rÔ   r�   rÜ  )rd  Zexpected_datarL  r9   r9   r:   r*  Ž  s    



þ
ÿz:_TestSQLAlchemy.test_datetime_with_timezone.<locals>.checkzselect * from typesrw   z&no column with datetime with time zoner  rÉ  rŠ  r    r  Tr  rm   )r!   r<   rW  ÚnodeÚ
add_markerr½   r  Úxfailrw   r   r7   rŽ   r)   rŒ  r‹  r   r  r   r"   r�   rÜ  )r_  ræ   r*  r¦   rd  rL  r9   r9   r:   Útest_datetime_with_timezone‰  sD    !
ÿ  ÿ
ÿ
þz+_TestSQLAlchemy.test_datetime_with_timezonec                 C  sÊ   t dtdddd�iƒ}|jd| jdd�dks0t‚| jd	krP|d j d
¡|d< n|d j d ¡|d< t	 
d| j¡}t ||¡ t	 d| j¡}| jdkrºt|jd tƒsªt‚t|d ƒ|d< t ||¡ d S )Nr©   ú2013-01-01 09:00:00r0  ú
US/Pacific©Úperiodsr‹  Ztest_datetime_tzFr5  r%   rŠ  zSELECT * FROM test_datetime_tzr#   ©r   r©   )r   r   rå   r<   rŽ   r�  rŒ  Z
tz_convertZtz_localizer   r"   r�   r6  r!   r]   Úlocr)   r   )r_  rL  rN  r9   r9   r:   Ú%test_datetime_with_timezone_roundtripØ  s    ÿ

z5_TestSQLAlchemy.test_datetime_with_timezone_roundtripc                 C  sd   t dtdddƒidgd�}|jd| jdd�dks4t‚t d| j¡}t tjgdgd�}t	 
||¡ d S )	Nr   i'  r    r   r5  Ztest_datetime_obbFr²   )r   r   rå   r<   rŽ   r   r"   ró   ZNaTr�   r6  )r_  r›   rN  rL  r9   r9   r:   Útest_out_of_bounds_datetimeó  s
    z+_TestSQLAlchemy.test_out_of_bounds_datetimec                 C  sh   t dddd� d ¡}tdtdƒi|d�}|jd| jdd	�dksBt‚tjd| jdd
�}t	j
||dd� d S )Nz
2018-01-01r†   Z6H)r”  ÚfreqÚnumsr5  Z	foo_tableZ	info_daterã  rí  F)Zcheck_names)r   Z
_with_freqr   rå  rå   r<   rŽ   r   r"   r�   r6  )r_  ÚdatesrL  rN  r9   r9   r:   Ú"test_naive_datetimeindex_roundtripû  s
    z2_TestSQLAlchemy.test_naive_datetimeindex_roundtripc                 C  sJ  t  d| j¡}| jdkrtntj}t|jj	j
|ƒs6t‚t jd| jdgd�}t|jj	j
tjƒs`t‚t jd| jddid�}t|jj	j
tjƒsŒt‚t jd| jdddiid�}t|jj	j
tjƒs¼t‚t jd| jdgd�}t|jj	j
tjƒsæt‚t jd| jddid�}t|jj	j
tjƒ�st‚t jd| jdd	diid�}t|jj	j
tjƒ�sFt‚d S )
Nrm   r#   ro   rÉ  rË  Úformatrp   r¿  Úunit)r   r"   r<   r�  r…  rŒ   rÎ  r‹   ro   r7   r‰   rŽ   rp   )r_  r¦   Úexpected_typer9   r9   r:   rÑ    s6      ÿ
ý  
ÿz!_TestSQLAlchemy.test_date_parsingc                 C  sÂ   t tddd�t d¡dœƒ}| d| j¡dks2t‚t d| j¡}|j	ddd	�}t
 ||¡ t d
| j¡}|j	ddd	�}| jdkr²t|jd tƒs”t‚t|d ƒ|d< t
 ||¡ nt
 ||¡ d S )Nr‘  r0  ©r”  rw  rð  Útest_datetimer¨   r    )ZaxisúSELECT * FROM test_datetimer#   r•  r©   )r   r   rŒ   r½  rå   r<   rŽ   r   r"   r`   r�   r6  r!   r�  r]   r–  r)   r   rï  r9   r9   r:   r¡  %  s    ÿ
z_TestSQLAlchemy.test_datetimec                 C  sº   t tddd�t d¡dœƒ}tj|jd< |jd| jdd	�dksBt‚t	 
d| j¡}t ||¡ t	 d
| j¡}| jdkrªt|jd tƒsˆt‚t|d dd�|d< t ||¡ nt ||¡ d S )Nr‘  r0  r   rw  rð  ©r    r©   r¡  Fr5  r¢  r#   r•  r©   rÔ  )rÖ  )r   r   rŒ   r½  r  r–  rå   r<   rŽ   r   r"   r�   r6  r!   r�  r]   r)   r   rï  r9   r9   r:   Útest_datetime_NaT:  s    ÿ
z!_TestSQLAlchemy.test_datetime_NaTc                 C  sl   t tdddƒtdddƒgdgd�}|jd| jdd�dks<t‚td| jƒ}|d }t|d ƒ}t ||¡ d S )	NéÞ  r    r  rì   r²   Ú	test_dateFr5  )	r   r   rå   r<   rŽ   r"   r   r�   rÜ  )r_  r¦   rª  rN  rL  r9   r9   r:   Útest_datetime_dateN  s    "z"_TestSQLAlchemy.test_datetime_datec                 C  s  t tdddƒtdddƒgdgd�}|jd| jdd	�d
ks<t‚td| jƒ}t ||¡ |}tj|d|dd	�d
ksrt‚t 	d|¡}| 
dd„ ¡}t ||¡ tj|d| jdd	�d
ks´t‚| jdkræt 	d| j¡}| 
dd„ ¡}t ||¡ t d| j¡}t ||¡ d S )Né	   r   r    é   rì   r²   Ú	test_timeFr5  r  Z
test_time2zSELECT * FROM test_time2c                 S  s
   |   d¡S ©Nz%H:%M:%S.%f©Ústrftime©Ú_r9   r9   r:   Ú<lambda>d  ó    z4_TestSQLAlchemy.test_datetime_time.<locals>.<lambda>Z
test_time3r#   zSELECT * FROM test_time3c                 S  s
   |   d¡S r«  r¬  r®  r9   r9   r:   r°  j  r±  )r   r   rå   r<   rŽ   r"   r�   r6  r   r!   Úapplymapr�  )r_  rÞ   r¦   rª  r×   Úrefr9   r9   r:   Útest_datetime_timeX  s     "
z"_TestSQLAlchemy.test_datetime_timec                 C  sh   t dtjd�}t dtjd�}t||dœƒ}|jd| jdd�dksDt‚t 	d| j¡}t
j||dd	d
� d S )Ni  ré   g        )Ús1rÀ  Ztest_read_writeFr5  r    T)Zcheck_dtypeZcheck_exact)r   rŒ   r;  Úfloat32r   rå   r<   rŽ   r   r"   r�   r6  )r_  rµ  rÀ  r¦   r  r9   r9   r:   Útest_mixed_dtype_inserto  s    z'_TestSQLAlchemy.test_mixed_dtype_insertc                 C  sn   t dddgdtjdgdœƒ}|jd| jdd	�d
ks6t‚t d| j¡}t 	||¡ t 
d| j¡}t 	||¡ d S )Nr   r    r  rƒ   rò  rð  Útest_nanFr5  r0  úSELECT * FROM test_nan)r   rŒ   r  rå   r<   rŽ   r   r"   r�   r6  r!   rï  r9   r9   r:   Útest_nan_numeric{  s    z _TestSQLAlchemy.test_nan_numericc                 C  sŒ   t dddgtjtjtjgdœƒ}|jd| jdd�dks:t‚t d| j¡}t 	||¡ |d	  
d
¡|d	< d |d	< t d| j¡}t 	||¡ d S )Nr   r    r  rð  r¸  Fr5  r0  rª   r…  r¹  )r   rŒ   r  rå   r<   rŽ   r   r"   r�   r6  r¥   r!   rï  r9   r9   r:   Útest_nan_fullcolumnˆ  s     z#_TestSQLAlchemy.test_nan_fullcolumnc                 C  sx   t dddgddtjgdœƒ}|jd| jdd	�d
ks6t‚d |jd< t d| j¡}t	 
||¡ t d| j¡}t	 
||¡ d S )Nr   r    r  rì   r4  rð  r¸  Fr5  r0  ©r  rª   r¹  )r   rŒ   r  rå   r<   rŽ   r–  r   r"   r�   r6  r!   rï  r9   r9   r:   Útest_nan_string—  s    
z_TestSQLAlchemy.test_nan_stringc                 C  s2   ddl m} || jƒ}| |¡}dd„ |D ƒ}|S )Nr   r}  c                 S  s   g | ]}|d  ‘qS r-  r9   r.  r9   r9   r:   rW   ­  s     z6_TestSQLAlchemy._get_index_columns.<locals>.<listcomp>)r6   rÄ   r<   r/  )r_  r0  rÄ   rÇ   r1  r9   r9   r:   r¤  §  s
    

z"_TestSQLAlchemy._get_index_columnsc                 C  s   |   ¡  d S rÊ   ©r¦  rh  r9   r9   r:   Útest_to_sql_save_index°  s    z&_TestSQLAlchemy.test_to_sql_save_indexc                 C  s   |   ¡  d S rÊ   ©r«  rh  r9   r9   r:   Útest_transactions³  s    z!_TestSQLAlchemy.test_transactionsc           	   
   C  sæ   ddl m} ddlm} d}tj||| jd�}|jd d… }|  || j¡ ||ƒ}t	| j|ƒr”| j 
¡ �$}| ¡ � | |¡ W 5 Q R X W 5 Q R X n"| j ¡ � | j |¡ W 5 Q R X t || j¡}tj||dd� |  || j¡ d S )Nr   rd   rM   Útest_get_schema_create_tablerÂ  Frî  )r6   re   r[   rN   r   rø  r<   rŠ   r^  r]   r^   r_   rA   r"   r�   r6  )	r_  r·   re   rN   ra  rú  Zblank_test_dfr<   Zreturned_dfr9   r9   r:   rÂ  ¶  s     
 z,_TestSQLAlchemy.test_get_schema_create_tablec              	   C  s¨  ddl m}m} ddlm} ddg}ddg}t||d�}| d	| j¡d
ksNt‚|jd| jd|id�d
kslt‚|ƒ }|j	| jd� |j
d jd j}t||ƒs t‚d}	tjt|	d�� |jd| jdtid� W 5 Q R X |jd| jd|dƒid�d
ksöt‚|j	| jd� |j
d jd j}t||ƒ�s&t‚|jdk�s6t‚|jd| j|d�d
k�sRt‚|j	| jd� |j
d jd j}
|j
d jd j}t|
|ƒ�s”t‚t||ƒ�s¤t‚d S )Nr   )ri   r/   ©r.   r©   rª   ©gš™™™™™é?T©gÍÌÌÌÌÌì?Nr²   Ú
dtype_testr  Údtype_test2ré   rY   z&The type of B is not a SQLAlchemy typerï   r¨  Zdtype_test3é
   Úsingle_dtype_test)r6   ri   r/   Úsqlalchemy.schemar.   r   rå   r<   rŽ   ÚreflectÚtablesr³   r‰   r]   r½   r  r	  r)   r  )r_  ri   r/   r.   r#  r›   r¦   ÚmetaZsqltyper
  ZsqltypeaZsqltypebr9   r9   r:   Ú
test_dtypeÎ  s2     "z_TestSQLAlchemy.test_dtypec                 C  s  ddl m}m}m}m} ddlm} tdd gƒttdddƒd gƒtdd gdd	�td
d gƒdœ}t	|ƒ}d}| 
|| j¡dks€t‚t || j¡}	|ƒ }
|
j| jd� | jdkr°|n|}|
j| j}t|d j|ƒsÔt‚t|d j|ƒsèt‚t|d j|ƒsüt‚t|d j|ƒ�st‚d S )Nr   )rj   rk   r-   rl   rÃ  TéÜ  r†   r    r…  ré   rÿ  ©ÚBoolÚDateÚIntr-   Únotna_dtype_testr  rY   r$   rÑ  rÒ  rÓ  r-   )r6   rj   rk   r-   rl   rÊ  r.   r   r   r   rå   r<   rŽ   r   r"   rË  r�  rÌ  r³   r]   r‰   )r_  rj   rk   r-   rl   r.   r#  r¦   ra  r¯  rÍ  Zmy_typeÚcol_dictr9   r9   r:   Útest_notna_dtypeñ  s&    

üz _TestSQLAlchemy.test_notna_dtypec           
   	   C  sn  ddl m}m}m} ddlm} d}tt|gdd�t|gdd�t|gdd�tdgd	d�tdgd
d�dœƒ}|jd| j	ddd|dd�id�dks’t
‚t d| j	¡}t |d jd d¡t |d jd d¡ksÐt
‚|ƒ }|j| j	d� |jd j}	t|	d jƒt|	d jƒk�st
‚t|	d j|ƒ�s(t
‚t|	d j|ƒ�s>t
‚t|	d j|ƒ�sTt
‚t|	d j|ƒ�sjt
‚d S )Nr   )Ú
BigIntegerr-   rl   rÃ  gñYÉBÊÀó?r¶  ré   Úfloat64r†   r;  r¢   )Úf32Úf64Ú
f64_as_f32Úi32r†  Ztest_dtypesFrò   rÛ  é   )Ú	precision)r¨   rã   r7   r    rÚ  é   rY   rÙ  rÜ  r†  )r6   r×  r-   rl   rÊ  r.   r   r   rå   r<   rŽ   r   r"   rŒ   ÚroundrŠ   rË  rÌ  r³   r)   r‰   r]   )
r_  r×  r-   rl   r.   ÚVr¦   rª  rÍ  rÕ  r9   r9   r:   Útest_double_precision	  s>    ûÿûùÿ
0"z%_TestSQLAlchemy.test_double_precisionc                   sj   ddl m‰  dd„ ‰dd„ ‰‡‡fdd„‰‡ ‡fd	d
„}tddddgiƒ d| j¡dks\t‚|| jƒ d S )Nr   rM   c                 S  s   d}t j|| d�S )Nz'SELECT test_foo_data FROM test_foo_datarÂ  )r   r!   )r@  r!  r9   r9   r:   Útest_select@	  s    zC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_selectc                 S  s   |j d| dd� d S )NÚtest_foo_datará   )rÔ   rÃ  rã   )rå   )r@  r›   r9   r9   r:   Útest_appendD	  s    zC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_appendc                   s   ˆ| ƒ}ˆ | |ƒ d S rÊ   r9   )r<   Zfoo_data)rå  rã  r9   r:   Útest_connectableG	  s    zH_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_connectablec              
     sH   t | ˆ ƒr<|  ¡ �"}| ¡ � ˆ|ƒ W 5 Q R X W 5 Q R X nˆ| ƒ d S rÊ   )r]   r^   r_   )Zconnectabler<   )rN   ræ  r9   r:   ÚmainM	  s
    


z<_TestSQLAlchemy.test_connectable_issue_example.<locals>.mainrä  r    r  r0  )r[   rN   r   rå   r<   rŽ   )r_  rç  r9   )rN   rå  ræ  rã  r:   Útest_connectable_issue_example;	  s    	ÿÿz._TestSQLAlchemy.test_connectable_issue_exampleÚinputrÚ  Úbar)rÚ  Úinfe0c              	   C  s¼   t |ƒ}| jdkr„t d¡}t|jƒtdƒk rRd|jkrRtjjdd�}|j	 
|¡ d}tjt|d�� |jd	| jd
d� W 5 Q R X n4|jd	| jd
d�dksžt‚t d	| j¡}t ||¡ d S )Nr$   r¸   z1.0.3rë  zGH 36465r  zinf cannot be used with MySQLrï   ZfoobarFr5  r    )r   r�  r½   r¾   r   Ú__version__r³   r  r�  r�  rŽ  r  r	  rå   r<   rŽ   r   r"   r�   Zassert_equal)r_  ré  ræ   r¦   r¸   r  r
  rª  r9   r9   r:   Útest_to_sql_with_negative_npinf[	  s    

ÿþz/_TestSQLAlchemy.test_to_sql_with_negative_npinfc              
     sÒ   ddl m‰ m‰m‰m} ddlm}m} d}td|giƒ}|ƒ }G ‡ ‡‡fdd„d|ƒ}|| j	ƒ�Z}| 
¡ �F | ¡ }	|j |	¡ | ||d�¡ | ¡  tj||jƒ|	d	�}
W 5 Q R X W 5 Q R X t |
|¡ d S )
Nr   )r,   rl   ÚUnicoder  )ÚSessionÚdeclarative_basezHello, World!Úspamc                      s6   e Zd ZdZddgiZ” ”dd�Z” ”dƒdd�Zd	S )
z7_TestSQLAlchemy.test_temporary_table.<locals>.TemporaryZ	temp_testÚprefixesÚ	TEMPORARYT©Zprimary_keyr©  F)ZnullableN)rc  rd  re  Ú__tablename__Z__table_args__Úidrñ  r9   ©r,   rl   rî  r9   r:   Ú	TemporaryŠ	  s   
rø  )rñ  )r   rÃ  )r6   r,   rl   rî  r  Úsqlalchemy.ormrï  rð  r   r<   r_   r@  Z	__table__ra   ÚaddÚflushr   r!   rñ  r�   r6  )r_  r  rï  rð  Z	test_datarL  ZBaserø  Úsessionr<   r¦   r9   r÷  r:   Útest_temporary_tablez	  s    
(z$_TestSQLAlchemy.test_temporary_tablec              	   C  s.   d}t jt|d�� |  |d¡ W 5 Q R X d S )Nz*engine must be one of 'auto', 'sqlalchemy'rï   Z
bad_engine)r½   r  r	  r‘  r¶  r9   r9   r:   Útest_invalid_engineš	  s    z#_TestSQLAlchemy.test_invalid_enginec              	   C  s&   t  dd¡� |  |¡ W 5 Q R X d S )Núio.sql.enginer6   ©ró   Úoption_contextr‘  r‹  r9   r9   r:   Útest_options_sqlalchemyŸ	  s    z'_TestSQLAlchemy.test_options_sqlalchemyc              	   C  s&   t  dd¡� |  |¡ W 5 Q R X d S )Nrÿ  r�  r   r‹  r9   r9   r:   Útest_options_auto¤	  s    z!_TestSQLAlchemy.test_options_autoc              	   C  sŽ   t tdƒtƒst‚t dd¡�* t tdƒtƒs2t‚t tdƒtƒsDt‚W 5 Q R X t dd¡�* t tdƒtƒsnt‚t tdƒtƒs€t‚W 5 Q R X d S )Nr6   rÿ  r�  )r]   r   r   rŽ   ró   r  rh  r9   r9   r:   Útest_options_get_engine©	  s    z'_TestSQLAlchemy.test_options_get_enginec                 C  s   d S rÊ   r9   rh  r9   r9   r:   Ú"test_get_engine_auto_error_message´	  s    z2_TestSQLAlchemy.test_get_engine_auto_error_messageÚfuncr  r!   c           	   	   C  sÈ   d}|   ¡ }|j|| jddd� t d|¡�" tt|ƒd|› �| j|d�}W 5 Q R X |  ||¡}t ||¡ t d|¡�F tt|ƒd|› �| j|dd	�}|  ||¡}|D ]}t ||¡ q¨W 5 Q R X d S )
Nrà   Frò   ©r¨   rã   úmode.string_storageúSelect * from ©Údtype_backendr0  ©r  r  ©	Údtype_backend_datarå   r<   ró   r  rY  Údtype_backend_expectedr�   r6  ©	r_  Ústring_storager  r  r'  r¦   rN  rL  Úiteratorr9   r9   r:   Útest_read_sql_dtype_backendº	  s*      ÿüz+_TestSQLAlchemy.test_read_sql_dtype_backendr"   c           	   	   C  s¼   d}|   ¡ }|j|| jddd� t d|¡� tt|ƒ|| j|d�}W 5 Q R X |  ||¡}t ||¡ t d|¡�@ tt|ƒ|| j|dd�}|  ||¡}|D ]}t ||¡ qœW 5 Q R X d S )	Nrà   Frò   r  r  r
  r0  r  r  r  r9   r9   r:   Ú!test_read_sql_dtype_backend_tableÓ	  s"     üz1_TestSQLAlchemy.test_read_sql_dtype_backend_tablec              	   C  sX   d}|   ¡ }|j|| jddd� d}tjt|d�� tt|ƒ|| jdd� W 5 Q R X d S )	Nrà   Frò   r  zPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.rï   Únumpyr
  )r  rå   r<   r½   r  r	  rY  ró   )r_  r  r'  r¦   r
  r9   r9   r:   Ú)test_read_sql_invalid_dtype_backend_tableê	  s    ÿz9_TestSQLAlchemy.test_read_sql_invalid_dtype_backend_tabler   rT  c                 C  sn   t tdtjdgdd�tdddgdd�tdtjdgdd�tdd	dgdd�d
dd gd
dd
gdddgddd gdœƒS )Nr    r0  r=  ré   r  r   ç      @ÚFloat64rv  TFrì   r4  rr  ©rì   r4  rr  ÚdÚeÚfÚgÚh)r   r   rŒ   r  rh  r9   r9   r:   r  ÷	  s    øÿz"_TestSQLAlchemy.dtype_backend_datac              
     s&  |dkr@t tjdddgtjd�ƒ}t tjddtjgtjd�ƒ}n2t d¡‰tˆ dddg¡ƒ}tˆ ddd g¡ƒ}t	t
dtjdgd	d�t
dd
dgd	d�t
dtjdgdd�t
dddgdd�t
ddtjgdd�t
dddgdd�||dœƒ‰|dk�r"t d¡‰ddlm‰  t	‡ ‡‡fdd„ˆjD ƒƒ‰ˆS )NÚpythonrì   r4  rr  ré   rè   r    r0  r=  r  r   r  r  rv  TFÚbooleanr  r   )ÚArrowExtensionArrayc                   s$   i | ]}|ˆ ˆj ˆ| d d�ƒ“qS )T)Zfrom_pandas)rô   )rS   rd  ©r!  r¦   Úpar9   r:   Ú
<dictcomp>#
  s   ÿ z:_TestSQLAlchemy.dtype_backend_expected.<locals>.<dictcomp>)r   rŒ   rô   Zobject_ró   ZNAr½   r¾   r   r   r   r  Zpandas.arraysr!  r³   )r_  Ústorager  Zstring_arrayZstring_array_nar9   r"  r:   r  
  s4    
øÿ

þÿz&_TestSQLAlchemy.dtype_backend_expectedc                 C  sb   dddœ}t ddgd� |¡}| ¡ }|jd| jdd	d
� td| j|dd�D ]}t ||¡ qLd S )Nr¢   r…  r3  rì   r4  r²   rà   Frò   r  zSELECT * FROM testr    )r7   r  )r   r¥   r  rå   r<   r!   r�   r6  )r_  rˆ   r¦   rL  rN  r9   r9   r:   Útest_chunksize_empty_dtypes*
  s    
ü
z+_TestSQLAlchemy.test_chunksize_empty_dtypesr  Únumpy_nullablec                 C  s˜   d}t dddgddœƒ}|j|| jddd	� tt|ƒd
|› �| jdtji|d�}t tdddgtjd�tdddg|dkszdndd�dœƒ}t 	||¡ d S )Nrà   r    r  r0  r†   r3  Frò   r  r	  rì   )r7   r  ré   r'  r¢   r=  )
r   rå   r<   rY  ró   rŒ   rØ  r   r�   r6  )r_  r  r  r'  r¦   rN  rL  r9   r9   r:   Útest_read_sql_dtype9
  s$    üþþÿ	z#_TestSQLAlchemy.test_read_sql_dtypeN)Brc  rd  re  r¬  r  r  r"  r½   r  r±  rj  rk  rp  rr  rt  r}  r€  rÄ  rÇ  rƒ  r$  r„  r/  r‡  r‰  r�  r—  r˜  rœ  rÑ  r¡  r¤  r§  r´  r·  rº  r»  r½  r¤  r¿  rÁ  rÂ  rÎ  rÖ  râ  rè  r  r  rŒ   Úinfrí  rý  rþ  r  r  r  r  r  r  r  r  r  r&  r   Z
no_defaultr(  r9   r9   r9   r:   ri    s†   



	

O
 
	#- (þ
 


%ri  c                      s|   e Zd ZdZdZedd„ ƒZedd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ Zddœ‡ fdd„Zej dddg¡dd„ ƒZ‡  ZS )ÚTestSQLiteAlchemyzL
    Test the sqlalchemy backend against an in-memory sqlite database.

    r#   c                 C  s   t  d¡| _d S r   r!  rv  r9   r9   r:   rk  [
  s    zTestSQLiteAlchemy.setup_enginec                 C  s
   d | _ d S rÊ   )Údriverrv  r9   r9   r:   rj  _
  s    zTestSQLiteAlchemy.setup_driverc                 C  s€   t  d| j¡}t|jjjtjƒs$t	‚t|j
jjtjƒs:t	‚t|jjjtjƒsPt	‚t|jjjtjƒsft	‚t|jjjtjƒs|t	‚d S r-  )r   r"   r<   r‹   rr   r7   r‰   rŒ   r�   rŽ   rs   r.  rt   ru   rv   rÐ  r9   r9   r:   r/  d
  s    z.TestSQLiteAlchemy.test_default_type_conversionc                 C  s(   t  d| j¡}t|jjjtjƒr$t	‚d S r-  rˆ  rÐ  r9   r9   r:   r‰  s
  s    z(TestSQLiteAlchemy.test_default_date_loadc              	   C  sV   t dddgidd�}|jd| jdd�dks.t‚t d ¡� t d| j¡ W 5 Q R X d S )	Nrì   r    r  r¢   ré   Ztest_bigintwarningFr5  )r   rå   r<   rŽ   r�   rõ   r   r"   rÐ  r9   r9   r:   Útest_bigint_warningy
  s    z%TestSQLiteAlchemy.test_bigint_warningc           	   	     sð   ddl m‰ m‰m‰ ddlm}m} |ƒ }G ‡ ‡‡fdd„d|ƒ}| j ¡ � |j	 
| j¡ W 5 Q R X || jd�}|ƒ �X}tddgdd	gd
œƒ}|jd| jddd�dks¬t‚| ¡  | |j|j¡}t|ƒ}W 5 Q R X t|jƒddgksìt‚d S )Nr   ©r,   rl   r/   )rð  Úsessionmakerc                      s(   e Zd ZdZ” ”dd�Z” ”dƒƒZdS )z>TestSQLiteAlchemy.test_row_object_is_named_tuple.<locals>.Testrý   Trô  é2   N)rc  rd  re  rõ  rö  Ústring_columnr9   r-  r9   r:   ÚTest’
  s   r1  rY   r    ZhelloZworld)rö  r0  rý   Frò   )rÃ  r¨   rã   r  rö  r0  )r6   r,   rl   r/   rù  rð  r.  r<   r_   r8   Z
create_allr   rå   rŽ   rl  r!  rö  r0  r  r³   )	r_  rð  r.  Z	BaseModelr1  rï  rü  r¦   Z
test_queryr9   r-  r:   Útest_row_object_is_named_tuple�
  s"    ÿÿz0TestSQLiteAlchemy.test_row_object_is_named_tupler   rT  c                   s<   t ƒ  ||¡}|dkr(| dddœ¡}n| dddœ¡}|S ©Nr'  r=  )r  r  zint64[pyarrow]©Úsuperr  r¥   ©r_  r%  r  r¦   ©Ú	__class__r9   r:   r  ¦
  s
    z(TestSQLiteAlchemy.dtype_backend_expectedr  r  r"   c                 C  s   d S rÊ   r9   )r_  r  r  r9   r9   r:   r  ¯
  s    z3TestSQLiteAlchemy.test_read_sql_dtype_backend_table)rc  rd  re  r¬  r�  r  rk  rj  r/  r‰  r,  r2  r  r½   r  r  r  Ú__classcell__r9   r9   r7  r:   r*  S
  s   

%	r*  c                      sN   e Zd ZdZdZdZedd„ ƒZedd„ ƒZdd	„ Z	d
dœ‡ fdd„Z
‡  ZS )ÚTestMySQLAlchemyzA
    Test the sqlalchemy backend against an MySQL database.

    r$   iê  c                 C  s(   t jd| j› d| j› d�| jd�| _d S )Nzmysql+z://root@localhost:ú/pandas)rº   )r6   r”   r+  Úportrº   r˜   rv  r9   r9   r:   rk  ¿
  s    þzTestMySQLAlchemy.setup_enginec                 C  s$   t  d¡}d| _d|jjji| _d S )Nr¸   r¹   )r½   r¾   r+  r¿   rÀ   rÁ   rº   )rw  r¸   r9   r9   r:   rj  Æ
  s    
zTestMySQLAlchemy.setup_driverc                 C  s   d S rÊ   r9   rh  r9   r9   r:   r/  Ì
  s    z-TestMySQLAlchemy.test_default_type_conversionr   rT  c                   s<   t ƒ  ||¡}|dkr(| dddœ¡}n| dddœ¡}|S r3  r4  r6  r7  r9   r:   r  Ï
  s
    z'TestMySQLAlchemy.dtype_backend_expected)rc  rd  re  r¬  r�  r<  r  rk  rj  r/  r  r9  r9   r9   r7  r:   r:  µ
  s   

r:  c                   @  s8   e Zd ZdZdZdZedd„ ƒZedd„ ƒZdd	„ Z	d
S )ÚTestPostgreSQLAlchemyzF
    Test the sqlalchemy backend against an PostgreSQL database.

    r%   i8  c                 C  s"   t  d| j› d| j› d�¡| _d S )Nzpostgresql+z://postgres:postgres@localhost:r;  )r6   r”   r+  r<  r˜   rv  r9   r9   r:   rk  ã
  s    ÿz"TestPostgreSQLAlchemy.setup_enginec                 C  s   t  d¡ d| _d S )NrÍ   )r½   r¾   r+  rv  r9   r9   r:   rj  é
  s    
z"TestPostgreSQLAlchemy.setup_driverc              	   C  s–  ddl m} tddgddgddgd	œƒ}| j ¡ � | j d
¡ | j d¡ W 5 Q R X |jd| jdd�dkspt‚|jd| jddd�dksŒt‚|jd| jddd�dks¨t‚t 	d| j¡}t
 ||¡ t 	d| j¡}t
 ||¡ tj	d| jdd�}t
 ||¡ tj	d| jdd�}t
 ||¡ d}tjt|d�� tj	d| jdd� W 5 Q R X | j ¡ � | j d
¡ | j d¡ W 5 Q R X |jd| jddd�dk�s”t‚|jd| jdddd� |jd| jdddd�dk�sÊt‚tj	d| jdd�}t
 t||gdd�|¡ t| j|ƒ�r’|  ¡ }	tj|	dd�}
|
j|ddd�dk�s2t‚|
j|dddd�dk�sNt‚|
j|dddd�dk�sjt‚tj	d| jdd�}|
 d¡}t
 ||¡ d S )Nr   rM   r    r  r1  rƒ   rì   rH  rI  z$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Ztest_schema_publicFr5  Ztest_schema_public_explicitÚpublic)r¨   rE  Ztest_schema_otherÚother)rE  z!Table test_schema_other not foundrï   )rE  r¨   rò   )rE  r¨   rã   rá   Tr  Ztest_schema_other2r  )r[   rN   r   r<   r_   r—   rå   rŽ   r   r"   r�   r6  r½   r  r	  r   r]   r^   r   Z
read_table)r_  rN   r¦   r8  r9  r  Zres4r
  rª  Zengine2Zpdsqlr9   r9   r:   Útest_schema_supportî
  sŽ       ÿýÿÿ  ÿÿûûùÿ
ÿÿÿÿ
z)TestPostgreSQLAlchemy.test_schema_supportN)
rc  rd  re  r¬  r�  r<  r  rk  rj  r@  r9   r9   r9   r:   r=  Ù
  s   

r=  c                   @  s²   e Zd ZdZdZejdd�dd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zej dddg¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'S )(ÚTestSQLiteFallbackzG
    Test the fallback mode against an in-memory sqlite database.

    r#   Tr®  c                 C  s0   |   ¡ | _|  |¡ |  |¡ t | j¡| _d S rÊ   )r^   r<   r‚  r„  r   r   r  r°  r9   r9   r:   r±  U  s    


zTestSQLiteFallback.setup_methodc                 C  s   |   ¡  d S rÊ   ro  rh  r9   r9   r:   rp  \  s    z*TestSQLiteFallback.test_read_sql_parameterc                 C  s   |   ¡  d S rÊ   rq  rh  r9   r9   r:   rr  _  s    z0TestSQLiteFallback.test_read_sql_named_parameterc                 C  s   |   |¡ d S rÊ   rs  r‹  r9   r9   r:   rt  b  s    z$TestSQLiteFallback.test_to_sql_emptyc                 C  sd   t ddddgddddgdœƒ}| j |d¡dks4t‚| j d¡sDt‚| j d¡ | j d¡r`t‚d S )Nru  rv  rw  rx  ry  Zdrop_test_framerŽ  )r   r  rå   rŽ   rÅ   r^  )r_  ræ  r9   r9   r:   Útest_create_and_drop_tablee  s    ÿz-TestSQLiteFallback.test_create_and_drop_tablec                 C  s   |   |¡ d S rÊ   r�  r‹  r9   r9   r:   rÄ  r  s    z!TestSQLiteFallback.test_roundtripc                 C  s   |   ¡  d S rÊ   r‚  rh  r9   r9   r:   rÇ  u  s    z#TestSQLiteFallback.test_execute_sqlc                 C  s€   t tdddƒtdddƒgdgd�}|jd| jdd�dks<t‚td	| jƒ}| jd
krft || 	t
¡¡ n| jdkr|t ||¡ d S )Nr¥  r    r  rì   r²   r¦  Fr5  zSELECT * FROM test_dater#   r$   )r   r   rå   r<   rŽ   r!   r�  r�   r6  r¥   r)   r  r9   r9   r:   r§  x  s    "

z%TestSQLiteFallback.test_datetime_dateÚtz_awareFc                 C  sž   |st dddƒt dddƒg}n$tdddd�}t| ¡ ƒ d	d
„ ¡}t|dgd�}|jd| jdd�dksjt‚t	d| jƒ}| j
dkrš| dd
„ ¡}t ||¡ d S )Nr¨  r   r    r©  r‘  r  r’  r“  c                 S  s   |   ¡ S rÊ   )Útimetz)rŒ  r9   r9   r:   r°  Š  r±  z7TestSQLiteFallback.test_datetime_time.<locals>.<lambda>rì   r²   rª  Fr5  zSELECT * FROM test_timer#   c                 S  s
   |   d¡S r«  r¬  r®  r9   r9   r:   r°  ’  r±  )r   r   r   Zto_pydatetimeÚmapr   rå   r<   rŽ   r!   r�  r²  r�   r6  )r_  rC  Ztz_timesZtz_dtr¦   rª  rL  r9   r9   r:   r´  ƒ  s    
z%TestSQLiteFallback.test_datetime_timec                 C  sT   t  dd|› d� | j¡}g }|jD ]*}t  d|› d�| j¡}| |j ¡ ¡ q$|S )Nz1SELECT * FROM sqlite_master WHERE type = 'index' zAND tbl_name = 'ú'zPRAGMA index_info(ú))r   r!   r<   rÔ   rá   rÏ  )r_  r0  r1  r¥  Zix_nameZix_infor9   r9   r:   r¤  •  s    
ÿý
z%TestSQLiteFallback._get_index_columnsc                 C  s   |   ¡  d S rÊ   r¾  rh  r9   r9   r:   r¿  ¡  s    z)TestSQLiteFallback.test_to_sql_save_indexc                 C  s   |   ¡  d S rÊ   rÀ  rh  r9   r9   r:   rÁ  ¤  s    z$TestSQLiteFallback.test_transactionsc           
      C  sT   | j  d|› d�¡}|D ] \}}}}}}	||kr|  S qtd|› d|› d�ƒ‚d S )NzPRAGMA table_info(rG  zTable z	, column r`  )r<   rA   r	  )
r_  r'  rc  ZrecsZcidrÔ   ÚctypeZnot_nullÚdefaultÚpkr9   r9   r:   re  §  s
    
z*TestSQLiteFallback._get_sqlite_column_typec              	   C  s  | j dkrt d¡ ddg}ddg}t||d�}| d| j¡d	ksFt‚|jd
| jddid�d	ksdt‚|  dd¡dksxt‚|  d
d¡dksŒt‚d}tjt	|d�� |jd| jdt
id� W 5 Q R X |jd| jdd�d	ksÚt‚|  dd¡dksît‚|  dd¡dk�st‚d S )Nr$   úNot applicable to MySQL legacyr©   rª   rÄ  rÅ  r²   rÆ  r  rÇ  ÚSTRINGré   rþ  z!B \(<class 'bool'>\) not a stringrï   r¨  rÉ  )r�  r½   rl  r   rå   r<   rŽ   re  r  r	  Úbool)r_  r#  r›   r¦   r
  r9   r9   r:   rÎ  ®  s    

 zTestSQLiteFallback.test_dtypec                 C  sÄ   | j dkrt d¡ tdd gƒttdddƒd gƒtdd gdd�td	d gƒd
œ}t|ƒ}d}| || j¡dkspt‚|  	|d¡dks„t‚|  	|d¡dks˜t‚|  	|d¡dks¬t‚|  	|d¡dksÀt‚d S )Nr$   rK  TrÏ  r†   r    r…  ré   rÿ  rÐ  rÔ  r  rÑ  rþ  rÒ  r2  rÓ  r-   r+   )
r�  r½   rl  r   r   r   rå   r<   rŽ   re  )r_  r#  r¦   ra  r9   r9   r:   rÖ  Ä  s    



üz#TestSQLiteFallback.test_notna_dtypec                 C  sâ   t ddgddggddgd�}d}tjt|d	�� | d
| j¡ W 5 Q R X tddddddddddg
ƒD ]x\}}| || j¡dks‚t‚t 	|| j¡ t ddgddggd|gd�}d|d›�}| || j¡dksÎt‚t 	|| j¡ qdd S )Nr    r  r0  rŽ  rì   r4  r²   z$Empty table or column name specifiedrï   r*  ztest_weird_name]ztest_weird_name[ztest_weird_name`ztest_weird_name"ztest_weird_name'z_b.test_weird_name_01-30z"_b.test_weird_name_01-30"Z99beginswithnumberZ12345r  Ztest_weird_col_namer  )
r   r½   r  r	  rå   r<   Ú	enumeraterŽ   r   Ztable_exists)r_  r¦   r
  ZndxZ
weird_namer  Zc_tblr9   r9   r:   Útest_illegal_namesØ  s.    öÿz%TestSQLiteFallback.test_illegal_namesN)rc  rd  re  r¬  r�  r½   r  r±  rp  rr  rt  rB  rÄ  rÇ  r§  r  r  r´  r¤  r¿  rÁ  re  rÎ  rÖ  rO  r9   r9   r9   r:   rA  M  s(   


rA  z'{}'z{:.8f}z{:d}c                 C  s   dS )NZNULLr9   )Úxr9   r9   r:   r°    r±  r°  z{:.10f}z'{!s}'c                 G  sJ   g }|D ]4}t |tƒr"t|ƒr"d }tt|ƒ }| ||ƒ¡ q| t|ƒ S rÊ   )r]   r£   r   Ú_formattersr‰   rá   rƒ  )r   rV  Zprocessed_argsÚargÚ	formatterr9   r9   r:   Úformat_query  s    rT  c              	   C  s8   t  |¡�}| | ¡ ¡ }W 5 Q R X |dkr0dS t|ƒS )z#Replace removed sql.tquery functionN)r   r    rA   rp  r  )r!  rÃ  rÆ  rª  r9   r9   r:   Útquery  s    rU  c                   @  s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestXSQLitec                 C  s*   |  ¡ }| dt |¡› �¡ | ¡  d S ri  )r@   rA   r   rk  rl  )r_  r“   r<   rG   r9   r9   r:   r^    s    zTestXSQLite.drop_tablec                 C  sØ   t  ¡ }tj|d|dd�dks"t‚t d|¡}|j|_|}t  ||¡ dgt|ƒ |d< | 	¡ }t
t t|ƒ¡tjd�d	 }| 	¡ |d
< tj|d|dd�dks¢t‚tjd|d
d�}| 	¡ }||_d
|j_t  ||¡ d S )Nr  F)rÔ   rÃ  r¨   r©  zselect * from test_tablerì   Útxtré   rÈ  ZIdxZtest_table2zselect * from test_table2rí  )r�   ÚmakeTimeDataFramer   rå   rŽ   r  r¨   r6  r   r  r   rŒ   r½  r¢   rÔ   )r_  rÞ   r   rN  rL  Zframe2Znew_idxr9   r9   r:   Ú
test_basic!  s0    ÿÿÿ  ÿzTestXSQLite.test_basicc           
      C  s”   t  ¡ }tj|jd< t |d¡}| ¡ }| |¡ d}| 	¡ D ]"\}}t
|f|žŽ }t||d� q>| ¡  tjd|d�}	|j|	_t j|	|dd� d S )N)r   r   rà   z(INSERT INTO test VALUES (%s, %s, %s, %s)rÂ  úselect * from testgü©ñÒMbP?)Zrtol)r�   rX  rŒ   r  rŠ   r   rø  r@   rA   ZiterrowsrT  rU  rl  r  r¨   r6  )
r_  rÞ   r   rú  rG   Úinsr¯  rT   Zfmt_sqlrN  r9   r9   r:   Útest_write_row_by_row>  s    
z!TestXSQLite.test_write_row_by_rowc           	   	   C  s–   t  ¡ }t |d¡}| ¡ }| |¡ d}|jd }t |¡�}| |t|ƒ¡ W 5 Q R X | 	¡  t 
d|¡}|jd d… |_t  ||d d… ¡ d S )Nrà   z$INSERT INTO test VALUES (?, ?, ?, ?)r   rZ  r    )r�   rX  r   rø  r@   rA   rŠ   r    rƒ  rl  r  r¨   r6  )	r_  rÞ   r   rú  rG   r[  rT   rÆ  rN  r9   r9   r:   Útest_executeP  s    

zTestXSQLite.test_executec                 C  s–   t  ¡ }t |d¡}| ¡ }|D ]6}| d¡}t|ƒdkr |d dkr |d dks t‚q tj|dddgd	�}| ¡ }d
|ks€t‚| ¡ }| 	|¡ d S )Nrà   ú r  r   r©   r    ZDATETIMErª   r&  zPRIMARY KEY ("A", "B"))
r�   rX  r   rø  Ú
splitlinesra  r   rŽ   r@   rA   )r_  rÞ   r   rú  ÚlinesÚlineÚtokensrG   r9   r9   r:   Útest_schema`  s    
zTestXSQLite.test_schemac              
   C  sj   d}|  ¡ }| |¡ t |¡�@}| d¡ | d¡ tjtjdd�� | d¡ W 5 Q R X W 5 Q R X d S )Núƒ
        CREATE TABLE test
        (
        a TEXT,
        b TEXT,
        c REAL,
        PRIMARY KEY (a, b)
        );
        ú,INSERT INTO test VALUES("foo", "bar", 1.234)z,INSERT INTO test VALUES("foo", "baz", 2.567)zExecution failed on sqlrï   z(INSERT INTO test VALUES("foo", "bar", 7))r@   rA   r   r    r½   r  r]  )r_  rÞ   rú  rG   rÆ  r9   r9   r:   Útest_execute_failo  s    	


zTestXSQLite.test_execute_failc              
   C  s‚   d}t  t d¡¡�8}| ¡ }| |¡ t |¡�}| d¡ W 5 Q R X W 5 Q R X d}tj	tj
|d�� td|d� W 5 Q R X d S )Nrd  rÜ   re  z$Cannot operate on a closed database.rï   rZ  rÂ  )rÝ   r   rf   r^   r@   rA   r   r    r½   r  ZProgrammingErrorrU  )r_  rú  r<   rG   rÆ  r
  r9   r9   r:   Útest_execute_closed_connectionƒ  s    	
z*TestXSQLite.test_execute_closed_connectionc                 C  s0   t dt d¡iƒ}tj||ddd�dks,t‚d S )NÚFromr†   ZtestkeywordsF©rÃ  rÔ   r¨   )r   rŒ   Zonesr   rå   rŽ   )r_  rÞ   r¦   r9   r9   r:   Útest_keyword_as_column_names˜  s    z(TestXSQLite.test_keyword_as_column_namesc                 C  sp   t ddgdgd�}tj||ddd�dks,t‚|}tdd	„ | d
¡D ƒƒ}|dksTt‚t d
|¡}t ||¡ d S )Nr    r  Zc0r²   Úmono_dfFri  c                 s  s   | ]}|d  V  qdS )r   Nr9   )rS   Zmy_c0r9   r9   r:   Ú	<genexpr>¤  s     z8TestXSQLite.test_onecolumn_of_integer.<locals>.<genexpr>zselect * from mono_dfr0  )	r   r   rå   rŽ   ÚsumrA   r  r�   r6  )r_  rÞ   rk  Zcon_xZthe_sumrN  r9   r9   r:   Útest_onecolumn_of_integerœ  s    z%TestXSQLite.test_onecolumn_of_integerc              	   C  s´  t ddgddgdœƒ}t dddgd	d
dgdœƒ}d}d|› �}d}tjt|d�� tj|||dd� W 5 Q R X |  ||¡ tj|||dd� d}tjt|d�� tj|||dd� W 5 Q R X tj|||ddd� t||d�ddgksèt‚tj|||ddd�dk�st‚t||d�dddgk�s"t‚|  ||¡ tj|||ddd�dk�sLt‚t||d�ddgk�sft‚tj|||ddd�dk�s„t‚t||d�dddddgk�s¤t‚|  ||¡ d S )Nr    r  r©   rª   )rJ  rK  r0  rŽ  r†   r«   r¬   ÚEZtable_if_existszSELECT * FROM z*'notvalidvalue' is not valid for if_existsrï   Znotvalidvalue)r   rÃ  rÔ   rã   r  z&Table 'table_if_exists' already existsrò   F)r   rÃ  rÔ   rã   r¨   rÂ  r£  r¼  )r0  r«   )rŽ  r¬   )r†   ro  rá   )	r   r½   r  r	  r   rå   r^  rU  rŽ   )r_  rÞ   Zdf_if_exists_1Zdf_if_exists_2r“   Z
sql_selectr
  r9   r9   r:   Útest_if_exists«  s˜    
ü   ÿüûûùÿ
ûùÿ
ûùÿ

ûzTestXSQLite.test_if_existsN)rc  rd  re  r^  rY  r\  r]  rc  rf  rg  rj  rn  rp  r9   r9   r9   r:   rV    s   rV  )N)�r¬  Ú
__future__r   rÝ   r   rC   r   r   r   r   rš   r   Úpathlibr
   rf   r  rŒ   r½   Zpandas._libsr   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsrO  Zpandas.core.dtypes.commonr   r   Zpandasró   r   r   r   r   r   r   r   r   r   r   Zpandas._testingZ_testingr�   Zpandas.core.arraysr   r   Zpandas.util.versionr   Z	pandas.ior   Zpandas.io.sqlr   r   r   r   r    r!   r"   r6   rh  rE  r  r;   rJ   rc   rh   rz   r|   r}   r’   r™   r  r�   r{   r§   r¶   r·   rÉ   rÌ   rÏ   rÐ   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÞ   rß   Zmysql_connectableZpostgresql_connectableZsqlite_connectableZsqlite_iris_connectableZsqlalchemy_connectableZsqlalchemy_connectable_irisZall_connectableZall_connectable_irisr  r   r  rç   rø   rù   r  r  r  r  r  r  r"  r$  r%  r,  r/  r:  rO  rT  rU  rV  rf  ru  r€  r­  rg  r  rP  ri  r*  r:  r=  rA  r�  r)   Zstr_Úbytesr£   rí   r‰   rØ  rM  rQ  rT  rU  rV  r9   r9   r9   r:   Ú<module>   s–  0$

ýøýí!



#












þþýý
ÿ

		$%

"    S LX      Lb#s 0         ÷
