a
    nÝEb� ã                   @  sB  d Z ddlmZ ddlZddl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  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  m&Z& dd	l%m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. zddl/Z/d
Z0W n e1�y$   dZ0Y n0 ddddœddddœddddœdœZ2ddœdd„Z3dddœdd„Z4ddd œd!d"„Z5d#d$„ Z6ddœd%d&„Z7dd'd(œd)d*„Z8d'dd+œd,d-„Z9d.d/œd0d1„Z:dd2œd3d4„Z;ej<d5d6„ ƒZ=ej<d7d8„ ƒZ>ej<d9d:„ ƒZ?ej<d;d<„ ƒZ@ej<d=d>„ ƒZAej<d?d@„ ƒZBej<dAdB„ ƒZCej<dCdD„ ƒZDej<dEdF„ ƒZEej<dGdH„ ƒZFej<dIdJ„ ƒZGej<dKdL„ ƒZHej<dMdN„ ƒZIej<dOdP„ ƒZJej<dQdR„ ƒZKd@dBgZLdDdFgZMdHdJgZNdLdNgZOeLeM eN ZPeLeM eO ZQePdPg ZReQdRg ZSejTjUejT VdSeR¡ejT VdTddUg¡dVdW„ ƒƒƒZWejTjUejT VdSeR¡ejT VdXdYdZg¡d[d\„ ƒƒƒZXejTjUejT VdSeR¡d]d^„ ƒƒZYejTjUejT VdSeS¡d_d`„ ƒƒZZejTjUejT VdSeP¡dadb„ ƒƒZ[ejTjUejT VdSeL¡dcdd„ ƒƒZ\ejTjUejT VdSeL¡dedf„ ƒƒZ]ejTjUejT VdSeM¡dgdh„ ƒƒZ^G didj„ djƒZ_G dkdl„ dle_ƒZ`G dmdn„ dne_ƒZaG dodp„ dpƒZbG dqdr„ drebƒZcejTjdejTjee0 dsdt�G dudv„ dveaecƒƒƒZfG dwdx„ dxƒZgejTjdG dydz„ dzegefƒƒZhejTjdG d{d|„ d|e`ecƒƒZiG d}d~„ d~eaebƒZjG dd€„ d€egejƒZkG d�d‚„ d‚ƒZlG dƒd„„ d„ƒZmG d…d†„ d†ƒZnejTjdejTjUG d‡dˆ„ dˆemejƒƒƒZoejTjdejTjUG d‰dŠ„ dŠemekƒƒƒZpejTjdejTjUG d‹dŒ„ dŒenejƒƒƒZqejTjdejTjUG d�dŽ„ dŽenekƒƒƒZrejTjdG d�d�„ d�elejƒƒZsejTjdG d‘d’„ d’elekƒƒZtejTjdG d“d”„ d”e`ebƒƒZued•jvewd•jvejxd•jveyd•jvezd–jve{d—jve|dƒd˜d™„ ej}dšjve~d›jvi	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, `_TestSQLAlchemyConn` tests the API with a SQLAlchemy
      Connection object. The different tested flavors (sqlite3, MySQL,
      PostgreSQL) derive from the base class
    - Tests for the fallback mode (`TestSQLiteFallback`)

é    )ÚannotationsN)ÚdateÚdatetimeÚtime)ÚStringIO©ÚPath)Úis_datetime64_dtypeÚis_datetime64tz_dtype)
Ú	DataFrameÚIndexÚ
MultiIndexÚSeriesÚ	TimestampÚconcatÚ
date_rangeÚisnaÚto_datetimeÚto_timedelta)ÚSQLAlchemyEngineÚSQLDatabaseÚSQLiteDatabaseÚ_gt14Ú
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ÚSepalLengthZ
SepalWidthZPetalLengthZ
PetalWidthÚNameéÈ   )Ú
sqlalchemyr%   r&   r'   r(   r)   r*   )
r$   r%   r&   r'   r(   r)   r*   ÚdtypeÚmetadatar+   © r2   úX/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/pandas/tests/io/test_sql.pyÚiris_table_metadataf   s     	ù	r4   zsqlite3.Connectionr   )ÚconnÚ	iris_filec                 C  sh   |   ¡ }d}| |¡ |jd d��2}t |¡}t|ƒ d}| ||¡ W d   ƒ n1 sZ0    Y  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)r5   r6   ÚcurÚstmtÚcsvfiler=   r2   r2   r3   Úcreate_and_load_iris_sqlite3~   s    

rC   )r6   r$   c           
   
     s  ddl m} ddlm} t|ƒ}|j| dd� |j| d� |jd d��²}t 	|¡}t
|ƒ‰ ‡ fdd	„|D ƒ}||ƒ |¡}	t| |ƒrà|  ¡ �B} |  ¡ � |  |	¡ W d   ƒ n1 s¶0    Y  W d   ƒ qê1 sÔ0    Y  n
|  |	¡ W d   ƒ n1 sþ0    Y  d S )
Nr   ©Úinsert©ÚEngineT©Z
checkfirst©Úbindr7   c                   s    g | ]}d d„ t ˆ |ƒD ƒ‘qS )c                 S  s   i | ]\}}||“qS r2   r2   )Ú.0ÚkeyÚvaluer2   r2   r3   Ú
<dictcomp>š   ó    z3create_and_load_iris.<locals>.<listcomp>.<dictcomp>)Úzip©rK   Úrow©Úheaderr2   r3   Ú
<listcomp>š   rO   z(create_and_load_iris.<locals>.<listcomp>)r/   rE   Úsqlalchemy.enginerG   r4   ÚdropÚcreater;   r<   r=   r>   ÚvaluesÚ
isinstanceÚconnectÚbeginr:   )
r5   r6   r$   rE   rG   r+   rB   r=   ÚparamsrA   r2   rS   r3   Úcreate_and_load_iris�   s    



Hr^   c              	   C  s¸   d}t | tjƒr$|  ¡ }| |¡ n�ddlm} ddlm} ||ƒ}t | |ƒrª|  	¡ �B} |  
¡ � |  |¡ W d   ƒ n1 s€0    Y  W d   ƒ q´1 sž0    Y  n
|  |¡ d S )Nz+CREATE VIEW iris_view AS SELECT * FROM irisr   ©ÚtextrF   )rZ   Úsqlite3Ú
Connectionr9   r:   r/   r`   rV   rG   r[   r\   )r5   rA   r@   r`   rG   r2   r2   r3   Úcreate_and_load_iris_view¤   s    


Hrc   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(   r*   r   ÚtypesÚTextColÚDateColÚ
IntDateColÚIntDateOnlyColÚFloatColÚIntColÚBoolColÚIntColWithNullÚBoolColWithNullr   ÚDateColWithTzT)Útimezone)
r/   rd   re   r&   rf   r'   rg   r(   r*   Úappend_column)r$   rd   re   r&   rf   r'   rg   r(   r*   Z	date_typeZ	bool_typer1   rh   r2   r2   r3   Útypes_table_metadata¶   s(    (õru   z
list[dict])r5   Ú
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(?, ?, ?, ?, ?, ?, ?, ?, ?)
            )r9   r:   r?   )r5   rv   r@   rA   r2   r2   r3   Úcreate_and_load_types_sqlite3×   s
    
rw   )rv   r$   c              	   C  s¼   ddl m} ddlm} t|ƒ}|j| dd� |j| d� ||ƒ |¡}t| |ƒr®|  	¡ �B} |  
¡ � |  |¡ W d   ƒ n1 s„0    Y  W d   ƒ q¸1 s¢0    Y  n
|  |¡ d S )Nr   rD   rF   TrH   rI   )r/   rE   rV   rG   ru   rW   rX   rY   rZ   r[   r\   r:   )r5   rv   r$   rE   rG   rh   rA   r2   r2   r3   Úcreate_and_load_typesí   s    


Hrx   r   ©Úframec                 C  s<   | j d j}| jd }t|tjƒs&J ‚t |jg d¢¡ d S )Nr   ©çffffff@g      @gffffffö?çš™™™™™É?úIris-setosa)	ÚdtypesÚtypeÚilocÚ
issubclassÚnpÚfloatingÚtmÚequalContentsrY   )rz   ZpytyperR   r2   r2   r3   Úcheck_iris_frameþ   s    
r‡   )Ú
table_namec                 C  sž   d|› �}t | tjƒr*|  ¡ }| |¡}nhddlm} ddlm} ||ƒ}t | |ƒrˆ|  	¡ �} |  |¡}W d   ƒ q’1 s|0    Y  n
|  |¡}| 
¡ d S )Nz SELECT count(*) AS count_1 FROM r   r_   rF   )rZ   ra   rb   r9   r:   r/   r`   rV   rG   r[   Úfetchone)r5   rˆ   rA   r@   Úresultr`   rG   r2   r2   r3   Ú
count_rows  s    


*
r‹   c                 C  s   | ddddƒ}t |ƒS )NÚioÚdatar<   ziris.csvr   )ÚdatapathÚ	iris_pathr2   r2   r3   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)
ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   ú2000-01-04 00:00:00i 'âPi\¸2z2000-06-01 00:00:00-07:00r2   r2   r2   r2   r3   rv     s.    ööórv   c              
   C  s2   ddddddddddœ	}t | ƒ}|| ¡   |¡S )Nr#   Úint64Úfloat)	ri   rj   rk   rl   rm   rn   ro   rp   rq   )r   ÚkeysÚastype)rv   r   Údfr2   r2   r3   Útypes_data_frame;  s    ÷r™   c                  C  s   g d¢} g d¢}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�   r2   r2   r3   Útest_frame1L  s    r¨   c                  C  s   g d¢} g d¢}t || d�S )N)rš   r›   rœ   ))r‘   iÿÿÿgZØÓÍÿ¿)r“   iãÿÿÿrŸ   )r    i N  r¡   )r¢   iÍ�ûÿr£   r¤   r¦   r§   r2   r2   r3   Útest_frame3p  s    r©   c           	   	   c  sö   t  d¡}t  d¡}|jdd|jjjid�}tƒ r<| |¡n|}| d¡sVt	|| dƒ | d¡s€|D ]}| 
d	¡ qdt||dƒ |V  | ¡ �L}| ¡ �$ | d
¡}| |¡ W d   ƒ n1 sÂ0    Y  W d   ƒ n1 sà0    Y  | ¡  d S )Nr/   Úpymysqlz*mysql+pymysql://root@localhost:3306/pandasÚclient_flag©Úconnect_argsr+   r   rh   rr   ú DROP TABLE IF EXISTS test_frame;)ÚpytestÚimportorskipÚcreate_engineÚ	constantsÚCLIENTÚMULTI_STATEMENTSr   ÚinspectÚ	has_tabler^   Úpoprx   r[   r\   r`   r:   Údispose)	r�   rv   r/   rª   ÚengineÚcheck_targetÚentryr5   rA   r2   r2   r3   Úmysql_pymysql_engine|  s&    

þ




Fr¼   c                 c  s   |   ¡ V  d S ©N©r[   )r¼   r2   r2   r3   Úmysql_pymysql_conn“  s    r¿   c              	   c  sÔ   t  d¡}t  d¡ | d¡}tƒ r.| |¡n|}| d¡sHt|| dƒ | d¡s^t||dƒ |V  | ¡ �L}| 	¡ �$ | 
d¡}| |¡ W d   ƒ n1 s 0    Y  W d   ƒ n1 s¾0    Y  | ¡  d S )Nr/   Úpsycopg2z=postgresql+psycopg2://postgres:postgres@localhost:5432/pandasr+   r   rh   r®   )r¯   r°   r±   r   rµ   r¶   r^   rx   r[   r\   r`   r:   r¸   )r�   rv   r/   r¹   rº   r5   rA   r2   r2   r3   Úpostgresql_psycopg2_engine˜  s     

ÿ




FrÁ   c                 c  s   |   ¡ V  d S r½   r¾   )rÁ   r2   r2   r3   Úpostgresql_psycopg2_conn¬  s    rÂ   c                  c  s&   t  d¡} |  d¡}|V  | ¡  d S )Nr/   z	sqlite://)r¯   r°   r±   r¸   )r/   r¹   r2   r2   r3   Úsqlite_engine±  s    

rÃ   c                 c  s   |   ¡ V  d S r½   r¾   )rÃ   r2   r2   r3   Úsqlite_conn¹  s    rÄ   c                 C  s   t | |dƒ | S )Nr   )r^   )rÃ   r�   r2   r2   r3   Úsqlite_iris_engine¾  s    rÅ   c                 c  s   |   ¡ V  d S r½   r¾   )rÅ   r2   r2   r3   Úsqlite_iris_connÄ  s    rÆ   c                  c  s   t  d¡} | V  |  ¡  d S ©Nú:memory:)ra   r[   Úclose)r5   r2   r2   r3   Úsqlite_buildinÉ  s    
rÊ   c                 C  s   t | |ƒ | S r½   )rC   )rÊ   r�   r2   r2   r3   Úsqlite_buildin_irisÐ  s    
rË   r5   ÚmethodZmultic                 C  sJ   |  | ¡} t| ƒ}|j|d|d� | d¡s0J ‚t| dƒt|ƒksFJ ‚d S )NÚ
test_frame©rÌ   ©Úgetfixturevaluer   Úto_sqlr¶   r‹   Úlen)r5   rÌ   r¨   ÚrequestÚ	pandasSQLr2   r2   r3   Útest_to_sqlö  s
    
rÕ   zmode, num_row_coef)Úreplacer’   )Úappendé   c                 C  s^   |  | ¡} t| ƒ}|j|ddd� |j|d|d� | d¡s@J ‚t| dƒ|t|ƒ ksZJ ‚d S )NrÍ   Úfail©Ú	if_existsrÏ   )r5   ÚmodeZnum_row_coefr¨   rÓ   rÔ   r2   r2   r3   Útest_to_sql_exist  s    
rÝ   c                 C  sv   |  | ¡} t| ƒ}|j|ddd� | d¡s0J ‚d}tjt|d��  |j|ddd� W d   ƒ n1 sh0    Y  d S )NrÍ   rÙ   rÚ   z!Table 'test_frame' already exists©Úmatch)rÐ   r   rÑ   r¶   r¯   ÚraisesÚ
ValueError)r5   r¨   rÓ   rÔ   Úmsgr2   r2   r3   Útest_to_sql_exist_fail  s    
rã   c                 C  s(   |  | ¡} t| ƒ}| d¡}t|ƒ d S )NúSELECT * FROM iris)rÐ   r   Ú
read_queryr‡   )r5   rÓ   rÔ   Ú
iris_framer2   r2   r3   Útest_read_iris  s    

rç   c                   sh   |  | ¡} t| ƒ}g ‰ ‡ fdd„}|j|d|d� | d¡s@J ‚ˆ dgksNJ ‚t| dƒt|ƒksdJ ‚d S )Nc                   s2   ˆ  d¡ ‡ fdd„|D ƒ}| | j ¡ |¡ d S )Nr’   c                   s   g | ]}t tˆ |ƒƒ‘qS r2   )ÚdictrP   rQ   ©r–   r2   r3   rU   -  rO   z8test_to_sql_callable.<locals>.sample.<locals>.<listcomp>)r×   r:   ÚtablerE   )Zpd_tabler5   r–   Ú	data_iterr�   ©Úcheckré   r3   Úsample+  s    
z$test_to_sql_callable.<locals>.samplerÍ   rÎ   r’   rÏ   )r5   r¨   rÓ   rÔ   rî   r2   rì   r3   Útest_to_sql_callable#  s    
rï   c                 C  sˆ   |  | ¡} t d| ¡}t|jjjtjƒs,J ‚t|j	jjtj
ƒsBJ ‚t|jjjtj
ƒsXJ ‚t|jjjtjƒsnJ ‚t|jjjtjƒs„J ‚d S ©Nrh   )rÐ   Úsqlr   r‚   rm   r0   r€   rƒ   r„   rn   Úintegerro   rp   rq   )r5   rÓ   r˜   r2   r2   r3   Útest_default_type_conversion6  s    
ró   c           	   	   C  sø   |  | ¡} ddlm} ddlm} tg d¢g d¢dœƒ}|jd| dd	� d
}||ƒ}t| |ƒrº|  ¡ �B}| 	¡ � | 
|¡ W d   ƒ n1 s�0    Y  W d   ƒ qÄ1 s®0    Y  n
|  
|¡ t d| ¡}t ||¡ t d| ¡}t ||¡ d S )Nr   r_   rF   ©r’   rØ   é   )çš™™™™™¹?r}   g333333Ó?©ÚaÚbrÍ   F©rš   z}DROP PROCEDURE IF EXISTS get_testdb;

    CREATE PROCEDURE get_testdb ()

    BEGIN
        SELECT * FROM test_frame;
    ENDzCALL get_testdb();)rÐ   r/   r`   rV   rG   r   rÑ   rZ   r[   r\   r:   rñ   r   r…   Úassert_frame_equalÚread_sql)	r5   rÓ   r`   rG   r˜   ÚprocZengine_connÚres1Úres2r2   r2   r3   Útest_read_procedureI  s     



H
r   c                 C  s\   dd„ }|  | ¡} tddgddgddgd	œƒ}|jd
| d|d� t d
| ¡}t ||¡ d S )Nc                 S  sª   |j }| ¡ �ˆ}tƒ }t |¡}| |¡ | d¡ d dd„ |D ƒ¡}| jrb| j› d| j	› �}	n| j	}	d|	› d|› d�}
|j
|
|d	� W d   ƒ n1 sœ0    Y  d S )
Nr   z, c                 S  s   g | ]}d |› d �‘qS )ú"r2   )rK   Úkr2   r2   r3   rU   }  rO   zVtest_copy_from_callable_insertion_method.<locals>.psql_insert_copy.<locals>.<listcomp>Ú.zCOPY z (z) FROM STDIN WITH CSV)rñ   Úfile)Ú
connectionr9   r   r<   ÚwriterÚ	writerowsÚseekÚjoinÚschemaÚnameZcopy_expert)rê   r5   r–   rë   Z
dbapi_connr@   Zs_bufr  r¥   rˆ   Z	sql_queryr2   r2   r3   Úpsql_insert_copyt  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û   )r5   rÓ   r  ÚexpectedrŠ   r2   r2   r3   Ú(test_copy_from_callable_insertion_methodn  s    
r  c                   @  s   e Zd Zdd„ ZdS )Ú	MixInBasec                 C  s.   t | dƒr*|  ¡ D ]}|  |¡ q|  ¡  d S )Nr5   )ÚhasattrÚ_get_all_tablesÚ
drop_tableÚ_close_conn)ÚselfrÌ   Útblr2   r2   r3   Úteardown_methodŽ  s    
zMixInBase.teardown_methodN)Ú__name__Ú
__module__Ú__qualname__r  r2   r2   r2   r3   r  �  s   r  c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSQLiteMixInc                 C  s&   | j  dt |¡› �¡ | j  ¡  d S ©NzDROP TABLE IF EXISTS )r5   r:   rñ   Ú_get_valid_sqlite_nameÚcommit©r  rˆ   r2   r2   r3   r  —  s    ÿzSQLiteMixIn.drop_tablec                 C  s   | j  d¡}dd„ | ¡ D ƒS )Nz1SELECT name FROM sqlite_master WHERE type='table'c                 S  s   g | ]}|d  ‘qS )r   r2   )rK   rê   r2   r2   r3   rU   Ÿ  rO   z/SQLiteMixIn._get_all_tables.<locals>.<listcomp>)r5   r:   Úfetchall)r  Úcr2   r2   r3   r  �  s    zSQLiteMixIn._get_all_tablesc                 C  s   | j  ¡  d S r½   ©r5   rÉ   ©r  r2   r2   r3   r  ¡  s    zSQLiteMixIn._close_connN©r  r  r  r  r  r  r2   r2   r2   r3   r  –  s   r  c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSQLAlchemyMixInc                 C  s   t  | j¡ |¡ d S r½   )rñ   r   r5   r  r"  r2   r2   r3   r  ¦  s    zSQLAlchemyMixIn.drop_tablec                 C  s   ddl m} || jƒ ¡ S )Nr   ©rµ   )r/   rµ   r5   Zget_table_names)r  rµ   r2   r2   r3   r  ©  s    zSQLAlchemyMixIn._get_all_tablesc                 C  s   | j  ¡  d S r½   )r5   r¸   r&  r2   r2   r3   r  ®  s    zSQLAlchemyMixIn._close_connNr'  r2   r2   r2   r3   r(  ¥  s   r(  c                   @  sv   e Zd ZdZejdd„ ƒZej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  sL   t | dƒs|  ¡  |  d¡ t| jtjƒr8t| j|ƒ nt| j|| j	ƒ d S )Nr5   r+   )
r  Úsetup_connectr  rZ   r5   ra   rb   rC   r^   Úflavor)r  r�   r2   r2   r3   Úload_iris_data¹  s    

zPandasSQLTest.load_iris_datac                 C  sn   t | dƒs|  ¡  | jdkr0|D ]}| d¡ q t| jtjƒrZdd„ |D ƒ}t| j|ƒ nt	| j|| jƒ d S )Nr5   r   rr   c                 S  s   g | ]}t | ¡ ƒ‘qS r2   )ÚtuplerY   )rK   r»   r2   r2   r3   rU   Ë  rO   z1PandasSQLTest.load_types_data.<locals>.<listcomp>)
r  r+  r,  r·   rZ   r5   ra   rb   rw   rx   )r  rv   r»   r2   r2   r3   Úload_types_dataÃ  s    

zPandasSQLTest.load_types_datac                 C  s2   t d | j }ddg}| jj||d�}t|ƒ d S )Nr    r~   r|   ©r]   ©ÚSQL_STRINGSr,  rÔ   rå   r‡   ©r  Úqueryr]   ræ   r2   r2   r3   Ú_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  Úlengthr0  r1  r3  r2   r2   r3   Ú_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"   r0  r1  )r  r4  ræ   r2   r2   r3   Ú(_read_sql_iris_no_parameter_with_percentÜ  s    z6PandasSQLTest._read_sql_iris_no_parameter_with_percentc                 C  s.   |   d¡ | j |jd d… d¡dks*J ‚d S )Nr¨   r   )r  rÔ   rÑ   r�   ©r  r¨   r2   r2   r3   Ú_to_sql_emptyá  s    
zPandasSQLTest._to_sql_emptyÚautoc                 K  sj   |   d¡ | jj|dfd|i|¤Ždks,J ‚| j d¡s<J ‚t|ƒ}t| jdƒ}||ks\J ‚|   d¡ dS )z `to_sql` with the `engine` paramr¨   r¹   é   N)r  rÔ   rÑ   r¶   rÒ   r‹   r5   )r  r¨   r¹   Zengine_kwargsÚnum_entriesÚnum_rowsr2   r2   r3   Ú_to_sql_with_sql_engineå  s     
ÿÿÿýÿz%PandasSQLTest._to_sql_with_sql_enginec                 C  sR   |   d¡ | j |d¡dks J ‚| 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å   Ú	set_indexrš   r  r…   rû   ©r  r¨   rŠ   r2   r2   r3   Ú
_roundtripù  s    
zPandasSQLTest._roundtripc                 C  s(   | j  d¡}| ¡ }t |g d¢¡ d S )Nrä   r{   )rÔ   r:   r‰   r…   r†   ©r  Ziris_resultsrR   r2   r2   r3   Ú_execute_sql  s    zPandasSQLTest._execute_sqlc                 C  sN   t jddgg d¢dgd�}| j |d¡dks0J ‚|  d¡}|dggksJJ ‚d S )N©r’   çÍÌÌÌÌÌ @Úline1©rØ   g      ø?Úline2©r›   rœ   r�   r›   ©r¥   rš   Ztest_to_sql_saves_indexrØ   )r   Úfrom_recordsrÔ   rÑ   Ú_get_index_columns)r  r˜   Úix_colsr2   r2   r3   Ú_to_sql_save_index  s    ÿ
z PandasSQLTest._to_sql_save_indexc                 C  sb  | j  ¡ �J}d}t| j tƒr(| |¡ nddlm} ||ƒ}| |¡ W d   ƒ n1 sZ0    Y  G dd„ dtƒ}d}t| j tƒr˜ddlm} ||ƒ}z@| j  ¡ �"}| |¡ |dƒ‚W d   ƒ n1 sÌ0    Y  W n |yê   Y n0 | j  	d¡}t
|ƒdk�s
J ‚| j  ¡ �}| |¡ W d   ƒ n1 �s60    Y  | j  	d¡}t
|ƒd	k�s^J ‚d S )
Nz'CREATE TABLE test_trans (A INT, B TEXT)r   r_   c                   @  s   e Zd ZdS )z7PandasSQLTest._transaction_test.<locals>.DummyExceptionN©r  r  r  r2   r2   r2   r3   ÚDummyException  s   rU  z/INSERT INTO test_trans (A,B) VALUES (1, 'blah')ÚerrorzSELECT * FROM test_transr’   )rÔ   Zrun_transactionrZ   r   r:   r/   r`   Ú	Exceptionr   rå   rÒ   )r  ZtransrA   r`   rU  Zins_sqlÚresrÿ   r2   r2   r3   Ú_transaction_test  s0    (
**zPandasSQLTest._transaction_testN)r;  )r  r  r  Ú__doc__r¯   Úfixturer-  r/  r5  r7  r8  r:  r?  rF  rH  rS  rY  r2   r2   r2   r3   r*  ³  s   
	

r*  c                
   @  s   e Zd ZU dZdZded< d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dd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zej d%g d&¢¡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 d4g d5¢¡d6d7„ ƒZ!d8d9„ Z"d:d;„ Z#ej d<d=e$e%e$e%d>œg¡d?d@„ ƒZ&dAdB„ Z'dCdD„ Z(dEdF„ Z)dGdH„ Z*dIdJ„ Z+dKdL„ Z,dMdN„ Z-dOdP„ Z.dQdR„ Z/d=S )SÚ_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Ü   c                 C  s   |   ¡ | _d S r½   ©r[   r5   r&  r2   r2   r3   r+  P  s    z_TestSQLApi.setup_connectT©Úautousec                 C  s   |   ¡  d S r½   )Úload_test_data_and_sql©r  r-  r/  r2   r2   r3   Úsetup_methodS  s    z_TestSQLApi.setup_methodc                 C  s   t | jƒ d S r½   )rc   r5   r&  r2   r2   r3   r`  W  s    z"_TestSQLApi.load_test_data_and_sqlc                 C  s   t  d| j¡}t|ƒ d S )NzSELECT * FROM iris_view)rñ   r   r5   r‡   ©r  ræ   r2   r2   r3   Útest_read_sql_viewZ  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.0é   ©Ú	chunksize)rñ   r   r5   r…   rû   r   )r  r4  Z
with_batchZwithout_batchr2   r2   r3   Ú&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"J ‚d S )Nr¨   )rñ   rÑ   r5   r¶   r9  r2   r2   r3   rÕ   d  s    z_TestSQLApi.test_to_sqlc                 C  sp   t j|d| jdd� t  d| j¡s&J ‚d}tjt|d��$ t j|d| jdd� W d   ƒ n1 sb0    Y  d S )NÚtest_frame2rÙ   rÚ   z"Table 'test_frame2' already existsrÞ   )rñ   rÑ   r5   r¶   r¯   rà   rá   ©r  r¨   râ   r2   r2   r3   Útest_to_sql_failh  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:J ‚t|ƒ}t| jdƒ}||ksZJ ‚d S )Nr©   rÙ   rÚ   rÖ   ©rñ   rÑ   r5   r¶   rÒ   r‹   ©r  r¨   r=  r>  r2   r2   r3   Útest_to_sql_replacep  s    z_TestSQLApi.test_to_sql_replacec                 C  sr   t j|d| jdd�dksJ ‚t j|d| jdd�dks8J ‚t  d| j¡sJJ ‚dt|ƒ }t| jdƒ}||ksnJ ‚d S )NÚtest_frame4rÙ   rÚ   r<  r×   rØ   rl  rm  r2   r2   r3   Útest_to_sql_append{  s    ÿz_TestSQLApi.test_to_sql_appendc                 C  s2   t j|d| jdd� t  d| j¡}t ||¡ d S )NZtest_frame5Frú   zSELECT * FROM test_frame5)rñ   rÑ   r5   rü   r…   rû   )r  r©   rŠ   r2   r2   r3   Útest_to_sql_type_mapping‰  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 )
Nre  r”   ©r0   Zseries©r  Ztest_seriesFrú   zSELECT * FROM test_series)
r   rƒ   Úarangerñ   rÑ   r5   r   r…   rû   Úto_frame)r  ÚsÚs2r2   r2   r3   Útest_to_sql_series�  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@  ©ÚconrA  rB  TrC  )rñ   rÑ   r5   r   rš   rD  r—   Úintr  r…   rû   rE  r2   r2   r3   Útest_roundtrip•  s    z_TestSQLApi.test_roundtripc                 C  s6   t j|d| jddd� t jd| jd�}t ||¡ d S )Nr@  FrØ   )rz  rš   rg  rA  ry  )rñ   rÑ   r5   r   r…   rû   rE  r2   r2   r3   Útest_roundtrip_chunksize   s    ûz$_TestSQLApi.test_roundtrip_chunksizec                 C  s,   t jd| jd�}| ¡ }t |g d¢¡ d S )Nrä   ry  r{   )rñ   r:   r5   r‰   r…   r†   rG  r2   r2   r3   Útest_execute_sql«  s    z_TestSQLApi.test_execute_sqlc              	   C  sò  t  d| j¡}t|jjjtjƒr$J ‚t jd| jdgd�}t|jjjtjƒsNJ ‚|j 	¡ t
ddddddƒt
ddddddƒgks€J ‚t jd| jdd	id�}t|jjjtjƒs¬J ‚|j 	¡ t
ddddddƒt
ddddddƒgksÞJ ‚t jd| jd
gd�}t|jjjtjƒ�s
J ‚|j 	¡ t
ddddddƒt
ddddddƒgk�s>J ‚t jd| jd
did�}t|jjjtjƒ�slJ ‚|j 	¡ t
ddddddƒt
ddddddƒgk�s J ‚t jd| jddid�}t|jjjtjƒ�sÎJ ‚|j 	¡ t
dƒt
dƒgk�sîJ ‚d S )NúSELECT * FROM typesrj   ©Úparse_datesiÐ  r’   rõ   r   r<  ú%Y-%m-%d %H:%M:%Srk   iÂ  é   é   iÝ  rv  rl   z%Y%m%dz
2010-10-10z
2010-12-12)rñ   r   r5   r‚   rj   r0   r€   rƒ   Ú
datetime64Útolistr   rk   rl   ©r  r˜   r2   r2   r3   Útest_date_parsing±  s\    
ÿþ
ýþ

ÿþÿþýþz_TestSQLApi.test_date_parsingrV  )ÚignoreÚraiseÚcoercezread_sql, text, moder  )r/   Úfallbackrh   r/   c                 C  s@   | j |v r<| ddi¡}||| jdd|iid�}t ||¡ d S )Nrj   zdatetime64[ns]Úerrors)rz  r�  )rÜ   r—   r5   r…   rû   )r  rü   r`   rÜ   rV  r™   r  rŠ   r2   r2   r3   Ú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.J ‚t|j	jjtjƒsDJ ‚d S )Nr  rj   rk   )Ú	index_colr�  )
rñ   r   r5   r‚   rš   r0   r€   rƒ   r…  rk   r‡  r2   r2   r3   Útest_date_and_index  s    üz_TestSQLApi.test_date_and_indexc                 C  sˆ   t tddgdd�ƒ ¡ }t t¡� | d| j¡}W d   ƒ n1 sF0    Y  |dks\J ‚t 	d| j¡}t 
|d |d  d¡¡ d S )	Nz00:00:01z00:00:03Úfoors  Útest_timedeltarØ   zSELECT * FROM test_timedeltar”   )r   r   ru  r…   Úassert_produces_warningÚUserWarningrÑ   r5   rñ   r   Úassert_series_equalÚview)r  r˜   Zresult_countrŠ   r2   r2   r3   r’    s    ,z_TestSQLApi.test_timedeltac                 C  s\   t dddgiƒ}d}tjt|d��& | d| j¡d u s:J ‚W d   ƒ n1 sN0    Y  d S )Nrø   y      ð?      ð?y               @zComplex datatypes not supportedrÞ   Ztest_complex)r   r¯   rà   rá   rÑ   r5   )r  r˜   râ   r2   r2   r3   Ú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sPJ ‚d S )Nr  r<  úSELECT * FROM test_index_labelÚtest_index_label©Úindex_labelr   )	r   Úrangerš   r  rñ   rÑ   r5   r   r¥   )r  r™  rž  r  Ú
temp_framer4  rz   r2   r2   r3   Ú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>J ‚t d| j¡}|jd d	ks^J ‚|jd
 dkspJ ‚tj|d| jdddgd�}||ks–J ‚t d| j¡}|jd d…  	¡ ddgksÂJ ‚ddg|j
_tj|d| jdd�}||ksîJ ‚t d| j¡}|jd d…  	¡ ddgk�sJ ‚tj|d| jdddgd�}||k�sDJ ‚t d| j¡}|jd d…  	¡ ddgk�srJ ‚d}tjt|d��& tj|d| jddd� W d   ƒ n1 �s²0    Y  d S )Nr<  r  )ZA0ÚA1)ÚB0ZB1rú   rœ  r›  r   rB  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Ñ   r5   r   r¥   r†  rš   Únamesr¯   rà   rá   )r  Zexpected_row_countr   rŠ   rz   râ   r2   r2   r3   Ú"test_to_sql_index_label_multiindex<  s\    
þû
ÿ û ûz._TestSQLApi.test_to_sql_index_label_multiindexc                 C  sT   t jddgg d¢ddgd�}| d| j¡ tjd| jddgd	�}tj||d
d� d S )NrI  rL  rN  r›   rœ   rO  Útest_multiindex_roundtripz'SELECT * FROM test_multiindex_roundtrip©r�  T©Zcheck_index_type)r   rP  rÑ   r5   rñ   r   r…   rû   ©r  r˜   rŠ   r2   r2   r3   r¦  u  s    ýÿz%_TestSQLApi.test_multiindex_roundtripr0   N©r›   rœ   c                 C  s^   t ddgddggddgd�}| d| j¡d	ks2J ‚| |¡}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©rz  r0   )r   rÑ   r5   r—   rñ   r   r…   rû   )r  r0   r˜   r  rŠ   r2   r2   r3   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Ñ   r5   r‡  r2   r2   r3   Útest_integer_col_names—  s    z"_TestSQLApi.test_integer_col_namesc                 C  s"   t j|d| jd�}d|v sJ ‚d S )NÚtestry  ÚCREATE©rñ   Ú
get_schemar5   ©r  r¨   Ú
create_sqlr2   r2   r3   Útest_get_schema›  s    z_TestSQLApi.test_get_schemac                 C  s$   t j|d| jdd�}d|v s J ‚d S )Nr°  Úpypi)rz  r
  zCREATE TABLE pypi.r²  r´  r2   r2   r3   Ú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|v sZJ ‚d|v sfJ ‚d S )Nr/   r   )rg   ÚINTEGERçš™™™™™ñ?r«  rJ  çš™™™™™@r÷   r°  rù   r®  r±  )rÜ   r/   rg   r   rñ   r³  r5   )r  rg   r0   Zfloat_framerµ  r2   r2   r3   Ú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	}||v s:J ‚tj|d| jd
dgd�}d}||v sbJ ‚d S )Nrº  r«  rJ  r»  )ÚCol1ZCol2r°  r½  )rz  r–   z'CONSTRAINT test_pk PRIMARY KEY ("Col1")r›   rœ   z)CONSTRAINT test_pk PRIMARY KEY ("A", "B"))r   rñ   r³  r5   )r  r¨   rz   rµ  Zconstraint_sentencer2   r2   r3   Ú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	}g d
¢}tjd| jdd�D ]0}t	||gdd�}t
|ƒ|| ks†J ‚|d7 }q^t ||¡ | jdk�r
t ƒ }d	}g d
¢}tjd| jdd�D ]0}t	||gdd�}t
|ƒ|| ksôJ ‚|d7 }qÌt ||¡ d S )Né   re  Zabcder¤   Ztest_chunksizeFrú   zselect * from test_chunksizer   )re  re  re  re  rØ   rf  T©Zignore_indexr’   r/   )r   rƒ   ÚrandomZrandnÚlistrÑ   r5   rñ   r   r   rÒ   r…   rû   rÜ   r   )r  r˜   rþ   rÿ   ÚiÚsizesÚchunkÚres3r2   r2   r3   Útest_chunksize_read¾  s,    ÿ


z_TestSQLApi.test_chunksize_readc                 C  s`   t g d¢g d¢dœƒ}| ¡ }|d  d¡|d< |jd| jdd� t d	| j¡}t ||¡ d S )
Nrô   )úJohn P. Doez	Jane DoverÈ  )Z	person_idÚperson_namerÉ  ÚcategoryÚtest_categoricalFrú   zSELECT * FROM test_categorical)	r   Úcopyr—   rÑ   r5   rñ   r   r…   rû   )r  r˜   Údf2rX  r2   r2   r3   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<  õ   Ã©rù   r¤   Ztest_unicodeFrú   )r   rÑ   r5   r‡  r2   r2   r3   Útest_unicode_column_nameñ  s    z$_TestSQLApi.test_unicode_column_namec                 C  sJ   t g d¢dtjdgdœƒ}|jd| jdd� t d| j¡}t ||¡ d S )	N©r   r’   rØ   r}   r¬  rª  zd1187b08-4943-4c8d-a7f6Frú   z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)	r   rƒ   ÚnanrÑ   r5   rñ   r   r…   rû   ©r  r˜   rX  r2   r2   r3   Útest_escaped_table_nameö  s    z#_TestSQLApi.test_escaped_table_name)0r  r  r  rZ  r,  Ú__annotations__r+  r¯   r[  rb  r`  rd  rh  rÕ   rk  rn  rp  rq  rx  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Ó  r2   r2   r2   r3   r\  <  sx   


7

ý
øþ
þ
9üþ	
"r\  úSQLAlchemy not installed©Úreasonc                   @  sð   e Zd Zd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„ 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   r/   c                 C  s
   t  d¡S ©Nzsqlite:///:memory:©r/   r±   r&  r2   r2   r3   r[     s    zTestSQLApi.connectc                 C  s@   t  |d| j¡ ddg}t jd| j|d�}|j ¡ |ks<J ‚d S )NrÍ   r›   rœ   r¤   )rñ   rÑ   r5   r   r¥   r†  )r  r¨   ÚcolsrŠ   r2   r2   r3   Ú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s4J ‚t jd| jddgd�}|jjddgks^J ‚t jd| jddgddgd�}|jjddgksŽJ ‚|j ¡ ddgks¤J ‚d S )	NrÍ   rš   r§  r›   rœ   r�   rž   )r�  r¥   )rñ   rÑ   r5   r   rš   r¤  r¥   r†  rE  r2   r2   r3   Ú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ä   r+   )rñ   r   r5   rü   r…   rû   r   )r  Úiris_frame1Úiris_frame2r2   r2   r3   Ú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 ]z}t| j|ƒrš| j ¡ �B}| ¡ � | |¡ W d   ƒ n1 sp0    Y  W d   ƒ q¦1 sŽ0    Y  q,| j |¡ q,t	 
d ¡�, t d| j¡ t d| j¡ W d   ƒ n1 sä0    Y  d S )Nr   r_   rF   z,CREATE TABLE invalid (x INTEGER, y UNKNOWN);z0CREATE TABLE other_table (x INTEGER, y INTEGER);Zother_tablezSELECT * FROM other_table)r/   r`   rV   rG   rZ   r5   r[   r\   r:   r…   r“  rñ   r   r   )r  r`   rG   Z
query_listr4  r5   r2   r2   r3   Útest_not_reflect_all_tables2  s    þ
Hz&TestSQLApi.test_not_reflect_all_tablesc                 C  s<   t  d ¡� | d| j¡ W d   ƒ n1 s.0    Y  d S )NZCaseSensitive)r…   r“  rÑ   r5   r9  r2   r2   r3   Ú(test_warning_case_insensitive_table_nameG  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_namesr2   ©rK   rÃ  r2   r2   r3   rU   U  rO   z1TestSQLApi._get_index_columns.<locals>.<listcomp>)rV   rå  Z	InspectorZfrom_enginer5   Úget_indexes)r  Útbl_namerå  ÚinspÚixsr2   r2   r3   rQ  P  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|ƒsXJ ‚d S )
Nr   )Ú	TIMESTAMPr   Ú201412120154Ú201412110254T©ÚutcÚ	test_typery   )r/   rì  r   r   rñ   r   r5   ÚSQLTablerZ   rê   r$  r€   )r  rì  r˜   Údbrê   r2   r2   r3   Útest_sqlalchemy_type_mappingX  s    ÿz'TestSQLApi.test_sqlalchemy_type_mappingzinteger, expected)Zint8ÚSMALLINT)ZInt8rõ  )Zuint8rõ  )ZUInt8rõ  )Zint16rõ  )ZInt16rõ  )Zuint16r¹  )ZUInt16r¹  )Úint32r¹  )ZInt32r¹  )Zuint32ÚBIGINT)ZUInt32r÷  )r”   r÷  )ZInt64r÷  r”   r÷  r¹  c                 C  sP   t ddgdg|d�}t | j¡}tjd||d�}t|jjjj	ƒ}||ksLJ ‚d S )Nr   r’   rø   ©r¥   r0   rñ  ry   )
r   rñ   r   r5   rò  r#   rê   r$  rø   r€   )r  rò   r  r˜   ró  rê   rŠ   r2   r2   r3   Útest_sqlalchemy_integer_mappingd  s
    z*TestSQLApi.test_sqlalchemy_integer_mappingrò   Zuint64ZUInt64c                 C  sb   t ddgdg|d�}t | j¡}tjtdd��  tjd||d� W d   ƒ n1 sT0    Y  d S )	Nr   r’   rø   rø  z1Unsigned 64 bit integer datatype is not supportedrÞ   rñ  ry   )r   rñ   r   r5   r¯   rà   rá   rò  )r  rò   r˜   ró  r2   r2   r3   Ú(test_sqlalchemy_integer_overload_mapping�  s    ÿz3TestSQLApi.test_sqlalchemy_integer_overload_mappingc           	      C  s–   t  ¡ �V}d| }d}|j||ddd� t ||¡}t ||¡}d}t ||¡}W d   ƒ n1 sd0    Y  t  ||¡ t  ||¡ t  ||¡ d S )Nz
sqlite:///r+   rÖ   F)rÛ   rš   rä   )r…   Úensure_cleanrÑ   rñ   rü   r   r   rû   )	r  r¨   r  Údb_urirê   ri  r©   r4  ro  r2   r2   r3   Útest_database_uri_string‹  s    
*z#TestSQLApi.test_database_uri_stringÚpg8000c                 C  sB   d}t jtdd�� t d|¡ W d   ƒ n1 s40    Y  d S )Nz)postgresql+pg8000://user:pass@host/dbnamerþ  rÞ   zselect * from table©r¯   rà   ÚImportErrorrñ   rü   )r  rü  r2   r2   r3   Ú(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sDJ ‚d S )Nr   r_   z#select * from iris where name=:namer  zIris-versicolorr0  r-   )r/   r`   rñ   rü   r5   Úset)r  r`   Z	name_textÚiris_dfÚ	all_namesr2   r2   r3   Útest_query_by_text_obj¤  s
    z!TestSQLApi.test_query_by_text_objc                 C  sx   ddl m}m} t| jƒ}tƒ r$|n|g}||ƒ |jj|dƒk¡}t	j
|| jddid�}t|d ƒ}|dhkstJ ‚d S )Nr   )Ú	bindparamÚselectr  r~   r0  r-   )r/   r  r  r4   r,  r   Úwherer$  r-   rñ   rü   r5   r  )r  r  r  r+   Ziris_selectZname_selectr  r  r2   r2   r3   Útest_query_by_select_obj­  s    
z#TestSQLApi.test_query_by_select_objc                 C  sF   t g d¢g d¢dœƒ}|jd| jdd� t d| j¡}t ||¡ d S )NrÐ  ©rõ   r<  re  )r›   z%_variationZtest_column_percentageFrú   ©r   rÑ   r5   rñ   r   r…   rû   rÒ  r2   r2   r3   Útest_column_with_percentage»  s    z&TestSQLApi.test_column_with_percentageN)r  r  r  rZ  r,  rÜ   r[   rÞ  rß  râ  rã  rä  rQ  rô  r¯   rÕ  rÖ  r{  rƒ   r0   r  rù  rú  rý  ÚtdZskip_if_installedr  r  r	  r  r2   r2   r2   r3   rÚ     sN   		ñþ
	
	
	rÚ  c                      s,   e Zd ZdZejdd�‡ fdd„ƒZ‡  ZS )Ú_EngineToConnMixinzS
    A mixin that causes setup_connect to create a conn rather than an engine.
    Tr^  c                 #  sn   t ƒ  ¡  | j}| ¡ }| ¡ | _t |¡| _|| _	|| _d V  | j 
¡  | j ¡  | j	| _t | j	¡| _d S r½   )Úsuperr`  r5   r[   r\   Z_EngineToConnMixin__txrñ   r   rÔ   Z_EngineToConnMixin__engineÚrollbackrÉ   )r  r-  r/  r¹   r5   ©Ú	__class__r2   r3   rb  Ê  s    



z_EngineToConnMixin.setup_method)r  r  r  rZ  r¯   r[  rb  Ú__classcell__r2   r2   r  r3   r  Å  s   
r  c                   @  s   e Zd ZdS )ÚTestSQLApiConnNrT  r2   r2   r2   r3   r  Ü  s   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½   ©ra   r[   )r  Zdatabaser2   r2   r3   r[   ë  s    zTestSQLiteFallbackApi.connectc                 C  s‚   t  ¡ �Z}|  |¡}tj|d|dd�dks.J ‚| ¡  |  |¡}t d|¡}| ¡  W d   ƒ n1 sh0    Y  t  ||¡ d S )NZtest_frame3_legacyFrú   r<  z!SELECT * FROM test_frame3_legacy;)r…   rû  r[   rñ   rÑ   rÉ   r   rû   )r  r©   r  r5   rŠ   r2   r2   r3   Útest_sql_open_closeî  s    


&z)TestSQLiteFallbackApi.test_sql_open_closezSQLAlchemy is installedrØ  c                 C  sF   d}d}t jt|d�� t d|¡ W d   ƒ n1 s80    Y  d S )Nzmysql://root@localhost/pandasz-Using URI string without sqlalchemy installedrÞ   rä   rÿ  )r  r5   râ   r2   r2   r3   Útest_con_string_import_errorþ  s    z2TestSQLiteFallbackApi.test_con_string_import_errorc                 C  sP   G dd„ dƒ}|dƒ}t  t¡� t d|¡ W d   ƒ n1 sB0    Y  d S )Nc                   @  s   e Z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>.MockSqliteConnectionc                 _  s   t j|i |¤Ž| _d S r½   )ra   rb   r5   )r  ÚargsÚkwargsr2   r2   r3   Ú__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½   )Úgetattrr5   )r  r  r2   r2   r3   Ú__getattr__  s    zŠTestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__getattr__N)r  r  r  r  r  r2   r2   r2   r3   ÚMockSqliteConnection	  s   r  rÈ   zSELECT 1)r…   r“  r”  rñ   rü   )r  r  r5   r2   r2   r3   Ú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  sn   t  d| j¡}t  d| j¡}t ||¡ d}tjt j|d�� t  d| j¡ W d   ƒ n1 s`0    Y  d S )Nrä   z9Execution failed on sql 'iris': near "iris": syntax errorrÞ   r+   )	rñ   r   r5   rü   r…   rû   r¯   rà   ÚDatabaseError)r  rà  rá  râ   r2   r2   r3   râ    s    z,TestSQLiteFallbackApi.test_read_sql_delegatec                 C  s   t  |d¡}d|v sJ ‚d S )Nr°  r±  )rñ   r³  r´  r2   r2   r3   Ú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   z""r’   zColumn ú
 not found)ÚsplitÚstriprá   )r  r
  ÚcolumnÚcolr2   r2   r3   Ú_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sPJ ‚d S )	Nr   rí  rî  Trï  rñ  ry   rì  )r   r   rñ   r   r5   ZSQLiteTableZ
sql_schemar(  )r  r˜   ró  rê   r
  r2   r2   r3   Útest_sqlite_type_mapping)  s    ÿz.TestSQLiteFallbackApi.test_sqlite_type_mappingN)rÈ   )r  r  r  rZ  r,  rÜ   r[   r  r¯   rÕ  ÚskipifÚSQLALCHEMY_INSTALLEDr  r  râ  r!  r(  r)  r2   r2   r2   r3   r  á  s   


	r  c                   @  sô  e Zd ZU dZded< ejddd�dd„ ƒZd	d
„ Zejdd�dd„ ƒZ	e
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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,dRdS„ Z-dTdU„ Z.dVdW„ Z/dXdY„ Z0ej1 2dZd[e3j4gid[e3j4 gie3j4 gd\gd]œg¡d^d_„ ƒZ5d`da„ Z6dbdc„ Z7ddde„ Z8dfdg„ Z9dhdi„ Z:djdk„ Z;dlS )mÚ_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,  TÚclass)r_  Úscopec                 C  s*   |   ¡  |  ¡  |  ¡  }| _| ¡  d S r½   )Úsetup_importÚsetup_driverr[   r5   )Úclsr5   r2   r2   r3   Úsetup_classD  s    z_TestSQLAlchemy.setup_classc                 C  s   d S r½   r2   r&  r2   r2   r3   r`  K  s    z&_TestSQLAlchemy.load_test_data_and_sqlr^  c                 C  s   d S r½   r2   ra  r2   r2   r3   rb  N  s    z_TestSQLAlchemy.setup_methodc                 C  s   t st d¡ d S )Nr×  )r+  r¯   Úskip©r1  r2   r2   r3   r/  R  s    z_TestSQLAlchemy.setup_importc                 C  s
   t ƒ ‚d S r½   ©ÚNotImplementedErrorr4  r2   r2   r3   r0  X  s    z_TestSQLAlchemy.setup_driverc                 C  s
   t ƒ ‚d S r½   r5  r4  r2   r2   r3   r[   \  s    z_TestSQLAlchemy.connectc                 C  sV   z&|   ¡ | _t | j¡| _| j  ¡  W n* tjjyP   t 	d| j
› d�¡ Y n0 d S )NzCan't connect to z server)r[   r5   rñ   r   rÔ   r/   ÚexcZOperationalErrorr¯   r3  r,  r&  r2   r2   r3   r+  `  s    
z_TestSQLAlchemy.setup_connectc                 C  s   |   ¡  d S r½   ©r5  r&  r2   r2   r3   Útest_read_sql_parameteri  s    z'_TestSQLAlchemy.test_read_sql_parameterc                 C  s   |   ¡  d S r½   ©r7  r&  r2   r2   r3   Útest_read_sql_named_parameterl  s    z-_TestSQLAlchemy.test_read_sql_named_parameterc                 C  s   |   |¡ d S r½   ©r:  r9  r2   r2   r3   Útest_to_sql_emptyo  s    z!_TestSQLAlchemy.test_to_sql_emptyc                 C  sx   |   ¡ }tg d¢g d¢dœƒ}t |¡}| |d¡dks<J ‚tƒ rfddlm} ||ƒ}| d¡stJ ‚n| d¡stJ ‚d S ©N©ç      ð?ç       @ç      @ç      @©rC  rB  rA  r@  ©ÚoneÚtwor   r<  r   r)  )	r[   r   rñ   r   rÑ   r   r/   rµ   r¶   ©r  Z	temp_connr   rÔ   rµ   rê  r2   r2   r3   Útest_create_tabler  s    ÿ
z!_TestSQLAlchemy.test_create_tablec                 C  s¦   |   ¡ }tg d¢g d¢dœƒ}t |¡}| |d¡dks<J ‚tƒ rfddlm} ||ƒ}| d¡stJ ‚n| d¡stJ ‚| 	d¡ tƒ r”| d¡r¢J ‚n| d¡r¢J ‚d S r>  )
r[   r   rñ   r   rÑ   r   r/   rµ   r¶   r  rH  r2   r2   r3   Útest_drop_tableƒ  s    ÿ

z_TestSQLAlchemy.test_drop_tablec                 C  s   |   |¡ d S r½   ©rF  r9  r2   r2   r3   r|  œ  s    z_TestSQLAlchemy.test_roundtripc                 C  s   |   ¡  d S r½   ©rH  r&  r2   r2   r3   r~  Ÿ  s    z _TestSQLAlchemy.test_execute_sqlc                 C  s   t jd| jd�}t|ƒ d S )Nr+   ry  )rñ   r   r5   r‡   rc  r2   r2   r3   Ú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 )Nr+   r,   )rz  r¥   )rñ   r   r5   r…   r†   r¥   rY   rc  r2   r2   r3   rÞ  ¦  s    ÿz'_TestSQLAlchemy.test_read_table_columnsc                 C  sF   d}t jt|d��  tjd| jd� W d   ƒ n1 s80    Y  d S )Nz!Table this_doesnt_exist not foundrÞ   Zthis_doesnt_existry  )r¯   rà   rá   rñ   r   r5   )r  râ   r2   r2   r3   Útest_read_table_absent_raises¬  s    z-_TestSQLAlchemy.test_read_table_absent_raisesc                 C  s~   t  d| j¡}t|jjjtjƒs$J ‚t|j	jjtj
ƒs:J ‚t|jjjtjƒsPJ ‚t|jjjtjƒsfJ ‚t|jjjtƒszJ ‚d S rð   )rñ   r   r5   r‚   rm   r0   r€   rƒ   r„   rn   rò   ro   Zbool_rp   rq   Úobjectr‡  r2   r2   r3   ró   ±  s    z,_TestSQLAlchemy.test_default_type_conversionc                 C  sH   t ddgid�}|jd| jdd�dks*J ‚t d| j¡}t ||¡ d S )NÚi64l            )r�   Útest_bigintFrú   r’   r  r©  r2   r2   r3   rQ  ½  s    z_TestSQLAlchemy.test_bigintc                 C  s(   t  d| j¡}t|jjjtjƒs$J ‚d S rð   ©	rñ   r   r5   r‚   rj   r0   r€   rƒ   r…  r‡  r2   r2   r3   Útest_default_date_loadÅ  s    z&_TestSQLAlchemy.test_default_date_loadc                 C  s&  dd„ }t d| jƒ}t|dƒs(t d¡ |j}t|jƒs<J ‚t d| jdgd�}t|dƒsbt d¡ |j}t|jƒsvJ ‚t|j	j
ƒdksŠJ ‚||jƒ ttt d| jdd	�ƒd
d�}|j}t|jƒsÄJ ‚t|j	j
ƒdksØJ ‚t d| j¡}|j}t|jƒsúJ ‚t |j|j¡ t d| j¡}||jƒ d S )Nc                 S  sš   t | jƒr4| d tdƒksJ ‚| d tdƒks–J ‚nbt| jƒr†t| jjƒdksRJ ‚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)Útzrs  z&DateCol loaded with incorrect type -> )r	   r0   r   r
   r#   ÚdtrU  r   r  r…   r•  ÚAssertionError)r'  Zexpected_datar  r2   r2   r3   rí   Ñ  s    



þ
ÿz:_TestSQLAlchemy.test_datetime_with_timezone.<locals>.checkzselect * from typesrr   z&no column with datetime with time zoner€  rT  r’   rf  TrÀ  rh   )r   r5   r  r¯   r3  rr   r
   r0   r#   rV  rU  r   rÂ  rñ   r   r…   r•  )r  rí   r˜   r'  r  r2   r2   r3   Útest_datetime_with_timezoneÌ  s8    "


ÿ


þz+_TestSQLAlchemy.test_datetime_with_timezonec                 C  sÊ   t dtdddd�iƒ}|jd| jdd�dks0J ‚| 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ªJ ‚t|d ƒ|d< t
 ||¡ d S )Nr›   ú2013-01-01 09:00:00rõ   z
US/Pacific)ÚperiodsrU  Ztest_datetime_tzFrú   r   rT  zSELECT * FROM test_datetime_tzr   ©r   r›   )r   r   rÑ   r5   r,  rV  Z
tz_convertZtz_localizerñ   r   r…   rû   r   rZ   Úlocr#   r   )r  r  rŠ   r2   r2   r3   Ú%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s4J ‚t d| j¡}t tjgdgd�}t 	||¡ d S )	Nr   i'  r’   r   rú   Ztest_datetime_obbFr¤   )
r   r   rÑ   r5   rñ   r   ÚpdZNaTr…   rû   )r  r�   rŠ   r  r2   r2   r3   Útest_out_of_bounds_datetime3  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sBJ ‚tjd| jdd
�}tj	||dd� d S )Nz
2018-01-01re  Z6H)rZ  ÚfreqÚnumsrú   Z	foo_tableZ	info_dater�  r§  F)Zcheck_names)
r   Z
_with_freqr   rŸ  rÑ   r5   rñ   r   r…   rû   )r  Údatesr  rŠ   r2   r2   r3   Ú"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
|ƒs6J ‚t jd| jdgd�}t|jj	j
tjƒs`J ‚t jd| jddid�}t|jj	j
tjƒsŒJ ‚t jd| jdddiid�}t|jj	j
tjƒs¼J ‚t jd| jdgd�}t|jj	j
tjƒsæJ ‚t jd| jddid�}t|jj	j
tjƒ�sJ ‚t jd| jdd	diid�}t|jj	j
tjƒ�sFJ ‚d S )
Nrh   r   rj   r€  r‚  Úformatrk   rv  Úunit)rñ   r   r5   r,  rO  rƒ   r…  r‚   rj   r0   r€   rk   )r  r˜   Úexpected_typer2   r2   r3   rˆ  E  s.    ÿ
ýÿz!_TestSQLAlchemy.test_date_parsingc                 C  sÂ   t tddd�t d¡dœƒ}| d| j¡dks2J ‚t d| j¡}|jddd	�}t	 
||¡ t d
| j¡}|jddd	�}| jdkr²t|jd tƒs”J ‚t|d ƒ|d< t	 
||¡ nt	 
||¡ d S )NrY  rõ   ©rZ  rB  rª  Útest_datetimerš   r’   )ZaxisúSELECT * FROM test_datetimer   r[  r›   )r   r   rƒ   rt  rÑ   r5   rñ   r   rW   r…   rû   r   r,  rZ   r\  r#   r   r©  r2   r2   r3   rh  e  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sBJ ‚t 	d| j¡}t
 ||¡ t d
| j¡}| jdkrªt|jd tƒsˆJ ‚t|d dd�|d< t
 ||¡ nt
 ||¡ d S )NrY  rõ   rg  rB  rª  ©r’   r›   rh  Frú   ri  r   r[  r›   r‹  )r�  )r   r   rƒ   rt  rÑ  r\  rÑ   r5   rñ   r   r…   rû   r   r,  rZ   r#   r   r©  r2   r2   r3   Útest_datetime_NaTz  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<J ‚td| jƒ}|d }t|d ƒ}t ||¡ d S )	NéÞ  r’   rØ   rø   r¤   Ú	test_dateFrú   )r   r   rÑ   r5   r   r   r…   r•  )r  r˜   rX  rŠ   r  r2   r2   r3   Útest_datetime_dateŽ  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<J ‚td| jƒ}t ||¡ t ¡ }t	j|d|dd	�d
ksvJ ‚t	 
d|¡}| dd„ ¡}t ||¡ t	j|d| jdd	�d
ks¸J ‚| jdkrêt	 
d| j¡}| dd„ ¡}t ||¡ t	 d| j¡}t ||¡ d S )Né	   r   r’   é   rø   r¤   Ú	test_timeFrú   rØ   Z
test_time2zSELECT * FROM test_time2c                 S  s
   |   d¡S ©Nz%H:%M:%S.%f©Ústrftime©Ú_r2   r2   r3   Ú<lambda>¤  rO   z4_TestSQLAlchemy.test_datetime_time.<locals>.<lambda>Z
test_time3r   zSELECT * FROM test_time3c                 S  s
   |   d¡S rr  rs  ru  r2   r2   r3   rw  ª  rO   )r   r   rÑ   r5   r   r…   rû   ÚTestSQLiteFallbackr[   rñ   r   Úapplymapr,  )r  r˜   rX  rÄ   Úrefr2   r2   r3   Útest_datetime_time˜  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sDJ ‚t d| j¡}t	j
||dd	d
� d S )Ni  rr  g        )Ús1rw  Ztest_read_writeFrú   r’   T)Zcheck_dtypeZcheck_exact)r   rƒ   rö  Úfloat32r   rÑ   r5   rñ   r   r…   rû   )r  r|  rw  r˜   rÍ  r2   r2   r3   Útest_mixed_dtype_insert¯  s    z'_TestSQLAlchemy.test_mixed_dtype_insertc                 C  sl   t g d¢dtjdgdœƒ}|jd| jdd�dks4J ‚t d| j¡}t ||¡ t 	d	| j¡}t ||¡ d S )
NrÐ  r}   r¬  rª  Útest_nanFrú   rõ   úSELECT * FROM test_nan)
r   rƒ   rÑ  rÑ   r5   rñ   r   r…   rû   r   r©  r2   r2   r3   Útest_nan_numeric»  s    z _TestSQLAlchemy.test_nan_numericc                 C  sŠ   t g d¢tjtjtjgdœƒ}|jd| jdd�dks8J ‚t d| j¡}t ||¡ |d  	d¡|d< d |d< t 
d	| j¡}t ||¡ d S )
NrÐ  rª  r  Frú   rõ   rœ   rO  r€  )r   rƒ   rÑ  rÑ   r5   rñ   r   r…   rû   r—   r   r©  r2   r2   r3   Útest_nan_fullcolumnÈ  s    z#_TestSQLAlchemy.test_nan_fullcolumnc                 C  sv   t g d¢ddtjgdœƒ}|jd| jdd�dks4J ‚d |jd	< t d| j¡}t 	||¡ t 
d
| j¡}t 	||¡ d S )NrÐ  rø   rù   rª  r  Frú   rõ   ©rØ   rœ   r€  )r   rƒ   rÑ  rÑ   r5   r\  rñ   r   r…   rû   r   r©  r2   r2   r3   Ú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æ  r2   rç  r2   r2   r3   rU   í  rO   z6_TestSQLAlchemy._get_index_columns.<locals>.<listcomp>)r/   rµ   r5   rè  )r  ré  rµ   rê  rë  r2   r2   r3   rQ  ç  s
    

z"_TestSQLAlchemy._get_index_columnsc                 C  s   |   ¡  d S r½   ©rS  r&  r2   r2   r3   Útest_to_sql_save_indexð  s    z&_TestSQLAlchemy.test_to_sql_save_indexc                 C  s   |   ¡  d S r½   ©rY  r&  r2   r2   r3   Ú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… }|  |¡ ||ƒ}t	| j|ƒr¸| j 
¡ �B}| ¡ � | |¡ W d   ƒ n1 sŽ0    Y  W d   ƒ qÄ1 s¬0    Y  n| j |¡ t || j¡}tj||dd� |  |¡ d S )Nr   r_   rF   Útest_get_schema_create_tablery  Fr¨  )r/   r`   rV   rG   rñ   r³  r5   r�   r  rZ   r[   r\   r:   r   r…   rû   )	r  r©   r`   rG   r  rµ  Zblank_test_dfr5   Zreturned_dfr2   r2   r3   r‰  ö  s    

H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sNJ ‚|jd| jd|id�d
kslJ ‚|ƒ }|j| jd� |j	d j
d j}t||ƒs J ‚d}	tjt|	d��& |jd| jdtid� W d   ƒ n1 sÞ0    Y  |jd| jd|dƒid�d
k�sJ ‚|j| jd� |j	d j
d j}t||ƒ�s<J ‚|jdk�sLJ ‚|jd| j|d�d
k�shJ ‚|j| jd� |j	d j
d j}
|j	d j
d j}t|
|ƒ�sªJ ‚t||ƒ�sºJ ‚d S )Nr   )rd   r)   ©r(   r›   rœ   ©gš™™™™™é?T©gÍÌÌÌÌÌì?Nr¤   Ú
dtype_testrØ   Údtype_test2rr  rI   z&The type of B is not a SQLAlchemy typerÞ   rV  Zdtype_test3é
   Úsingle_dtype_test)r/   rd   r)   Úsqlalchemy.schemar(   r   rÑ   r5   ÚreflectÚtablesr¥   r€   rZ   r¯   rà   rá   r#   r6  )r  rd   r)   r(   rÝ  r�   r˜   ÚmetaZsqltyperâ   ZsqltypeaZsqltypebr2   r2   r3   Ú
test_dtype  s2    4$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€J ‚t || j¡}	|ƒ }
|
j| jd� | jdkr°|n|}|
j| j}t|d j|ƒsÔJ ‚t|d j|ƒsèJ ‚t|d j|ƒsüJ ‚t|d j|ƒ�sJ ‚d S )Nr   )re   rf   r'   rg   rŠ  TéÜ  re  r’   rO  rr  rº  ©ÚBoolÚDateÚIntr'   Únotna_dtype_testrØ   rI   r   r˜  r™  rš  r'   )r/   re   rf   r'   rg   r‘  r(   r   r   r   rÑ   r5   rñ   r   r’  r,  r“  r¥   rZ   r€   )r  re   rf   r'   rg   r(   rÝ  r˜   r  rv  r”  Zmy_typeÚcol_dictr2   r2   r3   Útest_notna_dtype0  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’J ‚t
 d| j	¡}t |d jd d¡t |d jd d¡ksÐJ ‚|ƒ }|j| j	d� |jd j}	t|	d jƒt|	d jƒk�sJ ‚t|	d j|ƒ�s(J ‚t|	d j|ƒ�s>J ‚t|	d j|ƒ�sTJ ‚t|	d j|ƒ�sjJ ‚d S )Nr   )Ú
BigIntegerr'   rg   rŠ  gñYÉBÊÀó?r}  rr  Úfloat64re  rö  r”   )Úf32Úf64Ú
f64_as_f32Úi32rP  Ztest_dtypesFrÖ   r¢  é   )Ú	precision)rš   rÛ   r0   r’   r¡  é   rI   r   r£  rP  )r/   rž  r'   rg   r‘  r(   r   r   rÑ   r5   rñ   r   rƒ   Úroundr�   r’  r“  r¥   r#   r€   rZ   )
r  rž  r'   rg   r(   ÚVr˜   rX  r”  rœ  r2   r2   r3   Útest_double_precisionM  s>    ûÿûùÿ
0"z%_TestSQLAlchemy.test_double_precisionc                   sh   ddl m‰  dd„ ‰dd„ ‰‡‡fdd„‰‡ ‡fd	d
„}tdg d¢iƒ d| j¡dksZJ ‚|| jƒ d S )Nr   rF   c                 S  s   d}t j|| d�S )Nz'SELECT test_foo_data FROM test_foo_datary  )rñ   r   )r  r4  r2   r2   r3   r‘    s    z;_TestSQLAlchemy.test_connectable_issue_example.<locals>.fooc                 S  s   |j d| dd� d S )NÚtest_foo_datar×   )r  rz  rÛ   )rÑ   )r  r�   r2   r2   r3   Úbarƒ  s    z;_TestSQLAlchemy.test_connectable_issue_example.<locals>.barc                   s4   t ƒ rˆ| ƒ}ˆ | |ƒ n|  ˆ¡}|  ˆ |¡ d S r½   )r   Zrun_callable)r5   Zfoo_data)r«  r‘  r2   r3   Úbaz†  s
    
z;_TestSQLAlchemy.test_connectable_issue_example.<locals>.bazc              	     sp   t | ˆ ƒrd|  ¡ �@}| ¡ � ˆ|ƒ W d   ƒ n1 s:0    Y  W d   ƒ ql1 sX0    Y  nˆ| ƒ d S r½   )rZ   r[   r\   )Zconnectabler5   )rG   r¬  r2   r3   Úmain�  s
    


Fz<_TestSQLAlchemy.test_connectable_issue_example.<locals>.mainrª  rÐ  rõ   )rV   rG   r   rÑ   r5   )r  r­  r2   )rG   r«  r¬  r‘  r3   Útest_connectable_issue_examplez  s    
	ÿÿz._TestSQLAlchemy.test_connectable_issue_exampleÚinputr‘  r«  )r‘  Úinfe0c                 C  sÎ   t |ƒ}| jdkr–dd l}|jdd… dkrPd|jv rPtjjdd�}|j 	|¡ d}tj
t|d	��" |jd
| jdd� W d   ƒ qÊ1 sŠ0    Y  n4|jd
| jdd�dks°J ‚t d
| j¡}t ||¡ d S )Nr   r   rõ   )r   r�  r   r°  zGH 36465rØ  zinf cannot be used with MySQLrÞ   ZfoobarFrú   r’   )r   r,  rª   ÚVERSIONr¥   r¯   rÕ  ZxfailÚnodeZ
add_markerrà   rá   rÑ   r5   rñ   r   r…   Zassert_equal)r  r¯  rÓ   r˜   rª   rÕ  râ   rX  r2   r2   r3   Útest_to_sql_with_negative_npinfž  s    
2z/_TestSQLAlchemy.test_to_sql_with_negative_npinfc              	     s¢  ddl m‰ m‰m‰m} ddlm}m} tƒ r<ddlm	} nddl
m	} d}td|giƒ}|ƒ }G ‡ ‡‡fdd„d|ƒ}tƒ �r|| jƒ�x}	|	 ¡ �P |	 ¡ }
|j |
¡ |	 ||d	�¡ |	 ¡  tj||jƒ|
d
�}W d   ƒ n1 sê0    Y  W d   ƒ n1 �s
0    Y  n||ƒ }|| jd�}	|	j�R |	 ¡ }
|j |
¡ |	 ||d	�¡ |	 ¡  tj||jgƒ|
d
�}W d   ƒ n1 �sˆ0    Y  t ||¡ d S )Nr   )r&   rg   ÚUnicoder  )ÚSessionÚsessionmaker©Ú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_keyrp  F)ZnullableN)r  r  r  Ú__tablename__Z__table_args__Úidr¹  r2   ©r&   rg   r´  r2   r3   Ú	TemporaryÏ  s   
rÀ  )r¹  )rñ   rz  rI   )r/   r&   rg   r´  r  Úsqlalchemy.ormrµ  r¶  r   r¸  Úsqlalchemy.ext.declarativer   r5   r\   r  Z	__table__rX   ÚaddÚflushrñ   r   r¹  Ztransactionr…   rû   )r  r  rµ  r¶  r¸  Z	test_datar  ZBaserÀ  Úsessionr5   r˜   r2   r¿  r3   Útest_temporary_tableº  s4    
T6z$_TestSQLAlchemy.test_temporary_tablec                 C  sB   d}t jt|d�� |  |d¡ W d   ƒ n1 s40    Y  d S )Nz*engine must be one of 'auto', 'sqlalchemy'rÞ   Z
bad_engine)r¯   rà   rá   r?  rj  r2   r2   r3   Útest_invalid_engineê  s    z#_TestSQLAlchemy.test_invalid_enginec                 C  s:   t  dd¡� |  |¡ W d   ƒ n1 s,0    Y  d S )Núio.sql.enginer/   ©r^  Úoption_contextr?  r9  r2   r2   r3   Útest_options_sqlalchemyï  s    z'_TestSQLAlchemy.test_options_sqlalchemyc                 C  s:   t  dd¡� |  |¡ W d   ƒ n1 s,0    Y  d S )NrÈ  r;  rÉ  r9  r2   r2   r3   Útest_options_autoô  s    z!_TestSQLAlchemy.test_options_autoc                 C  s¶   t tdƒtƒsJ ‚t dd¡�4 t tdƒtƒs2J ‚t tdƒtƒsDJ ‚W d   ƒ n1 sX0    Y  t dd¡�4 t tdƒtƒs‚J ‚t tdƒtƒs”J ‚W d   ƒ n1 s¨0    Y  d S )Nr/   rÈ  r;  )rZ   r   r   r^  rÊ  r&  r2   r2   r3   Útest_options_get_engineù  s    0z'_TestSQLAlchemy.test_options_get_enginec                 C  s   d S r½   r2   r&  r2   r2   r3   Ú"test_get_engine_auto_error_message	  s    z2_TestSQLAlchemy.test_get_engine_auto_error_messageN)<r  r  r  rZ  rÔ  r¯   r[  r2  r`  rb  Úclassmethodr/  r0  r[   r+  r9  r;  r=  rI  rJ  r|  r~  rM  rÞ  rN  ró   rQ  rS  rX  r]  r_  rc  rˆ  rh  rk  rn  r{  r~  r�  r‚  r„  rQ  r†  rˆ  r‰  r•  r�  r©  r®  rÕ  rÖ  rƒ   Úinfr³  rÆ  rÇ  rË  rÌ  rÍ  rÎ  r2   r2   r2   r3   r,  9  sv   






	L
 
	#-$(þ
0r,  c                   @  s   e Zd Zdd„ ZdS )Ú_TestSQLAlchemyConnc                 C  s   t  d¡ d S )Nz4Nested transactions rollbacks don't work with Pandas)r¯   r3  r&  r2   r2   r3   rˆ  	  s    z%_TestSQLAlchemyConn.test_transactionsN)r  r  r  rˆ  r2   r2   r2   r3   rÑ  	  s   rÑ  c                   @  sL   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S )Ú_TestSQLiteAlchemyzL
    Test the sqlalchemy backend against an in-memory sqlite database.

    r   c                 C  s
   t  d¡S rÛ  rÜ  r4  r2   r2   r3   r[   	  s    z_TestSQLiteAlchemy.connectc                 C  s
   d | _ d S r½   )Údriverr4  r2   r2   r3   r0  	  s    z_TestSQLiteAlchemy.setup_driverc                 C  s€   t  d| j¡}t|jjjtjƒs$J ‚t|j	jjtj
ƒs:J ‚t|jjjtj
ƒsPJ ‚t|jjjtjƒsfJ ‚t|jjjtjƒs|J ‚d S rð   )rñ   r   r5   r‚   rm   r0   r€   rƒ   r„   rn   rò   ro   rp   rq   r‡  r2   r2   r3   ró   !	  s    z/_TestSQLiteAlchemy.test_default_type_conversionc                 C  s(   t  d| j¡}t|jjjtjƒr$J ‚d S rð   rR  r‡  r2   r2   r3   rS  0	  s    z)_TestSQLiteAlchemy.test_default_date_loadc                 C  sj   t dddgidd�}|jd| jdd�dks.J ‚t d ¡� t d| j¡ W d   ƒ n1 s\0    Y  d S )	Nrø   r’   rØ   r”   rr  Ztest_bigintwarningFrú   )r   rÑ   r5   r…   r“  rñ   r   r‡  r2   r2   r3   Útest_bigint_warning6	  s    z&_TestSQLiteAlchemy.test_bigint_warningc           	        sò   ddl m‰ m‰m‰ ddlm} tƒ r4ddlm} nddlm} |ƒ }G ‡ ‡‡fdd„d|ƒ}|j	 
| j¡ || jd�}|ƒ }tddgd	d
gdœƒ}|jd| jddd�dks°J ‚| ¡  | |j|j¡}t|ƒ}| ¡  t|jƒddgksîJ ‚d S )Nr   ©r&   rg   r)   )r¶  r·  c                      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)r  r  r  r½  r¾  r‘  r2   rÕ  r2   r3   ÚTestQ	  s   r×  rI   r’   ZhelloZworld)r¾  r‘  rÍ   FrÖ   )rz  rš   rÛ   rØ   r¾  r‘  )r/   r&   rg   r)   rÁ  r¶  r   r¸  rÂ  r1   Z
create_allr5   r   rÑ   r!  r4  r¾  r‘  rÉ   rÂ  r¥   )	r  r¶  r¸  Z	BaseModelr×  rµ  rÅ  r˜   r‘  r2   rÕ  r3   Útest_row_object_is_named_tuple>	  s(    ÿÿz1_TestSQLiteAlchemy.test_row_object_is_named_tupleN)r  r  r  rZ  r,  rÏ  r[   r0  ró   rS  rÔ  rØ  r2   r2   r2   r3   rÒ  	  s   

rÒ  c                   @  s8   e Zd ZdZdZdZedd„ ƒZedd„ ƒZdd	„ Z	d
S )Ú_TestMySQLAlchemyzA
    Test the sqlalchemy backend against an MySQL database.

    r   iê  c                 C  s"   t jd| j› d| j› d�| jd�S )Nzmysql+z://root@localhost:ú/pandasr¬   )r/   r±   rÓ  Úportr­   r4  r2   r2   r3   r[   q	  s    þz_TestMySQLAlchemy.connectc                 C  s$   t  d¡}d| _d|jjji| _d S )Nrª   r«   )r¯   r°   rÓ  r²   r³   r´   r­   )r1  rª   r2   r2   r3   r0  x	  s    
z_TestMySQLAlchemy.setup_driverc                 C  s   d S r½   r2   r&  r2   r2   r3   ró   ~	  s    z._TestMySQLAlchemy.test_default_type_conversionN)
r  r  r  rZ  r,  rÛ  rÏ  r[   r0  ró   r2   r2   r2   r3   rÙ  h	  s   

rÙ  c                   @  s8   e Zd ZdZdZdZedd„ ƒZedd„ ƒZdd	„ Z	d
S )Ú_TestPostgreSQLAlchemyzF
    Test the sqlalchemy backend against an PostgreSQL database.

    r   i8  c                 C  s   t  d| j› d| j› d�¡S )Nzpostgresql+z://postgres:postgres@localhost:rÚ  )r/   r±   rÓ  rÛ  r4  r2   r2   r3   r[   ‹	  s    ÿz_TestPostgreSQLAlchemy.connectc                 C  s   t  d¡ d| _d S )NrÀ   )r¯   r°   rÓ  r4  r2   r2   r3   r0  ‘	  s    
z#_TestPostgreSQLAlchemy.setup_driverc                 C  s€  ddl m} tddgddgddgd	œƒ}| j d
¡ | j d¡ |jd| jdd�dksZJ ‚|jd| jddd�dksvJ ‚|jd| jddd�dks’J ‚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 d   ƒ n1 �s>0    Y  | j d
¡ | j d¡ |jd| jddd�dk�s~J ‚|jd| jdddd� |jd| jdddd�dk�s´J ‚tjd| jdd�}t 	t||gdd�|¡ t| j|ƒ�r||  ¡ }	tj|	dd�}
|
j|ddd�dk�sJ ‚|
j|dddd�dk�s8J ‚|
j|dddd�dk�sTJ ‚tjd| jdd�}|
 d¡}t 	||¡ d S )Nr   rF   r’   rØ   rö   r}   rø   r  r  z$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Ztest_schema_publicFrú   Ztest_schema_public_explicitÚpublic)rš   r
  Ztest_schema_otherÚother)r
  z!Table test_schema_other not foundrÞ   )r
  rš   rÖ   )r
  rš   rÛ   r×   TrÀ  Ztest_schema_other2)rš   rÛ   )rV   rG   r   r5   r:   rÑ   rñ   r   r…   rû   r¯   rà   rá   r   rZ   r[   r   Z
read_table)r  rG   r˜   rþ   rÿ   rÆ  Zres4râ   rX  Zengine2Zpdsqlr2   r2   r3   Útest_schema_support–	  s€    
ÿýÿÿÿ2ÿûûùÿ
ÿÿÿÿ
z*_TestPostgreSQLAlchemy.test_schema_supportN)
r  r  r  rZ  r,  rÛ  rÏ  r[   r0  rß  r2   r2   r2   r3   rÜ  ‚	  s   

rÜ  c                   @  s   e Zd ZdS )ÚTestMySQLAlchemyNrT  r2   r2   r2   r3   rà  ï	  s   rà  c                   @  s   e Zd ZdS )ÚTestMySQLAlchemyConnNrT  r2   r2   r2   r3   rá  õ	  s   rá  c                   @  s   e Zd ZdS )ÚTestPostgreSQLAlchemyNrT  r2   r2   r2   r3   râ  û	  s   râ  c                   @  s   e Zd ZdS )ÚTestPostgreSQLAlchemyConnNrT  r2   r2   r2   r3   rã  
  s   rã  c                   @  s   e Zd ZdS )ÚTestSQLiteAlchemyNrT  r2   r2   r2   r3   rä  
  s   rä  c                   @  s   e Zd ZdS )ÚTestSQLiteAlchemyConnNrT  r2   r2   r2   r3   rå  
  s   rå  c                   @  s´   e Zd ZdZdZedd„ ƒZd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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 )*rx  zG
    Test the fallback mode against an in-memory sqlite database.

    r   c                 C  s
   t  d¡S rÇ   r  r4  r2   r2   r3   r[   
  s    zTestSQLiteFallback.connectc                 C  s   |   ¡ | _d S r½   r]  r&  r2   r2   r3   r+  "
  s    z TestSQLiteFallback.setup_connectTr^  c                 C  s   t  | j¡| _d S r½   )rñ   r   r5   rÔ   ra  r2   r2   r3   rb  %
  s    zTestSQLiteFallback.setup_methodc                 C  s   |   ¡  d S r½   r8  r&  r2   r2   r3   r9  )
  s    z*TestSQLiteFallback.test_read_sql_parameterc                 C  s   |   ¡  d S r½   r:  r&  r2   r2   r3   r;  ,
  s    z0TestSQLiteFallback.test_read_sql_named_parameterc                 C  s   |   |¡ d S r½   r<  r9  r2   r2   r3   r=  /
  s    z$TestSQLiteFallback.test_to_sql_emptyc                 C  s\   t g d¢g d¢dœƒ}| j |d¡dks,J ‚| j d¡s<J ‚| j d¡ | j d¡rXJ ‚d S )Nr?  rD  rE  Zdrop_test_framer<  )r   rÔ   rÑ   r¶   r  )r  r   r2   r2   r3   Útest_create_and_drop_table2
  s    ÿz-TestSQLiteFallback.test_create_and_drop_tablec                 C  s   |   |¡ d S r½   rK  r9  r2   r2   r3   r|  ?
  s    z!TestSQLiteFallback.test_roundtripc                 C  s   |   ¡  d S r½   rL  r&  r2   r2   r3   r~  B
  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<J ‚td	| jƒ}| jd
krft || t	¡¡ n| jdkr|t ||¡ d S )Nrl  r’   rØ   rø   r¤   rm  Frú   zSELECT * FROM test_dater   r   )
r   r   rÑ   r5   r   r,  r…   rû   r—   r#   rÒ  r2   r2   r3   rn  E
  s    "

z%TestSQLiteFallback.test_datetime_datec                 C  sp   t tdddƒtdddƒgdgd�}|jd| jdd	�d
ks<J ‚td| jƒ}| jdkrl| dd„ ¡}t ||¡ d S )Nro  r   r’   rp  rø   r¤   rq  Frú   rØ   zSELECT * FROM test_timer   c                 S  s
   |   d¡S rr  rs  ru  r2   r2   r3   rw  W
  rO   z7TestSQLiteFallback.test_datetime_time.<locals>.<lambda>)	r   r   rÑ   r5   r   r,  ry  r…   rû   )r  r˜   rX  r  r2   r2   r3   r{  P
  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   r5   r  r×   r†  )r  ré  rë  rR  Zix_nameZix_infor2   r2   r3   rQ  Z
  s    
ÿý
z%TestSQLiteFallback._get_index_columnsc                 C  s   |   ¡  d S r½   r…  r&  r2   r2   r3   r†  f
  s    z)TestSQLiteFallback.test_to_sql_save_indexc                 C  s   |   ¡  d S r½   r‡  r&  r2   r2   r3   rˆ  i
  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#  )r5   r:   rá   )
r  rê   r&  ZrecsZcidr  ÚctypeZnot_nullÚdefaultÚpkr2   r2   r3   r(  l
  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sFJ ‚|jd
| jddid�d	ksdJ ‚|  dd¡dksxJ ‚|  d
d¡dksŒJ ‚d}tjt|d��& |jd| jdt	id� W d   ƒ n1 sÊ0    Y  |jd| jdd�d	ksîJ ‚|  dd¡dk�sJ ‚|  dd¡dk�sJ ‚d S )Nr   úNot applicable to MySQL legacyr›   rœ   r‹  rŒ  r¤   r�  rØ   rŽ  ÚSTRINGrr  r¹  z!B \(<class 'bool'>\) not a stringrÞ   rV  r�  )
r,  r¯   r3  r   rÑ   r5   r(  rà   rá   Úbool)r  rÝ  r�   r˜   râ   r2   r2   r3   r•  s
  s    

4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spJ ‚|  |d¡dks„J ‚|  |d¡dks˜J ‚|  |d¡dks¬J ‚|  |d¡dksÀJ ‚d S )Nr   rì  Tr–  re  r’   rO  rr  rº  r—  r›  rØ   r˜  r¹  r™  rì  rš  r'   r%   )	r,  r¯   r3  r   r   r   rÑ   r5   r(  )r  rÝ  r˜   r  r2   r2   r3   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 d   ƒ n1 sR0    Y  tg d¢ƒD ]x\}}| || j¡dks†J ‚t || j¡ t ddgddggd|gd�}d|d›�}| || j¡dksÒJ ‚t || j¡ qhd S )Nr’   rØ   rõ   r<  rø   rù   r¤   z$Empty table or column name specifiedrÞ   Ú )
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_nameÚd)	r   r¯   rà   rá   rÑ   r5   Ú	enumeraterñ   Ztable_exists)r  r˜   râ   ZndxZ
weird_namerÍ  Zc_tblr2   r2   r3   Útest_illegal_names�
  s    ,ÿz%TestSQLiteFallback.test_illegal_namesN)r  r  r  rZ  r,  rÏ  r[   r+  r¯   r[  rb  r9  r;  r=  ræ  r|  r~  rn  r{  rQ  r†  rˆ  r(  r•  r�  rò  r2   r2   r2   r3   rx  
  s,   



rx  z'{}'z{:.8f}z{:d}c                 C  s   dS )NZNULLr2   )Úxr2   r2   r3   rw  Ç
  rO   rw  z{:.10f}z'{!s}'c                 G  sJ   g }|D ]4}t |tƒr"t|ƒr"d }tt|ƒ }| ||ƒ¡ q| t|ƒ S r½   )rZ   r•   r   Ú_formattersr€   r×   r.  )rñ   r  Zprocessed_argsÚargÚ	formatterr2   r2   r3   Úformat_queryÍ
  s    r÷  c                 C  s&   t j| |d� ¡ }|du rdS t|ƒS )z#Replace removed sql.tquery functionry  N)rñ   r:   r#  rÂ  )r4  rz  rX  r2   r2   r3   ÚtqueryÙ
  s    rø  c                   @  sl   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d„ Zdd„ ZdS )ÚTestXSQLitec                 C  s   t  d¡| _d S rÇ   )ra   r[   r5   r&  r2   r2   r3   rb  à
  s    zTestXSQLite.setup_methodc                 C  s   | j  ¡  d S r½   r%  r&  r2   r2   r3   r  ã
  s    zTestXSQLite.teardown_methodc                 C  s.   | j  ¡ }| dt |¡› �¡ | j  ¡  d S r  )r5   r9   r:   rñ   r   r!  )r  rˆ   r@   r2   r2   r3   r  æ
  s    
zTestXSQLite.drop_tablec                 C  sÚ   t  ¡ }tj|d| jdd�dks$J ‚t d| j¡}|j|_|}t  ||¡ dgt|ƒ |d< | 	¡ }t
t t|ƒ¡ƒd }| 	¡ |d	< tj|d
| jdd�dks¢J ‚tjd| jd	d�}| 	¡ }||_d	|j_t  ||¡ d S )NZ
test_tableF)r  rz  rš   rp  zselect * from test_tablerø   Útxtr�  ZIdxZtest_table2zselect * from test_table2r§  )r…   ÚmakeTimeDataFramerñ   rÑ   r5   rü   rš   rû   rÒ   rÌ  r   rƒ   rt  r  )r  rz   rŠ   r  Zframe2Znew_idxr2   r2   r3   Ú
test_basicë
  s     zTestXSQLite.test_basicc           	      C  sž   t  ¡ }tj|jd< t |d¡}| j ¡ }| 	|¡ d}| 
¡ D ]&\}}t|g|¢R Ž }t|| jd� q@| j ¡  tjd| jd�}|j|_t j||dd� d S )N)r   r   r°  z(INSERT INTO test VALUES (%s, %s, %s, %s)ry  úselect * from testgü©ñÒMbP?)Zrtol)r…   rû  rƒ   rÑ  r�   rñ   r³  r5   r9   r:   Ziterrowsr÷  rø  r!  rü   rš   rû   )	r  rz   rµ  r@   Úinsrv  rR   Zfmt_sqlrŠ   r2   r2   r3   Útest_write_row_by_row  s    


z!TestXSQLite.test_write_row_by_rowc                 C  sŒ   t  ¡ }t |d¡}| j ¡ }| |¡ d}|jd }tj|| jt|ƒd� | j 	¡  t 
d| j¡}|jd d… |_t  ||d d… ¡ d S )Nr°  z$INSERT INTO test VALUES (?, ?, ?, ?)r   r0  rý  r’   )r…   rû  rñ   r³  r5   r9   r:   r�   r.  r!  rü   rš   rû   )r  rz   rµ  r@   rþ  rR   rŠ   r2   r2   r3   Útest_execute  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 J ‚q tj|dddgd	�}| ¡ }d
|v s€J ‚| j ¡ }| 	|¡ d S )Nr°  ú rØ   r   r›   r’   ZDATETIMErœ   ré   zPRIMARY KEY ("A", "B"))
r…   rû  rñ   r³  Ú
splitlinesr$  rÒ   r5   r9   r:   )r  rz   rµ  ÚlinesÚlineÚtokensr@   r2   r2   r3   Útest_schema"  s    

zTestXSQLite.test_schemac                 C  sv   d}| j  ¡ }| |¡ t d| j ¡ t d| j ¡ tjtjdd�� t d| j ¡ W d   ƒ n1 sh0    Y  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))r5   r9   r:   rñ   r¯   rà   r   )r  rµ  r@   r2   r2   r3   Útest_execute_fail1  s    	

zTestXSQLite.test_execute_failc                 C  sv   d}| j  ¡ }| |¡ t d| j ¡ | j  ¡  d}tjtj|d�� t	d| j d� W d   ƒ n1 sh0    Y  d S )Nr  r  z$Cannot operate on a closed database.rÞ   rý  ry  )
r5   r9   r:   rñ   rÉ   r¯   rà   ra   ZProgrammingErrorrø  )r  rµ  r@   râ   r2   r2   r3   Útest_execute_closed_connectionD  s    	


z*TestXSQLite.test_execute_closed_connectionc                 C  s2   t dt d¡iƒ}tj|| jddd�dks.J ‚d S )NÚFromre  ZtestkeywordsF©rz  r  rš   )r   rƒ   Zonesrñ   rÑ   r5   r‡  r2   r2   r3   Útest_keyword_as_column_namesX  s    z(TestXSQLite.test_keyword_as_column_namesc                 C  st   t ddgdgd�}tj|| jddd�dks.J ‚| j}tdd	„ | d
¡D ƒƒ}|dksXJ ‚t d
|¡}t ||¡ d S )Nr’   rØ   Zc0r¤   Úmono_dfFr  c                 s  s   | ]}|d  V  qdS )r   Nr2   )rK   Zmy_c0r2   r2   r3   Ú	<genexpr>d  rO   z8TestXSQLite.test_onecolumn_of_integer.<locals>.<genexpr>zselect * from mono_dfrõ   )	r   rñ   rÑ   r5   Úsumr:   rü   r…   rû   )r  r  Zcon_xZthe_sumrŠ   r2   r2   r3   Útest_onecolumn_of_integer\  s    z%TestXSQLite.test_onecolumn_of_integerc                 C  sâ  t ddgddgdœƒ}t g d¢g d¢dœƒ}d}d	|› �}d
}tjt|d��$ tj|| j|dd� W d   ƒ n1 sv0    Y  |  |¡ tj|| j|dd� d}tjt|d��$ tj|| j|dd� W d   ƒ n1 sÚ0    Y  tj|| j|ddd� t|| jd�ddgk�sJ ‚tj|| j|ddd�dk�s6J ‚t|| jd�g d¢k�sRJ ‚|  |¡ tj|| j|ddd�dk�s|J ‚t|| jd�ddgk�s˜J ‚tj|| j|ddd�dk�s¸J ‚t|| jd�g d¢k�sÔJ ‚|  |¡ d S )Nr’   rØ   r›   rœ   )r  r  r
  )r�   rž   ÚEZtable_if_existszSELECT * FROM z*'notvalidvalue' is not valid for if_existsrÞ   Znotvalidvalue)rz   rz  r  rÛ   rÙ   z&Table 'table_if_exists' already existsrÖ   F)rz   rz  r  rÛ   rš   ry  rj  rƒ  rõ   )©rõ   r�   ©r<  rž   ©re  r  r×   )rj  rƒ  r  r  r  )	r   r¯   rà   rá   rñ   rÑ   r5   r  rø  )r  Zdf_if_exists_1Zdf_if_exists_2rˆ   Z
sql_selectrâ   r2   r2   r3   Útest_if_existsk  s€    
ü$

ÿ
ÿ$ûûùÿ

ûùÿ
ûùÿ
zTestXSQLite.test_if_existsN)r  r  r  rb  r  r  rü  rÿ  r   r  r	  r
  r  r  r  r2   r2   r2   r3   rù  ß
  s   rù  )N)ƒrZ  Ú
__future__r   r<   r   r   r   rŒ   r   Úpathlibr   ra   Únumpyrƒ   r¯   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsr  Zpandas.core.dtypes.commonr	   r
   Zpandasr^  r   r   r   r   r   r   r   r   r   r   Zpandas._testingZ_testingr…   Zpandas.io.sqlrñ   r   r   r   r   r   r   r   r   r/   r+  r   r2  r4   rC   r^   rc   ru   rw   rx   r‡   r‹   r[  r�   rv   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\  Úsingler*  rÚ  r  r  r  r,  rÑ  rÒ  rÙ  rÜ  rà  rá  râ  rã  rä  rå  rx  rd  r#   Zstr_Úbytesr•   r{  r€   rŸ  rî  rô  r÷  rø  rù  r2   r2   r2   r3   Ú<module>   s^  0(
ýøýí!



#










þþþþ
ÿ

	#	 
   G DW     WXm ,÷
