U
    ùQ”ilÇ ã                   @  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   ú</tmp/pip-unpacked-wheel-58ppya8e/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   Zappend_column)r*   ri   rj   r,   rk   r-   rl   r.   r0   Z	date_typeZ	bool_typer8   rm   r9   r9   r:   Útypes_table_metadataÁ   s(    (õry   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<   rz   rG   rH   r9   r9   r:   Úcreate_and_load_types_sqlite3â   s
    
r{   )rz   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   ry   r\   r]   r^   r_   r`   ra   rA   )r<   rz   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:   rz   1  s.    ööórz   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)rz   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œ   rz   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œ   rz   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ø   ÚmethodZ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"    



 
r8  Ú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_bufr?  r²   r’   Z	sql_query©r9  r9   r:   Úpsql_insert_copy  s    



zBtest_copy_from_callable_insertion_method.<locals>.psql_insert_copyrŸ   r  r/  r‚   rë   Ún©Úcol1Úcol2Zcol3rû   F)r§   rù   )
rã   r   rä   r]   rì   r�   r   r"   rŽ   r4  )r<   r9  rå   rE  ÚexpectedÚresult_countÚresultr9   rD  r:   Ú(test_copy_from_callable_insertion_method  s    
   ÿ
rM  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    þrR  c              	   C  s*   t jtdd�� t d| ¡ W 5 Q R X d S )NrN  rî   rO  )rŽ   rô   rQ  r   rA   )rÞ   r9   r9   r:   Útest_execute_deprecatedB  s
    þrS  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__r`  r9   r9   r9   r:   rT  L  s   rT  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 rh  )r]  Ú	view_namer<   r9   r9   r:   rZ  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 rl  r9   )rS   r^  r9   r9   r:   rW   p  s     z.SQLiteMixIn._get_all_views.<locals>.<listcomp>rm  ro  r9   r9   r:   rY  n  s    
zSQLiteMixIn._get_all_viewsN)ra  rb  rc  r^   r\  r[  rZ  rY  r9   r9   r9   r:   rd  ^  s
   rd  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^   rf  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\  rk  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 rq  )	r—   r*   Zidentifier_preparerZquote_identifierrw  rx  ry  r_   r–   )r]  rr  r<   Zquoted_viewr9   r9   r:   rZ  †  s    
ÿ
zSQLAlchemyMixIn.drop_viewc                 C  s   ddl m} ||ƒ ¡ S rz  )r6   rÃ   Zget_view_namesr|  r9   r9   r:   rY  �  s    zSQLAlchemyMixIn._get_all_viewsN)
ra  rb  rc  Úclassmethodrv  r^   r\  r[  rZ  rY  r9   r9   r9   r:   rs  s  s   
	rs  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]  rz   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Ž   r4  ©r]  rµ   rL  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Ÿ   çÍÌÌÌÌÌ @Zline1©r  ç      ø?Z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)ra  rb  rc  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Úresr7  r9   r9   r:   Ú_transaction_testï  s0    
zPandasSQLTest._transaction_testN)r‹  )ra  rb  rc  Ú__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œ   rz   r9   r9   r:   Úsetup_method,  s    


z_TestSQLApi.setup_methodc                 C  s   t | jƒ d S rÉ   )rh   r<   rf  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Ž   r4  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_frame5Fr3  zSELECT * FROM test_frame5)r   rä   r<   r  rŽ   r4  )r]  r¶   rL  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_seriesFr3  zSELECT * FROM test_series)
r   r‹   Úaranger   rä   r<   r!   rŽ   r4  Ú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Ž   r4  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Ž   r4  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Ÿ   r.  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Ž   r4  )r]  r  re   r  r¤  r¦   rJ  rL  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¥   rK  rL  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 )NrH  rŒ  úSELECT * FROM test_index_labelÚtest_index_label©Úindex_labelr   )
r   Úranger§   rÓ   r   rä   r<   r!   r²   r�   )r]  rÛ  rà  rJ  Ú
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Œ  rH  )ZA0ÚA1)ÚB0ZB1r3  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â  rL  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Ž   r4  ©r]  r¥   rL  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Ž   r4  )r]  r7   r¥   rJ  rL  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  r.  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¿  rC  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›  çš™™™™™@r1  rß   r2  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_chunksizeFr3  zselect * from test_chunksizer   r  r  T©Zignore_indexrŸ   r6   )r   r‹   ÚrandomZrandnÚlisträ   r<   r   r!   r   rþ   r�   rŽ   r4  r  r"   )r]  r¥   r6  r7  ÚiZ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  r.  zJohn P. Doez	Jane Dove)Z	person_idÚperson_namer  ÚcategoryÚtest_categoricalFr3  zSELECT * FROM test_categorical)	r   Úcopyr¤   rä   r<   r   r!   rŽ   r4  )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  r.  rŒ  õ   Ã©r2  r±   Ztest_unicodeFr3  )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-a7f6Fr3  z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)	r   r‹   Únanrä   r<   r   r!   rŽ   r4  ©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  r.  r/  r‚   r0  )rë   r2  rp  Ú
test_tableFr3  z*SELECT a, b, a +1 as a, c FROM test_table;rŒ  rë   r2  rp  r±   )r   rä   r<   rò   r  rŽ   r4  )r]  r¥   rL  rJ  r9   r9   r:   Útest_read_sql_duplicate_columnsÛ  s     
þz+_TestSQLApi.test_read_sql_duplicate_columns)0ra  rb  rc  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—   rt  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µ   ÚcolsrL  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Ž   r4  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   r-  r   r   r   r   r<   ÚSQLTabler]   r%  rp  rˆ   r�   )r]  r-  r¥   r  r%  r9   r9   r:   Útest_sqlalchemy_type_mappingH  s    ÿz'TestSQLApi.test_sqlalchemy_type_mappingzinteger, expected)Zint8ÚSMALLINT)ZInt8r5  )Zuint8r5  )ZUInt8r5  )Zint16r5  )ZInt16r5  )Zuint16rú  )ZUInt16rú  )Úint32rú  )ZInt32rú  )Zuint32ÚBIGINT)ZUInt32r7  )r¡   r7  )ÚInt64r7  r¡   r7  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   r2  r}   )r   r   r   r<   r3  r)   r%  rp  rë   rˆ   r�   )r]  r,  rJ  r¥   r  r%  rL  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ë   r9  z1Unsigned 64 bit integer datatype is not supportedrî   r2  r}   )r   r   r   r<   r¼   r  r  r3  )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!   r4  )	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/dbnamer>  rî   zselect * from table©r¼   r  ÚImportErrorr   r  )r]  r<  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   rF  r  r;   r  Úwhererp  r4   r   r  r<   rB  r�   )r]  rF  r  r1   Zname_selectrC  rD  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  r.  rŒ  r…   )r¨   z%_variationZtest_column_percentageFr3  )r   rä   r<   r   r"   rŽ   r4  r  r9   r9   r:   Útest_column_with_percentageª  s    z&TestSQLApi.test_column_with_percentageN)ra  rb  rc  r¨  r  r  r}  r  r  r   r#  r$  r&  r   r4  r¼   r  r  rì   r‹   r7   rÓ   r:  r;  r=  ÚtdZskip_if_installedrA  rE  rH  rI  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É   re  )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_legacyFr3  rŒ  z!SELECT * FROM test_frame3_legacy;)	rŽ   rÑ   r   r^   r   rä   r�   r!   r4  )r]  r¶   rÓ   r<   rL  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
  r?  )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<   rV  rf  r9   r9   r:   rV  â  s    z„TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.closeN)ra  rb  rc  rS  rU  rV  r9   r9   r9   r:   ÚMockSqliteConnectionÛ  s   rV  rÛ   zSELECT 1)rÜ   r   rŽ   rô   rõ   r   r  )r]  rV  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Ž   r4  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]  rC  Ú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   r.  r/  Tr0  r2  r}   r-  )	r   r   r   r   r<   ZSQLiteTableZ
sql_schemar`  r�   )r]  r¥   r  r%  rC  r9   r9   r:   Útest_sqlite_type_mappingý  s    ÿz.TestSQLiteFallbackApi.test_sqlite_type_mappingN)rÛ   )ra  rb  rc  r¨  r  r  r^   rL  r¼   r  ÚskipifÚSQLALCHEMY_INSTALLEDrM  rW  r#  rY  r`  ra  r9   r9   r9   r:   rK  ´  s   


	rK  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_enginert  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   rW  rX  r¼   Úskipr  r€  r‚  r¬  r9   r9   r:   r­    s    
z_TestSQLAlchemy.setup_methodc                 C  s
   t ƒ ‚d S rÉ   ©ÚNotImplementedErrorrt  r9   r9   r:   re  '  s    z_TestSQLAlchemy.setup_driverc                 C  s
   t ƒ ‚d S rÉ   rh  rt  r9   r9   r:   rf  +  s    z_TestSQLAlchemy.setup_enginec                 C  s   |   ¡  d S rÉ   ©r†  rf  r9   r9   r:   Útest_read_sql_parameter/  s    z'_TestSQLAlchemy.test_read_sql_parameterc                 C  s   |   ¡  d S rÉ   ©r‡  rf  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{  ç      ð?ç       @ç      @ç      @©ZoneZ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{  rp  rq  rr  rs  rt  râ  rŒ  )r6   rÃ   r^   r   r   r   rä   r�   rÄ   r\  Úclear_cacheÚAttributeErrorru  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™  rf  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_bigintFr3  rŸ   )r   rä   r<   r�   r   r"   rŽ   r4  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Ø  )r_  Zexpected_datarJ  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<   rU  ÚnodeÚ
add_markerr¼   r  Úxfailrw   r   r7   r�   r)   r…  r„  r   r  r   r"   rŽ   rØ  )r]  rå   r(  r¥   r_  rJ  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:00r.  ú
US/Pacific©Úperiodsr„  Ztest_datetime_tzFr3  r%   rƒ  zSELECT * FROM test_datetime_tzr#   ©r   r¨   )r   r   rä   r<   r�   r  r…  Z
tz_convertZtz_localizer   r"   rŽ   r4  r!   r]   Úlocr)   r   )r]  rJ  rL  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   r3  Ztest_datetime_obbFr±   )r   r   rä   r<   r�   r   r"   rò   ZNaTrŽ   r4  )r]  rš   rL  rJ  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Únumsr3  Z	foo_tableZ	info_daterß  ré  F)Zcheck_names)r   Z
_with_freqr   rá  rä   r<   r�   r   r"   rŽ   r4  )r]  ÚdatesrJ  rL  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¥   Z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Š  r.  ©r�  rr  rì  Útest_datetimer§   rŸ   )ZaxisúSELECT * FROM test_datetimer#   rŽ  r¨   )r   r   r‹   r¹  rä   r<   r�   r   r"   r`   rŽ   r4  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Š  r.  r˜  rr  rì  ©rŸ   r¨   r™  Fr3  rš  r#   rŽ  r¨   rÐ  )rÒ  )r   r   r‹   r¹  r  r�  rä   r<   r�   r   r"   rŽ   r4  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_dateFr3  )	r   r   rä   r<   r�   r"   r   rŽ   rØ  )r]  r¥   r¦  rL  rJ  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_timeFr3  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Ž   r4  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_writeFr3  rŸ   T)Zcheck_dtypeZcheck_exact)r   r‹   r6  Úfloat32r   rä   r<   r�   r   r"   rŽ   r4  )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_nanFr3  r.  úSELECT * FROM test_nan)r   r‹   r  rä   r<   r�   r   r"   rŽ   r4  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°  Fr3  r.  r©   r~  r±  )r   r‹   r  rä   r<   r�   r   r"   rŽ   r4  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ë   r2  rì  r°  Fr3  r.  ©r  r©   r±  )r   r‹   r  rä   r<   r�   r�  r   r"   rŽ   r4  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]  r+  rÃ   rÆ   r,  r9   r9   r:   r   §  s
    

z"_TestSQLAlchemy._get_index_columnsc                 C  s   |   ¡  d S rÉ   ©r¢  rf  r9   r9   r:   Útest_to_sql_save_index°  s    z&_TestSQLAlchemy.test_to_sql_save_indexc                 C  s   |   ¡  d S rÉ   ©r§  rf  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Ž   r4  )	r]  r¶   re   rN   r_  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¥   r_  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…   r6  r¡   )Úf32Úf64Ú
f64_as_f32Úi32r  Ztest_dtypesFrñ   rÓ  é   )Z	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  r.  )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foobarFr3  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)ra  rb  rc  Ú__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Ž   r4  )r]  r  ræ  rç  Z	test_datarJ  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ø  rf  r9   r9   r:   Útest_options_get_engine©	  s    z'_TestSQLAlchemy.test_options_get_enginec                 C  s   d S rÉ   r9   rf  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_backendr.  ©r  r  ©	Údtype_backend_datarä   r<   rò   rø  rT  Údtype_backend_expectedrŽ   r4  ©	r]  Ústring_storagerý  r  r%  r¥   rL  rJ  Ú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  r.  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  rT  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   rO  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Ÿ   r.  r8  rè   r  r�  ç      @ÚFloat64rq  TFrë   r2  rp  ©rë   r2  rp  ÚdÚeÚfÚgÚh)r   r   r‹   r  rf  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ë   r2  rp  rè   rç   rŸ   r.  r8  r  r�  r  r  rq  TFÚbooleanr  r   )ÚArrowExtensionArrayc                   s$   i | ]}|ˆ ˆj ˆ| d d�ƒ“qS )T)Zfrom_pandas)ró   )rS   r_  ©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~  r1  rë   r2  r±   rß   Frñ   rþ  zSELECT * FROM testrŸ   )r7   r  )r   r¤   r  rä   r<   r!   rŽ   r4  )r]  r‡   r¥   rJ  rL  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  r.  r…   r1  Frñ   rþ  r   rë   )r7   r  rè   r  r¡   r8  )
r   rä   r<   rT  rò   r‹   rÐ  r   rŽ   r4  )r]  rý  r  r%  r¥   rL  rJ  r9   r9   r:   Útest_read_sql_dtype9
  s$    üþþÿ	z#_TestSQLAlchemy.test_read_sql_dtypeN)Bra  rb  rc  r¨  r  r}  r  r¼   r  r­  re  rf  rk  rm  ro  rv  ry  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:   rd    s†   



	

O
 
	#- (þ
 


%rd  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  rt  r9   r9   r:   rf  [
  s    zTestSQLiteAlchemy.setup_enginec                 C  s
   d | _ d S rÉ   )Údriverrt  r9   r9   r:   re  _
  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_bigintwarningFr3  )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)ra  rb  rc  rì  rí  Ústring_columnr9   r$  r9   r:   ÚTest’
  s   r(  rY   rŸ   ZhelloZworld)rí  r'  rû   Frñ   )r¿  r§   râ   r  rí  r'  )r6   r,   rl   r/   rð  rç  r%  r<   r_   r8   Z
create_allr   rä   r�   rj  r  rí  r'  r  r²   )	r]  rç  r%  Z	BaseModelr(  ræ  ró  r¥   Z
test_queryr9   r$  r:   Útest_row_object_is_named_tuple�
  s"    ÿÿz0TestSQLiteAlchemy.test_row_object_is_named_tupler   rO  c                   s<   t ƒ  ||¡}|dkr(| dddœ¡}n| dddœ¡}|S ©Nr  r8  )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)ra  rb  rc  r¨  r  r}  rf  re  r-  r‚  r#  r)  r  r¼   r  r  r  Ú__classcell__r9   r9   r.  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—   rt  r9   r9   r:   rf  ¿
  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¹   )ru  r·   r9   r9   r:   re  Æ
  s    
zTestMySQLAlchemy.setup_driverc                 C  s   d S rÉ   r9   rf  r9   r9   r:   r-  Ì
  s    z-TestMySQLAlchemy.test_default_type_conversionr   rO  c                   s<   t ƒ  ||¡}|dkr(| dddœ¡}n| dddœ¡}|S r*  r+  r-  r.  r9   r:   r  Ï
  s
    z'TestMySQLAlchemy.dtype_backend_expected)ra  rb  rc  r¨  r  r3  r}  rf  re  r-  r  r0  r9   r9   r.  r:   r1  µ
  s   

r1  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:r2  )r6   r“   r"  r3  r—   rt  r9   r9   r:   rf  ã
  s    ÿz"TestPostgreSQLAlchemy.setup_enginec                 C  s   t  d¡ d| _d S )NrÌ   )r¼   r½   r"  rt  r9   r9   r:   re  é
  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  r/  r‚   rë   rF  rG  z$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Ztest_schema_publicFr3  Ztest_schema_public_explicitÚpublic)r§   rC  Ztest_schema_otherÚother)rC  z!Table test_schema_other not foundrî   )rC  r§   rñ   )rC  r§   râ   rà   Tr  Ztest_schema_other2rþ  )r[   rN   r   r<   r_   r–   rä   r�   r   r"   rŽ   r4  r¼   r  r  r   r]   r^   r   Z
read_table)r]  rN   r¥   r6  r7  r  Zres4r  r¦  Zengine2Zpdsqlr9   r9   r:   Útest_schema_supportî
  sŽ       ÿýÿÿ  ÿÿûûùÿ
ÿÿÿÿ
z)TestPostgreSQLAlchemy.test_schema_supportN)
ra  rb  rc  r¨  r  r3  r}  rf  re  r7  r9   r9   r9   r:   r4  Ù
  s   

r4  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É   rj  rf  r9   r9   r:   rk  \  s    z*TestSQLiteFallback.test_read_sql_parameterc                 C  s   |   ¡  d S rÉ   rl  rf  r9   r9   r:   rm  _  s    z0TestSQLiteFallback.test_read_sql_named_parameterc                 C  s   |   |¡ d S rÉ   rn  r‰  r9   r9   r:   ro  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 )Nrp  rq  rr  rs  rt  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É   rz  r‰  r9   r9   r:   rÀ  r  s    z!TestSQLiteFallback.test_roundtripc                 C  s   |   ¡  d S rÉ   r{  rf  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ž  Fr3  zSELECT * FROM test_dater#   r$   )r   r   rä   r<   r�   r!   r  rŽ   r4  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¢  Fr3  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Ž   r4  )r]  r:  Ztz_timesZtz_dtr¥   r¦  rJ  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]  r+  r,  r¡  Zix_nameZix_infor9   r9   r:   r   •  s    
ÿý
z%TestSQLiteFallback._get_index_columnsc                 C  s   |   ¡  d S rÉ   r¶  rf  r9   r9   r:   r·  ¡  s    z)TestSQLiteFallback.test_to_sql_save_indexc                 C  s   |   ¡  d S rÉ   r¸  rf  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(r>  zTable z	, column r[  )r<   rA   r  )
r]  r%  r^  ZrecsZcidrÓ   ÚctypeZnot_nullÚdefaultÚpkr9   r9   r:   r`  §  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¼   rg  r   rä   r<   r�   r`  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$   rB  TrÇ  r…   rŸ   r~  rè   rû  rÈ  rÌ  r  rÉ  rú  rÊ  r-  rË  r-   r+   )
r  r¼   rg  r   r   r   rä   r<   r�   r`  )r]  r  r¥   r_  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  r.  rŒ  rë   r2  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)ra  rb  rc  r¨  r  r¼   r  r­  rk  rm  ro  r9  rÀ  rÃ  rŸ  r  r  r¬  r   r·  r¹  r`  rÆ  rÎ  rF  r9   r9   r9   r:   r8  M  s(   


r8  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   rQ  Zprocessed_argsÚargÚ	formatterr9   r9   r:   Úformat_query  s    rK  c              	   C  s8   t  |¡�}| | ¡ ¡ }W 5 Q R X |dkr0dS t|ƒS )z#Replace removed sql.tquery functionN)r   r    rA   rn  r  )r  r¿  rÂ  r¦  r9   r9   r:   Útquery  s    rL  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 rg  )r@   rA   r   ri  rj  )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§   r4  rþ   r  r   r‹   r¹  r¡   rÓ   )r]  rÝ   r~   rL  rJ  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Ž   rO  r‹   r  r‰   r   rô  r@   rA   ZiterrowsrK  rL  rj  r  r§   r4  )
r]  rÝ   r~   rö  rG   Úinsr§  rT   Zfmt_sqlrL  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   rQ  rŸ   )rŽ   rO  r   rô  r@   rA   r‰   r    r�  rj  r  r§   r4  )	r]  rÝ   r~   rö  rG   rR  rT   rÂ  rL  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Ž   rO  r   rô  Ú
splitlinesr\  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  rX  )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 )Nr[  rÛ   r\  z$Cannot operate on a closed database.rî   rQ  r¾  )rÜ   r   rf   r^   r@   rA   r   r    r¼   r  ZProgrammingErrorrL  )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_dfFr`  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_dfr.  )	r   r   rä   r�   ÚsumrA   r  rŽ   r4  )r]  rÝ   rb  Zcon_xZthe_sumrL  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©   )rH  rI  r.  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´  )r.  rª   )rŒ  r«   )r…   rf  rà   )	r   r¼   r  r  r   rä   r\  rL  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)ra  rb  rc  r\  rP  rS  rT  rZ  r]  r^  ra  re  rg  r9   r9   r9   r:   rM    s   rM  )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_decoratorsrJ  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   rc  r@  r  r;   rJ   rc   rh   ry   r{   r|   r‘   r˜   r  rœ   rz   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-  r8  rM  rR  rS  rT  rd  rs  r~  r©  rb  r  rK  rd  r!  r1  r4  r8  r–  r)   Zstr_Úbytesr¢   rì   rˆ   rÐ  rD  rH  rK  rL  rM  r9   r9   r9   r:   Ú<module>   s–  0$

ýøýí!



#












þþýý
ÿ

		$%

"    S LX      Lb#s 0         ÷
