U
    -el                    @  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`bdddgdd Zrdd Zsdd ZtG dd dZuG dd deuZvG dd deuZwG dd dZxG dd dexZyej`jze: ddG dd deweyZ{G dd deveyZ|ej`jze: ddG dd dewexZ}G dd de}Z~ej`jaG dd de}Zej`jaG dd de}ZG dd devexZedjedjejdjedjedjedjeddd ejdjedji	Zdd ZdddZG dd dZd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   Y/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/pandas/tests/io/test_sql.pyiris_table_metadatam   s     		r;   zsqlite3.Connectionr
   )conn	iris_filec              	   C  sT   |   }d}|| |jd d(}t|}t| d}||| W 5 Q R X d S )NzCREATE TABLE iris (
            "SepalLength" REAL,
            "SepalWidth" REAL,
            "PetalLength" REAL,
            "PetalWidth" REAL,
            "Name" TEXT
        )newlinez&INSERT INTO iris VALUES(?, ?, ?, ?, ?))cursorexecuteopencsvreadernextexecutemany)r<   r=   curstmtcsvfilerD   r9   r9   r:   create_and_load_iris_sqlite3   s    

rJ   )r=   r*   c           
        s   ddl m} ddlm} t|}|jd d}t|}t|  fdd|D }||	|}	t
| |r|  >} |  * |j| dd |j| d	 | |	 W 5 Q R X W 5 Q R X n8|  * |j| dd |j| d	 | |	 W 5 Q R X W 5 Q R X d S )
Nr   insertEnginer>   c                   s   g | ]}t t |qS r9   dictzip.0rowheaderr9   r:   
<listcomp>   s     z(create_and_load_iris.<locals>.<listcomp>TZ
checkfirstbind)r6   rL   sqlalchemy.enginerN   r;   rB   rC   rD   rE   values
isinstanceconnectbegindropcreaterA   )
r<   r=   r*   rL   rN   r1   rI   rD   paramsrH   r9   rU   r:   create_and_load_iris   s$    



 
rc   c              
   C  s   d}t | tjr$|  }|| n|ddlm} ddlm} ||}t | |r| 	 $} | 
  | | W 5 Q R X W 5 Q R X n| 
  | | W 5 Q R X d S )Nz+CREATE VIEW iris_view AS SELECT * FROM irisr   textrM   )r]   sqlite3
Connectionr@   rA   r6   re   r[   rN   r^   r_   )r<   rH   rG   re   rN   r9   r9   r:   create_and_load_iris_view   s    


 
rh   c                 C  s   ddl m}m}m}m}m}m}m}m} | dkr4|n|}	| dkrD|n|}
| }|d||d||d|	|d||d||d	||d
||d|
|d||d|
}| dkr|	|d|dd |S )Nr   )TEXTBooleanr,   DateTimer-   Integerr.   r0   r#   typesTextColDateCol
IntDateColIntDateOnlyColFloatColIntColBoolColIntColWithNullBoolColWithNullr%   DateColWithTzT)timezone)
r6   ri   rj   r,   rk   r-   rl   r.   r0   append_column)r*   ri   rj   r,   rk   r-   rl   r.   r0   Z	date_typeZ	bool_typer8   rm   r9   r9   r:   types_table_metadata   s(    (rz   z
list[dict])r<   
types_datac                 C  s*   |   }d}|| d}||| d S )Na  CREATE TABLE types (
                    "TextCol" TEXT,
                    "DateCol" TEXT,
                    "IntDateCol" INTEGER,
                    "IntDateOnlyCol" INTEGER,
                    "FloatCol" REAL,
                    "IntCol" INTEGER,
                    "BoolCol" INTEGER,
                    "IntColWithNull" INTEGER,
                    "BoolColWithNull" INTEGER
                )zY
            INSERT INTO types
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
            )r@   rA   rF   )r<   r{   rG   rH   r9   r9   r:   create_and_load_types_sqlite3   s
    
r|   )r{   r*   c              
   C  s   ddl m} ddlm} t|}|||}t| |r|  >} |  * |j	| dd |j
| d | | W 5 Q R X W 5 Q R X n8|  * |j	| dd |j
| d | | W 5 Q R X d S )Nr   rK   rM   TrX   rY   )r6   rL   r[   rN   rz   r\   r]   r^   r_   r`   ra   rA   )r<   r{   r*   rL   rN   rm   rH   r9   r9   r:   create_and_load_types   s    


 
r}   r   framec                 C  sP   | j d j}| jd }t|tjs&tt|j	dddddg | j
dksLtd S )Nr   ffffff@      @ffffff?皙?Iris-setosa))      )   r   )dtypestypeiloc
issubclassnpfloatingAssertionErrortmequalContentsr\   shape)r   ZpytyperT   r9   r9   r:   check_iris_frame  s
    
r   )
table_namec              
   C  s   d| }t | tjr0|  }|| d S ddlm} ddlm	} t | t
rz:|| }|  } | | 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i2g333333$@   Fz2000-01-01 00:00:00-08:00)
rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   2000-01-04 00:00:00i 'Pi\2z2000-06-01 00:00:00-07:00r9   r9   r9   r9   r:   r{   1  s.    r{   c              
   C  s2   dddddddddd	}t | }||  |S )Nr)   int64float)	rn   ro   rp   rq   rr   rs   rt   ru   rv   )r   keysastype)r{   r   dfr9   r9   r:   types_data_frameO  s    r   c                  C  s&   dddddg} dddd	g}t || d
S )NindexABCD)r   gN\^?g9\x`|@g% TO׿g(nI)r   g}C?c^Vg~q"BĿg4?)2000-01-05 00:00:00gGͿ?2r¹e?g>ݦ4gёR?)2000-01-06 00:00:00g?{mX?$?gnk3Am?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   ir   )r   i N  r   )r   i͏r   r   r   r   r9   r9   r:   test_frame3  s    
r   c           	   
   c  s   t d}t d}|jdd|jjji|jjd}||}|	dsRt
|| d |	ds||D ]}|d	 q`t||d |V  | .}|  |d
}|| W 5 Q R X W 5 Q R X |  d S )Nr6   pymysqlz*mysql+pymysql://root@localhost:3306/pandasclient_flag)connect_args	poolclassr1   r$   rm   rw    DROP TABLE IF EXISTS test_frame;)pytestimportorskipr   	constantsCLIENTMULTI_STATEMENTSpoolNullPoolinspect	has_tablerc   popr}   r^   r_   re   rA   r   )	r   r{   r6   r   r   inspentryr<   rH   r9   r9   r:   mysql_pymysql_engine  s(    







r   c              	   c  s   |   }|V  W 5 Q R X d S Nr^   )r   r<   r9   r9   r:   mysql_pymysql_conn  s    
r   c              
   c  s   t d}t d |jd|jjd}||}|dsFt|| d |ds\t||d |V  |	 .}|
  |d}|| W 5 Q R X W 5 Q R X |  d S )	Nr6   psycopg2z=postgresql+psycopg2://postgres:postgres@localhost:5432/pandasr   r1   r%   rm   r   )r   r   r   r   r   r   r   rc   r}   r^   r_   re   rA   r   )r   r{   r6   r   r   r<   rH   r9   r9   r:   postgresql_psycopg2_engine  s"    







r   c              	   c  s   |   }|V  W 5 Q R X d S r   r   )r   r<   r9   r9   r:   postgresql_psycopg2_conn  s    
r   c               	   c  s,   t d t } d|  V  W 5 Q R X d S )Nr6   
sqlite:///)r   r   r   ensure_cleannamer9   r9   r:   
sqlite_str  s    

r   c                 c  s.   t d}|j| |jjd}|V  |  d S )Nr6   r   )r   r   r   r   r   r   )r   r6   r   r9   r9   r:   sqlite_engine  s    
r   c              	   c  s   |   }|V  W 5 Q R X d S r   r   )r   r<   r9   r9   r:   sqlite_conn  s    
r   c                 C  s,   t d}|| }t||d |  | S )Nr6   r#   )r   r   r   rc   r   )r   r   r6   r   r9   r9   r:   sqlite_iris_str  s
    

r   c                 C  s   t | |d | S )Nr#   )rc   )r   r   r9   r9   r:   sqlite_iris_engine  s    r   c              	   c  s   |   }|V  W 5 Q R X d S r   r   )r   r<   r9   r9   r:   sqlite_iris_conn  s    
r   c               
   c  s6   t td} | }|V  W 5 Q R X W 5 Q R X d S N:memory:)
contextlibr   rf   r^   )Zclosing_connr<   r9   r9   r:   sqlite_buildin  s    r   c                 C  s   t | | | S r   )rJ   )r   r   r9   r9   r:   sqlite_buildin_iris  s    
r   r<   c                 C  s    | | } |jd| ddd d S )NtestappendF	if_existsr   )getfixturevalueto_sql)r<   r   requestr9   r9   r:   test_dataframe_to_sql"  s    
r   c              	   C  s   t d ttjdgddtjtdddgddtjtdgddtjdgd	dd
}|| } tj	t
dd |jd| ddd W 5 Q R X d S )Npyarrowr   zint8[pyarrow]r7     timestamp[ns][pyarrow]zduration[ns][pyarrow]azstring[pyarrow])intr   r   stringzthe 'timedelta'match
test_arrowreplaceFr   )r   r   r   pdarrayr   r   r   r   assert_produces_warningUserWarningr   r<   r   r   r9   r9   r:   "test_dataframe_to_sql_arrow_dtypes*  s    
 

r   c                 C  sL   t d tdtjtddd|gddi}|| } |jd| dd	d
 d S )Nr   r   r   r   r   r   r   r   Fr   )r   r   r   r   r   r   r   r   )r<   r   Znulls_fixturer   r9   r9   r:   *test_dataframe_to_sql_arrow_dtypes_missing>  s    
  
r   methodmultic              	   C  sZ   | | } t| dd$}|j|d|d |ds6tW 5 Q R X t| dt|ksVtd S )NTZneed_transaction
test_framer   r   r    r   r   r   r   len)r<   r   r   r   	pandasSQLr9   r9   r:   test_to_sqlN  s
    
r  zmode, num_row_coef)r   r   )r      c              	   C  sn   | | } t| dd4}|j|ddd |j|d|d |dsFtW 5 Q R X t| d|t| ksjtd S )NTr   r   failr   r   )r<   modeZnum_row_coefr   r   r  r9   r9   r:   test_to_sql_existY  s    
r  c              
   C  sr   | | } t| ddR}|j|ddd |ds6td}tjt|d |j|ddd W 5 Q R X W 5 Q R X d S )NTr   r   r  r  z!Table 'test_frame' already existsr   )r   r    r   r   r   r   raises
ValueError)r<   r   r   r  msgr9   r9   r:   test_to_sql_exist_faile  s    
r  c                 C  s\   | | } td| }t| td| }t| td| }|jdksJtd|jksXtd S )NSELECT * FROM irisSELECT * FROM iris where 0=1r   r   r3   )r   r!   r   r   read_sqlr   r   r   r<   r   
iris_framer9   r9   r:   test_read_iris_queryr  s    

r  c                 C  st   | | } ttd| dd}t| ttjd| dd}t| ttjd| dd}|jdksbtd|jksptd S )Nr     	chunksizer  r  r3   )	r   r   r!   r   r   r  r   r   r   r  r9   r9   r:   test_read_iris_query_chunksize  s    
r  c           
      C  s   | | } ddlm}m}m}m} | }t| tr:|| n| }|d||d}t||| dddd}	t	|	 t| tr~|
  d S )	Nr   )r.   r0   r   selectr1   )Zautoload_withr   r   r   lengthrb   )r   r6   r.   r0   r   r  r]   r)   r!   r   r   )
r<   r   r.   r0   r   r  r8   Zautoload_conr1   r  r9   r9   r:   .test_read_iris_query_expression_with_parameter  s    
  
r  c                 C  sV   t d  D ]\}}|| kr q2qtd|  d|| } t|| dd}t| d S )Nr&   zNo part of z( found in SQL_STRINGS['read_parameters']r   r   r  )SQL_STRINGSitemsKeyErrorr   r!   r   )r<   r   dbqueryr  r9   r9   r:   *test_read_iris_query_string_with_parameter  s    
r"  c                 C  s4   | | } td| }t| td| }t| d S Nr1   )r   r"   r   r   r  r  r9   r9   r:   test_read_iris_table  s
    

r$  c                 C  sD   | | } ttd| dd}t| ttjd| dd}t| d S )Nr1   r  r  )r   r   r"   r   r   r  r  r9   r9   r:   test_read_iris_table_chunksize  s
    
r%  c              	     sx   | | } g   fdd}t| dd$}|j|d|d |dsFtW 5 Q R X  dgks^tt| dt|ksttd S )Nc                   s2    d  fdd|D }|| j | d S )Nr   c                   s   g | ]}t t |qS r9   rO   rR   r   r9   r:   rW     s     z8test_to_sql_callable.<locals>.sample.<locals>.<listcomp>)r   rA   tablerL   )Zpd_tabler<   r   	data_iterr   checkr&  r:   sample  s    
z$test_to_sql_callable.<locals>.sampleTr   r   r   r   r   )r<   r   r   r+  r  r9   r)  r:   test_to_sql_callable  s    
r,  c                 C  s   | | } td| }t|jjjtjs,t	t|j
jjtjsBt	t|jjjtjsXt	t|jjjtjsnt	t|jjjtjst	d S Nrm   )r   r   r"   r   rr   r7   r   r   r   r   rs   integerrt   ru   rv   r   r9   r9   r:   test_default_type_conversion  s    
r/  c           	   
   C  s   | | } ddlm} ddlm} tdddgddd	gd
}|jd| dd d}||}t| |r|  $}|	  |
| W 5 Q R X W 5 Q R X n| 	  | 
| W 5 Q R X td| }t|| td| }t|| d S )Nr   rd   rM   r   r     皙?r   333333?r   br   Fr   z}DROP PROCEDURE IF EXISTS get_testdb;

    CREATE PROCEDURE get_testdb ()

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

    c                 C  s>   |  d| j t| jtjr*t| j| nt| j|| j d S r#  )r^  r<   r]   rf   rg   rJ   rc   flavor)r_  r   r9   r9   r:   load_iris_data  s    zPandasSQLTest.load_iris_datac                 C  s\   | j dkr|D ]}|d qt| jtjrHdd |D }t| j| nt| j|| j  d S )Nr%   rw   c                 S  s   g | ]}t | qS r9   )tupler\   )rS   r   r9   r9   r:   rW     s     z1PandasSQLTest.load_types_data.<locals>.<listcomp>)r  r   r]   r<   rf   rg   r|   r}   )r_  r{   r   r9   r9   r:   load_types_data  s    
zPandasSQLTest.load_types_datac                 C  s.   t d | j }d}| jj||d}t| d S )Nr&   r  r  r  r  r  
read_queryr   r_  r!  rb   r  r9   r9   r:   _read_sql_iris_parameter  s    z&PandasSQLTest._read_sql_iris_parameterc                 C  s4   t d | j }ddd}| jj||d}t| d S )Nr'   r   r   r  r  r  r  r9   r9   r:   _read_sql_iris_named_parameter  s    
z,PandasSQLTest._read_sql_iris_named_parameterc                 C  s*   t d | j }| jj|d d}t| d S )Nr(   r  r  )r_  r!  r  r9   r9   r:   (_read_sql_iris_no_parameter_with_percent  s    z6PandasSQLTest._read_sql_iris_no_parameter_with_percentc                 C  s2   |  d| j | j|jd d ddks.td S )Nr   r   )r^  r<   r  r   r   r   r_  r   r9   r9   r:   _to_sql_empty  s    zPandasSQLTest._to_sql_emptyautoc                 K  sr   |  d| j | jj|dfd|i|dks0t| jds@tt|}t| jd}||ks`t|  d| j dS )z `to_sql` with the `engine` paramr   r      N)r^  r<   r  r   r   r   r   r   )r_  r   r   Zengine_kwargsnum_entriesnum_rowsr9   r9   r:   _to_sql_with_sql_engine  s"     z%PandasSQLTest._to_sql_with_sql_enginec                 C  sV   |  d| j | j|ddks$t| jd}|jddd d |j_t	
|| d S )Ntest_frame_roundtripr  "SELECT * FROM test_frame_roundtriplevel_0TZinplace)r^  r<   r  r   r   r  	set_indexr   r   r   r6  r_  r   rN  r9   r9   r:   
_roundtrip  s    zPandasSQLTest._roundtripc                 C  s.   | j d}| }t|dddddg d S Nr  r   r   r   r   r   )r  rA   r   r   r   )r_  iris_resultsrT   r9   r9   r:   _execute_sql  s    zPandasSQLTest._execute_sqlc                 C  sP   t jddgdddgdgd}| j|ddks2t| d}|dggksLtd S )	Nr    @line1r        ?line2r   r   r   r   r   Ztest_to_sql_saves_indexr  )r   from_recordsr  r   r   _get_index_columns)r_  r   ix_colsr9   r9   r:   _to_sql_save_index  s      
z PandasSQLTest._to_sql_save_indexc              	   C  s$  | j  @}d}t| j tr(|| nddlm} ||}|| W 5 Q R X G dd dt}d}t| j trddlm} ||}z,| j  }|| |dW 5 Q R X W n |k
r   Y nX | j 	d}t
|dkst| j  }|| W 5 Q R X | j 	d}t
|d	ks td S )
Nz'CREATE TABLE test_trans (A INT, B TEXT)r   rd   c                   @  s   e Zd ZdS )z7PandasSQLTest._transaction_test.<locals>.DummyExceptionN)rc  rd  re  r9   r9   r9   r:   DummyException  s   r  z/INSERT INTO test_trans (A,B) VALUES (1, 'blah')errorzSELECT * FROM test_transr   )r  Zrun_transactionr]   r   rA   r6   re   	Exceptionr   r  r   r   )r_  ZtransrH   re   r  Zins_sqlresr9  r9   r9   r:   _transaction_test  s0    
zPandasSQLTest._transaction_testN)r  )rc  rd  re  __doc__r  r  r  r  r  r  r  r  r  r  r  r9   r9   r9   r:   r    s   

r  c                
   @  s  e Zd ZU dZdZded< ejdddd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zejd#d$d%d&gejd'ejd(d)fejd*d+fejd(d)fejd*d+fgd,d- Zd.d/ Zd0d1 Zd2d3 Zejd4d5d6d7d8d9d:gd;d< Z d=d> Z!d?d@ Z"ejdAdBe#e$e#e$dCgdDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dBS )Z_TestSQLApia  
    Base class to test the public API.

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

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

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

    r#   r)   r  TZautousec                 C  s*   |   | _| | | | |   d S r   )r^   r<   r  r  load_test_data_and_sqlr_  r   r{   r9   r9   r:   setup_method,  s    


z_TestSQLApi.setup_methodc                 C  s   t | j d S r   )rh   r<   rh  r9   r9   r:   r  3  s    z"_TestSQLApi.load_test_data_and_sqlc                 C  s   t d| j}t| d S )NzSELECT * FROM iris_view)r   r!   r<   r   r_  r  r9   r9   r:   test_read_sql_view6  s    z_TestSQLApi.test_read_sql_viewc                 C  s8   d}t j|| jdd}t || j}tt|| d S )Nz/SELECT * FROM iris_view WHERE SepalLength < 0.0r   r  )r   r!   r<   r   r6  r   )r_  r!  Z
with_batchZwithout_batchr9   r9   r:   &test_read_sql_with_chunksize_no_result:  s    z2_TestSQLApi.test_read_sql_with_chunksize_no_resultc                 C  s&   t |d| j t d| js"td S )Nr   )r   r   r<   r   r   r  r9   r9   r:   r  @  s    z_TestSQLApi.test_to_sqlc              	   C  s\   t j|d| jdd t d| js&td}tjt|d t j|d| jdd W 5 Q R X d S )Ntest_frame2r  r  z"Table 'test_frame2' already existsr   )r   r   r<   r   r   r   r  r	  r_  r   r
  r9   r9   r:   test_to_sql_failD  s
    z_TestSQLApi.test_to_sql_failc                 C  s^   t j|d| jdd t j|d| jdd t d| js:tt|}t| jd}||ksZtd S )Nr   r  r  r   )r   r   r<   r   r   r   r   r_  r   r  r  r9   r9   r:   test_to_sql_replaceL  s    z_TestSQLApi.test_to_sql_replacec                 C  sr   t j|d| jdddkstt j|d| jdddks8tt d| jsJtdt| }t| jd}||ksntd S )Ntest_frame4r  r  r  r   r  )r   r   r<   r   r   r   r   r  r9   r9   r:   test_to_sql_appendW  s    z_TestSQLApi.test_to_sql_appendc                 C  s2   t j|d| jdd t d| j}t|| d S )NZtest_frame5Fr5  zSELECT * FROM test_frame5)r   r   r<   r  r   r6  )r_  r   rN  r9   r9   r:   test_to_sql_type_mappinge  s    z$_TestSQLApi.test_to_sql_type_mappingc                 C  sL   t tjddddd}tj|d| jdd td	| j}t|	 | d S )
Nr   r   r   Zseriesr   Ztest_seriesFr5  zSELECT * FROM test_series)
r   r   aranger   r   r<   r!   r   r6  to_frame)r_  ss2r9   r9   r:   test_to_sql_seriesk  s    z_TestSQLApi.test_to_sql_seriesc                 C  s\   t j|d| jd t jd| jd}|j|_|jddd |jt d |j_t	
|| d S )Nr  conr  r  Tr  )r   r   r<   r!   r   r  r   r   r   r   r6  r  r9   r9   r:   test_roundtripq  s    z_TestSQLApi.test_roundtripc                 C  s6   t j|d| jddd t jd| jd}t|| d S )Nr  Fr  )r  r   r  r  r  )r   r   r<   r!   r   r6  r  r9   r9   r:   test_roundtrip_chunksize|  s    z$_TestSQLApi.test_roundtrip_chunksizec              	   C  sD   t | j}|d}W 5 Q R X | }t|dddddg d S r  )r   r    r<   rA   r   r   r   )r_  
pandas_sqlr  rT   r9   r9   r:   test_execute_sql  s    z_TestSQLApi.test_execute_sqlc              	   C  s  t d| j}t|jjjtjr$t	t jd| jdgd}t|jjjtjsNt	|j
 tddddddtddddddgkst	t jd| jdd	id}t|jjjtjst	|j
 tddddddtddddddgkst	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st	t jd| jddid}t|jjjtjst	|j
 tdtdgkst	d S )NSELECT * FROM typesro   parse_datesi  r   r0  r   r  %Y-%m-%d %H:%M:%Srp   i        i  r  rq   z%Y%m%dz
2010-10-10z
2010-12-12)r   r!   r<   r   ro   r7   r   r   
datetime64r   tolistr   rp   rq   r_  r   r9   r9   r:   test_date_parsing  sh      

    z_TestSQLApi.test_date_parsingr  ignoreraisecoercezread_sql, text, moder  )r6   fallbackrm   r6   c                 C  s@   | j |kr<|ddi}||| jdd|iid}t|| d S )Nro   zdatetime64[ns]errors)r  r  )r  r   r<   r   r6  )r_  r  re   r  r  r   rL  rN  r9   r9   r:   test_custom_dateparsing_error  s    
 z)_TestSQLApi.test_custom_dateparsing_errorc                 C  sH   t jd| jdddgd}t|jjjtjs.t	t|j
jjtjsDt	d S )Nr  ro   rp   )	index_colr  )r   r!   r<   r   r   r7   r   r   r  r   rp   r  r9   r9   r:   test_date_and_index  s    z_TestSQLApi.test_date_and_indexc              	   C  st   t tddgdd }tt |d| j}W 5 Q R X |dksHtt	
d| j}t|d |d d d S )	Nz00:00:01z00:00:03foor   test_timedeltar  zSELECT * FROM test_timedeltar   )r   r   r  r   r   r   r   r<   r   r   r!   assert_series_equalr`  )r_  r   rM  rN  r9   r9   r:   r    s    z_TestSQLApi.test_timedeltac              	   C  sH   t dddgi}d}tjt|d |d| jd ks:tW 5 Q R X d S )Nr   y      ?      ?y               @zComplex datatypes not supportedr   Ztest_complex)r   r   r  r	  r   r<   r   )r_  r   r
  r9   r9   r:   test_complex_raises  s    z_TestSQLApi.test_complex_raiseszindex_name,index_label,expected)NNr   )Nother_labelr  )
index_nameNr  )r  r  r  )r   N0)Nr   r  c                 C  sT   t dtdi}||j_d}tj|d| j|d t|| j}|jd |ksPt	d S )NrJ  r  SELECT * FROM test_index_labeltest_index_labelindex_labelr   )
r   ranger   r   r   r   r<   r!   r   r   )r_  r  r  rL  
temp_framer!  r   r9   r9   r:   test_to_sql_index_label  s    z#_TestSQLApi.test_to_sql_index_labelc              	   C  s  d}t dtditddgd}t|d| j}||ks>ttd| j}|j	d d	ks^t|j	d
 dkspttj|d| jdddgd}||ksttd| j}|j	d d 
 ddgkstddg|j_tj|d| jdd}||ksttd| j}|j	d d 
 ddgksttj|d| jdddgd}||ksDttd| j}|j	d d 
 ddgksrtd}tjt|d tj|d| jddd W 5 Q R X d S )Nr  rJ  )ZA0A1)B0ZB1r5  r  r  r   r  r   Zlevel_1r   r   r   )r   r  r  r  r   r   zALength of 'index_label' should match number of levels, which is 2r   )r   r  r   Zfrom_productr   r   r<   r   r!   r   r  r   namesr   r  r	  )r_  Zexpected_row_countr  rN  r   r
  r9   r9   r:   "test_to_sql_index_label_multiindex  sb    
     z._TestSQLApi.test_to_sql_index_label_multiindexc                 C  sV   t jddgdddgddgd}|d| j tjd| jddgd	}tj||d
d d S )Nr  r  r   r   r   r  test_multiindex_roundtripz'SELECT * FROM test_multiindex_roundtripr  TZcheck_index_type)r   r  r   r<   r   r!   r   r6  r_  r   rN  r9   r9   r:   r  Q  s      z%_TestSQLApi.test_multiindex_roundtripr7   Nr   r   c                 C  s^   t ddgddggddgd}|d| jd	ks2t||}tjd
| j|d}t|| d S )N333333?g333333@ffffff@g333333@r   r   r   test_dtype_argumentr  z$SELECT A, B FROM test_dtype_argumentr  r7   )	r   r   r<   r   r   r   r!   r   r6  )r_  r7   r   rL  rN  r9   r9   r:   r  ^  s    
  z_TestSQLApi.test_dtype_argumentc                 C  s4   t ddgddggddgd}tj|d| jdd	 d S )
Nr   r  r0  r  r   r   Ztest_frame_integer_col_namesr   r  )r   r   r   r<   r  r9   r9   r:   test_integer_col_namess  s    z"_TestSQLApi.test_integer_col_namesc                 C  s"   t j|d| jd}d|kstd S )Nr   r  CREATEr   
get_schemar<   r   r_  r   
create_sqlr9   r9   r:   test_get_schemaw  s    z_TestSQLApi.test_get_schemac                 C  s$   t j|d| jdd}d|ks td S )Nr   pypi)r  rE  zCREATE TABLE pypi.r  r  r9   r9   r:   test_get_schema_with_schema{  s    z'_TestSQLApi.test_get_schema_with_schemac                 C  sj   | j dkrddlm} |}nd}tddgddgd	}tj|d
| jd|id}d|ksZtd|ksftd S )Nr6   r   )rl   INTEGER皙?r  r  皙@r3  r   r4  r  r  )r  r6   rl   r   r   r  r<   r   )r_  rl   r7   Zfloat_framer  r9   r9   r:   test_get_schema_dtypes  s    
   z"_TestSQLApi.test_get_schema_dtypesc                 C  sf   t ddgddgd}tj|d| jdd}d	}||ks:ttj|d| jd
dgd}d}||ksbtd S )Nr  r  r  r   )Col1ZCol2r   r  )r  r   z'CONSTRAINT test_pk PRIMARY KEY ("Col1")r   r   z)CONSTRAINT test_pk PRIMARY KEY ("A", "B"))r   r   r  r<   r   )r_  r   r   r  Zconstraint_sentencer9   r9   r:   test_get_schema_keys  s    z _TestSQLApi.test_get_schema_keysc                 C  s  t tjddtdd}|jd| jdd td| j}t  }d	}ddddd
g}tjd| jddD ]0}t	||gdd}t
||| kst|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 }qt|| d S )N   r   Zabcder   Ztest_chunksizeFr5  zselect * from test_chunksizer   r  r  TZignore_indexr   r6   )r   r   randomZrandnlistr   r<   r   r!   r   r   r   r   r6  r  r"   )r_  r   r8  r9  isizeschunkres3r9   r9   r:   test_chunksize_read  s0      


z_TestSQLApi.test_chunksize_readc                 C  sd   t dddgdddgd}| }|d d|d< |jd	| jd
d td| j}t|| d S )Nr   r  r0  zJohn P. Doez	Jane Dove)Z	person_idperson_namer  categorytest_categoricalFr5  zSELECT * FROM test_categorical)	r   copyr   r   r<   r   r!   r   r6  )r_  r   df2r  r9   r9   r:   r    s    z_TestSQLApi.test_categoricalc                 C  s2   t ddgddggddgd}|jd| jd	d
 d S )Nr   r  r0  r     ér4  r   Ztest_unicodeFr5  )r   r   r<   r  r9   r9   r:   test_unicode_column_name  s    z$_TestSQLApi.test_unicode_column_namec                 C  sL   t dddgdtjdgd}|jd| jdd	 td
| j}t|| d S )Nr   r   r  r   r  r  zd1187b08-4943-4c8d-a7f6Fr5  z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)	r   r   nanr   r<   r   r!   r   r6  r_  r   r  r9   r9   r:   test_escaped_table_name  s    z#_TestSQLApi.test_escaped_table_namec                 C  s~   t dddgdddgdd}|jd| jd	d
 td| j}t ddddgddddgddddggddddgd}t|| d S )Nr   r  r0  r1  r   r2  )r   r4  rr  
test_tableFr5  z*SELECT a, b, a +1 as a, c FROM test_table;r  r   r4  rr  r   )r   r   r<   r   r  r   r6  )r_  r   rN  rL  r9   r9   r:   test_read_sql_duplicate_columns  s     
z+_TestSQLApi.test_read_sql_duplicate_columns)0rc  rd  re  r  r  __annotations__r   fixturer  r  r  r  r  r  r  r  r  r  r  r  r  r  markparametrizer   r  r!   r"   r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r9   r9   r9   r:   r    s   


7


	
9	
"	r  zSQLAlchemy not installedreasonc                   @  s   e Zd ZdZdZdZedd Zdd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd Zejddddddddddddd d!d"eeejd#krd$nd%fgd&d' Zejd(d)d*gd+d, Zd-d. Zed/d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8S )9
TestSQLApiz
    Test the public API as it would be used directly

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

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

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

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

    r)   r  c                 C  s   |    |   d S r   )setup_driversetup_enginerv  r9   r9   r:   r"    s    z_TestSQLAlchemy.setup_classTr  c                 C  sd   z| j  | _t| j| _W n, tjjk
rJ   t	
d| j d Y nX | | | | d S )NzCan't connect to z server)r   r^   r<   r   r   r  r6   rY  rZ  r   skipr  r  r  r  r9   r9   r:   r    s    
z_TestSQLAlchemy.setup_methodc                 C  s
   t  d S r   NotImplementedErrorrv  r9   r9   r:   rj  '  s    z_TestSQLAlchemy.setup_driverc                 C  s
   t  d S r   rm  rv  r9   r9   r:   rk  +  s    z_TestSQLAlchemy.setup_enginec                 C  s   |    d S r   r  rh  r9   r9   r:   test_read_sql_parameter/  s    z'_TestSQLAlchemy.test_read_sql_parameterc                 C  s   |    d S r   r  rh  r9   r9   r:   test_read_sql_named_parameter2  s    z-_TestSQLAlchemy.test_read_sql_named_parameterc                 C  s   |  | d S r   r  r  r9   r9   r:   test_to_sql_empty5  s    z!_TestSQLAlchemy.test_to_sql_emptyc              	   C  sz   ddl m} |  }tddddgddddgd}tj|dd	}||d
dksVtW 5 Q R X ||}|d
svtd S )Nr   r}        ?       @      @      @onetwoTr   r  r  )	r6   r   r^   r   r   r   r   r   r   r_  r   Z	temp_connr  r  r   r9   r9   r:   test_create_table8  s    z!_TestSQLAlchemy.test_create_tablec                 C  s   ddl m} |  }tddddgddddgd}t|}||dd	ksPt||}|dsft|	d z|
  W n tk
r   Y nX |drtd S )
Nr   r}  ru  rv  rw  rx  ry  r  r  )r6   r   r^   r   r   r   r   r   r   r^  clear_cacheAttributeErrorr|  r9   r9   r:   test_drop_tableE  s    

z_TestSQLAlchemy.test_drop_tablec                 C  s   |  | d S r   r  r  r9   r9   r:   r  Y  s    z_TestSQLAlchemy.test_roundtripc                 C  s   |    d S r   r  rh  r9   r9   r:   r  \  s    z _TestSQLAlchemy.test_execute_sqlc                 C  s   t jd| jd}t| d S )Nr1   r  )r   r"   r<   r   r  r9   r9   r:   test_read_table_  s    z_TestSQLAlchemy.test_read_tablec                 C  s.   t jd| jddgd}t|jjddg d S )Nr1   r2   )r  r   )r   r"   r<   r   r   r   r\   r  r9   r9   r:   r$  c  s      z'_TestSQLAlchemy.test_read_table_columnsc              	   C  s2   d}t jt|d tjd| jd W 5 Q R X d S )Nz!Table this_doesnt_exist not foundr   Zthis_doesnt_existr  )r   r  r	  r   r"   r<   )r_  r
  r9   r9   r:   test_read_table_absent_raisesi  s    z-_TestSQLAlchemy.test_read_table_absent_raisesc                 C  s~   t d| j}t|jjjtjs$t	t|j
jjtjs:t	t|jjjtjsPt	t|jjjtjsft	t|jjjtszt	d S r-  )r   r"   r<   r   rr   r7   r   r   r   r   rs   r.  rt   Zbool_ru   rv   objectr  r9   r9   r:   r/  n  s    z,_TestSQLAlchemy.test_default_type_conversionc                 C  sH   t ddgid}|jd| jdddks*ttd| j}t|| d S )Ni64l            )r   test_bigintFr5  r   )r   r   r<   r   r   r"   r   r6  r  r9   r9   r:   r  z  s    z_TestSQLAlchemy.test_bigintc                 C  s(   t d| j}t|jjjtjs$t	d S r-  
r   r"   r<   r   ro   r7   r   r   r  r   r  r9   r9   r:   test_default_date_load  s    z&_TestSQLAlchemy.test_default_date_loadc                 C  s@  dd }t d| j}t|ds4|jtjjdd |j}t	|j
sHtt d| jdgd}t|dsz|jtjjdd |j}t	|j
stt|jjdkst||j ttt d| jd	d
dd}|j}t	|j
stt|jjdkst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stnbt| jrt| jjdksRttdddtdddg}t|| j	d}t
| | ntd| j d S )	Nr   z2000-01-01 08:00:00r   z2000-06-01 07:00:00UTC)tzr   z&DateCol loaded with incorrect type -> )r   r7   r   r   r   r)   dtr  r   r   r   r  )rd  Zexpected_datarL  r9   r9   r:   r*    s    




z:_TestSQLAlchemy.test_datetime_with_timezone.<locals>.checkzselect * from typesrw   z&no column with datetime with time zoner  r  r  r   r  Tr  rm   )r!   r<   rW  node
add_markerr   r  xfailrw   r   r7   r   r)   r  r  r   r  r   r"   r   r  )r_  r   r*  r   rd  rL  r9   r9   r:   test_datetime_with_timezone  sD    !
  

z+_TestSQLAlchemy.test_datetime_with_timezonec                 C  s   t dtddddi}|jd| jdddks0t| jd	krP|d jd
|d< n|d jd |d< t	
d| j}t|| t	d| j}| jdkrt|jd tstt|d |d< t|| d S )Nr   2013-01-01 09:00:00r0  
US/Pacificperiodsr  Ztest_datetime_tzFr5  r%   r  zSELECT * FROM test_datetime_tzr#   r   r   )r   r   r   r<   r   r  r  Z
tz_convertZtz_localizer   r"   r   r6  r!   r]   locr)   r   )r_  rL  rN  r9   r9   r:   %test_datetime_with_timezone_roundtrip  s    

z5_TestSQLAlchemy.test_datetime_with_timezone_roundtripc                 C  sd   t dtdddidgd}|jd| jdddks4ttd| j}t tjgdgd}t	
|| d S )	Nr   i'  r   r   r5  Ztest_datetime_obbFr   )r   r   r   r<   r   r   r"   r   ZNaTr   r6  )r_  r   rN  rL  r9   r9   r:   test_out_of_bounds_datetime  s
    z+_TestSQLAlchemy.test_out_of_bounds_datetimec                 C  sh   t ddddd }tdtdi|d}|jd| jdd	dksBttjd| jdd
}t	j
||dd d S )Nz
2018-01-01r   Z6H)r  freqnumsr5  Z	foo_tableZ	info_dater  r  F)Zcheck_names)r   Z
_with_freqr   r  r   r<   r   r   r"   r   r6  )r_  datesrL  rN  r9   r9   r:   "test_naive_datetimeindex_roundtrip  s
    z2_TestSQLAlchemy.test_naive_datetimeindex_roundtripc                 C  sJ  t d| j}| jdkrtntj}t|jj	j
|s6tt jd| jdgd}t|jj	j
tjs`tt jd| jddid}t|jj	j
tjstt jd| jdddiid}t|jj	j
tjstt jd| jdgd}t|jj	j
tjstt jd| jddid}t|jj	j
tjstt jd| jdd	diid}t|jj	j
tjsFtd S )
Nrm   r#   ro   r  r  formatrp   r  unit)r   r"   r<   r  r  r   r  r   ro   r7   r   r   rp   )r_  r   expected_typer9   r9   r:   r    s6      
  
z!_TestSQLAlchemy.test_date_parsingc                 C  s   t tdddtdd}|d| jdks2ttd| j}|j	ddd	}t
|| td
| j}|j	ddd	}| jdkrt|jd tstt|d |d< t
|| nt
|| d S )Nr  r0  r  rw  r  test_datetimer   r   )ZaxisSELECT * FROM test_datetimer#   r  r   )r   r   r   r  r   r<   r   r   r"   r`   r   r6  r!   r  r]   r  r)   r   r  r9   r9   r:   r  %  s    
z_TestSQLAlchemy.test_datetimec                 C  s   t tdddtdd}tj|jd< |jd| jdd	dksBtt	
d| j}t|| t	d
| j}| jdkrt|jd tstt|d dd|d< t|| nt|| d S )Nr  r0  r  rw  r  r   r   r  Fr5  r  r#   r  r   r  )r  )r   r   r   r  r  r  r   r<   r   r   r"   r   r6  r!   r  r]   r)   r   r  r9   r9   r:   test_datetime_NaT:  s    
z!_TestSQLAlchemy.test_datetime_NaTc                 C  sl   t tdddtdddgdgd}|jd| jdddks<ttd| j}|d }t|d }t|| d S )	N  r   r  r   r   	test_dateFr5  )	r   r   r   r<   r   r"   r   r   r  )r_  r   r  rN  rL  r9   r9   r:   test_datetime_dateN  s    "z"_TestSQLAlchemy.test_datetime_datec                 C  s  t tdddtdddgdgd}|jd| jdd	d
ks<ttd| j}t|| |}tj|d|dd	d
ksrtt	d|}|
dd }t|| tj|d| jdd	d
kst| jdkrt	d| j}|
dd }t|| td| j}t|| d S )N	   r   r      r   r   	test_timeFr5  r  Z
test_time2zSELECT * FROM test_time2c                 S  s
   |  dS Nz%H:%M:%S.%fstrftime_r9   r9   r:   <lambda>d      z4_TestSQLAlchemy.test_datetime_time.<locals>.<lambda>Z
test_time3r#   zSELECT * FROM test_time3c                 S  s
   |  dS r  r  r  r9   r9   r:   r  j  r  )r   r   r   r<   r   r"   r   r6  r   r!   applymapr  )r_  r   r   r  r   refr9   r9   r:   test_datetime_timeX  s     "
z"_TestSQLAlchemy.test_datetime_timec                 C  sh   t dtjd}t dtjd}t||d}|jd| jdddksDtt	d| j}t
j||dd	d
 d S )Ni  r   g        )s1r  Ztest_read_writeFr5  r   T)Zcheck_dtypeZcheck_exact)r   r   r;  float32r   r   r<   r   r   r"   r   r6  )r_  r  r  r   r  r9   r9   r:   test_mixed_dtype_inserto  s    z'_TestSQLAlchemy.test_mixed_dtype_insertc                 C  sn   t dddgdtjdgd}|jd| jdd	d
ks6ttd| j}t	|| t
d| j}t	|| d S )Nr   r   r  r   r  r  test_nanFr5  r0  SELECT * FROM test_nan)r   r   r  r   r<   r   r   r"   r   r6  r!   r  r9   r9   r:   test_nan_numeric{  s    z _TestSQLAlchemy.test_nan_numericc                 C  s   t dddgtjtjtjgd}|jd| jdddks:ttd| j}t	|| |d	 
d
|d	< d |d	< td| j}t	|| d S )Nr   r   r  r  r  Fr5  r0  r   r  r  )r   r   r  r   r<   r   r   r"   r   r6  r   r!   r  r9   r9   r:   test_nan_fullcolumn  s     z#_TestSQLAlchemy.test_nan_fullcolumnc                 C  sx   t dddgddtjgd}|jd| jdd	d
ks6td |jd< td| j}t	
|| td| j}t	
|| d S )Nr   r   r  r   r4  r  r  Fr5  r0  r  r   r  )r   r   r  r   r<   r   r  r   r"   r   r6  r!   r  r9   r9   r:   test_nan_string  s    
z_TestSQLAlchemy.test_nan_stringc                 C  s2   ddl m} || j}||}dd |D }|S )Nr   r}  c                 S  s   g | ]}|d  qS r-  r9   r.  r9   r9   r:   rW     s     z6_TestSQLAlchemy._get_index_columns.<locals>.<listcomp>)r6   r   r<   r/  )r_  r0  r   r   r1  r9   r9   r:   r    s
    

z"_TestSQLAlchemy._get_index_columnsc                 C  s   |    d S r   r  rh  r9   r9   r:   test_to_sql_save_index  s    z&_TestSQLAlchemy.test_to_sql_save_indexc                 C  s   |    d S r   r  rh  r9   r9   r:   test_transactions  s    z!_TestSQLAlchemy.test_transactionsc           	   
   C  s   ddl m} ddlm} d}tj||| jd}|jd d }| || j ||}t	| j|r| j
 $}|  || W 5 Q R X W 5 Q R X n"| j  | j| W 5 Q R X t|| j}tj||dd | || j d S )Nr   rd   rM   test_get_schema_create_tabler  Fr  )r6   re   r[   rN   r   r  r<   r   r^  r]   r^   r_   rA   r"   r   r6  )	r_  r   re   rN   ra  r  Zblank_test_dfr<   Zreturned_dfr9   r9   r:   r    s     
 z,_TestSQLAlchemy.test_get_schema_create_tablec              	   C  s  ddl m}m} ddlm} ddg}ddg}t||d}|d	| jd
ksNt|jd| jd|idd
kslt| }|j	| jd |j
d jd j}t||st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st|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|
|stt||st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stt|| j}	| }
|
j| jd | jdkr|n|}|
j| j}t|d j|stt|d j|stt|d j|stt|d j|std S )Nr   )rj   rk   r-   rl   r  T  r   r   r  r   r  BoolDateIntr-   notna_dtype_testr  rY   r$   r  r  r  r-   )r6   rj   rk   r-   rl   r  r.   r   r   r   r   r<   r   r   r"   r  r  r  r   r]   r   )r_  rj   rk   r-   rl   r.   r#  r   ra  r  r  Zmy_typecol_dictr9   r9   r:   test_notna_dtype  s&    

z _TestSQLAlchemy.test_notna_dtypec           
   	   C  sn  ddl m}m}m} ddlm} d}tt|gddt|gddt|gddtdgd	dtdgd
dd}|jd| j	ddd|ddiddkst
td| j	}t|d jd dt|d jd dkst
| }|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  gYB?r  r   float64r   r;  r   )f32f64
f64_as_f32i32r  Ztest_dtypesFr   r     )	precision)r   r   r7   r   r     rY   r  r  r  )r6   r  r-   rl   r  r.   r   r   r   r<   r   r   r"   r   roundr   r  r  r   r)   r   r]   )
r_  r  r-   rl   r.   Vr   r  r  r  r9   r9   r:   test_double_precision	  s>    
0"z%_TestSQLAlchemy.test_double_precisionc                   sj   ddl m  dd dd fdd fd	d
}tddddgid| jdks\t|| j d S )Nr   rM   c                 S  s   d}t j|| dS )Nz'SELECT test_foo_data FROM test_foo_datar  )r   r!   )r@  r!  r9   r9   r:   test_select@	  s    zC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_selectc                 S  s   |j d| dd d S )Ntest_foo_datar   )r   r  r   )r   )r@  r   r9   r9   r:   test_appendD	  s    zC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_appendc                   s   | } | | d S r   r9   )r<   Zfoo_data)r  r  r9   r:   test_connectableG	  s    zH_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_connectablec              
     sH   t |  r<|  "}|  | W 5 Q R X W 5 Q R X n|  d S r   )r]   r^   r_   )Zconnectabler<   )rN   r  r9   r:   mainM	  s
    


z<_TestSQLAlchemy.test_connectable_issue_example.<locals>.mainr  r   r  r0  )r[   rN   r   r   r<   r   )r_  r  r9   )rN   r  r  r  r:   test_connectable_issue_example;	  s    	z._TestSQLAlchemy.test_connectable_issue_exampleinputr  bar)r  infe0c              	   C  s   t |}| jdkrt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sttd	| j}t|| d S )Nr$   r   z1.0.3r  zGH 36465r  zinf cannot be used with MySQLr   ZfoobarFr5  r   )r   r  r   r   r   __version__r   r  r  r  r  r  r	  r   r<   r   r   r"   r   Zassert_equal)r_  r  r   r   r   r  r
  r  r9   r9   r:   test_to_sql_with_negative_npinf[	  s    

z/_TestSQLAlchemy.test_to_sql_with_negative_npinfc              
     s   ddl m mmm} ddlm}m} d}td|gi}| }G  fddd|}|| j	Z}|
 F | }	|j|	 |||d |  tj||j|	d	}
W 5 Q R X W 5 Q R X t|
| d S )
Nr   )r,   rl   Unicoder  )Sessiondeclarative_basezHello, World!spamc                      s6   e Zd ZdZddgiZ ddZ dddZd	S )
z7_TestSQLAlchemy.test_temporary_table.<locals>.TemporaryZ	temp_testprefixes	TEMPORARYTZprimary_keyr  F)ZnullableN)rc  rd  re  __tablename__Z__table_args__idr  r9   r,   rl   r  r9   r:   	Temporary	  s   
r  )r  )r   r  )r6   r,   rl   r  r  sqlalchemy.ormr  r  r   r<   r_   r@  Z	__table__ra   addflushr   r!   r  r   r6  )r_  r  r  r  Z	test_datarL  ZBaser  sessionr<   r   r9   r  r:   test_temporary_tablez	  s    
(z$_TestSQLAlchemy.test_temporary_tablec              	   C  s.   d}t jt|d | |d W 5 Q R X d S )Nz*engine must be one of 'auto', 'sqlalchemy'r   Z
bad_engine)r   r  r	  r  r  r9   r9   r:   test_invalid_engine	  s    z#_TestSQLAlchemy.test_invalid_enginec              	   C  s&   t dd | | W 5 Q R X d S )Nio.sql.enginer6   r   option_contextr  r  r9   r9   r:   test_options_sqlalchemy	  s    z'_TestSQLAlchemy.test_options_sqlalchemyc              	   C  s&   t dd | | W 5 Q R X d S )Nr  r  r   r  r9   r9   r:   test_options_auto	  s    z!_TestSQLAlchemy.test_options_autoc              	   C  s   t tdtsttdd* t tdts2tt tdtsDtW 5 Q R X tdd* t tdtsntt tdtstW 5 Q R X d S )Nr6   r  r  )r]   r   r   r   r   r  rh  r9   r9   r:   test_options_get_engine	  s    z'_TestSQLAlchemy.test_options_get_enginec                 C  s   d S r   r9   rh  r9   r9   r:   "test_get_engine_auto_error_message	  s    z2_TestSQLAlchemy.test_get_engine_auto_error_messagefuncr  r!   c           	   	   C  s   d}|   }|j|| jddd td|" tt|d| | j|d}W 5 Q R X | ||}t|| td|F tt|d| | j|dd	}| ||}|D ]}t|| qW 5 Q R X d S )
Nr   Fr   r   r   mode.string_storageSelect * from dtype_backendr0  r  r  	dtype_backend_datar   r<   r   r  rY  dtype_backend_expectedr   r6  	r_  string_storager  r  r'  r   rN  rL  iteratorr9   r9   r:   test_read_sql_dtype_backend	  s*      z+_TestSQLAlchemy.test_read_sql_dtype_backendr"   c           	   	   C  s   d}|   }|j|| jddd td| tt||| j|d}W 5 Q R X | ||}t|| td|@ tt||| j|dd}| ||}|D ]}t|| qW 5 Q R X d S )	Nr   Fr   r  r  r
  r0  r  r  r  r9   r9   r:   !test_read_sql_dtype_backend_table	  s"     z1_TestSQLAlchemy.test_read_sql_dtype_backend_tablec              	   C  sX   d}|   }|j|| jddd d}tjt|d tt||| jdd W 5 Q R X d S )	Nr   Fr   r  zPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.r   numpyr
  )r  r   r<   r   r  r	  rY  r   )r_  r  r'  r   r
  r9   r9   r:   )test_read_sql_invalid_dtype_backend_table	  s    z9_TestSQLAlchemy.test_read_sql_invalid_dtype_backend_tabler   rT  c                 C  sn   t tdtjdgddtdddgddtdtjdgddtdd	dgddd
dd gd
dd
gdddgddd gdS )Nr   r0  r=  r   r  r        @Float64rv  TFr   r4  rr  r   r4  rr  defgh)r   r   r   r  rh  r9   r9   r:   r  	  s    z"_TestSQLAlchemy.dtype_backend_datac              
     s&  |dkr@t tjdddgtjd}t tjddtjgtjd}n2tdtdddg}tddd g}t	t
dtjdgd	dt
dd
dgd	dt
dtjdgddt
dddgddt
ddtjgddt
dddgdd||d|dkr"tdddlm  t	 fddjD S )Npythonr   r4  rr  r   r   r   r0  r=  r  r  r  r  rv  TFbooleanr  r   )ArrowExtensionArrayc                   s$   i | ]}| j | d dqS )T)Zfrom_pandas)r   )rS   rd  r!  r   par9   r:   
<dictcomp>#
  s    z:_TestSQLAlchemy.dtype_backend_expected.<locals>.<dictcomp>)r   r   r   Zobject_r   ZNAr   r   r   r   r   r  Zpandas.arraysr!  r   )r_  storager  Zstring_arrayZstring_array_nar9   r"  r:   r  
  s4    


z&_TestSQLAlchemy.dtype_backend_expectedc                 C  sb   ddd}t ddgd|}| }|jd| jdd	d
 td| j|ddD ]}t|| qLd S )Nr   r  r3  r   r4  r   r   Fr   r  zSELECT * FROM testr   )r7   r  )r   r   r  r   r<   r!   r   r6  )r_  r   r   rL  rN  r9   r9   r:   test_chunksize_empty_dtypes*
  s    

z+_TestSQLAlchemy.test_chunksize_empty_dtypesr  numpy_nullablec                 C  s   d}t dddgdd}|j|| jddd	 tt|d
| | jdtji|d}t tdddgtjdtdddg|dkszdnddd}t	|| d S )Nr   r   r  r0  r   r3  Fr   r  r	  r   )r7   r  r   r'  r   r=  )
r   r   r<   rY  r   r   r  r   r   r6  )r_  r  r  r'  r   rN  rL  r9   r9   r:   test_read_sql_dtype9
  s$    	z#_TestSQLAlchemy.test_read_sql_dtypeN)Brc  rd  re  r  r  r  r"  r   r  r  rj  rk  rp  rr  rt  r}  r  r  r  r  r$  r  r/  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   infr  r  r  r  r  r  r  r  r  r  r  r  r&  r   Z
no_defaultr(  r9   r9   r9   r:   ri    s   



	

O
 
	#- (
 


%ri  c                      s|   e Zd ZdZdZedd Zedd Zdd Zd	d
 Z	dd Z
dd Zdd fddZejdddgdd Z  ZS )TestSQLiteAlchemyzL
    Test the sqlalchemy backend against an in-memory sqlite database.

    r#   c                 C  s   t d| _d S r   r!  rv  r9   r9   r:   rk  [
  s    zTestSQLiteAlchemy.setup_enginec                 C  s
   d | _ d S r   )driverrv  r9   r9   r:   rj  _
  s    zTestSQLiteAlchemy.setup_driverc                 C  s   t d| j}t|jjjtjs$t	t|j
jjtjs:t	t|jjjtjsPt	t|jjjtjsft	t|jjjtjs|t	d S r-  )r   r"   r<   r   rr   r7   r   r   r   r   rs   r.  rt   ru   rv   r  r9   r9   r:   r/  d
  s    z.TestSQLiteAlchemy.test_default_type_conversionc                 C  s(   t d| j}t|jjjtjr$t	d S r-  r  r  r9   r9   r:   r  s
  s    z(TestSQLiteAlchemy.test_default_date_loadc              	   C  sV   t dddgidd}|jd| jdddks.ttd  td| j W 5 Q R X d S )	Nr   r   r  r   r   Ztest_bigintwarningFr5  )r   r   r<   r   r   r   r   r"   r  r9   r9   r:   test_bigint_warningy
  s    z%TestSQLiteAlchemy.test_bigint_warningc           	   	     s   ddl m mm ddlm}m} | }G  fddd|}| j  |j	
| j W 5 Q R X || jd}| X}tddgdd	gd
}|jd| jddddkst|  ||j|j}t|}W 5 Q R X t|jddgkstd S )Nr   r,   rl   r/   )r  sessionmakerc                      s(   e Zd ZdZ ddZ dZdS )z>TestSQLiteAlchemy.test_row_object_is_named_tuple.<locals>.Testr   Tr  2   N)rc  rd  re  r  r  string_columnr9   r-  r9   r:   Test
  s   r1  rY   r   ZhelloZworld)r  r0  r   Fr   )r  r   r   r  r  r0  )r6   r,   rl   r/   r  r  r.  r<   r_   r8   Z
create_allr   r   r   rl  r!  r  r0  r  r   )	r_  r  r.  Z	BaseModelr1  r  r  r   Z
test_queryr9   r-  r:   test_row_object_is_named_tuple
  s"    z0TestSQLiteAlchemy.test_row_object_is_named_tupler   rT  c                   s<   t  ||}|dkr(|ddd}n|ddd}|S Nr'  r=  )r  r  zint64[pyarrow]superr  r   r_  r%  r  r   	__class__r9   r:   r  
  s
    z(TestSQLiteAlchemy.dtype_backend_expectedr  r  r"   c                 C  s   d S r   r9   )r_  r  r  r9   r9   r:   r  
  s    z3TestSQLiteAlchemy.test_read_sql_dtype_backend_table)rc  rd  re  r  r  r  rk  rj  r/  r  r,  r2  r  r   r  r  r  __classcell__r9   r9   r7  r:   r*  S
  s   

%	r*  c                      sN   e Zd ZdZdZdZedd Zedd Zdd	 Z	d
d fddZ
  ZS )TestMySQLAlchemyzA
    Test the sqlalchemy backend against an MySQL database.

    r$   i  c                 C  s(   t jd| j d| j d| jd| _d S )Nzmysql+z://root@localhost:/pandas)r   )r6   r   r+  portr   r   rv  r9   r9   r:   rk  
  s    zTestMySQLAlchemy.setup_enginec                 C  s$   t d}d| _d|jjji| _d S )Nr   r   )r   r   r+  r   r   r   r   )rw  r   r9   r9   r:   rj  
  s    
zTestMySQLAlchemy.setup_driverc                 C  s   d S r   r9   rh  r9   r9   r:   r/  
  s    z-TestMySQLAlchemy.test_default_type_conversionr   rT  c                   s<   t  ||}|dkr(|ddd}n|ddd}|S r3  r4  r6  r7  r9   r:   r  
  s
    z'TestMySQLAlchemy.dtype_backend_expected)rc  rd  re  r  r  r<  r  rk  rj  r/  r  r9  r9   r9   r7  r:   r:  
  s   

r:  c                   @  s8   e Zd ZdZdZdZedd Zedd Zdd	 Z	d
S )TestPostgreSQLAlchemyzF
    Test the sqlalchemy backend against an PostgreSQL database.

    r%   i8  c                 C  s"   t d| j d| j d| _d S )Nzpostgresql+z://postgres:postgres@localhost:r;  )r6   r   r+  r<  r   rv  r9   r9   r:   rk  
  s    z"TestPostgreSQLAlchemy.setup_enginec                 C  s   t d d| _d S )Nr   )r   r   r+  rv  r9   r9   r:   rj  
  s    
z"TestPostgreSQLAlchemy.setup_driverc              	   C  s  ddl m} tddgddgddgd	}| j  | jd
 | jd W 5 Q R X |jd| jdddkspt|jd| jddddkst|jd| jddddkst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st|jd| jdddd |jd| jdddddksttj	d| jdd}t
t||gdd| t| j|r|  }	tj|	dd}
|
j|ddddks2t|
j|dddddksNt|
j|dddddksjttj	d| jdd}|
d}t
|| d S )Nr   rM   r   r  r1  r   r   rH  rI  z$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Ztest_schema_publicFr5  Ztest_schema_public_explicitpublic)r   rE  Ztest_schema_otherother)rE  z!Table test_schema_other not foundr   )rE  r   r   )rE  r   r   r   Tr  Ztest_schema_other2r  )r[   rN   r   r<   r_   r   r   r   r   r"   r   r6  r   r  r	  r   r]   r^   r   Z
read_table)r_  rN   r   r8  r9  r  Zres4r
  r  Zengine2Zpdsqlr9   r9   r:   test_schema_support
  s         

z)TestPostgreSQLAlchemy.test_schema_supportN)
rc  rd  re  r  r  r<  r  rk  rj  r@  r9   r9   r9   r:   r=  
  s   

r=  c                   @  s   e Zd ZdZdZejdddd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zejdddgdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(TestSQLiteFallbackzG
    Test the fallback mode against an in-memory sqlite database.

    r#   Tr  c                 C  s0   |   | _| | | | t| j| _d S r   )r^   r<   r  r  r   r   r  r  r9   r9   r:   r  U  s    


zTestSQLiteFallback.setup_methodc                 C  s   |    d S r   ro  rh  r9   r9   r:   rp  \  s    z*TestSQLiteFallback.test_read_sql_parameterc                 C  s   |    d S r   rq  rh  r9   r9   r:   rr  _  s    z0TestSQLiteFallback.test_read_sql_named_parameterc                 C  s   |  | d S r   rs  r  r9   r9   r:   rt  b  s    z$TestSQLiteFallback.test_to_sql_emptyc                 C  sd   t ddddgddddgd}| j|ddks4t| jdsDt| jd | jdr`td S )Nru  rv  rw  rx  ry  Zdrop_test_framer  )r   r  r   r   r   r^  )r_  r  r9   r9   r:   test_create_and_drop_tablee  s    z-TestSQLiteFallback.test_create_and_drop_tablec                 C  s   |  | d S r   r  r  r9   r9   r:   r  r  s    z!TestSQLiteFallback.test_roundtripc                 C  s   |    d S r   r  rh  r9   r9   r:   r  u  s    z#TestSQLiteFallback.test_execute_sqlc                 C  s   t tdddtdddgdgd}|jd| jdddks<ttd	| j}| jd
krft||	t
 n| jdkr|t|| d S )Nr  r   r  r   r   r  Fr5  zSELECT * FROM test_dater#   r$   )r   r   r   r<   r   r!   r  r   r6  r   r)   r  r9   r9   r:   r  x  s    "

z%TestSQLiteFallback.test_datetime_datetz_awareFc                 C  s   |st dddt dddg}n$tdddd}t| d	d
 }t|dgd}|jd| jdddksjtt	d| j}| j
dkr|dd
 }t|| d S )Nr  r   r   r  r  r  r  r  c                 S  s   |   S r   )timetz)r  r9   r9   r:   r    r  z7TestSQLiteFallback.test_datetime_time.<locals>.<lambda>r   r   r  Fr5  zSELECT * FROM test_timer#   c                 S  s
   |  dS r  r  r  r9   r9   r:   r    r  )r   r   r   Zto_pydatetimemapr   r   r<   r   r!   r  r  r   r6  )r_  rC  Ztz_timesZtz_dtr   r  rL  r9   r9   r:   r    s    
z%TestSQLiteFallback.test_datetime_timec                 C  sT   t dd| d | j}g }|jD ]*}t d| d| j}||j  q$|S )Nz1SELECT * FROM sqlite_master WHERE type = 'index' zAND tbl_name = ''zPRAGMA index_info())r   r!   r<   r   r   r  )r_  r0  r1  r  Zix_nameZix_infor9   r9   r:   r    s    

z%TestSQLiteFallback._get_index_columnsc                 C  s   |    d S r   r  rh  r9   r9   r:   r    s    z)TestSQLiteFallback.test_to_sql_save_indexc                 C  s   |    d S r   r  rh  r9   r9   r:   r    s    z$TestSQLiteFallback.test_transactionsc           
      C  sT   | j d| d}|D ] \}}}}}}	||kr|  S qtd| d| dd S )NzPRAGMA table_info(rG  zTable z	, column r`  )r<   rA   r	  )
r_  r'  rc  ZrecsZcidr   ctypeZnot_nulldefaultpkr9   r9   r:   re    s
    
z*TestSQLiteFallback._get_sqlite_column_typec              	   C  s  | j dkrtd ddg}ddg}t||d}|d| jd	ksFt|jd
| jddidd	ksdt| dddksxt| d
ddkstd}tjt	|d |jd| jdt
id W 5 Q R X |jd| jddd	kst| dddkst| dddkstd S )Nr$   Not applicable to MySQL legacyr   r   r  r  r   r  r  r  STRINGr   r  z!B \(<class 'bool'>\) not a stringr   r  r  )r  r   rl  r   r   r<   r   re  r  r	  bool)r_  r#  r   r   r
  r9   r9   r:   r    s    

 zTestSQLiteFallback.test_dtypec                 C  s   | j dkrtd tdd gttdddd gtdd gddtd	d gd
}t|}d}||| jdkspt| 	|ddkst| 	|ddkst| 	|ddkst| 	|ddkstd S )Nr$   rK  Tr  r   r   r  r   r  r  r  r  r  r  r  r2  r  r-   r+   )
r  r   rl  r   r   r   r   r<   r   re  )r_  r#  r   ra  r9   r9   r:   r    s    



z#TestSQLiteFallback.test_notna_dtypec                 C  s   t ddgddggddgd}d}tjt|d	 |d
| j W 5 Q R X tddddddddddg
D ]x\}}||| jdkstt	|| j t ddgddggd|gd}d|d}||| jdkstt	|| j qdd S )Nr   r  r0  r  r   r4  r   z$Empty table or column name specifiedr   r*  ztest_weird_name]ztest_weird_name[ztest_weird_name`ztest_weird_name"ztest_weird_name'z_b.test_weird_name_01-30z"_b.test_weird_name_01-30"Z99beginswithnumberZ12345r  Ztest_weird_col_namer  )
r   r   r  r	  r   r<   	enumerater   r   Ztable_exists)r_  r   r
  ZndxZ
weird_namer  Zc_tblr9   r9   r:   test_illegal_names  s.    z%TestSQLiteFallback.test_illegal_namesN)rc  rd  re  r  r  r   r  r  rp  rr  rt  rB  r  r  r  r  r  r  r  r  r  re  r  r  rO  r9   r9   r9   r:   rA  M  s(   


rA  z'{}'z{:.8f}z{:d}c                 C  s   dS )NZNULLr9   )xr9   r9   r:   r    r  r  z{:.10f}z'{!s}'c                 G  sJ   g }|D ]4}t |tr"t|r"d }tt| }||| q| t| S r   )r]   r   r   _formattersr   r   r  )r   rV  Zprocessed_argsarg	formatterr9   r9   r:   format_query  s    rT  c              	   C  s8   t |}||  }W 5 Q R X |dkr0dS t|S )z#Replace removed sql.tquery functionN)r   r    rA   rp  r  )r!  r  r  r  r9   r9   r:   tquery  s    rU  c                   @  s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )TestXSQLitec                 C  s*   |  }|dt|  |  d S ri  )r@   rA   r   rk  rl  )r_  r   r<   rG   r9   r9   r:   r^    s    zTestXSQLite.drop_tablec                 C  s   t  }tj|d|dddks"ttd|}|j|_|}t || dgt| |d< |	 }t
tt|tjdd	 }|	 |d
< tj|d|dddksttjd|d
d}|	 }||_d
|j_t || d S )Nr  F)r   r  r   r  zselect * from test_tabler   txtr   r  ZIdxZtest_table2zselect * from test_table2r  )r   makeTimeDataFramer   r   r   r  r   r6  r   r  r   r   r  r   r   )r_  r   r   rN  rL  Zframe2Znew_idxr9   r9   r:   
test_basic!  s0      zTestXSQLite.test_basicc           
      C  s   t  }tj|jd< t|d}| }|| d}|	 D ]"\}}t
|f| }t||d q>|  tjd|d}	|j|	_t j|	|dd d S )N)r   r   r   z(INSERT INTO test VALUES (%s, %s, %s, %s)r  select * from testgMbP?)Zrtol)r   rX  r   r  r   r   r  r@   rA   ZiterrowsrT  rU  rl  r  r   r6  )
r_  r   r   r  rG   insr  rT   Zfmt_sqlrN  r9   r9   r:   test_write_row_by_row>  s    
z!TestXSQLite.test_write_row_by_rowc           	   	   C  s   t  }t|d}| }|| d}|jd }t|}||t| W 5 Q R X |	  t
d|}|jd d |_t ||d d  d S )Nr   z$INSERT INTO test VALUES (?, ?, ?, ?)r   rZ  r   )r   rX  r   r  r@   rA   r   r    r  rl  r  r   r6  )	r_  r   r   r  rG   r[  rT   r  rN  r9   r9   r:   test_executeP  s    

zTestXSQLite.test_executec                 C  s   t  }t|d}| }|D ]6}|d}t|dkr |d dkr |d dks tq tj|dddgd	}| }d
|kst| }|	| d S )Nr    r  r   r   r   ZDATETIMEr   r&  zPRIMARY KEY ("A", "B"))
r   rX  r   r  
splitlinesra  r   r   r@   rA   )r_  r   r   r  lineslinetokensrG   r9   r9   r:   test_schema`  s    
zTestXSQLite.test_schemac              
   C  sj   d}|  }|| t|@}|d |d tjtjdd |d W 5 Q R X W 5 Q R X d S )N
        CREATE TABLE test
        (
        a TEXT,
        b TEXT,
        c REAL,
        PRIMARY KEY (a, b)
        );
        ,INSERT INTO test VALUES("foo", "bar", 1.234)z,INSERT INTO test VALUES("foo", "baz", 2.567)zExecution failed on sqlr   z(INSERT INTO test VALUES("foo", "bar", 7))r@   rA   r   r    r   r  r]  )r_  r   r  rG   r  r9   r9   r:   test_execute_failo  s    	


zTestXSQLite.test_execute_failc              
   C  s   d}t td8}| }|| t|}|d W 5 Q R X W 5 Q R X d}tj	tj
|d td|d W 5 Q R X d S )Nrd  r   re  z$Cannot operate on a closed database.r   rZ  r  )r   r   rf   r^   r@   rA   r   r    r   r  ZProgrammingErrorrU  )r_  r  r<   rG   r  r
  r9   r9   r:   test_execute_closed_connection  s    	
z*TestXSQLite.test_execute_closed_connectionc                 C  s0   t dtdi}tj||ddddks,td S )NFromr   ZtestkeywordsFr  r   r   )r   r   Zonesr   r   r   )r_  r   r   r9   r9   r:   test_keyword_as_column_names  s    z(TestXSQLite.test_keyword_as_column_namesc                 C  sp   t ddgdgd}tj||ddddks,t|}tdd	 |d
D }|dksTttd
|}t|| d S )Nr   r  Zc0r   mono_dfFri  c                 s  s   | ]}|d  V  qdS )r   Nr9   )rS   Zmy_c0r9   r9   r:   	<genexpr>  s     z8TestXSQLite.test_onecolumn_of_integer.<locals>.<genexpr>zselect * from mono_dfr0  )	r   r   r   r   sumrA   r  r   r6  )r_  r   rk  Zcon_xZthe_sumrN  r9   r9   r:   test_onecolumn_of_integer  s    z%TestXSQLite.test_onecolumn_of_integerc              	   C  s  t ddgddgd}t dddgd	d
dgd}d}d| }d}tjt|d tj|||dd W 5 Q R X | || tj|||dd d}tjt|d tj|||dd W 5 Q R X tj|||ddd t||dddgkst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stt||ddddddgkst| || d S )Nr   r  r   r   )rJ  rK  r0  r  r   r   r   EZtable_if_existszSELECT * FROM z*'notvalidvalue' is not valid for if_existsr   Znotvalidvalue)r   r  r   r   r  z&Table 'table_if_exists' already existsr   F)r   r  r   r   r   r  r  r  )r0  r   )r  r   )r   ro  r   )	r   r   r  r	  r   r   r^  rU  r   )r_  r   Zdf_if_exists_1Zdf_if_exists_2r   Z
sql_selectr
  r9   r9   r:   test_if_exists  s    
   



zTestXSQLite.test_if_existsN)rc  rd  re  r^  rY  r\  r]  rc  rf  rg  rj  rn  rp  r9   r9   r9   r:   rV    s   rV  )N)r  
__future__r   r   r   rC   r   r   r   r   r   r   pathlibr
   rf   r  r   r   Zpandas._libsr   Zpandas.util._test_decoratorsutilZ_test_decoratorsrO  Zpandas.core.dtypes.commonr   r   Zpandasr   r   r   r   r   r   r   r   r   r   r   Zpandas._testingZ_testingr   Zpandas.core.arraysr   r   Zpandas.util.versionr   Z	pandas.ior   Zpandas.io.sqlr   r   r   r   r    r!   r"   r6   rh  rE  r  r;   rJ   rc   rh   rz   r|   r}   r   r   r  r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmysql_connectableZpostgresql_connectableZsqlite_connectableZsqlite_iris_connectableZsqlalchemy_connectableZsqlalchemy_connectable_irisZall_connectableZall_connectable_irisr  r   r  r   r   r   r  r  r  r  r  r  r"  r$  r%  r,  r/  r:  rO  rT  rU  rV  rf  ru  r  r  rg  r  rP  ri  r*  r:  r=  rA  r  r)   Zstr_bytesr   r   r   r  rM  rQ  rT  rU  rV  r9   r9   r9   r:   <module>   s  0$

!



#















		$%

"    S LX      Lb#s 0         
