o
    Û­jc4 ã                   @  s¬  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mZ d dlZd dlZd dlZd dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlm  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l0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; er«d dl<Z<ej= >d¡ej=j?gZ@ejAdd„ ƒZBdd„ ZC�dôdd„ZD�dôdd„ZE�dôdd„ZFdd„ ZG�dõd!d"„ZH�död%d&„ZI�död'd(„ZJ�d÷d)d*„ZKd+d,„ ZL�død/d0„ZM�dùd2d3„ZNejAd4d5„ ƒZOejAd6d#„ ƒZPejAd7d8„ ƒZQejAd9d:„ ƒZRejAd;d<„ ƒZSd=d>„ ZTd?d@„ ZU�dúdCdD„ZV�dûdFdG„ZWejAdHdI„ ƒZXejAdJdK„ ƒZYejAdLdM„ ƒZZejAdNdO„ ƒZ[ejAdPdQ„ ƒZ\ejAdRdS„ ƒZ]ejAdTdU„ ƒZ^ejAdVdW„ ƒZ_ejAdXdY„ ƒZ`ejAdZd[„ ƒZaejAd\d]„ ƒZbejAd^d_„ ƒZcejAd`da„ ƒZdejAdbdc„ ƒZeejAddde„ ƒZfejAdfdg„ ƒZgejAdhdi„ ƒZhejAdjdk„ ƒZiejAdldm„ ƒZjejAdndo„ ƒZkejAdpdq„ ƒZlejAdrds„ ƒZmejAdtdu„ ƒZnejAdvdw„ ƒZoejAdxdy„ ƒZpejAdzd{„ ƒZqejAd|d}„ ƒZrejAd~d„ ƒZsejAd€d�„ ƒZtejAd‚dƒ„ ƒZuejvdIej=jwd„�ejvdOej=jwd„�gZxejvdKej=jwd„�ejvdQej=jwd„�gZyejvdMej=jwd„�ejvdSej=jwd„�gZzejvdUej=jwd„�ejvd[ej=jwd„�gZ{ejvdWej=jwd„�ejvdcej=jwd„�gZ|ejvdYej=jwd„�ejvdeej=jwd„�gZ}g d…¢Z~g d†¢Zg d‡¢Z€exe{ e~ Z�eye| e Z‚eze} e€ Zƒdyejvd]ej=jwd„�gZ„ejvd_ej=jwd„�d{gZ…ejvdaej=jwd„�d}gZ†e�dg e„ Z‡e‚d�g e… Zˆeƒdƒg e† Z‰ej= ŠdAe‡¡dˆd‰„ ƒZ‹ej= ŠdAe‡¡dŠd‹„ ƒZŒej= ŠdAe‡¡dŒd�„ ƒZ�ej= ŠdAe‡¡dŽd�„ ƒZŽej= ŠdAe‡¡ej= Šd�dd‘g¡d’d“„ ƒƒZ�ej= ŠdAe‡¡ej= Šd”d•d–g¡d—d˜„ ƒƒZ�ej= ŠdAe‡¡d™dš„ ƒZ‘ej= ŠdAeˆ¡d›dœ„ ƒZ’ej= ŠdAeˆ¡d�dž„ ƒZ“ej= ŠdAe‚¡dŸd „ ƒZ”ej= ŠdAeˆ¡d¡d¢„ ƒZ•ej= ŠdAe‚¡d£d¤„ ƒZ–ej= ŠdAe‚¡d¥d¦„ ƒZ—ej= ŠdAe�¡d§d¨„ ƒZ˜ej= ŠdAe‰¡d©dª„ ƒZ™ej= ŠdAex¡d«d¬„ ƒZšej= ŠdAe{¡ej= Šd­d®d¯g¡d°d±„ ƒƒZ›ej= ŠdAe{¡d²d³„ ƒZœej= ŠdAe‡¡d´dµ„ ƒZ�ej= ŠdAex¡d¶d·„ ƒZžej= ŠdAe{¡d¸d¹„ ƒZŸdºd»„ Z d¼d½„ Z¡d¾d¿„ Z¢dÀdÁ„ Z£ej= ŠdAeˆ¡dÂdÃ„ ƒZ¤ej= ŠdAeˆ¡dÄdÅ„ ƒZ¥ej= ŠdAeˆ¡dÆdÇ„ ƒZ¦ej= ŠdAeˆ¡dÈdÉ„ ƒZ§ej= ŠdAeˆ¡dÊdË„ ƒZ¨ej= ŠdAe‡¡dÌdÍ„ ƒZ©ej= ŠdAe‡¡dÎdÏ„ ƒZªej= ŠdAe‡¡dÐdÑ„ ƒZ«ej= ŠdAe‡¡dÒdÓ„ ƒZ¬ej= ŠdAe‡¡dÔdÕ„ ƒZ­ej= ŠdAe‡¡dÖd×„ ƒZ®ej= ŠdAe‡¡dØdÙ„ ƒZ¯ej= ŠdAe‡¡dÚdÛ„ ƒZ°ej= ŠdAeˆ¡dÜdÝ„ ƒZ±ej= ŠdAe‰¡dÞdß„ ƒZ²ej= ŠdAe‰¡ej= Šdàg dá¢¡ej= Šdâe3j³dãdäfe3j³dådæfe3j:dãdäfe3j;dådæfg¡dçdè„ ƒƒƒZ´ej= ŠdAe‰¡dédê„ ƒZµej= ŠdAe‡¡dëdì„ ƒZ¶ej= ŠdAe‡¡dídî„ ƒZ·ej= ŠdAe‡¡ej= Šdïg dð¢¡dñdò„ ƒƒZ¸ej= ŠdAe‡¡dódô„ ƒZ¹ej= ŠdAe‡¡dõdö„ ƒZºej= ŠdAe‡¡ej= Šd÷de»e¼e»e¼døœg¡dùdú„ ƒƒZ½ej= ŠdAe‡¡dûdü„ ƒZ¾ej= ŠdAe‡¡dýdþ„ ƒZ¿ej= ŠdAe‡¡dÿ�d „ ƒZÀej= ŠdAe‡¡�d�d„ ƒZÁej= ŠdAe‡¡�d�d„ ƒZÂej= ŠdAe‡¡�d�d„ ƒZÃej= ŠdAe‡¡�d�d„ ƒZÄej= ŠdAe‡¡�d	�d
„ ƒZÅej= ŠdAe‡¡�d�d„ ƒZÆej= ŠdAe‡¡�d�d„ ƒZÇej= ŠdAe‡¡�d�d„ ƒZÈej= ŠdAe‡¡�d�d„ ƒZÉej= ŠdAeˆ¡�d�d„ ƒZÊ�d�d„ ZËej= ŠdAe‡¡�d�d„ ƒZÌej= ŠdAe�¡�d�d„ ƒZÍej= ŠdAe�¡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= ŠdAe�¡ej= Š�d/�d0�d1g¡�d2�d3„ ƒƒZÑej= ŠdAe‡¡�d4�d5„ ƒZÒe  Ó�d6¡ej= ŠdAe‡¡�d7�d8„ ƒƒZÔej= ŠdAe‚¡�d9�d:„ ƒZÕej= ŠdAe‚¡�d;�d<„ ƒZÖej= ŠdAe‡¡�d=�d>„ ƒZ×�d?�d@„ ZØe  Ódæ¡�dA�dB„ ƒZÙe  Ódæ¡�dC�dD„ ƒZÚ�dE�dF„ ZÛ�dG�dH„ ZÜ�dI�dJ„ ZÝej= ŠdAe�¡�dK�dL„ ƒZÞej= ŠdAe�¡�dM�dN„ ƒZßej= ŠdAe‡¡�dO�dP„ ƒZàej= ŠdAeˆ¡�dQ�dR„ ƒZáej= ŠdAe‚¡�dS�dT„ ƒZâej= ŠdAe‚¡�dU�dV„ ƒZãej= ŠdAe‚¡�dW�dX„ ƒZäej= ŠdAeƒ¡�dY�dZ„ ƒZåej= ŠdAe�¡�d[�d\„ ƒZæej= ŠdAeƒ¡�d]�d^„ ƒZçej= ŠdAe{¡ej= Š�d_d�d`gg¡�da�db„ ƒƒZèej= ŠdAe{¡�dc�dd„ ƒZéej= ŠdAe{¡�de�df„ ƒZêej= ŠdAe�¡�dg�dh„ ƒZëej= ŠdAe�¡�di�dj„ ƒZìej= ŠdAe�¡�dk�dl„ ƒZíej= ŠdAeƒ¡�dm�dn„ ƒZîej= ŠdAe�¡�do�dp„ ƒZïej= ŠdAe�¡�dq�dr„ ƒZðej= ŠdAe�¡�ds�dt„ ƒZñej= ŠdAe�¡�du�dv„ ƒZòej= ŠdAe�¡�dw�dx„ ƒZóej= ŠdAe�¡�dy�dz„ ƒZôej= ŠdAe�¡�d{�d|„ ƒZõej= ŠdAe�¡�d}�d~„ ƒZöej= ŠdAe‡¡�d�d€„ ƒZ÷ej= ŠdAe‡¡�d��d‚„ ƒZøej= ŠdAe‡¡�dƒ�d„„ ƒZùej= ŠdAe�¡�d…�d†„ ƒZúej= ŠdAe�¡�d‡�dˆ„ ƒZûej= ŠdAe�¡�d‰�dŠ„ ƒZüej= ŠdAe�¡�d‹�dŒ„ ƒZýej= ŠdAe�¡�d��dŽ„ ƒZþej= ŠdAe�¡ej= Š�d��d�ejÿgi�d�ejÿ giejÿ g�d‘g�d’œg¡�d“�d”„ ƒƒ�Z ej= ŠdAe�¡�d•�d–„ ƒ�Zej= ŠdAe‡¡�d—�d˜„ ƒ�Zej= ŠdAe‡¡�d™�dš„ ƒ�Zej= ŠdAe�¡�d›�dœ„ ƒ�Zej= ŠdAe‡¡�d��dž„ ƒ�Z�dŸ�d „ �Z�d¡�d¢„ �Zej= ŠdAe‡¡ej= Š�d£�d¤�d¥g¡�d¦�d§„ ƒƒ�Zej= ŠdAe‡¡ej= Š�d£�d¤�d¨g¡�d©�dª„ ƒƒ�Z	ej= ŠdAe‡¡ej= Š�d£g �d«¢¡�d¬�d­„ ƒƒ�Z
ejA�dü�d¯�d°„ƒ�ZejA�d±�d²„ ƒ�Zej= ŠdAe‡¡�d³�d´„ ƒ�Zej= ŠdAe‡¡ej= Š�dµe�j�d¶g¡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ejA�dÅ�dÆ„ ƒ�Z�dÇ�dÈ„ �Zej=jw�dÉ�dÊ„ ƒ�Zej=jw�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à�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 (þ  é    )ÚannotationsN)Úclosing)ÚdateÚdatetimeÚtimeÚ	timedelta)ÚStringIO©ÚPath)ÚTYPE_CHECKING)Úusing_string_dtype)Úlib)Úpa_version_under13p0Úpa_version_under14p1)Úimport_optional_dependency)
Ú	DataFrameÚIndexÚ
MultiIndexÚSeriesÚ	TimestampÚconcatÚ
date_rangeÚisnaÚto_datetimeÚto_timedelta)ÚVersion)Úsql)ÚSQLAlchemyEngineÚSQLDatabaseÚSQLiteDatabaseÚ
get_engineÚpandasSQL_builderÚread_sql_queryÚread_sql_tablez=ignore:Passing a BlockManager to DataFrame:DeprecationWarningc                   C  s$   ddddœddddœdd	d
dœdœS )Nz1SELECT * 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© r*   r*   r*   úU/var/www/html/CropPilot/venv/lib/python3.10/site-packages/pandas/tests/io/test_sql.pyÚsql_stringsF   s   ýøýír,   c            
      C  s‚   dd l } ddl m}m}m}m}m}m} t| jƒtdƒkr|n|}|ƒ }|d||d|ƒ|d|ƒ|d|ƒ|d|ƒ|d	|d
ƒƒƒ}	|	S )Nr   )ÚColumnÚDoubleÚFloatÚMetaDataÚStringÚTablez2.0.0ÚirisÚSepalLengthÚ
SepalWidthÚPetalLengthÚ
PetalWidthÚNameéÈ   )	Ú
sqlalchemyr-   r.   r/   r0   r1   r2   r   Ú__version__)
r:   r-   r.   r/   r0   r1   r2   ÚdtypeÚmetadatar3   r*   r*   r+   Úiris_table_metadatac   s    	ù	r>   Ú	iris_filer
   c                 C  sŒ   d}|   ¡ }| |¡ |jd dd��"}t |¡}t|ƒ d}g }dd„ |D ƒ}| ||¡ W d   ƒ n1 s7w   Y  | ¡  |  ¡  d S )Nz³CREATE TABLE iris (
            "SepalLength" REAL,
            "SepalWidth" REAL,
            "PetalLength" REAL,
            "PetalWidth" REAL,
            "Name" TEXT
        )úutf-8©ÚnewlineÚencodingz&INSERT INTO iris VALUES(?, ?, ?, ?, ?)c                 S  ó>   g | ]}t |d  ƒt |d ƒt |d ƒt |d ƒ|d f‘qS ©r   é   é   é   é   ©Úfloat©Ú.0Úrowr*   r*   r+   Ú
<listcomp>�   ó    
ú


ûÿz0create_and_load_iris_sqlite3.<locals>.<listcomp>)	ÚcursorÚexecuteÚopenÚcsvÚreaderÚnextÚexecutemanyÚcloseÚcommit©Úconnr?   ÚstmtÚcurÚcsvfilerU   Úrecordsr*   r*   r+   Úcreate_and_load_iris_sqlite3|   s   

øïr`   c              	   C  s    d}|   ¡ �<}| |¡ |jd dd�� }t |¡}t|ƒ d}dd„ |D ƒ}| ||¡ W d   ƒ n1 s6w   Y  W d   ƒ n1 sEw   Y  |  ¡  d S )NzãCREATE TABLE iris (
            "SepalLength" DOUBLE PRECISION,
            "SepalWidth" DOUBLE PRECISION,
            "PetalLength" DOUBLE PRECISION,
            "PetalWidth" DOUBLE PRECISION,
            "Name" TEXT
        )r@   rA   z+INSERT INTO iris VALUES($1, $2, $3, $4, $5)c                 S  rD   rE   rJ   rL   r*   r*   r+   rO   ­   rP   z3create_and_load_iris_postgresql.<locals>.<listcomp>)rQ   rR   rS   rT   rU   rV   rW   rY   rZ   r*   r*   r+   Úcreate_and_load_iris_postgresqlž   s   


øð€þra   c           	   	     sÔ   ddl m} tƒ }|jd dd��P}t |¡}t|ƒ‰ ‡ fdd„|D ƒ}||ƒ |¡}|  ¡ �}|j	|dd� |j
|d	� | |¡ W d   ƒ n1 sKw   Y  W d   ƒ d S W d   ƒ d S 1 scw   Y  d S )
Nr   ©Úinsertr@   rA   c                   ó   g | ]	}t tˆ |ƒƒ‘qS r*   ©ÚdictÚziprL   ©Úheaderr*   r+   rO   Å   ó    z(create_and_load_iris.<locals>.<listcomp>T©Ú
checkfirst©Úbind)r:   rc   r>   rS   rT   rU   rV   ÚvaluesÚbeginÚdropÚcreaterR   )	r[   r?   rc   r3   r^   rU   Úparamsr\   Úconr*   rh   r+   Úcreate_and_load_iris½   s   

ýû"ûru   c                 C  sÌ   d}t | tjƒr|  ¡ }| |¡ d S tddd�}|r@t | |jƒr@|  ¡ �}| |¡ W d   ƒ n1 s5w   Y  |  ¡  d S ddlm} ||ƒ}|  	¡ �}| |¡ W d   ƒ d S 1 s_w   Y  d S )Nz+CREATE VIEW iris_view AS SELECT * FROM irisúadbc_driver_manager.dbapiÚignore©Úerrorsr   ©Útext)
Ú
isinstanceÚsqlite3Ú
ConnectionrQ   rR   r   rY   r:   r{   rp   )r[   r\   r]   Úadbcr{   rt   r*   r*   r+   Úcreate_and_load_iris_viewÍ   s   
ÿ
"ÿr€   ÚdialectÚstrc                 C  s¤   ddl m}m}m}m}m}m}m}m} | dkr|n|}	| dkr"|n|}
|ƒ }|d||d|ƒ|d|	ƒ|d|ƒ|d|ƒ|d	|ƒ|d
|ƒ|d|
ƒ|d|ƒ|d|
ƒƒ}|S )Nr   )ÚTEXTÚBooleanr-   ÚDateTimer/   ÚIntegerr0   r2   r$   ÚtypesÚTextColÚDateColÚ
IntDateColÚIntDateOnlyColÚFloatColÚIntColÚBoolColÚIntColWithNullÚBoolColWithNull)	r:   rƒ   r„   r-   r…   r/   r†   r0   r2   )r�   rƒ   r„   r-   r…   r/   r†   r0   r2   Ú	date_typeÚ	bool_typer=   r‡   r*   r*   r+   Útypes_table_metadataà   s$   (õr“   Ú
types_dataú
list[dict]c                 C  s€   d}d}t | tjƒr|  ¡ }| |¡ | ||¡ d S |  ¡ �}| |¡ | ||¡ W d   ƒ n1 s5w   Y  |  ¡  d S )Na”  CREATE TABLE types (
                    "TextCol" TEXT,
                    "DateCol" TEXT,
                    "IntDateCol" INTEGER,
                    "IntDateOnlyCol" INTEGER,
                    "FloatCol" REAL,
                    "IntCol" INTEGER,
                    "BoolCol" INTEGER,
                    "IntColWithNull" INTEGER,
                    "BoolColWithNull" INTEGER
                )ze
                INSERT INTO types
                VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
                )r|   r}   r~   rQ   rR   rW   rY   )r[   r”   r\   Úins_stmtr]   r*   r*   r+   Úcreate_and_load_types_sqlite3ÿ   s   


þr—   c                 C  sR   |   ¡ �}d}| |¡ d}| ||¡ W d   ƒ n1 sw   Y  |  ¡  d S )NaÍ  CREATE TABLE types (
                        "TextCol" TEXT,
                        "DateCol" TIMESTAMP,
                        "IntDateCol" INTEGER,
                        "IntDateOnlyCol" INTEGER,
                        "FloatCol" DOUBLE PRECISION,
                        "IntCol" INTEGER,
                        "BoolCol" BOOLEAN,
                        "IntColWithNull" INTEGER,
                        "BoolColWithNull" BOOLEAN
                    )zy
                INSERT INTO types
                VALUES($1, $2::timestamp, $3, $4, $5, $6, $7, $8, $9)
                )rQ   rR   rW   rY   )r[   r”   r]   r\   r*   r*   r+   Ú create_and_load_types_postgresql  s   

ír˜   c              	   C  s  ddl m} ddlm} t|ƒ}||ƒ |¡}t| |ƒra|  ¡ �7} |  ¡ � |j	| dd� |j
| d� |  |¡ W d   ƒ n1 sBw   Y  W d   ƒ d S W d   ƒ d S 1 sZw   Y  d S |  ¡ � |j	| dd� |j
| d� |  |¡ W d   ƒ d S 1 sƒw   Y  d S )Nr   rb   ©ÚEngineTrk   rm   )r:   rc   Úsqlalchemy.enginerš   r“   ro   r|   Úconnectrp   rq   rr   rR   )r[   r”   r�   rc   rš   r‡   r\   r*   r*   r+   Úcreate_and_load_types6  s&   


ýÿ"ÿ
"ýr�   c              	   C  sT  ddl m}m}m}m}m} ddlm} |ƒ }|d||d|dd�ƒƒ}ddidd	ig}	||ƒ |	¡}
t	| |ƒrr|  
¡ �.} |  ¡ � |j| dd
� |j| d� |  |
¡ W d   ƒ n1 s]w   Y  W d   ƒ n1 slw   Y  n&|  ¡ � |j| dd
� |j| d� |  |
¡ W d   ƒ n1 s“w   Y  tddd�tddd�g}t|dd�S )Nr   )r-   r…   r0   r2   rc   r™   ÚdatetzÚDateColWithTzT)Útimezonez2000-01-01 00:00:00-08:00z2000-06-01 00:00:00-07:00rk   rm   z2000-01-01 08:00:00ÚUTC©Útzz2000-06-01 07:00:00©Úname)r:   r-   r…   r0   r2   rc   r›   rš   ro   r|   rœ   rp   rq   rr   rR   r   r   )r[   r-   r…   r0   r2   rc   rš   r=   rž   Údatetz_datar\   Úexpected_datar*   r*   r+   Úcreate_and_load_postgres_datetzJ  s:   ÿÿü


ý€ÿ€
ý

þr¨   Úframer   c                 C  sV   | j jd j}| jd }t|tjƒsJ ‚t |tg d¢| j	dd�¡ | j
dv s)J ‚d S )Nr   ©çffffff@g      @gffffffö?çš™™™™™É?úIris-setosa)Úindexr¥   ))é–   é   )é   r°   )ÚdtypesÚilocÚtypeÚ
issubclassÚnpÚfloatingÚtmÚassert_series_equalr   ÚcolumnsÚshape)r©   ÚpytyperN   r*   r*   r+   Úcheck_iris_framew  s   
ÿr½   Ú
table_namec                 C  sd  d|› �}t ddd�}t| tjƒr|  ¡ }| |¡ ¡ d S |rGt| |jƒrG|  ¡ �}| |¡ | ¡ d W  d   ƒ S 1 s@w   Y  d S ddlm} ddl	m
} t| tƒr‰z+|| ƒ}| ¡ �} |  |¡ ¡ W  d   ƒ W | ¡  S 1 sxw   Y  W | ¡  d S | ¡  w t| |ƒr«|  ¡ �} |  |¡ ¡ W  d   ƒ S 1 s¤w   Y  d S |  |¡ ¡ S )Nz SELECT count(*) AS count_1 FROM rv   rw   rx   r   )Úcreate_enginer™   )r   r|   r}   r~   rQ   rR   Úfetchoner:   r¿   r›   rš   r‚   rœ   Úexec_driver_sqlÚ
scalar_oneÚdispose)r[   r¾   r\   r   r]   r¿   rš   Úenginer*   r*   r+   Ú
count_rows�  s4   



$þ

ÿ
ý

$ÿrÅ   c                 C  s   | ddddƒ}t |ƒS )NÚioÚdatarT   ziris.csvr	   )ÚdatapathÚ	iris_pathr*   r*   r+   rÉ   �  s   rÉ   c                   C  s0   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$@rF   F©	rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   ú2000-01-04 00:00:00i 'âPi\¸2r*   r*   r*   r*   r+   r”   £  s*   ÷÷ôc              
   C  s2   ddddddddddœ	}t | ƒ}|| ¡   |¡S )Nr‚   Úint64rK   rÌ   )r   ÚkeysÚastype)r”   r²   Údfr*   r*   r+   Útypes_data_frame¿  s   ÷rÒ   c                  C  ó   g d¢} g d¢}t || d�S )N)r®   Ú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«›å?©rº   ©r   ©rº   rÇ   r*   r*   r+   Útest_frame1Ð  s   rà   c                  C  rÓ   )N)r®   rÔ   rÕ   ))rË   iÿÿÿgZØÓÍÿ¿)rÍ   iãÿÿÿrØ   )rÙ   i N  rÚ   )rÛ   iÍ�ûÿrÜ   rÝ   rÞ   rß   r*   r*   r+   Útest_frame3ô  s   rá   c           
      C  sÈ   t | tjƒr|  d¡}dd„ | ¡ D ƒS tddd�}|rXt | |jƒrXg }|  ¡  ¡  ¡ }|D ]'}|d  |d D ]}|d	  |d
 D ]}|d dkrS|d }| 	|¡ qBq8q.|S ddl
m}	 |	| ƒ ¡ S )Nz0SELECT name FROM sqlite_master WHERE type='view'c                 S  ó   g | ]}|d  ‘qS ©r   r*   )rM   Úviewr*   r*   r+   rO     ó    z!get_all_views.<locals>.<listcomp>rv   rw   rx   Úcatalog_nameÚcatalog_db_schemasÚdb_schema_nameÚdb_schema_tablesÚ
table_typerä   r¾   r   ©Úinspect)r|   r}   r~   rR   Úfetchallr   Úadbc_get_objectsÚread_allÚ	to_pylistÚappendr:   rì   Úget_view_names)
r[   Úcr   ÚresultsÚinfoÚcatalogÚschemaÚtableÚ	view_namerì   r*   r*   r+   Úget_all_views   s*   

€ýþrú   c           
      C  s¸   t | tjƒr|  d¡}dd„ | ¡ D ƒS tddd�}|rPt | |jƒrPg }|  ¡  ¡  ¡ }|D ]}|d D ]}|d D ]}|d	 d
krK|d }| 	|¡ q:q4q.|S ddl
m}	 |	| ƒ ¡ S )Nz1SELECT name FROM sqlite_master WHERE type='table'c                 S  râ   rã   r*   )rM   rø   r*   r*   r+   rO     rå   z"get_all_tables.<locals>.<listcomp>rv   rw   rx   rç   ré   rê   rø   r¾   r   rë   )r|   r}   r~   rR   rí   r   rî   rï   rð   rñ   r:   rì   Úget_table_names)
r[   ró   r   rô   rõ   rö   r÷   rø   r¾   rì   r*   r*   r+   Úget_all_tables  s&   

€ýÿrü   r[   úLsqlite3.Connection | sqlalchemy.engine.Engine | sqlalchemy.engine.Connectionc              	   C  sü   t |tjƒr| dt | ¡› �¡ | ¡  d S tddd�}|rEt ||jƒrE| ¡ �}| d| › d�¡ W d   ƒ d S 1 s>w   Y  d S | 	¡ �+}t 
|¡�}| | ¡ W d   ƒ n1 s_w   Y  W d   ƒ d S W d   ƒ d S 1 sww   Y  d S )NzDROP TABLE IF EXISTS rv   rw   rx   zDROP TABLE IF EXISTS "ú")r|   r}   r~   rR   r   Ú_get_valid_sqlite_namerY   r   rQ   rp   r   Ú
drop_table)r¾   r[   r   r]   rt   Údbr*   r*   r+   r   1  s   
"ÿ
ÿÿ"ÿr   rù   c                 C  sê   dd l }t|tjƒr| dt | ¡› �¡ | ¡  d S tddd�}|rIt||jƒrI| 	¡ �}| d| › d�¡ W d   ƒ d S 1 sBw   Y  d S |j
jj | ¡}| d|› �¡}| ¡ �}| |¡ W d   ƒ d S 1 snw   Y  d S )Nr   zDROP VIEW IF EXISTS rv   rw   rx   zDROP VIEW IF EXISTS "rþ   )r:   r|   r}   r~   rR   r   rÿ   rY   r   rQ   rÄ   r�   Úidentifier_preparerÚquote_identifierr{   rp   )rù   r[   r:   r   r]   Úquoted_viewr\   rt   r*   r*   r+   Ú	drop_viewD  s    
"ÿ
ÿ
"ÿr  c                  c  sv   � t  d¡} t  d¡}| jdd|jjji| jjd�}|V  t|ƒD ]}t	||ƒ q!t
|ƒD ]}t||ƒ q-| ¡  d S )Nr:   Úpymysqlz*mysql+pymysql://root@localhost:3306/pandasÚclient_flag)Úconnect_argsÚ	poolclass)ÚpytestÚimportorskipr¿   Ú	constantsÚCLIENTÚMULTI_STATEMENTSÚpoolÚNullPoolrú   r  rü   r   rÃ   )r:   r  rÄ   rä   Útblr*   r*   r+   Úmysql_pymysql_engine[  s   €

ýr  c                 c  ó   � t | |ƒ t| ƒ | V  d S ©N©ru   r€   )r  rÉ   r*   r*   r+   Úmysql_pymysql_engine_irisl  ó   €

r  c                 c  ó   � t | |dƒ | V  d S )Nr%   ©r�   )r  r”   r*   r*   r+   Úmysql_pymysql_engine_typess  ó   €
r  c                 c  ó6   � |   ¡ �}|V  W d   ƒ d S 1 sw   Y  d S r  ©rœ   )r  r[   r*   r*   r+   Úmysql_pymysql_conny  ó   €
"ÿr  c                 c  r  r  r  )r  r[   r*   r*   r+   Úmysql_pymysql_conn_iris  r  r   c                 c  r  r  r  )r  r[   r*   r*   r+   Úmysql_pymysql_conn_types…  r  r!  c                  c  sj   � t  d¡} t  d¡ | jd| jjd�}|V  t|ƒD ]}t||ƒ qt|ƒD ]}t||ƒ q'| 	¡  d S )Nr:   Úpsycopg2z=postgresql+psycopg2://postgres:postgres@localhost:5432/pandas©r	  ©
r
  r  r¿   r  r  rú   r  rü   r   rÃ   )r:   rÄ   rä   r  r*   r*   r+   Úpostgresql_psycopg2_engine‹  s   €

þr%  c                 c  r  r  r  )r%  rÉ   r*   r*   r+   Úpostgresql_psycopg2_engine_iris›  r  r&  c                 c  r  )NÚpostgresr  )r%  r”   r*   r*   r+   Ú postgresql_psycopg2_engine_types¢  r  r(  c                 c  r  r  r  )r%  r[   r*   r*   r+   Úpostgresql_psycopg2_conn¨  r  r)  c                  c  s”   � t  d¡ t  d¡ ddlm}  d}|  |¡�(}|V  t|ƒD ]}t||ƒ q t|ƒD ]}t||ƒ q,| 	¡  W d   ƒ d S 1 sCw   Y  d S )NÚpyarrowÚadbc_driver_postgresqlr   ©Údbapiz4postgresql://postgres:postgres@localhost:5432/pandas)
r
  r  r+  r-  rœ   rú   r  rü   r   rY   )r-  Úurir[   rä   r  r*   r*   r+   Úpostgresql_adbc_conn®  s   €


"úr/  c                 c  ó‚   � dd l }| }z| d¡ W n |jy!   | ¡  t||ƒ Y nw z| d¡ W n |jy;   | ¡  t|ƒ Y nw |V  d S ©Nr   r3   Ú	iris_view)Úadbc_driver_managerÚadbc_get_table_schemaÚProgrammingErrorÚrollbackra   r€   )r/  rÉ   Úmgrr[   r*   r*   r+   Úpostgresql_adbc_iris¾  s    €þþ
r8  c                 c  s\   � dd l }| }z| d¡ W n |jy(   | ¡  dd„ |D ƒ}t||ƒ Y nw |V  d S )Nr   r‡   c                 S  ó   g | ]}t | ¡ ƒ‘qS r*   ©Útuplero   ©rM   Úentryr*   r*   r+   rO   Û  ó    z)postgresql_adbc_types.<locals>.<listcomp>)r3  r4  r5  r6  r˜   )r/  r”   r7  r[   Únew_datar*   r*   r+   Úpostgresql_adbc_typesÑ  s   €ü
r@  c                 c  r  r  r  )r&  r[   r*   r*   r+   Úpostgresql_psycopg2_conn_irisâ  r  rA  c                 c  r  r  r  )r(  r[   r*   r*   r+   Úpostgresql_psycopg2_conn_typesè  r  rB  c                  c  sF   � t  d¡ t ¡ �} d| › �V  W d   ƒ d S 1 sw   Y  d S )Nr:   ú
sqlite:///)r
  r  r¸   Úensure_cleanr¤   r*   r*   r+   Ú
sqlite_strî  s
   €

"ÿrE  c                 c  s`   � t  d¡}|j| |jjd�}|V  t|ƒD ]}t||ƒ qt|ƒD ]}t||ƒ q"| 	¡  d S )Nr:   r#  r$  )rE  r:   rÄ   rä   r  r*   r*   r+   Úsqlite_engineõ  s   €
rF  c                 c  r  r  r  )rF  r[   r*   r*   r+   Úsqlite_conn  r  rG  c                 C  s2   t  d¡}| | ¡}t||ƒ t|ƒ | ¡  | S )Nr:   )r
  r  r¿   ru   r€   rÃ   )rE  rÉ   r:   rÄ   r*   r*   r+   Úsqlite_str_iris  s   


rH  c                 c  r  r  r  )rF  rÉ   r*   r*   r+   Úsqlite_engine_iris  r  rI  c                 c  r  r  r  )rI  r[   r*   r*   r+   Úsqlite_conn_iris  r  rJ  c                 C  s,   t  d¡}| | ¡}t||dƒ | ¡  | S )Nr:   r$   )r
  r  r¿   r�   rÃ   )rE  r”   r:   rÄ   r*   r*   r+   Úsqlite_str_types  s
   

rK  c                 c  r  )Nr$   r  )rF  r”   r*   r*   r+   Úsqlite_engine_types'  r  rL  c                 c  r  r  r  )rL  r[   r*   r*   r+   Úsqlite_conn_types-  r  rM  c               	   c  sÒ   � t  d¡ t  d¡ ddlm}  t ¡ �J}d|› �}|  |¡�'}|V  t|ƒD ]}t||ƒ q(t	|ƒD ]}t
||ƒ q4| ¡  W d   ƒ n1 sJw   Y  W d   ƒ d S W d   ƒ d S 1 sbw   Y  d S )Nr*  Úadbc_driver_sqliter   r,  zfile:)r
  r  rN  r-  r¸   rD  rœ   rú   r  rü   r   rY   )r-  r¥   r.  r[   rä   r  r*   r*   r+   Úsqlite_adbc_conn3  s"   €




úþ"þrO  c                 c  r0  r1  )r3  r4  r5  r6  r`   r€   )rO  rÉ   r7  r[   r*   r*   r+   Úsqlite_adbc_irisD  s    €þþ
rP  c              	   c  s¢   � dd l }| }z| d¡ W n= |jyK   | ¡  g }|D ]!}t|d ƒ|d< |d d ur6t|d ƒ|d< | t| ¡ ƒ¡ qt||ƒ | 	¡  Y nw |V  d S )Nr   r‡   rŽ   r�   )
r3  r4  r5  r6  Úintrñ   r;  ro   r—   rY   )rO  r”   r7  r[   r?  r=  r*   r*   r+   Úsqlite_adbc_typesV  s"   €
ö
rR  c               	   c  sr   � t  t d¡¡�&} | �}|V  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s2w   Y  d S )Nú:memory:)Ú
contextlibr   r}   rœ   ©Úclosing_connr[   r*   r*   r+   Úsqlite_buildinl  s   €ÿÿ"ÿrW  c                 c  r  r  )r`   r€   )rW  rÉ   r*   r*   r+   Úsqlite_buildin_iriss  r  rX  c                 c  s$   � dd„ |D ƒ}t | |ƒ | V  d S )Nc                 S  r9  r*   r:  r<  r*   r*   r+   rO   |  r>  z(sqlite_buildin_types.<locals>.<listcomp>)r—   )rW  r”   r*   r*   r+   Úsqlite_buildin_typesz  s   €

rY  )Úmarks)rF  rG  rE  )rI  rJ  rH  )rL  rM  rK  c                 C  s    |  | ¡} |jd| ddd� d S )NÚtestrñ   F©r¥   rt   Ú	if_existsr®   )ÚgetfixturevalueÚto_sql)r[   rà   Úrequestr*   r*   r+   Útest_dataframe_to_sqlÖ  s   
ra  c                 C  sR   | dkrt ƒ s|j tjjdd�¡ | | ¡} |jd d… }|jd| ddd� d S )	Nr/  z=postgres ADBC driver < 1.2 cannot insert index with null type©Úreasonr   r[  rñ   Fr\  )	r   ÚnodeÚ
add_markerr
  ÚmarkÚxfailr^  r³   r_  )r[   rà   r`  Úempty_dfr*   r*   r+   Útest_dataframe_to_sql_emptyÝ  s   ÿÿ
ri  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ddƒgdd�tjtdƒgdd�tjd	gd
d�dœƒ}d| v rR| dkrF|jdgd�}t	rMt
}d}n	d }d}nt}d}| | ¡} tj||dd�� |jd| ddd� W d   ƒ d S 1 sxw   Y  d S )Nr*  rF   zint8[pyarrow]©r<   éç  útimestamp[ns][pyarrow]zdate32[day][pyarrow]zduration[ns][pyarrow]Úazstring[pyarrow])rQ  r   r   r   Ústringr   rO  r   rÝ   zis_sparse is deprecatedÚ zthe 'timedelta'F)ÚmatchÚcheck_stacklevelÚ
test_arrowÚreplacer\  )r
  r  r   ÚpdÚarrayr   r   r   rq   r   ÚDeprecationWarningÚUserWarningr^  r¸   Úassert_produces_warningr_  )r[   r`  rÑ   Úexp_warningÚmsgr*   r*   r+   Ú"test_dataframe_to_sql_arrow_dtypesì  s2   
ÿùÿ
"ÿ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   rk  rF   rl  rj  rr  rs  Fr\  )r
  r  r   rt  ru  r   r^  r_  )r[   r`  Únulls_fixturerÑ   r*   r*   r+   Ú*test_dataframe_to_sql_arrow_dtypes_missing  s   
ÿÿÿ
r}  ÚmethodÚmultic                 C  s–   |dkrd| v r|j  tjjddd�¡ | | ¡} t| dd��}|j|d|d� | d¡s/J ‚W d   ƒ n1 s9w   Y  t	| dƒt
|ƒksIJ ‚d S )	Nr  r   z)'method' not implemented for ADBC driversT©rc  Ústrict©Úneed_transactionÚ
test_frame©r~  )rd  re  r
  rf  rg  r^  r!   r_  Ú	has_tablerÅ   Úlen)r[   r~  rà   r`  Ú	pandasSQLr*   r*   r+   Útest_to_sql  s   ÿÿ
þr‰  zmode, num_row_coef)rs  rF   )rñ   rG   c                 C  s‚   |  | ¡} t| dd��}|j|ddd� |j|d|d� | d¡s#J ‚W d   ƒ n1 s-w   Y  t| dƒ|t|ƒ ks?J ‚d S )NTr‚  r„  Úfail©r]  ©r^  r!   r_  r†  rÅ   r‡  )r[   ÚmodeÚnum_row_coefrà   r`  rˆ  r*   r*   r+   Útest_to_sql_exist.  s   
ýr�  c              	   C  s¬   |  | ¡} t| dd��A}|j|ddd� | d¡sJ ‚d}tjt|d�� |j|ddd� W d   ƒ n1 s7w   Y  W d   ƒ d S W d   ƒ d S 1 sOw   Y  d S )NTr‚  r„  rŠ  r‹  z!Table 'test_frame' already exists©rp  )r^  r!   r_  r†  r
  ÚraisesÚ
ValueError)r[   rà   r`  rˆ  rz  r*   r*   r+   Útest_to_sql_exist_fail9  s   
ÿû"ûr“  c                 C  s\   |  | ¡} td| ƒ}t|ƒ t d| ¡}t|ƒ t d| ¡}|jdks%J ‚d|jv s,J ‚d S )NúSELECT * FROM irisúSELECT * FROM iris where 0=1©r   r°   r5   )r^  r"   r½   rt  Úread_sqlr»   rº   ©r[   r`  Ú
iris_framer*   r*   r+   Útest_read_iris_queryE  s   

rš  c                 C  s”   d| v r|j  tjjddd�¡ | | ¡} ttd| dd�ƒ}t|ƒ tt	j
d| dd�ƒ}t|ƒ tt	j
d| dd�ƒ}|jd	ksAJ ‚d
|jv sHJ ‚d S )Nr   ú,'chunksize' not implemented for ADBC driversTr€  r”  é   ©Ú	chunksizer•  r–  r5   )rd  re  r
  rf  rg  r^  r   r"   r½   rt  r—  r»   rº   r˜  r*   r*   r+   Útest_read_iris_query_chunksizeQ  s   þÿ
rŸ  c           
      C  s¦   d| v r|j  tjjddd�¡ | | ¡} ddlm}m}m	}m
} |ƒ }t| tƒr-|| ƒn| }|d||d�}t||ƒ| d	d
dœd�}	t|	ƒ t| tƒrQ| ¡  d S d S )Nr   r›  Tr€  r   )r0   r2   r¿   Úselectr3   )Úautoload_withr­   r«   ©r¥   Úlength©rs   )rd  re  r
  rf  rg  r^  r:   r0   r2   r¿   r   r|   r‚   r"   r½   rÃ   )
r[   r`  r0   r2   r¿   r   r=   Úautoload_conr3   r™  r*   r*   r+   Ú.test_read_iris_query_expression_with_parameterd  s&   þÿ
ÿ
ÿr¦  c                 C  sv   d| v r|j  tjjddd�¡ |d  ¡ D ]
\}}|| v r  n	qtd| › d�ƒ‚| | ¡} t|| dd	�}t	|ƒ d S )
Nr   r›  Tr€  r'   zNo part of z( found in sql_strings['read_parameters']©r­   r«   r¤  )
rd  re  r
  rf  rg  ÚitemsÚKeyErrorr^  r"   r½   )r[   r`  r,   r  Úqueryr™  r*   r*   r+   Ú*test_read_iris_query_string_with_parameter€  s   þÿÿ
r«  c                 C  s4   |  | ¡} td| ƒ}t|ƒ t d| ¡}t|ƒ d S )Nr3   )r^  r#   r½   rt  r—  r˜  r*   r*   r+   Útest_read_iris_table”  s
   

r¬  c                 C  sb   d| v r|j  tjjdd�¡ | | ¡} ttd| dd�ƒ}t|ƒ tt	j
d| dd�ƒ}t|ƒ d S )Nr   ú+chunksize argument NotImplemented with ADBCrb  r3   rœ  r�  )rd  re  r
  rf  rg  r^  r   r#   r½   rt  r—  r˜  r*   r*   r+   Útest_read_iris_table_chunksizež  s   ÿ
r®  c                   sŒ   |  | ¡} g ‰ ‡ fdd„}t| dd��}|j|d|d� | d¡s#J ‚W d   ƒ n1 s-w   Y  ˆ dgks9J ‚t| dƒt|ƒksDJ ‚d S )Nc                   s2   ˆ  d¡ ‡ fdd„|D ƒ}| | j ¡ |¡ d S )NrF   c                   rd   r*   re   rL   ©rÏ   r*   r+   rO   ³  rj   z8test_to_sql_callable.<locals>.sample.<locals>.<listcomp>)rñ   rR   rø   rc   )Úpd_tabler[   rÏ   Ú	data_iterrÇ   ©Úcheckr¯  r+   Úsample±  s   
z$test_to_sql_callable.<locals>.sampleTr‚  r„  r…  rF   rŒ  )r[   rà   r`  r´  rˆ  r*   r²  r+   Útest_to_sql_callable«  s   
þrµ  c                 C  sè   | }|dkr|  tjjdd�¡ | | ¡} t d| ¡}t|jj	j
tjƒs&J ‚t|jj	j
tjƒs1J ‚d|v rAt|jj	j
tjƒs@J ‚nt|jj	j
tjƒsLJ ‚t|jj	j
tjƒsWJ ‚d|v rgt|jj	j
tƒseJ ‚d S t|jj	j
tjƒsrJ ‚d S )NrY  ú;sqlite_buildin connection does not implement read_sql_tablerb  r‡   r&   )Úapplymarkerr
  rf  rg  r^  r   r#   rµ   rŒ   r<   r´   r¶   r·   r�   ÚintegerrŽ   Úbool_r�   r�   Úobject©r[   r`  Ú	conn_namerÑ   r*   r*   r+   Útest_default_type_conversion½  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]|  ¡ �!}| 	¡ � | 
|¡ W d   ƒ n1 sHw   Y  W d   ƒ n1 sWw   Y  n|  	¡ � |  
|¡ W d   ƒ n1 sqw   Y  t d| ¡}t ||¡ t d| ¡}t ||¡ d S )Nr   rz   r™   ©rF   rG   rH   ©çš™™™™™¹?r¬   ç333333Ó?©rm  Úbr„  F©r¥   rt   r®   z}DROP PROCEDURE IF EXISTS get_testdb;

    CREATE PROCEDURE get_testdb ()

    BEGIN
        SELECT * FROM test_frame;
    ENDzCALL get_testdb();)r^  r:   r{   r›   rš   r   r_  r|   rœ   rp   rR   r   r"   r¸   Úassert_frame_equalr—  )	r[   r`  r{   rš   rÑ   ÚprocÚengine_connÚres1Úres2r*   r*   r+   Útest_read_procedureÝ  s,   



ÿ€ÿ€
ÿrÊ  Úexpected_countrG   zSuccess!c                   s‚   ‡ fdd„}|  | ¡} tddgddgddgd	œƒ}|jd
| d|d�}ˆ d u r-|d u s,J ‚n|ˆ ks3J ‚t d
| ¡}t ||¡ d S )Nc                   s¬   |j }| ¡ �E}tƒ }t |¡}| |¡ | d¡ d dd„ |D ƒ¡}| jr1| j› d| j	› �}	n| j	}	d|	› d|› d�}
|j
|
|d	� W d   ƒ ˆ S 1 sOw   Y  ˆ S )
Nr   z, c                 S  s   g | ]}d |› d �‘qS )rþ   r*   )rM   Úkr*   r*   r+   rO     r>  zVtest_copy_from_callable_insertion_method.<locals>.psql_insert_copy.<locals>.<listcomp>Ú.zCOPY z (z) FROM STDIN WITH CSV)r   Úfile)Ú
connectionrQ   r   rT   ÚwriterÚ	writerowsÚseekÚjoinr÷   r¥   Úcopy_expert)rø   r[   rÏ   r±  Ú
dbapi_connr]   Ús_bufrÐ  rº   r¾   Ú	sql_query©rË  r*   r+   Úpsql_insert_copy  s    




óòzBtest_copy_from_callable_insertion_method.<locals>.psql_insert_copyrF   rG   rÀ  r¬   rm  Ún©Úcol1Úcol2Úcol3r„  F)r¥   rt   r®   r~  ©r^  r   r_  r   r#   r¸   rÅ  )r[   rË  r`  rÙ  ÚexpectedÚresult_countÚresultr*   rØ  r+   Ú(test_copy_from_callable_insertion_method  s   
ÿrã  c              	     sŽ  |  | ¡} ddlm‰  ddlm} ddlm} ‡ fdd„}|dƒ}t| |ƒrT|  ¡ �!}| 	¡ � | 
|¡ W d   ƒ n1 s?w   Y  W d   ƒ n1 sNw   Y  n|  	¡ � |  
|¡ W d   ƒ n1 shw   Y  tg d¢gtd	ƒd
�}|jd| ddd� tg d¢gtd	ƒd
�}|jd| dd|d�}	t d| ¡}
t |
|¡ |	dks¨J ‚tj| dd��}| d¡ W d   ƒ d S 1 sÀw   Y  d S )Nr   rb   r™   rz   c                   s<   ‡ fdd„|D ƒ}ˆ| j ƒ |¡jdgd�}| |¡}|jS )Nc                   rd   r*   re   rL   r¯  r*   r+   rO   3  rj   z\test_insertion_method_on_conflict_do_nothing.<locals>.insert_on_conflict.<locals>.<listcomp>rm  )Úindex_elements)rø   ro   Úon_conflict_do_nothingrR   Úrowcount©rø   r[   rÏ   r±  rÇ   r\   râ  rb   r¯  r+   Úinsert_on_conflict2  s   þÿ
zHtest_insertion_method_on_conflict_do_nothing.<locals>.insert_on_conflictzx
    CREATE TABLE test_insert_conflict (
        a  integer PRIMARY KEY,
        b  numeric,
        c  text
    );
    ©rF   çÍÌÌÌÌÌ @rm  ÚabcrÝ   Útest_insert_conflictrñ   Fr\  ©rF   gš™™™™™	@rÃ  ©r¥   rt   r®   r]  r~  Tr‚  )r^  Úsqlalchemy.dialects.postgresqlrc   r›   rš   Úsqlalchemy.sqlr{   r|   rœ   rp   rR   r   Úlistr_  r   r#   r¸   rÅ  r   r   )r[   r`  rš   r{   rè  Ú
create_sqlrt   rà  Ú	df_insertÚinsertedrâ  rˆ  r*   rb   r+   Ú,test_insertion_method_on_conflict_do_nothing)  sJ   

ÿ
	

ÿ€ÿ€
ÿÿû"ÿrõ  c                 C  s~   d| v sd| v r|  tjjdd�¡ | | ¡} tg d¢g d¢gtdƒd�}|jd	| d
ddd� tj	d	| dd�}t
 ||¡ d S )Nr$   r%   z2test for public schema only specific to postgresqlrb  ré  )rG   gÍÌÌÌÌÌ@rÃ  rë  rÝ   Útest_public_schemarñ   FÚpublic)r¥   rt   r]  r®   r÷   ©r÷   )r·  r
  rf  rg  r^  r   rñ  r_  r   r#   r¸   rÅ  )r[   r`  Ú	test_dataÚdf_outr*   r*   r+   Útest_to_sql_on_public_schemac  s"   ÿÿ
ûrû  c              	     sŽ  |  | ¡} ddlm‰  ddlm} ddlm} ‡ fdd„}|dƒ}t| |ƒrT|  ¡ �!}| 	¡ � | 
|¡ W d   ƒ n1 s?w   Y  W d   ƒ n1 sNw   Y  n|  	¡ � |  
|¡ W d   ƒ n1 shw   Y  tg d¢gtd	ƒd
�}|jd| ddd� tg d¢gtd	ƒd
�}|jd| dd|d�}	t d| ¡}
t |
|¡ |	dks¨J ‚tj| dd��}| d¡ W d   ƒ d S 1 sÀw   Y  d S )Nr   rb   r™   rz   c                   sH   ‡ fdd„|D ƒ}ˆ| j ƒ |¡}|j|jj|jjd�}| |¡}|jS )Nc                   rd   r*   re   rL   r¯  r*   r+   rO   …  rj   zXtest_insertion_method_on_conflict_update.<locals>.insert_on_conflict.<locals>.<listcomp>)rÃ  ró   )rø   ro   Úon_duplicate_key_updaterô  rÃ  ró   rR   ræ  rç  rb   r¯  r+   rè  „  s
   
zDtest_insertion_method_on_conflict_update.<locals>.insert_on_conflictzv
    CREATE TABLE test_insert_conflict (
        a INT PRIMARY KEY,
        b FLOAT,
        c VARCHAR(10)
    );
    ré  rë  rÝ   rì  rñ   Fr\  rí  rî  rG   Tr‚  )r^  Úsqlalchemy.dialects.mysqlrc   r›   rš   rð  r{   r|   rœ   rp   rR   r   rñ  r_  r   r#   r¸   rÅ  r   r   )r[   r`  rš   r{   rè  rò  rt   rÑ   rà  rô  râ  rˆ  r*   rb   r+   Ú(test_insertion_method_on_conflict_update{  sF   
ÿ
	

ÿ€ÿ€
ÿû"ÿrþ  c           
   
   C  s&  |  | ¡} ddlm} ddlm} dt ¡ j› �}dt ¡ j› �}|d|› d|› d|› d	|› d
�	ƒ}t| |ƒre|  	¡ �!}| 
¡ � | |¡ W d   ƒ n1 sPw   Y  W d   ƒ n1 s_w   Y  n|  
¡ � |  |¡ W d   ƒ n1 syw   Y  t|| ƒ}tdgddœƒ}	t ||	¡ d S )Nr   r™   rz   Úgroup_Úgroup_view_z
    CREATE TABLE zF (
        group_id INTEGER,
        name TEXT
    );
    INSERT INTO z- VALUES
        (1, 'name');
    CREATE VIEW z
    AS
    SELECT * FROM z;
    rF   r¥   ©Úgroup_idr¥   )r^  r›   rš   rð  r{   ÚuuidÚuuid4Úhexr|   rœ   rp   rR   r#   r   r¸   rÅ  )
r[   r`  rš   r{   r¾   rù   Úsql_stmtrt   râ  rà  r*   r*   r+   Útest_read_view_postgres°  s<   
ÿûù	÷ÿ


ÿ€ÿ€
ÿ
r  c                 C  sV   d}d}d}|   |¡ |   |¡ |   |¡ t d| ¡}tdgddœƒ}t ||¡ d S )Nz<
CREATE TABLE groups (
   group_id INTEGER,
   name TEXT
);
z,
INSERT INTO groups VALUES
    (1, 'name');
z1
CREATE VIEW group_view
AS
SELECT * FROM groups;
zSELECT * FROM group_viewrF   r¥   r  )rR   rt  r—  r   r¸   rÅ  )rW  Úcreate_tableÚinsert_intoÚcreate_viewrâ  rà  r*   r*   r+   Útest_read_view_sqliteÔ  s   


r  c              	   C  s~   t jtdd��. tjtdd�� t d| ¡ W d   ƒ n1 s w   Y  W d   ƒ d S W d   ƒ d S 1 s8w   Y  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¸   rx  ÚFutureWarningr   rR   )rI  r*   r*   r+   Útest_execute_typeerrorí  s   þûÿ"ÿr  c                 C  s@   t jtdd�� t d| ¡ W d   ƒ d S 1 sw   Y  d S )Nr  r�  r  )r¸   rx  r  r   rR   )rJ  r*   r*   r+   Útest_execute_deprecated÷  s   þ"ûr  c                 C  s2   d| v rdS d| v rdS d| v rdS t d| › �ƒ‚)Nr&   r$   r%   zunsupported connection: )r’  )r¼  r*   r*   r+   Úflavor  s   r  c              	   C  s¬   d| v r|j  tjjddd�¡ | }| | ¡} |d t|ƒ }d}t| ƒ�#}| ¡ � |j	||d�}W d   ƒ n1 s<w   Y  W d   ƒ n1 sKw   Y  t
|ƒ d S )Nr   ú)'params' not implemented for ADBC driversTr€  r'   r§  r¤  ©rd  re  r
  rf  rg  r^  r  r!   Úrun_transactionÚ
read_queryr½   ©r[   r`  r,   r¼  rª  rs   rˆ  r™  r*   r*   r+   Útest_read_sql_iris_parameter  s$   þÿ


ÿ€ÿr  c              	   C  s²   d| v r|j  tjjddd�¡ | }| | ¡} |d t|ƒ }dddœ}t| ƒ�#}| ¡ � |j	||d	�}W d   ƒ n1 s?w   Y  W d   ƒ n1 sNw   Y  t
|ƒ d S )
Nr   r  Tr€  r(   r­   r«   r¢  r¤  r  r  r*   r*   r+   Ú"test_read_sql_iris_named_parameter  s$   þÿ



ÿ€ÿr  c              	   C  s´   d| v sd| v rd| vr|  tjjdd�¡ | }| | ¡} |d t|ƒ }t| ƒ�#}| ¡ � |j|d d�}W d   ƒ n1 s@w   Y  W d   ƒ n1 sOw   Y  t	|ƒ d S )Nr%   r&   r   zbroken testrb  r)   r¤  )
r·  r
  rf  rg  r^  r  r!   r  r  r½   )r[   r`  r,   r¼  rª  rˆ  r™  r*   r*   r+   Ú,test_read_sql_iris_no_parameter_with_percent3  s   


ÿ€ÿr  c                 C  s"   |  | ¡} t d| ¡}t|ƒ d S )NzSELECT * FROM iris_view)r^  r   r"   r½   r˜  r*   r*   r+   Útest_api_read_sql_viewF  s   
r  c                 C  s\   d| v r|j  tjjdd�¡ | | ¡} d}tj|| dd�}t || ¡}t 	t
|ƒ|¡ d S )Nr   r­  rb  z1SELECT * FROM iris_view WHERE "SepalLength" < 0.0r°   r�  )rd  re  r
  rf  rg  r^  r   r"   r¸   rÅ  r   )r[   r`  rª  Ú
with_batchÚwithout_batchr*   r*   r+   Ú*test_api_read_sql_with_chunksize_no_resultM  s   ÿ
r  c                 C  sp   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  t |d| ¡ t d| ¡s6J ‚d S )Nrà   Tr‚  )r^  r   r†  r   r   r_  )r[   r`  rà   rˆ  r*   r*   r+   Útest_api_to_sqlZ  s   
ÿr  c                 C  sº   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tj|d| dd� t d| ¡s8J ‚d}tjt|d�� tj|d| dd� W d   ƒ d S 1 sVw   Y  d S )NÚtest_frame2Tr‚  rŠ  r‹  z"Table 'test_frame2' already existsr�  )	r^  r   r†  r   r   r_  r
  r‘  r’  )r[   r`  rà   rˆ  rz  r*   r*   r+   Útest_api_to_sql_faile  s   
ÿ"ÿr!  c                 C  s¤   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tj|d| dd� tj|d| dd� t d| ¡sAJ ‚t|ƒ}t| dƒ}||ksPJ ‚d S )Nrá   Tr‚  rŠ  r‹  rs  ©r^  r   r†  r   r   r_  r‡  rÅ   ©r[   r`  rà   rˆ  Únum_entriesÚnum_rowsr*   r*   r+   Útest_api_to_sql_replacet  s   
ÿ
r&  c                 C  s¸   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tj|d| dd�dks4J ‚tj|d| dd�dksAJ ‚t d| ¡sIJ ‚dt|ƒ }t| dƒ}||ksZJ ‚d S )	NÚtest_frame4Tr‚  rŠ  r‹  rI   rñ   rG   r"  r#  r*   r*   r+   Útest_api_to_sql_append†  s   
ÿ
r(  c                 C  s|   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tj|d| dd� t d| ¡}t ||¡ d S )NÚtest_frame5Tr‚  F©r®   zSELECT * FROM test_frame5)	r^  r   r†  r   r   r_  r—  r¸   rÅ  )r[   r`  rá   rˆ  râ  r*   r*   r+   Útest_api_to_sql_type_mapping™  s   
ÿr+  c                 C  s–   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  ttjddd�dd�}tj|d| d	d
� t 	d| ¡}t
 | ¡ |¡ d S )NÚtest_seriesTr‚  r°   rÎ   rj  Úseriesr¤   Fr*  zSELECT * FROM test_series)r^  r   r†  r   r   r   r¶   Úaranger_  r"   r¸   rÅ  Úto_frame)r[   r`  rˆ  ÚsÚs2r*   r*   r+   Útest_api_to_sql_series¦  s   
ÿr2  c                 C  sÂ   | }|  | ¡} t d| ¡r)tj| dd��}| d¡ W d   ƒ n1 s$w   Y  tj|d| d� tjd| d�}d|v rD|jddid	�}|j|_|j	ddd
� |j 
t¡ d |j_t ||¡ d S )NÚtest_frame_roundtripTr‚  ©rt   ú"SELECT * FROM test_frame_roundtripr   Ú__index_level_0__Úlevel_0rÝ   ©Úinplace)r^  r   r†  r   r   r_  r"   Úrenamer®   Ú	set_indexrÐ   rQ  r¥   r¸   rÅ  ©r[   r`  rà   r¼  rˆ  râ  r*   r*   r+   Útest_api_roundtrip³  s   
ÿr=  c                 C  sž   d| v r|j  tjjdd�¡ | | ¡} t d| ¡r6tj| dd��}| 	d¡ W d   ƒ n1 s1w   Y  tj
|d| ddd	� tjd
| d�}t ||¡ d S )Nr   r­  rb  r3  Tr‚  FrG   )rt   r®   rž  r5  r4  )rd  re  r
  rf  rg  r^  r   r†  r   r   r_  r"   r¸   rÅ  )r[   r`  rà   rˆ  râ  r*   r*   r+   Útest_api_roundtrip_chunksizeÈ  s$   ÿ
ÿûr>  c                 C  sf   |  | ¡} t | ¡�}| d¡}| ¡ }| ¡  W d   ƒ n1 s"w   Y  t|ƒg d¢ks1J ‚d S ©Nr”  rª   )r^  r   r!   rR   rÀ   rX   rñ  )r[   r`  Ú
pandas_sqlÚiris_resultsrN   r*   r*   r+   Útest_api_execute_sqlÞ  s   


ýrB  c              	   C  sø  | }|  | ¡} t d| ¡}d|v s d|v s t|jjjtjƒr J ‚tjd| dgd�}t|jjjtjƒs4J ‚|j 	¡ t
dddd	d	d	ƒt
ddd
d	d	d	ƒgksMJ ‚tjd| ddid�}t|jjjtjƒsbJ ‚|j 	¡ t
dddd	d	d	ƒt
ddd
d	d	d	ƒgks{J ‚tjd| 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| 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| 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 typesr%   r'  r‰   ©Úparse_datesiÐ  rF   rH   r   rI   ú%Y-%m-%d %H:%M:%SrŠ   iÂ  é   é   iÝ  r0  r‹   z%Y%m%dz
2010-10-10z
2010-12-12)r^  r   r"   rµ   r‰   r<   r´   r¶   Ú
datetime64Útolistr   rŠ   r‹   r»  r*   r*   r+   Útest_api_date_parsingé  sZ   

þý
þ
þ
ÿ
þýþrK  Úerror)rw   ÚraiseÚcoercezread_sql, text, moderC  )r:   Úfallbackr‡   r:   c           
      C  sÂ   | }|  | ¡} |dkr|dkr| tjjdd�¡ | ddi¡}||| dd|iid�}	d	|v rA|	d
  t¡|	d
< |	d  t¡|	d< |dkrY| ddddœ¡}tsY|d  d¡|d< t	 
|	|¡ d S )Nr‡   rY  z failing combination of argumentsrb  r‰   údatetime64[ns]ry   )rt   rE  r'  rŽ   r�   r@  Úint32)rŠ   r‹   r�   zdatetime64[us])r^  r·  r
  rf  rg  rÐ   rQ  rK   r   r¸   rÅ  )
r[   r`  r—  r{   r�  rL  rÒ   r¼  rà  râ  r*   r*   r+   Ú!test_api_custom_dateparsing_error!  s4   
ÿÿýýÿrR  c                 C  sP   |  | ¡} tjd| dddgd�}t|jjjtjƒsJ ‚t|j	jjtjƒs&J ‚d S )NrC  r‰   rŠ   )Ú	index_colrE  )
r^  r   r"   rµ   r®   r<   r´   r¶   rI  rŠ   ©r[   r`  rÑ   r*   r*   r+   Útest_api_date_and_indexX  s   
ürU  c           	      C  sP  | }|  | ¡} t d| ¡r)tj| dd��}| d¡ W d   ƒ n1 s$w   Y  ttddgdd�ƒ ¡ }|dkrD|j 	t
jjd	d
�¡ d|v rPtrMt}nd }nt}tj|dd�� |jd| d�}W d   ƒ n1 skw   Y  |dksvJ ‚t d| ¡}|dkr—ttjddddd�tjddddd�gdd�}n|d  d¡}t |d |¡ d S )NÚtest_timedeltaTr‚  z00:00:01z00:00:03Úfoor¤   rO  z.sqlite ADBC driver doesn't implement timedeltarb  r   F)rq  ©r¥   rt   rG   zSELECT * FROM test_timedeltar/  r   i@B )ÚmonthsÚdaysÚmicrosecondsÚnanosecondsiÀÆ- rÎ   )r^  r   r†  r   r   r   r   r/  rd  re  r
  rf  rg  r   rv  rw  r¸   rx  r_  r"   rt  Ú
DateOffsetrÐ   r¹   )	r[   r`  r¼  rˆ  rÑ   ry  rá  râ  rà  r*   r*   r+   Útest_api_timedeltag  s@   
ÿÿÿÿþûr^  c                 C  sz   | }|  | ¡} tdddgiƒ}d|v rd}nd}tjt|d�� |jd| d	�d u s+J ‚W d   ƒ d S 1 s6w   Y  d S )
Nrm  y      ð?      ð?y               @r   zdatatypes not supportedzComplex datatypes not supportedr�  Útest_complexr4  )r^  r   r
  r‘  r’  r_  )r[   r`  r¼  rÑ   rz  r*   r*   r+   Útest_api_complex_raises–  s   
"ÿr`  zindex_name,index_label,expected))NNr®   )NÚother_labelra  )Ú
index_nameNrb  )rb  ra  ra  )r   NÚ0)Nr   rc  c           	      C  s¼   d| v r|j  tjjdd�¡ | | ¡} t d| ¡r6tj| dd��}| 	d¡ W d   ƒ n1 s1w   Y  t
dtdƒiƒ}||j_d	}tj|d| |d
� t || ¡}|jd |ks\J ‚d S )Nr   ú-index_label argument NotImplemented with ADBCrb  Útest_index_labelTr‚  rÜ  rI   úSELECT * FROM test_index_label)Úindex_labelr   )rd  re  r
  rf  rg  r^  r   r†  r   r   r   Úranger®   r¥   r_  r"   rº   )	r[   r`  rb  rg  rà  rˆ  Ú
temp_framerª  r©   r*   r*   r+   Útest_api_to_sql_index_label¤  s   ÿ
ÿrj  c           	      C  s:  | }d|v r|  tjjddd�¡ nd|v r!|j tjjdd�¡ | | ¡} t d| ¡rHtj	| d	d
��}| 
d¡ W d   ƒ n1 sCw   Y  d}tdtdƒit ddg¡d�}t |d| ¡}||ksfJ ‚t d| ¡}|jd dksuJ ‚|jd dks~J ‚tj|d| dddgd�}||ks�J ‚t d| ¡}|jd d…  ¡ ddgks¥J ‚ddg|j_tj|d| dd�}||ksºJ ‚t d| ¡}|jd d…  ¡ ddgksÏJ ‚tj|d| dddgd�}||ksáJ ‚t d| ¡}|jd d…  ¡ ddgksöJ ‚d}tjt|d�� tj|d| ddd� W d   ƒ d S 1 �sw   Y  d S )Nr%   z/MySQL can fail using TEXT without length as keyFr€  r   rd  rb  re  Tr‚  rI   rÜ  )ÚA0ÚA1)ÚB0ÚB1r*  rf  r   r7  rF   Úlevel_1rs  rÔ   rÕ   )r]  rg  rG   r‹  rÖ   r×   zALength of 'index_label' should match number of levels, which is 2r�  )r·  r
  rf  rg  rd  re  r^  r   r†  r   r   r   rh  r   Úfrom_productr_  r"   rº   rJ  r®   Únamesr‘  r’  )	r[   r`  r¼  rˆ  Úexpected_row_countri  râ  r©   rz  r*   r*   r+   Ú&test_api_to_sql_index_label_multiindexÈ  sz   ÿÿÿ
ÿ
þûûû$ÿrs  c                 C  s    |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tjddgg d¢ddgd	�}|jd| d
� tjd| ddgd�}t	j
||dd� d S )NÚtest_multiindex_roundtripTr‚  ©rF   rê  Úline1©rG   ç      ø?Úline2©rÔ   rÕ   rÖ   rÔ   rÕ   ©rº   r®   rX  z'SELECT * FROM test_multiindex_roundtrip©rS  ©Úcheck_index_type)r^  r   r†  r   r   r   Úfrom_recordsr_  r"   r¸   rÅ  )r[   r`  rˆ  rÑ   râ  r*   r*   r+   Útest_api_multiindex_roundtrip  s   
ÿý
ÿr€  r<   ©rÔ   rÕ   c           	      C  sÀ   | }|  | ¡} t d| ¡r)tj| dd��}| d¡ W d   ƒ n1 s$w   Y  tddgddggdd	gd
�}|jd| d�dksBJ ‚| |¡}d|v rNd}nd}tj|| |d�}t	 
||¡ d S )NÚtest_dtype_argumentTr‚  ç333333ó?g333333@çffffff@g333333@rÔ   rÕ   rÝ   rX  rG   r'  z(SELECT "A", "B" FROM test_dtype_argumentz$SELECT A, B FROM test_dtype_argument©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+   Útest_api_dtype_argument&  s   
ÿ
r†  c                 C  s<   |  | ¡} tddgddggddgd�}tj|d| dd	� d S )
NrF   rG   rH   rI   r   rÝ   Útest_frame_integer_col_namesrs  r‹  )r^  r   r   r_  rT  r*   r*   r+   Útest_api_integer_col_namesF  s   
rˆ  c                 C  sJ   d| v r|j  tjjddd�¡ | | ¡} tj|d| d�}d|v s#J ‚d S )Nr   ú-'get_schema' not implemented for ADBC driversTr€  r[  r4  ÚCREATE©rd  re  r
  rf  rg  r^  r   Ú
get_schema©r[   r`  rà   rò  r*   r*   r+   Útest_api_get_schemaM  s   þÿ
rŽ  c                 C  sL   d| v r|j  tjjddd�¡ | | ¡} tj|d| dd�}d|v s$J ‚d S )	Nr   r‰  Tr€  r[  Úpypi)rt   r÷   zCREATE TABLE pypi.r‹  r�  r*   r*   r+   Útest_api_get_schema_with_schema[  s   þÿ
r�  c                 C  s”   d| v r|j  tjjddd�¡ | }| | ¡} tddgddgd	œƒ}|d
kr)d}nddlm} |}t	j
|d| d|id�}d|v sBJ ‚d|v sHJ ‚d S )Nr   r‰  Tr€  çš™™™™™ñ?rƒ  rê  çš™™™™™@rÂ  rW  ÚINTEGERr   )r†   r[  rÃ  r…  rŠ  )rd  re  r
  rf  rg  r^  r   r:   r†   r   rŒ  )r[   r`  r¼  Úfloat_framer<   r†   rò  r*   r*   r+   Útest_api_get_schema_dtypesj  s"   þÿ
r•  c                 C  s¬   d| v r|j  tjjddd�¡ | }| | ¡} tddgddgd	œƒ}tj|d
| dd�}d|v r2d}nd}||v s:J ‚tj|d
| ddgd�}d|v rLd}nd}||v sTJ ‚d S )Nr   r‰  Tr€  r‘  rƒ  rê  r’  )ÚCol1ÚCol2r[  r–  )rt   rÏ   r%   z'CONSTRAINT test_pk PRIMARY KEY (`Col1`)z'CONSTRAINT test_pk PRIMARY KEY ("Col1")rÔ   rÕ   z)CONSTRAINT test_pk PRIMARY KEY (`A`, `B`)z)CONSTRAINT test_pk PRIMARY KEY ("A", "B"))	rd  re  r
  rf  rg  r^  r   r   rŒ  )r[   r`  rà   r¼  r©   rò  Úconstraint_sentencer*   r*   r+   Útest_api_get_schema_keys‚  s(   þÿ
r™  c                 C  sº  d| v r|j  tjjdd�¡ | }| | ¡} t d| ¡r8tj| dd��}| 	d¡ W d   ƒ n1 s3w   Y  t
tj d¡ d¡td	ƒd
�}|jd| dd� t d| ¡}t
ƒ }d}g d¢}tjd| dd�D ]}	t||	gdd�}t|	ƒ|| kszJ ‚|d7 }qft ||¡ |dkr«tjtdd�� tjd| dd� W d   ƒ d S 1 s¤w   Y  d S t
ƒ }
d}g d¢}tjd| dd�D ]}	t|
|	gdd�}
t|	ƒ|| ksÐJ ‚|d7 }q¼t ||
¡ d S )Nr   r­  rb  Útest_chunksizeTr‚  rG   )é   r°   ÚabcderÝ   FrÄ  zselect * from test_chunksizer   )r°   r°   r°   r°   rG   r°   r�  ©Úignore_indexrF   rW  ro  r�  )rd  re  r
  rf  rg  r^  r   r†  r   r   r   r¶   ÚrandomÚdefault_rngÚstandard_normalrñ  r_  r"   r   r‡  r¸   rÅ  r‘  ÚNotImplementedErrorr#   )r[   r`  r¼  rˆ  rÑ   rÈ  rÉ  ÚiÚsizesÚchunkÚres3r*   r*   r+   Útest_api_chunksize_readŸ  sF   ÿ
ÿÿ
"ÿ
r§  c                 C  sð   | dkr#t ddd�}|d ur#t|jƒtdƒk r#|j tjjddd�¡ | | ¡} t	 
d	| ¡rJt	j| dd
��}| d	¡ W d   ƒ n1 sEw   Y  tg d¢g d¢dœƒ}| ¡ }|d  d¡|d< |jd	| dd� t	 d| ¡}t ||¡ d S )Nr/  r+  rw   rx   z0.9.0z:categorical dtype not implemented for ADBC postgres driverTr€  Útest_categoricalr‚  r¾  )úJohn P. Doez	Jane Dover©  )Ú	person_idÚperson_namer«  ÚcategoryFrÄ  zSELECT * FROM test_categorical)r   r   r;   rd  re  r
  rf  rg  r^  r   r†  r   r   r   ÚcopyrÐ   r_  r"   r¸   rÅ  )r[   r`  r   rˆ  rÑ   Údf2Úresr*   r*   r+   Útest_api_categoricalÐ  s0   þÿ
ÿþÿr°  c                 C  s~   |  | ¡} t d| ¡r'tj| dd��}| d¡ W d   ƒ n1 s"w   Y  tddgddggdd	gd
�}|jd| dd� d S )NÚtest_unicodeTr‚  rF   rG   rH   rI   õ   Ã©rÃ  rÝ   FrÄ  )r^  r   r†  r   r   r   r_  )r[   r`  rˆ  rÑ   r*   r*   r+   Útest_api_unicode_column_nameñ  s   
ÿr³  c                 C  sª   | }|  | ¡} t d| ¡r)tj| dd��}| d¡ W d   ƒ n1 s$w   Y  tg d¢dtjdgdœƒ}|jd| dd	� d
|v rEd}nd}t 	|| ¡}t
 ||¡ d S )Nzd1187b08-4943-4c8d-a7f6Tr‚  ©r   rF   rG   r¬   r„  r�  FrÄ  r'  z'SELECT * FROM "d1187b08-4943-4c8d-a7f6"z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)r^  r   r†  r   r   r   r¶   Únanr_  r"   r¸   rÅ  )r[   r`  r¼  rˆ  rÑ   rª  r¯  r*   r*   r+   Útest_api_escaped_table_nameý  s   
ÿr¶  c                 C  sø   d| v r"t  d¡}t|jƒtdƒkr| dv s"|j t jjddd�¡ | | ¡} t	 
d| ¡rIt	j| dd	��}| d¡ W d   ƒ n1 sDw   Y  tg d
¢g d¢ddœƒ}|jd| dd� t d| ¡}tg d¢g d¢g d¢gg d¢d�}t ||¡ d S )Nr   r*  z16.0)rO  r/  z!pyarrow->pandas throws ValueErrorTr€  Ú
test_tabler‚  r¾  r¿  rF   ©rm  rÃ  ró   FrÄ  z)SELECT a, b, a +1 as a, c FROM test_table)rF   rÀ  rG   rF   )rG   r¬   rH   rF   )rH   rÁ  rI   rF   )rm  rÃ  rm  ró   rÝ   )r
  r  r   r;   rd  re  rf  rg  r^  r   r†  r   r   r   r_  rt  r—  r¸   rÅ  )r[   r`  Úparˆ  rÑ   râ  rà  r*   r*   r+   Ú#test_api_read_sql_duplicate_columns	  s,   
ÿÿ
ÿþrº  c                 C  sf   | }|dkr|  tjjdd�¡ | | ¡} t |d| ¡ ddg}tjd| |d�}|j 	¡ |ks1J ‚d S )NrW  úNot Implementedrb  r„  rÔ   rÕ   rÝ   )
r·  r
  rf  rg  r^  r   r_  r#   rº   rJ  )r[   r`  rà   r¼  Úcolsrâ  r*   r*   r+   Útest_read_table_columns0	  s   
r½  c                 C  sÊ   | }|dkr|  tjjdd�¡ | | ¡} t |d| ¡ tjd| dd�}|jj	dgks-J ‚tjd| ddgd�}|jj	ddgksAJ ‚tjd| ddgd	d
gd�}|jj	ddgksXJ ‚|j
 ¡ d	d
gkscJ ‚d S )NrW  r»  rb  r„  r®   r|  rÔ   rÕ   rÖ   r×   )rS  rº   )r·  r
  rf  rg  r^  r   r_  r#   r®   rq  rº   rJ  )r[   r`  rà   r¼  râ  r*   r*   r+   Útest_read_table_index_col@	  s   
ÿr¾  c                 C  sr   | dkr|  tjjdd�¡ | | ¡} t d| ¡}t d| ¡}t 	||¡ t 
d| ¡}t d| ¡}t 	||¡ d S )NrX  r¶  rb  r”  r3   )r·  r
  rf  rg  r^  r   r"   r—  r¸   rÅ  r#   )r[   r`  Úiris_frame1Úiris_frame2r*   r*   r+   Útest_read_sql_delegateW	  s   ÿÿ
rÁ  c              
   C  s  | }ddl m} ddlm} |dƒ|dƒg}|D ]N}t||ƒrM| ¡ �!}| ¡ � | |¡ W d   ƒ n1 s8w   Y  W d   ƒ n1 sGw   Y  q| ¡ � | |¡ W d   ƒ n1 saw   Y  qt 	d ¡� t
 d|¡ t
 d|¡ W d   ƒ d S 1 s„w   Y  d S )Nr   rz   r™   z,CREATE TABLE invalid (x INTEGER, y UNKNOWN);z0CREATE TABLE other_table (x INTEGER, y INTEGER);Úother_tablezSELECT * FROM other_table)r:   r{   r›   rš   r|   rœ   rp   rR   r¸   rx  r   r#   r"   )rG  r[   r{   rš   Ú
query_listrª  r*   r*   r+   Útest_not_reflect_all_tablesj	  s.   þ


ÿ€ÿ€
ÿ€"þrÄ  c              	   C  sÔ   | }|dks
d|v r|  tjjdd�¡ | | ¡} tjtdd��# t 	| ¡�}| 
dd¡ W d   ƒ n1 s7w   Y  W d   ƒ n1 sFw   Y  t d ¡� |jd	| d
� W d   ƒ d S 1 scw   Y  d S )NrW  r   zDoes not raise warningrb  z¶The provided table name 'TABLE1' is not found exactly as such in the database after writing the table, possibly due to case sensitivity issues. Consider using lower case table names.r�  ÚTABLE1ro  ÚCaseSensitiverX  )r·  r
  rf  rg  r^  r¸   rx  rw  r   r   Úcheck_case_sensitiver_  )r[   r`  rà   r¼  r  r*   r*   r+   Ú(test_warning_case_insensitive_table_nameƒ	  s    
ýÿ€ø"ÿrÈ  c                 C  s†   |  | ¡} ddlm} tdtddgdd�iƒ}t | ¡�}tjd||d	�}t|j	j
d j|ƒs1J ‚W d   ƒ d S 1 s<w   Y  d S )
Nr   )Ú	TIMESTAMPr   ú2014-12-12 01:54ú2014-12-11 02:54T©ÚutcÚ	test_type©r©   )r^  r:   rÉ  r   r   r   r   ÚSQLTabler|   rø   ró   r´   )r[   r`  rÉ  rÑ   r  rø   r*   r*   r+   Útest_sqlalchemy_type_mapping›	  s   
ÿ"ýrÑ  zinteger, expected)Úint8ÚSMALLINT)ÚInt8rÓ  )Úuint8rÓ  )ÚUInt8rÓ  )Úint16rÓ  )ÚInt16rÓ  )Úuint16r“  )ÚUInt16r“  )rQ  r“  )ÚInt32r“  )Úuint32ÚBIGINT)ÚUInt32rÝ  )rÎ   rÝ  )ÚInt64rÝ  rÎ   rÝ  r“  c                 C  sx   |  | ¡} tddgdg|d�}t | ¡�}tjd||d�}t|jjjj	ƒ}W d   ƒ n1 s/w   Y  ||ks:J ‚d S )Nr   rF   rm  ©rº   r<   rÎ  rÏ  )
r^  r   r   r   rÐ  r‚   rø   ró   rm  r´   )r[   r`  r¸  rà  rÑ   r  rø   râ  r*   r*   r+   Útest_sqlalchemy_integer_mappingª	  s   
ýrá  r¸  Úuint64ÚUInt64c              	   C  sœ   |  | ¡} tddgdg|d�}t | ¡�0}tjtdd�� tjd||d� W d   ƒ n1 s/w   Y  W d   ƒ d S W d   ƒ d S 1 sGw   Y  d S )	Nr   rF   rm  rà  z1Unsigned 64 bit integer datatype is not supportedr�  rÎ  rÏ  )r^  r   r   r   r
  r‘  r’  rÐ  )r[   r`  r¸  rÑ   r  r*   r*   r+   Ú(test_sqlalchemy_integer_overload_mappingÊ	  s   
ÿýÿ"ÿrä  c           
      C  sª   t  d¡ | | ¡} t ¡ �+}d| }d}|j||ddd� t ||¡}t ||¡}d}t 	||¡}	W d   ƒ n1 s<w   Y  t 
||¡ t 
||¡ t 
||	¡ d S )Nr:   rC  r3   rs  Fr\  r”  )r
  r  r^  r¸   rD  r_  r   r—  r#   r"   rÅ  )
r[   r`  rà   r¥   Údb_urirø   r   rá   rª  r'  r*   r*   r+   Útest_database_uri_string×	  s   


ùræ  Úpg8000c                 C  sX   t  d¡ | | ¡} d}t jtdd�� t d|¡ W d   ƒ d S 1 s%w   Y  d S )Nr:   z)postgresql+pg8000://user:pass@host/dbnamerç  r�  zselect * from table)r
  r  r^  r‘  ÚImportErrorr   r—  )r[   r`  rå  r*   r*   r+   Ú(test_pg8000_sqlalchemy_passthrough_errorì	  s   

"ÿré  c                 C  sf   | }|  | ¡} ddlm} d|v r|dƒ}n|dƒ}tj|| ddid�}t|d	 ƒ}|dhks1J ‚d S )
Nr   rz   r'  z%select * from iris where "Name"=:namez#select * from iris where name=:namer¥   zIris-versicolorr¤  r8   )r^  r:   r{   r   r—  Úset)r[   r`  r¼  r{   Ú	name_textÚiris_dfÚ	all_namesr*   r*   r+   Útest_query_by_text_objø	  s   

rî  c                 C  sl   |  | ¡} ddlm}m} tƒ }||ƒ |jj|dƒk¡}tj	|| ddid�}t
|d ƒ}|dhks4J ‚d S )Nr   )Ú	bindparamr   r¥   r­   r¤  r8   )r^  r:   rï  r   r>   Úwhereró   r8   r   r—  rê  )r[   r`  rï  r   r3   Úname_selectrì  rí  r*   r*   r+   Útest_query_by_select_obj
  s   
rò  c                 C  sl   | }|dkr|  tjjdd�¡ | | ¡} tg d¢g d¢dœƒ}|jd| dd	� t d| ¡}t	 
||¡ d S )
NrW  r»  rb  r´  ©rH   rI   r°   )rÔ   z%_variationÚtest_column_percentageFrÄ  )r·  r
  rf  rg  r^  r   r_  r   r#   r¸   rÅ  )r[   r`  r¼  rÑ   r¯  r*   r*   r+   Útest_column_with_percentage
  s   
rõ  c              	   C  sº   t  ¡ �I}tt |¡ƒ�}tj| d|dd�dksJ ‚W d   ƒ n1 s$w   Y  tt |¡ƒ�}t d|¡}W d   ƒ n1 sAw   Y  W d   ƒ n1 sPw   Y  t  | |¡ d S )NÚtest_frame3_legacyFr*  rI   z!SELECT * FROM test_frame3_legacy;)	r¸   rD  r   r}   rœ   r   r_  r"   rÅ  )rá   r¥   r[   râ  r*   r*   r+   Útest_sql_open_close(
  s   
ÿÿ€ür÷  c                  C  sH   d} d}t jt|d�� t d| ¡ W d   ƒ d S 1 sw   Y  d S )Nzmysql://root@localhost/pandasz-Using URI string without sqlalchemy installedr�  r”  )r
  r‘  rè  r   r—  )r[   rz  r*   r*   r+   Útest_con_string_import_error6
  s
   "ÿrø  c               	   C  sˆ   G dd„ dƒ} t  | dƒ¡�,}t t¡� t d|¡ W d   ƒ n1 s%w   Y  W d   ƒ d S W d   ƒ d S 1 s=w   Y  d S )Nc                   @  s&   e Zd Zd
dd„Zdd„ Zdd„ Zd	S )zhtest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnectionÚreturnÚNonec                 _  s   t j|i |¤Ž| _d S r  )r}   r~   r[   )ÚselfÚargsÚkwargsr*   r*   r+   Ú__init__A
  s   zqtest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__init__c                 S  s   t | j|ƒS r  )Úgetattrr[   )rû  r¥   r*   r*   r+   Ú__getattr__D
  s   zttest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__getattr__c                 S  s   | j  ¡  d S r  )r[   rX   )rû  r*   r*   r+   rX   G
  s   zntest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.closeN)rù  rú  )Ú__name__Ú
__module__Ú__qualname__rþ  r   rX   r*   r*   r*   r+   ÚMockSqliteConnection@
  s    
r  rS  zSELECT 1)rT  r   r¸   rx  rw  r   r—  )r  r[   r*   r*   r+   ÚJtest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed>
  s   
ÿÿ"ÿr  c                 C  sn   | }t  d|¡}t  d|¡}t ||¡ d}tjt j|d�� t  d|¡ W d   ƒ d S 1 s0w   Y  d S )Nr”  z9Execution failed on sql 'iris': near "iris": syntax errorr�  r3   )r   r"   r—  r¸   rÅ  r
  r‘  ÚDatabaseError)rX  r[   r¿  rÀ  rz  r*   r*   r+   Útest_sqlite_read_sql_delegateO
  s   "ÿr  c                 C  s   t  | d¡}d|v sJ ‚d S )Nr[  rŠ  )r   rŒ  )rà   rò  r*   r*   r+   Útest_get_schema2Z
  s   r  c                 C  s|   | }t dtddgdd�iƒ}t |¡}tjd||d�}| ¡ }| d¡D ]}| ¡ d	  d
¡dkr;| ¡ d dks;J ‚q$d S )Nr   rÊ  rË  TrÌ  rÎ  rÏ  Ú
r   rþ   rF   rÉ  )r   r   r   r   ÚSQLiteTableÚ
sql_schemaÚsplitÚstrip)rW  r[   rÑ   r  rø   r÷   Úcolr*   r*   r+   Útest_sqlite_type_mapping`
  s   ÿ
€þr  c                 C  sÔ   | dkr	t  d¡ | | ¡} ddlm} tg d¢g d¢dœƒ}tj| dd	��}| |d
¡dks1J ‚W d   ƒ n1 s;w   Y  || ƒ}| 	d
¡sKJ ‚tj| dd	��}| 
d
¡ W d   ƒ d S 1 scw   Y  d S )NrE  ú#sqlite_str has no inspection systemr   rë   ©ç      ð?ç       @ç      @ç      @©r  r  r  r  ©ÚoneÚtwoTr‚  ri  rI   )r
  Úskipr^  r:   rì   r   r   r   r_  r†  r   ©r[   r`  rì   ri  rˆ  Úinspr*   r*   r+   Útest_create_tabler
  s   

ÿ"ÿr  c              	   C  s   | dkr	t  d¡ | | ¡} ddlm} tg d¢g d¢dœƒ}t | ¡�b}| ¡ � | 	|d¡d	ks4J ‚W d   ƒ n1 s>w   Y  || ƒ}| 
d¡sNJ ‚| ¡ � | d¡ W d   ƒ n1 sbw   Y  z| ¡  W n	 tyv   Y nw | 
d¡r~J ‚W d   ƒ d S 1 s‰w   Y  d S )
NrE  r  r   rë   r  r  r  ri  rI   )r
  r  r^  r:   rì   r   r   r   r  r_  r†  r   Úclear_cacheÚAttributeErrorr  r*   r*   r+   Útest_drop_table‡
  s*   


ÿ
ÿÿ"ór   c                 C  s¬   | dkr	t  d¡ | }| | ¡} t| ƒ}| ¡ � | |d¡dks#J ‚| d¡}W d   ƒ n1 s2w   Y  d|v rC|jddid	�}|jdd
d� d |j	_
t ||¡ d S )NrE  r  r3  rI   r5  r   r6  r7  rÝ   Tr8  )r
  r  r^  r!   r  r_  r  r:  r;  r®   r¥   r¸   rÅ  r<  r*   r*   r+   Útest_roundtrip¡
  s   


þr!  c              	   C  sŒ   |  | ¡} t| ƒ�)}| ¡ � | d¡}| ¡ }| ¡  W d   ƒ n1 s&w   Y  W d   ƒ n1 s5w   Y  t|ƒg d¢ksDJ ‚d S r?  )r^  r!   r  rR   rÀ   rX   rñ  )r[   r`  rˆ  rA  rN   r*   r*   r+   Útest_execute_sql·
  s   




ý€ÿr"  c                 C  s$   |  | ¡} tjd| d�}t|ƒ d S )Nr3   r4  )r^  r   r#   r½   r˜  r*   r*   r+   Útest_sqlalchemy_read_tableÂ
  s   
r#  c                 C  s8   |  | ¡} tjd| ddgd�}t |jtddgƒ¡ d S )Nr3   r4   )rt   rº   ÚSepalLength__1)r^  r   r#   r¸   Úassert_index_equalrº   r   r˜  r*   r*   r+   Ú"test_sqlalchemy_read_table_columnsÉ
  s
   

ÿr&  c                 C  sP   |  | ¡} d}tjt|d�� tjd| d� W d   ƒ d S 1 s!w   Y  d S )Nz!Table this_doesnt_exist not foundr�  Úthis_doesnt_existr4  )r^  r
  r‘  r’  r   r#   )r[   r`  rz  r*   r*   r+   Útest_read_table_absent_raisesÒ
  s
   
"ÿr(  c                 C  sÂ   | }|dkrt  d¡ nd|v sd|v r| t jjdd�¡ | | ¡} t d| ¡}t|j	j
jtjƒs4J ‚t|jj
jtjƒs?J ‚t|jj
jtjƒsJJ ‚t|jj
jtjƒsUJ ‚t|jj
jtƒs_J ‚d S )NrE  ú.types tables not created in sqlite_str fixturer%   r$   z#boolean dtype not inferred properlyrb  r‡   )r
  r  r·  rf  rg  r^  r   r#   rµ   rŒ   r<   r´   r¶   r·   r�   r¸  rŽ   r¹  r�   r�   rº  r»  r*   r*   r+   Ú'test_sqlalchemy_default_type_conversionÚ
  s   ÿ
r*  c                 C  sN   |  | ¡} tddgid�}|jd| dd�dksJ ‚t d| ¡}t ||¡ d S )NÚi64l            )rÇ   Útest_bigintFrÄ  rF   rß  ©r[   r`  rÑ   râ  r*   r*   r+   r,  ñ
  s
   
r,  c                 C  sd   | }|dkrt  d¡ nd|v r| t jjdd�¡ | | ¡} t d| ¡}t|j	j
jtjƒs0J ‚d S )NrE  r)  r$   z"sqlite does not read date properlyrb  r‡   )r
  r  r·  rf  rg  r^  r   r#   rµ   r‰   r<   r´   r¶   rI  r»  r*   r*   r+   Útest_default_date_loadü
  s   ÿ
r.  rE  rŸ   c                 C  s6   |  | ¡} t| ƒ}td| |d�}|j}t ||¡ d S )Núselect * from datetzrD  )r^  r¨   r"   rŸ   r¸   r¹   )r[   r`  rE  rà  rÑ   r  r*   r*   r+   Ú!test_datetime_with_timezone_query  s
   
r0  c                 C  sB   |  | ¡} t| ƒ}tttd| dd�ƒdd�}|j}t ||¡ d S )Nr/  rF   r�  Tr�  )r^  r¨   r   rñ  r"   rŸ   r¸   r¹   )r[   r`  rà  rÑ   r  r*   r*   r+   Ú+test_datetime_with_timezone_query_chunksize  s   
þr1  c                 C  s2   |  | ¡} t| ƒ}t d| ¡}t || ¡ ¡ d S )Nrž   )r^  r¨   r   r#   r¸   rÅ  r/  )r[   r`  rà  râ  r*   r*   r+   Ú!test_datetime_with_timezone_table(  s   
r2  c                 C  sÎ   | }|  | ¡} tdtdddd�iƒ}|jd| dd�dksJ ‚d	|v r-|d j d
¡|d< n
|d j d ¡|d< t d| ¡}t	 
||¡ t d| ¡}d|v r_t|jd tƒsWJ ‚t|d ƒ|d< t	 
||¡ d S )NrÔ   ú2013-01-01 09:00:00rH   ú
US/Pacific©Úperiodsr£   Útest_datetime_tzFrÄ  r&   r¡   zSELECT * FROM test_datetime_tzr$   ©r   rÔ   )r^  r   r   r_  ÚdtÚ
tz_convertÚtz_localizer   r#   r¸   rÅ  r"   r|   Úlocr‚   r   )r[   r`  r¼  rà  râ  r*   r*   r+   Ú%test_datetime_with_timezone_roundtrip0  s    
ÿr=  c                 C  sj   |  | ¡} tdtdddƒidgd�}|jd| dd�dksJ ‚t d| ¡}ttjgdgd	�}t 	||¡ d S )
Nr   i'  rF   r   r*  Útest_datetime_obbFrÄ  rÝ   )
r^  r   r   r_  r   r#   rt  ÚNaTr¸   rÅ  )r[   r`  rÇ   râ  rà  r*   r*   r+   Útest_out_of_bounds_datetimeO  s   
r@  c                 C  sn   |  | ¡} tdddd� d ¡}tdtdƒi|d�}|jd| dd	�dks%J ‚tjd| dd
�}tj	||dd� d S )Nz
2018-01-01r°   Ú6h©r6  ÚfreqÚnumsr*  Ú	foo_tableÚ	info_date)r¥   rt   rg  r|  F)Úcheck_names)
r^  r   Ú
_with_freqr   rh  r_  r   r#   r¸   rÅ  )r[   r`  Údatesrà  râ  r*   r*   r+   Ú"test_naive_datetimeindex_roundtripZ  s   
rJ  c                 C  sD  | }|  | ¡} t d| ¡}d|v rtntj}t|jjj	|ƒs J ‚tjd| dgd�}t|jjj	tjƒs4J ‚tjd| ddid�}t|jjj	tjƒsIJ ‚tjd| dddiid�}t|jjj	tjƒs`J ‚tjd| dgd�}t|j
jj	tjƒstJ ‚tjd| ddid�}t|j
jj	tjƒs‰J ‚tjd| dd	diid�}t|j
jj	tjƒs J ‚d S )
Nr‡   r$   r‰   rD  rF  ÚformatrŠ   r0  Úunit)r^  r   r#   rº  r¶   rI  rµ   r‰   r<   r´   rŠ   )r[   r`  r¼  rÑ   Úexpected_typer*   r*   r+   Útest_date_parsingg  s*   

ýrN  c                 C  sÌ   | }|  | ¡} ttddd�t d¡dœƒ}|jd| d�dks J ‚t d| ¡}|jdd	d
�}t	 
||¡ t d| ¡}|jdd	d
�}d|v r^t|jd tƒsNJ ‚t|d ƒ|d< t	 
||¡ d S t	 
||¡ d S )Nr3  rH   ©r6  r  r�  Útest_datetimerX  r®   rF   )ÚaxisúSELECT * FROM test_datetimer$   r8  rÔ   )r^  r   r   r¶   r.  r_  r   r#   rq   r¸   rÅ  r"   r|   r<  r‚   r   ©r[   r`  r¼  rÑ   râ  r*   r*   r+   rP  ‡  s    
ÿrP  c                 C  sÂ   | }|  | ¡} ttddd�t d¡dœƒ}tj|jd< |jd| dd	�dks'J ‚t 	d| ¡}t
 ||¡ t d
| ¡}d|v rYt|jd tƒsGJ ‚t|d dd�|d< t
 ||¡ d S t
 ||¡ d S )Nr3  rH   rO  r  r�  ©rF   rÔ   rP  FrÄ  rR  r$   r8  rÔ   rN  rx   )r^  r   r   r¶   r.  rµ  r<  r_  r   r#   r¸   rÅ  r"   r|   r‚   r   rS  r*   r*   r+   Útest_datetime_NaT   s   
ÿrU  c                 C  sr   |  | ¡} ttdddƒtdddƒgdgd�}|jd| dd�dks"J ‚td| ƒ}|d }t|d ƒ}t ||¡ d S )	NéÞ  rF   rG   rm  rÝ   Ú	test_dateFrÄ  )r^  r   r   r_  r#   r   r¸   r¹   )r[   r`  rÑ   r¯  râ  rà  r*   r*   r+   Útest_datetime_date¸  s   
"
rX  c                 C  s  | }|  | ¡} ttdddƒtdddƒgdgd�}|jd| dd	�d
ks$J ‚td| ƒ}t ||¡ |}tj|d|dd�d
ks>J ‚t d|¡}| 	dd„ ¡}t ||¡ tj|d| dd�d
ks^J ‚d|v rut d| ¡}| 	dd„ ¡}t ||¡ t d| ¡}t ||¡ d S )Né	   r   rF   é   rm  rÝ   Ú	test_timeFrÄ  rG   Ú
test_time2r*  zSELECT * FROM test_time2c                 S  ó
   |   d¡S ©Nz%H:%M:%S.%f©Ústrftime©Ú_r*   r*   r+   Ú<lambda>Ô  ó   
 z$test_datetime_time.<locals>.<lambda>Ú
test_time3r$   zSELECT * FROM test_time3c                 S  r]  r^  r_  ra  r*   r*   r+   rc  Ú  rd  )
r^  r   r   r_  r#   r¸   rÅ  r   r"   Úmap)r[   r`  rW  r¼  rÑ   r¯  rG  Úrefr*   r*   r+   Útest_datetime_timeÅ  s$   
"
rh  c                 C  sn   |  | ¡} tdtjd�}tdtjd�}t||dœƒ}|jd| dd�dks&J ‚t d| ¡}t	j
||dd	d
� d S )Ni  rj  g        )Ús1r1  Útest_read_writeFrÄ  rF   T)Úcheck_dtypeÚcheck_exact)r^  r   r¶   rQ  Úfloat32r   r_  r   r#   r¸   rÅ  )r[   r`  ri  r1  rÑ   r®  r*   r*   r+   Útest_mixed_dtype_insertà  s   
rn  c                 C  sp   |  | ¡} tg d¢dtjdgdœƒ}|jd| dd�dksJ ‚t d| ¡}t ||¡ t 	d	| ¡}t ||¡ d S )
Nr´  r¬   r„  r�  Útest_nanFrÄ  rH   úSELECT * FROM test_nan)
r^  r   r¶   rµ  r_  r   r#   r¸   rÅ  r"   r-  r*   r*   r+   Útest_nan_numericï  s   
rq  c                 C  sŽ   |  | ¡} tg d¢tjtjtjgdœƒ}|jd| dd�dks J ‚t d| ¡}t ||¡ |d  	d¡|d< d |d< t 
d	| ¡}t ||¡ d S )
Nr´  r�  ro  FrÄ  rH   rÕ   rº  rp  )r^  r   r¶   rµ  r_  r   r#   r¸   rÅ  rÐ   r"   r-  r*   r*   r+   Útest_nan_fullcolumnÿ  s   
rr  c                 C  sz   |  | ¡} tg d¢ddtjgdœƒ}|jd| dd�dksJ ‚d |jd	< t d| ¡}t 	||¡ t 
d
| ¡}t 	||¡ d S )Nr´  rm  rÃ  r�  ro  FrÄ  rH   ©rG   rÕ   rp  )r^  r   r¶   rµ  r_  r<  r   r#   r¸   rÅ  r"   r-  r*   r*   r+   Útest_nan_string  s   

rt  c              	   C  sB  d| v r|j  tjjddd�¡ | }| | ¡} tjddgg d¢dgd	�}d
}t| ƒ�&}| 	¡ � | 
||¡dks:J ‚W d   ƒ n1 sDw   Y  W d   ƒ n1 sSw   Y  |dv r�t d|› d�| ¡}g }|jD ]}t d|› d�| ¡}	| |	j ¡ ¡ qknddlm}
 |
| ƒ}| |¡}dd„ |D ƒ}|dggksŸJ ‚d S )Nr   z)ADBC implementation does not create indexTr€  ru  rw  rz  rÔ   r{  Útest_to_sql_saves_indexrG   >   rE  rW  zASELECT * FROM sqlite_master WHERE type = 'index' AND tbl_name = 'ú'zPRAGMA index_info(ú)r   rë   c                 S  râ   )Úcolumn_namesr*   )rM   r£  r*   r*   r+   rO   G  rå   z*test_to_sql_save_index.<locals>.<listcomp>)rd  re  r
  rf  rg  r^  r   r  r!   r  r_  r   r"   r¥   rñ   rJ  r:   rì   Úget_indexes)r[   r`  r¼  rÑ   Útbl_namerˆ  ÚixsÚix_colsÚix_nameÚix_inforì   r  r*   r*   r+   Útest_to_sql_save_index$  sF   ÿÿ
ÿ

ÿ€ÿÿý
þ
r  c              	   C  s¦   | }|  | ¡} d}|dkrd|vrddlm} ||ƒ}t| ƒ�*}| ¡ �}| |¡ W d   ƒ n1 s4w   Y  W d   ƒ d S W d   ƒ d S 1 sLw   Y  d S )Nú'CREATE TABLE test_trans (A INT, B TEXT)rW  r   r   rz   )r^  r:   r{   r!   r  rR   )r[   r`  r¼  r\   r{   rˆ  Útransr*   r*   r+   Útest_transactionsL  s   


ÿÿ"ÿr‚  c              	   C  s¨  | }|  | ¡} t| ƒ�¿}| ¡ �(}d}d|v st|tƒr"| |¡ nddlm} ||ƒ}| |¡ W d   ƒ n1 s;w   Y  G dd„ dtƒ}d}t|t	ƒrYddlm} ||ƒ}z| ¡ �
}| |¡ |dƒ‚1 skw   Y  W n	 |yz   Y nw | ¡ � | 
d	¡}	W d   ƒ n1 s�w   Y  t|	ƒdksœJ ‚| ¡ �}| |¡ | 
d	¡}
W d   ƒ n1 sµw   Y  t|
ƒd
ksÂJ ‚W d   ƒ d S 1 sÍw   Y  d S )Nr€  r   r   rz   c                   @  s   e Zd ZdS )z1test_transaction_rollback.<locals>.DummyExceptionN)r  r  r  r*   r*   r*   r+   ÚDummyExceptionk  s    rƒ  z/INSERT INTO test_trans (A,B) VALUES (1, 'blah')rL  zSELECT * FROM test_transrF   )r^  r!   r  r|   r   rR   r:   r{   Ú	Exceptionr   r  r‡  )r[   r`  r¼  rˆ  r�  r\   r{   rƒ  Úins_sqlr¯  rÉ  r*   r*   r+   Útest_transaction_rollback\  sF   



€ø



þþ
ÿ

þ"Ýr†  c           
   	   C  sø   | dkr|  tjjdd�¡ | | ¡} ddlm} ddlm} d}t	j
||| d�}|jd d… }||ƒ}t| |ƒrg|  ¡ �!}| ¡ � | |¡ W d   ƒ n1 sRw   Y  W d   ƒ n1 saw   Y  n|  |¡ t	 || ¡}	tj|	|d	d
� d S )NrE  z(test does not support sqlite_str fixturerb  r   rz   r™   Útest_get_schema_create_tabler4  Fr}  )r·  r
  rf  rg  r^  r:   r{   r›   rš   r   rŒ  r³   r|   rœ   rp   rR   r#   r¸   rÅ  )
r[   r`  rá   r{   rš   r  rò  Úblank_test_dfÚnewconÚreturned_dfr*   r*   r+   r‡  †  s,   ÿ



ÿ€ÿ€
r‡  c                 C  sÀ  | dkr	t  d¡ | | ¡} ddlm}m} ddlm} ddg}dd	g}t||d
�}|j	d| d�dks5J ‚|j	d| d|id�dksCJ ‚|ƒ }|j
| d� |jd jd j}	t|	|ƒs\J ‚d}
t jt|
d�� |j	d| dtid� W d   ƒ n1 szw   Y  |j	d| d|dƒid�dks�J ‚|j
| d� |jd jd j}	t|	|ƒs¥J ‚|	jdks¬J ‚|j	d| |d�dks¸J ‚|j
| d� |jd jd j}|jd jd j}t||ƒs×J ‚t||ƒsÞJ ‚d S )NrE  r  r   )rƒ   r1   ©r0   rÔ   rÕ   ©gš™™™™™é?T©gÍÌÌÌÌÌì?NrÝ   Ú
dtype_testrX  rG   Údtype_test2©r¥   rt   r<   rm   z&The type of B is not a SQLAlchemy typer�  rL  Údtype_test3é
   Úsingle_dtype_test)r
  r  r^  r:   rƒ   r1   Úsqlalchemy.schemar0   r   r_  ÚreflectÚtablesrº   r´   r|   r‘  r’  r‚   r£  )r[   r`  rƒ   r1   r0   r¼  rÇ   rÑ   ÚmetaÚsqltyperz  ÚsqltypeaÚsqltypebr*   r*   r+   Ú
test_dtype¤  s:   

ÿ r›  c                 C  s.  | dkr	t  d¡ | }| | ¡} 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�dksPJ ‚t |
| ¡}|ƒ }|j| d� d|v re|n|}|j|
 j}t|d j|ƒswJ ‚t|d j|ƒs�J ‚t|d j|ƒs‹J ‚t|d j|ƒs•J ‚d S )NrE  r  r   )r„   r…   r/   r†   r‹  TéÜ  r°   rF   rº  rj  r‘  ©ÚBoolÚDateÚIntr/   Únotna_dtype_testrX  rG   rm   r%   rž  rŸ  r   r/   )r
  r  r^  r:   r„   r…   r/   r†   r”  r0   r   r   r   r_  r   r#   r•  r–  rº   r|   r´   )r[   r`  r¼  r„   r…   r/   r†   r0   r¼  rÑ   r  rb  r—  Úmy_typeÚcol_dictr*   r*   r+   Útest_notna_dtypeÎ  s.   



ür¤  c              	   C  sz  | dkr	t  d¡ | | ¡} 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| ddd|dd�id�dksVJ ‚t d| ¡}t |d jd d¡t |d jd d¡kstJ ‚|ƒ }	|	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|ƒs±J ‚t|
d j|ƒs»J ‚d S )NrE  r  r   )Ú
BigIntegerr/   r†   r‹  gñYÉBÊÀó?rm  rj  Úfloat64r°   rQ  rÎ   )Úf32Úf64Ú
f64_as_f32Úi32r+  Útest_dtypesFrs  r©  é   )Ú	precision)r¥   rt   r®   r]  r<   rF   r¨  é   rm   r§  rª  r+  )r
  r  r^  r:   r¥  r/   r†   r”  r0   r   r   r_  r   r#   r¶   Úroundr³   r•  r–  rº   r‚   r´   r|   )r[   r`  r¥  r/   r†   r0   ÚVrÑ   r¯  r—  r£  r*   r*   r+   Útest_double_precisionó  sB   

ûÿûù	0 r±  c                   sp   |  | ¡} ddlm‰  dd„ ‰dd„ ‰‡‡fdd„‰‡ ‡fd	d
„}tdg d¢iƒjd| d�dks2J ‚|| ƒ d S )Nr   r™   c                 S  s   d}t j|| d�S )Nz'SELECT test_foo_data FROM test_foo_datar4  )r   r"   )rÏ  rª  r*   r*   r+   Útest_select/  s   z3test_connectable_issue_example.<locals>.test_selectc                 S  s   |j d| dd� d S )NÚtest_foo_datarñ   )r¥   rt   r]  )r_  )rÏ  rÇ   r*   r*   r+   Útest_append3  s   z3test_connectable_issue_example.<locals>.test_appendc                   s   ˆ| ƒ}ˆ | |ƒ d S r  r*   )r[   Úfoo_data)r´  r²  r*   r+   Útest_connectable6  s   z8test_connectable_issue_example.<locals>.test_connectablec              	     s„   t | ˆ ƒr<|  ¡ �)}| ¡ � ˆ|ƒ W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s5w   Y  d S ˆ| ƒ d S r  )r|   rœ   rp   )Úconnectabler[   )rš   r¶  r*   r+   Úmain<  s   



ÿÿ"ÿz,test_connectable_issue_example.<locals>.mainr³  r´  rX  rH   )r^  r›   rš   r   r_  )r[   r`  r¸  r*   )rš   r´  r¶  r²  r+   Útest_connectable_issue_example'  s   
	ÿr¹  ÚinputrW  Úbar)rW  Úinfe0c           	      C  sØ   t |ƒ}| }| | ¡} d|v rRt d¡}t|jƒtdƒk r.d|jv r.tjjdd�}| 	|¡ d}tj
t|d�� |jd	| d
d� W d   ƒ d S 1 sKw   Y  d S |jd	| d
d�dks^J ‚t d	| ¡}t ||¡ d S )Nr%   r  z1.0.3r¼  zGH 36465rb  zinf cannot be used with MySQLr�  ÚfoobarFrÄ  rF   )r   r^  r
  r  r   r;   rº   rf  rg  r·  r‘  r’  r_  r   r#   r¸   Úassert_equal)	r[   r`  rº  rÑ   r¼  r  rf  rz  r¯  r*   r*   r+   Útest_to_sql_with_negative_npinfK  s   


"ÿr¿  c              	     s  | dkr	t  d¡ | | ¡} ddlm‰ m‰m‰m} ddlm	}m
} d}td|giƒ}|ƒ }G ‡ ‡‡fdd	„d	|ƒ}|| ƒ�<}	|	 ¡ �( |	 ¡ } |j | ¡ |	 ||d
�¡ |	 ¡  tj||jƒ| d�}
W d   ƒ n1 snw   Y  W d   ƒ n1 s}w   Y  t |
|¡ d S )NrE  z&test does not work with str connectionr   )r-   r†   Ú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 )
z'test_temporary_table.<locals>.TemporaryÚ	temp_testÚprefixesÚ	TEMPORARYT©Úprimary_keyrZ  F)ÚnullableN)r  r  r  Ú__tablename__Ú__table_args__ÚidrÃ  r*   ©r-   r†   rÀ  r*   r+   Ú	Temporary�  s
    
rÎ  )rÃ  )r   rt   )r
  r  r^  r:   r-   r†   rÀ  r   Úsqlalchemy.ormrÁ  rÂ  r   rp   rÏ  Ú	__table__rr   ÚaddÚflushr   r"   rÃ  r¸   rÅ  )r[   r`  r   rÁ  rÂ  rù  rà  ÚBaserÎ  ÚsessionrÑ   r*   rÍ  r+   Útest_temporary_tablek  s(   



û€ÿrÕ  c              	   C  s®   | dksd| v r|  tjjdd�¡ | | ¡} d}t| ƒ�0}tjt|d�� |j|ddd	� W d   ƒ n1 s8w   Y  W d   ƒ d S W d   ƒ d S 1 sPw   Y  d S )
NrW  r   z9SQLiteDatabase/ADBCDatabase does not raise for bad enginerb  z*engine must be one of 'auto', 'sqlalchemy'r�  rà   Ú
bad_engine©rÄ   )	r·  r
  rf  rg  r^  r!   r‘  r’  r_  )r[   r`  rà   rz  rˆ  r*   r*   r+   Útest_invalid_engine‘  s   ÿÿ

ÿÿ"ÿrØ  c              	   C  s¢   |  | ¡} t| ƒ�/}| ¡ � |j|ddd�dksJ ‚| d¡s"J ‚W d  ƒ n1 s,w   Y  W d  ƒ n1 s;w   Y  t|ƒ}t| dƒ}||ksOJ ‚dS )z `to_sql` with the `engine` paramrà   Úautor×  rI   N)r^  r!   r  r_  r†  r‡  rÅ   r#  r*   r*   r+   Útest_to_sql_with_sql_engine¡  s   


þ€ÿ
rÚ  c              
   C  óÌ   |  | ¡} t dd¡�Q t| ƒ�-}| ¡ � | |d¡dks J ‚| d¡s'J ‚W d   ƒ n1 s1w   Y  W d   ƒ n1 s@w   Y  t|ƒ}t| dƒ}||ksTJ ‚W d   ƒ d S 1 s_w   Y  d S )Núio.sql.enginer:   rà   rI   ©	r^  rt  Úoption_contextr!   r  r_  r†  r‡  rÅ   r#  r*   r*   r+   Útest_options_sqlalchemy°  ó   


þ€ÿ
"ørß  c              
   C  rÛ  )NrÜ  rÙ  rà   rI   rÝ  r#  r*   r*   r+   Útest_options_auto¿  rà  rá  c                   C  sÂ   t  d¡ ttdƒtƒsJ ‚t dd¡� ttdƒtƒsJ ‚ttdƒtƒs'J ‚W d   ƒ n1 s1w   Y  t dd¡� ttdƒtƒsFJ ‚ttdƒtƒsOJ ‚W d   ƒ d S 1 sZw   Y  d S )Nr:   rÜ  rÙ  )r
  r  r|   r    r   rt  rÞ  r*   r*   r*   r+   Útest_options_get_engineÎ  s   
þ"þrâ  c                   C  s   d S r  r*   r*   r*   r*   r+   Ú"test_get_engine_auto_error_messageÛ  s   rã  Úfuncr—  r"   c                 C  s  | }|  | ¡} d}|}	|	j|| ddd� t d|¡� tt|ƒd|› �| |d�}
||||ƒ}W d   ƒ n1 s8w   Y  t |
|¡ d|v rQ| tj	j
d	d
�¡ t d|¡�( tt|ƒd|› �| |dd�}||||ƒ}|D ]}
t |
|¡ qnW d   ƒ d S 1 s‚w   Y  d S )Nr[  Frs  ©r¥   rt   r®   r]  úmode.string_storageúSelect * from ©Údtype_backendr   z(adbc does not support chunksize argumentrb  rH   )rt   ré  rž  )r^  r_  rt  rÞ  rÿ  r¸   rÅ  r·  r
  rf  rg  ©r[   r`  Ústring_storagerä  ré  Údtype_backend_dataÚdtype_backend_expectedr¼  rø   rÑ   râ  rà  Úiteratorr*   r*   r+   Útest_read_sql_dtype_backendâ  s8   
ÿüÿüÿ"ørï  r#   c                 C  s  d| v rd| vr|  tjjdd�¡ | }| | ¡} d}|}	|	j|| ddd� t d	|¡� tt|ƒ|| |d
�}
||||ƒ}W d   ƒ n1 sGw   Y  t	 
|
|¡ d|v rXd S t d	|¡�% tt|ƒ|| |dd�}||||ƒ}|D ]}
t	 
|
|¡ qrW d   ƒ d S 1 s†w   Y  d S )Nr$   r   zhSQLite actually returns proper boolean values via read_sql_table, but before pytest refactor was skippedrb  r[  Frs  rå  ræ  rè  rH   )ré  rž  )r·  r
  rf  rg  r^  r_  rt  rÞ  rÿ  r¸   rÅ  rê  r*   r*   r+   Ú!test_read_sql_dtype_backend_table  s<   þÿ	
þüÿ"ørð  )r—  r#   r"   c                 C  sp   |  | ¡} d}|}|j|| ddd� d}tjt|d�� tt|ƒ|| dd� W d   ƒ d S 1 s1w   Y  d S )	Nr[  Frs  rå  zPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.r�  Únumpyrè  )r^  r_  r
  r‘  r’  rÿ  rt  )r[   r`  rä  rì  rø   rÑ   rz  r*   r*   r+   Ú)test_read_sql_invalid_dtype_backend_table>  s   
ÿ"ÿrò  rù  c                
   C  sb   t tdtjdgdd�tg d¢dd�tdtjdgdd�tg d	¢dd�g d
¢g d¢g d¢g d¢dœƒS )NrF   rH   rß  rj  r¾  rx  ç      @ÚFloat64©rx  r  ró  )TFN©TFTr¸  ©rm  rÃ  N©rm  rÃ  ró   ÚdÚeÚfÚgÚh)r   r   r¶   rµ  r*   r*   r*   r+   rì  N  s   øÿrì  c                  C  s   ddd„} | S )Nrù  r   c                   s,  |dkrt  d¡‰t ˆ ¡ ¡}nt | ¡}ttdtj	dgdd�tg d¢dd�tdtj	dgd	d�tg d
¢d	d�tddtj
gdd�tg d¢dd�tg d¢|d�tg d¢|d�dœƒ‰|dkrvt  d¡‰ddlm‰  t‡ ‡‡fdd„ˆjD ƒƒ‰d|v s~d|v r”|dkrŒˆ dddœ¡‰ˆS ˆ dddœ¡‰ˆS )Nr*  rF   rH   rß  rj  r¾  rx  ró  rô  rõ  TFÚbooleanrö  r¸  r÷  rø  r   )ÚArrowExtensionArrayc                   s$   i | ]}|ˆ ˆj ˆ| d d�ƒ“qS )T)Úfrom_pandas)ru  )rM   r  ©rÿ  rÑ   r¹  r*   r+   Ú
<dictcomp>z  s    ÿÿz8dtype_backend_expected.<locals>.func.<locals>.<dictcomp>r%   r$   Únumpy_nullable)rú  rû  zint64[pyarrow])r
  r  rt  Ú
ArrowDtypern  ÚStringDtyper   r   r¶   rµ  ÚNAÚpandas.arraysrÿ  rº   rÐ   )rë  ré  r¼  Ústring_dtyper*   r  r+   rä  `  s:   

øÿ
þÿþz$dtype_backend_expected.<locals>.func©rù  r   r*   )rä  r*   r*   r+   rí  ^  s   
(rí  c                 C  s†   d| v r|j  tjjdd�¡ | | ¡} dddœ}tddgd	� |¡}| ¡ }|j	d
| ddd� t
d| |dd�D ]}t ||¡ q8d S )Nr   r­  rb  rÎ   rº  rÂ  rm  rÃ  rÝ   r[  Frs  rå  zSELECT * FROM testrF   )r<   rž  )rd  re  r
  rf  rg  r^  r   rÐ   r­  r_  r"   r¸   rÅ  )r[   r`  r²   rÑ   rà  râ  r*   r*   r+   Útest_chunksize_empty_dtypes‹  s"   ÿ


üúr
  ré  r  c                 C  s˜   |  | ¡} d}tg d¢ddœƒ}|j|| ddd� tt|ƒd|› �| d	tji|d
�}ttg d¢tjd�tg d¢|dks=dndd�dœƒ}t 	||¡ d S )Nr[  r¾  r°   rÂ  Frs  rå  rç  rm  )r<   ré  rj  )r°   r°   r°   r  rÎ   rß  )
r^  r   r_  rÿ  rt  r¶   r¦  r   r¸   rÅ  )r[   r`  rä  ré  rø   rÑ   râ  rà  r*   r*   r+   Útest_read_sql_dtype¡  s&   
üþþÿ	r  c                 C  sv   | }d}t ddddœddddœgƒ}| d|¡ tjt|d�� |jd|d dd	� W d   ƒ d S 1 s4w   Y  d S )
NzxStarting with pandas version 3.0 all arguments of to_sql except for the arguments 'name' and 'con' will be keyword-only.rF   rG   rH   rz  Úexampler�  rs  r‹  )r   r_  r¸   rx  r  )rF  r[   rz  rÑ   r*   r*   r+   Útest_keyword_deprecation½  s   ÿ"ÿr  c                 C  sl   | }t dddgidd�}|jd|dd�dksJ ‚t d ¡� t d|¡ W d   ƒ d S 1 s/w   Y  d S )	Nrm  rF   rG   rÎ   rj  Útest_bigintwarningFrÄ  )r   r_  r¸   rx  r   r#   ©rF  r[   rÑ   r*   r*   r+   Útest_bigint_warningË  s   "ÿr  c                 C  s`   | }t ddgddgdœƒ}tjtdd�� |jd|d	d
d� W d   ƒ d S 1 s)w   Y  d S )NrF   rG   rH   rI   ©rÜ  rÝ  zEmpty table name specifiedr�  ro  rs  Fr\  )r   r
  r‘  r’  r_  r  r*   r*   r+   Útest_valueerror_exceptionÕ  s
   "ÿr  c           
        s  | }ddl m‰ m‰m‰ ddlm}m} |ƒ }G ‡ ‡‡fdd„d|ƒ}| ¡ � |j 	|¡ W d   ƒ n1 s8w   Y  ||d�}|ƒ �0}t
ddgdd	gd
œƒ}|jd|ddd�dks^J ‚| ¡  | |j|j¡}	t
|	ƒ}W d   ƒ n1 sxw   Y  t|jƒddgksˆJ ‚d S )Nr   ©r-   r†   r1   )rÂ  Úsessionmakerc                      s(   e Zd ZdZ” ”dd�Z” ”dƒƒZdS )z,test_row_object_is_named_tuple.<locals>.Testr„  TrÇ  é2   N)r  r  r  rÊ  rÌ  Ústring_columnr*   r  r*   r+   ÚTestî  s    r  rm   rF   ÚhelloÚworld)rÌ  r  r„  Frs  rå  rG   rÌ  r  )r:   r-   r†   r1   rÏ  rÂ  r  rp   r=   Ú
create_allr   r_  rY   rª  rÌ  r  rñ  rº   )
rF  r[   rÂ  r  Ú	BaseModelr  rÁ  rÔ  rÑ   Ú
test_queryr*   r  r+   Útest_row_object_is_named_tupleÜ  s&   
ÿ
ÿ
ø
r  c                 C  sž   | }d}t dddgiƒ}|j||ddd� t dd	¡� t||ƒ}W d   ƒ n1 s+w   Y  tjtjd
�}t dddgi|tdg|d�d�}t	 
||¡ d S )Nr[  rm  ÚxÚyFrs  )rt   r®   r]  zfuture.infer_stringT)Úna_valuerj  )r<   rº   )r   r_  rt  rÞ  r#   r  r¶   rµ  r   r¸   rÅ  )rF  r[   rø   rÑ   râ  r<   rà  r*   r*   r+   Útest_read_sql_string_inference  s   ÿÿr!  c                 C  sT   | }t dtddddƒgidd�}|jd|dd	d
� t d|¡jd }|dks(J ‚d S ©NÚtiä  rG  é   rP  rj  r[  rs  F)r]  r®   úselect * from test©r   r   z2020-12-31 12:00:00.000000)r   r   r_  rt  r—  r³   )rF  r[   rÑ   râ  r*   r*   r+   Útest_roundtripping_datetimes  s
   r'  c               	   c  sx   � t  tjdtjd�¡�&} | �}|V  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s5w   Y  d S )NrS  )Údetect_types)rT  r   r}   rœ   ÚPARSE_DECLTYPESrU  r*   r*   r+   Úsqlite_builtin_detect_types  s   €ÿÿý"ýr*  c                 C  sX   | }t dtddddƒgidd�}|jd|dd	d
� t d|¡jd }|tdƒks*J ‚d S r"  )r   r   r_  rt  r—  r³   r   )r*  r[   rÑ   râ  r*   r*   r+   Ú)test_roundtripping_datetimes_detect_types'  s
   r+  c           
   	   C  sV  | }t ddgddgddgdœƒ}| ¡ �&}| ¡ � | d¡ | d	¡ W d   ƒ n1 s.w   Y  W d   ƒ n1 s=w   Y  |jd
|dd�dksNJ ‚|jd|ddd�dks[J ‚|jd|ddd�dkshJ ‚t d
|¡}t ||¡ t d|¡}t ||¡ tjd|dd�}t ||¡ tjd|dd�}t ||¡ d}t	j
t|d�� tjd|dd� W d   ƒ n1 s¸w   Y  | ¡ �&}| ¡ � | d¡ | d	¡ W d   ƒ n1 sÛw   Y  W d   ƒ n1 sêw   Y  |jd|ddd�dksüJ ‚|jd|dddd� |jd|dddd�dk�sJ ‚tjd|dd�}	t t||gdd�|	¡ d S )NrF   rG   rÀ  r¬   rm  rÚ  rÛ  z$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Útest_schema_publicFrÄ  Útest_schema_public_explicitr÷  )r¥   rt   r®   r÷   Útest_schema_otherÚotherrø  z!Table test_schema_other not foundr�  )r¥   rt   r÷   r®   rs  )r¥   rt   r÷   r®   r]  rñ   Tr�  )r   rœ   rp   rÁ   r_  r   r#   r¸   rÅ  r
  r‘  r’  r   )
r%  r[   rÑ   rt   rÈ  rÉ  r¦  Úres4rz  r¯  r*   r*   r+   Útest_psycopg2_schema_support0  sr   


þ€ÿüú	ÿ


þ€ÿûû
ù	r1  c           	   	   C  sò   | }ddl m} |dƒ}| ¡ �!}| ¡ � | |¡ W d   ƒ n1 s%w   Y  W d   ƒ n1 s4w   Y  d}t ||¡}tdtddd�gd	 gd
dgd	 d�}t	 
||¡ tj|dd��}| d¡ W d   ƒ d S 1 srw   Y  d S )Nr   rz   zÐ
    CREATE TABLE person
    (
        id serial constraint person_pkey primary key,
        created_dt timestamp with time zone
    );

    INSERT INTO person
        VALUES (1, '2021-01-01T00:00:00Z');
    zHSELECT * FROM "person" AS p1 INNER JOIN "person" AS p2 ON p1.id = p2.id;rF   Ú2021r¡   r¢   rG   rÌ  Ú
created_dtrÝ   Tr‚  Úperson)rð  r{   rœ   rp   rR   rt  r—  r   r   r¸   rÅ  r   r   r   )	r%  r[   r{   r  rt   r×  râ  rà  rˆ  r*   r*   r+   Útest_self_join_date_columns{  s*   ÿ

ÿ€ÿÿÿ"ÿr5  c              	   C  sÔ   | }t g d¢g d¢dœƒ}t |¡�N}| ¡ � | |d¡dks"J ‚W d   ƒ n1 s,w   Y  | d¡s8J ‚| ¡ � | d¡ W d   ƒ n1 sLw   Y  | d¡rXJ ‚W d   ƒ d S 1 scw   Y  d S )Nr  r  r  Údrop_test_framerI   )r   r   r   r  r_  r†  r   )rF  r[   ri  rˆ  r*   r*   r+   Útest_create_and_drop_tableŸ  s   
ÿ
ÿ"÷r7  c                 C  s^   | }t tdddƒtdddƒgdgd�}|jd|dd�dksJ ‚td	|ƒ}t || t¡¡ d S )
NrV  rF   rG   rm  rÝ   rW  FrÄ  zSELECT * FROM test_date)r   r   r_  r"   r¸   rÅ  rÐ   r‚   )rW  r[   rÑ   r¯  r*   r*   r+   Útest_sqlite_datetime_date®  s
   "
r8  Útz_awareFTc                 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|dd�dks6J ‚td|ƒ}| dd
„ ¡}t 	||¡ d S )NrY  r   rF   rZ  r3  rG   r4  r5  c                 S  s   |   ¡ S r  )Útimetz)r9  r*   r*   r+   rc  ¿  s    z+test_sqlite_datetime_time.<locals>.<lambda>rm  rÝ   r[  FrÄ  zSELECT * FROM test_timec                 S  r]  r^  r_  ra  r*   r*   r+   rc  Æ  rd  )
r   r   r   Úto_pydatetimerf  r   r_  r"   r¸   rÅ  )r9  rW  r[   Útz_timesÚtz_dtrÑ   r¯  rà  r*   r*   r+   Útest_sqlite_datetime_time·  s   
r>  c           
      C  sN   |   d|› d�¡}|D ]\}}}}}}	||kr|  S qtd|› d|› d�ƒ‚)NzPRAGMA table_info(rw  zTable z	, column z
 not found)rR   r’  )
r[   rø   ÚcolumnÚrecsÚcidr¥   ÚctypeÚnot_nullÚdefaultÚpkr*   r*   r+   Úget_sqlite_column_typeÊ  s   ÿrF  c                 C  s  | }ddg}ddg}t ||d�}|jd|d�dksJ ‚|jd	|dd
id�dks)J ‚t|ddƒdks3J ‚t|d	dƒd
ks=J ‚d}tjt|d�� |jd|dtid� W d   ƒ n1 s[w   Y  |jd|d
d�dkslJ ‚t|ddƒd
ksvJ ‚t|ddƒd
ks€J ‚d S )NrÔ   rÕ   rŒ  r�  rÝ   rŽ  rX  rG   r�  ÚSTRINGr�  r“  z!B \(<class 'bool'>\) not a stringr�  rL  r“  )r   r_  rF  r
  r‘  r’  Úbool)rW  r[   r¼  rÇ   rÑ   rz  r*   r*   r+   Útest_sqlite_test_dtypeÒ  s   ÿrI  c                 C  s´   | }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
�dks0J ‚t||dƒdks:J ‚t||dƒdksDJ ‚t||dƒdksNJ ‚t||dƒdksXJ ‚d S )NTrœ  r°   rF   rº  rj  r‘  r�  r¡  rX  rG   rž  r“  rŸ  rÉ  r   r/   ÚREAL)r   r   r   r_  rF  )rW  r[   r¼  rÑ   r  r*   r*   r+   Útest_sqlite_notna_dtypeè  s   

ürK  c                 C  sæ   | }t ddgddggddgd�}d}tjt|d	�� |jd
|d� W d   ƒ n1 s+w   Y  tg d¢ƒD ]:\}}|j||d�dksEJ ‚t ||¡ t ddgddggd|gd�}d|d›�}|j||d�dksjJ ‚t ||¡ q6d S )NrF   rG   rH   rI   rm  rÃ  rÝ   z$Empty table or column name specifiedr�  ro  rX  )
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"Ú99beginswithnumberÚ12345r²  Útest_weird_col_namerù  )r   r
  r‘  r’  r_  Ú	enumerater   Útable_exists)rW  r[   rÑ   rz  ÚndxÚ
weird_namer®  Úc_tblr*   r*   r+   Útest_sqlite_illegal_namesû  s    ÿÿìrT  c                 G  sŽ   t djtdjtjdjtdjtdjtdjtd ƒdd„ tj	djt
dji	}g }|D ]}t|tƒr3t|ƒr3d }|t|ƒ }| ||ƒ¡ q&| t|ƒ S )Nz'{}'z{:.8f}z{:d}c                 S  s   dS )NÚNULLr*   )r  r*   r*   r+   rc  #  s    zformat_query.<locals>.<lambda>z{:.10f}z'{!s}')r   rK  r‚   r¶   Ústr_ÚbytesrK   rQ  r´   r¦  rH  r|   r   rñ   r;  )r   rü  Ú_formattersÚprocessed_argsÚargÚ	formatterr*   r*   r+   Úformat_query  s"   ÷r\  c                 C  sL   t  |¡�}| | ¡ ¡ }W d  ƒ n1 sw   Y  |du r"dS t|ƒS )z#Replace removed sql.tquery functionN)r   r!   rR   rí   rñ  )rª  rt   r@  r¯  r*   r*   r+   Útquery2  s   ÿr]  c                 C  sþ   t tj d¡ d¡ttdƒƒtdddd�d�}tj	|d	| d
d�dks$J ‚t 
d| ¡}|j|_|}t ||¡ dgt|ƒ |d< | ¡ }tt t|ƒ¡tjd�d }| ¡ |d< tj	|d| d
d�dksdJ ‚tj
d| dd�}| ¡ }||_d|j_t ||¡ d S )NrG   ©r’  rI   ÚABCDú
2000-01-01r’  rÕ   rB  r{  r·  FrÄ  zselect * from test_tablerm  Útxtrj  ÚIdxÚtest_table2zselect * from test_table2r|  )r   r¶   rŸ  r   r¡  r   rñ  r   r   r_  r—  r®   r¸   rÅ  r‡  r­  r.  rÎ   r¥   )rW  r©   râ  rà  Úframe2Únew_idxr*   r*   r+   Útest_xsqlite_basic9  s(   
ýrf  c           	      C  s¼   t tj d¡ d¡ttdƒƒtdddd�d�}tj|j	d	< t
 |d
¡}|  ¡ }| |¡ d}| ¡ D ]\}}t|g|¢R Ž }t|| d� q2|  ¡  t
jd| d�}|j|_tj||dd� d S )NrG   r^  r_  r`  r’  rÕ   rB  r{  r&  r[  z(INSERT INTO test VALUES (%s, %s, %s, %s)r4  r%  gü©ñÒMbP?)Úrtol)r   r¶   rŸ  r   r¡  r   rñ  r   rµ  r³   r   rŒ  rQ   rR   Úiterrowsr\  r]  rY   r—  r®   r¸   rÅ  )	rW  r©   rò  r]   Úinsrb  rN   Úfmt_sqlrâ  r*   r*   r+   Útest_xsqlite_write_row_by_rowT  s"   
ý
rk  c                 C  sÐ   t tj d¡ d¡ttdƒƒtdddd�d�}t 	|d	¡}|  
¡ }| |¡ d
}|jd }t | ¡�}| |t|ƒ¡ W d   ƒ n1 sEw   Y  |  ¡  t d| ¡}|jd d… |_t ||d d… ¡ d S )NrG   r^  r_  r`  r’  rÕ   rB  r{  r[  z$INSERT INTO test VALUES (?, ?, ?, ?)r   r%  rF   )r   r¶   rŸ  r   r¡  r   rñ  r   r   rŒ  rQ   rR   r³   r!   r;  rY   r—  r®   r¸   rÅ  )rW  r©   rò  r]   ri  rN   r@  râ  r*   r*   r+   Útest_xsqlite_executek  s"   
ý

ÿrl  c                 C  s¼   t tj d¡ d¡ttdƒƒtdddd�d�}t 	|d	¡}| 
¡ }|D ]}| d
¡}t|ƒdkr>|d dkr>|d dks>J ‚q#tj	|d	ddgd�}| 
¡ }d|v sSJ ‚|  ¡ }| |¡ d S )NrG   r^  r_  r`  r’  rÕ   rB  r{  r[  ú r   rÔ   rF   ÚDATETIMEr¯  zPRIMARY KEY ("A", "B"))r   r¶   rŸ  r   r¡  r   rñ  r   r   rŒ  Ú
splitlinesr  r‡  rQ   rR   )rW  r©   rò  ÚlinesÚlineÚtokensr]   r*   r*   r+   Útest_xsqlite_schema€  s"   
ý
€rs  c              	   C  s¤   d}|   ¡ }| |¡ t | ¡�8}| d¡ | d¡ tjtjdd�� | d¡ W d   ƒ n1 s3w   Y  W d   ƒ d S W d   ƒ d S 1 sKw   Y  d S )Núc
    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))rQ   rR   r   r!   r
  r‘  r  )rW  rò  r]   r@  r*   r*   r+   Útest_xsqlite_execute_fail”  s   	


ÿü"ürv  c               	   C  sÀ   d} t  t d¡¡�+}| ¡ }| | ¡ t |¡�}| d¡ W d   ƒ n1 s)w   Y  W d   ƒ n1 s8w   Y  d}tj	tj
|d�� td|d� W d   ƒ d S 1 sYw   Y  d S )Nrt  rS  ru  z$Cannot operate on a closed database.r�  r%  r4  )rT  r   r}   rœ   rQ   rR   r   r!   r
  r‘  r5  r]  )rò  r[   r]   r@  rz  r*   r*   r+   Ú&test_xsqlite_execute_closed_connection©  s   	
ÿ€ü"ÿrw  c                 C  s0   t dt d¡iƒ}tj|| ddd�dksJ ‚d S )NÚFromr°   ÚtestkeywordsF©rt   r¥   r®   )r   r¶   Úonesr   r_  )rW  rÑ   r*   r*   r+   Ú$test_xsqlite_keyword_as_column_names¿  s   r|  c                 C  sp   t ddgdgd�}tj|| ddd�dksJ ‚| }tdd	„ | d
¡D ƒƒ}|dks*J ‚t d
|¡}t ||¡ d S )NrF   rG   Úc0rÝ   Úmono_dfFrz  c                 s  s   � | ]}|d  V  qdS )r   Nr*   )rM   Úmy_c0r*   r*   r+   Ú	<genexpr>Ì  s   € z4test_xsqlite_onecolumn_of_integer.<locals>.<genexpr>zselect * from mono_dfrH   )r   r   r_  ÚsumrR   r—  r¸   rÅ  )rW  r~  Úcon_xÚthe_sumrâ  r*   r*   r+   Ú!test_xsqlite_onecolumn_of_integerÄ  s   r„  c                 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|| |dd� W d   ƒ n1 s:w   Y  t|| ƒ tj|| |dd� d}tjt|d�� tj|| |dd� W d   ƒ n1 sjw   Y  tj|| |ddd� t|| d�ddgks…J ‚tj|| |ddd�dks“J ‚t|| d�g d¢ksŸJ ‚t|| ƒ tj|| |ddd�dks²J ‚t|| d�ddgks¾J ‚tj|| |ddd�dksÌJ ‚t|| d�g d¢ksØJ ‚t|| ƒ d S )NrF   rG   rÔ   rÕ   r  ró  )rÖ   r×   ÚEÚtable_if_existszSELECT * FROM z*'notvalidvalue' is not valid for if_existsr�  Únotvalidvalue)r©   rt   r¥   r]  rŠ  z&Table 'table_if_exists' already existsrs  F)r©   rt   r¥   r]  r®   r4  rT  rs  rH   )©rH   rÖ   ©rI   r×   ©r°   r…  rñ   )rT  rs  rˆ  r‰  rŠ  )r   r
  r‘  r’  r   r_  r   r]  )rW  Údf_if_exists_1Údf_if_exists_2r¾   Ú
sql_selectrz  r*   r*   r+   Útest_xsqlite_if_existsÔ  s„   
üÿ
ÿüÿûûù	
ûù	ûù	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  (,  Ú
__future__r   rT  r   rT   r   r   r   r   rÆ   r   Úpathlibr
   r}   Útypingr   r  rñ  r¶   r
  Úpandas._configr   Úpandas._libsr   Úpandas.compatr   r   Úpandas.compat._optionalr   Úpandas.util._test_decoratorsÚutilÚ_test_decoratorsÚtdÚpandasrt  r   r   r   r   r   r   r   r   r   r   Úpandas._testingÚ_testingr¸   Úpandas.util.versionr   Ú	pandas.ior   Úpandas.io.sqlr   r   r   r    r!   r"   r#   r:   rf  ÚfilterwarningsÚ
single_cpuÚ
pytestmarkÚfixturer,   r>   r`   ra   ru   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/  r8  r@  rA  rB  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rO  rP  rR  rW  rX  rY  Úparamr  Úmysql_connectableÚmysql_connectable_irisÚmysql_connectable_typesÚpostgresql_connectableÚpostgresql_connectable_irisÚpostgresql_connectable_typesÚsqlite_connectableÚsqlite_connectable_irisÚsqlite_connectable_typesÚsqlalchemy_connectableÚsqlalchemy_connectable_irisÚsqlalchemy_connectable_typesÚadbc_connectableÚadbc_connectable_irisÚadbc_connectable_typesÚall_connectableÚall_connectable_irisÚall_connectable_typesÚparametrizera  ri  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+  r2  r=  r>  rB  rK  r—  rR  rU  r^  r`  rj  rs  r€  rQ  rK   r†  rˆ  rŽ  r�  r•  r™  r§  r°  r³  r¶  rº  r½  r¾  rÁ  rÄ  rÈ  rÑ  r<   r¥   rá  rä  ræ  Úskip_if_installedré  rî  rò  rõ  r÷  rø  r  r  r  r  r  r   r!  r"  r#  r&  r(  r*  r,  r.  r0  r1  r2  r=  r@  rJ  rN  rP  rU  rX  rh  rn  rq  rr  rt  r  r‚  r†  r‡  r›  r¤  r±  r¹  Úinfr¿  rÕ  rØ  rÚ  rß  rá  râ  rã  rï  rð  rò  rì  rí  r
  Ú
no_defaultr  r  r  r  r  r!  r'  r*  r+  r1  r5  r7  r8  r>  rF  rI  rK  rT  r\  r]  rf  rk  rl  rs  rv  rw  r|  r„  rŽ  r*   r*   r*   r+   Ú<module>   sÎ   0$
ÿü
"-




#



















	










þþþþþþ
ÿ
ÿþþþÿÿ


!
	





	



$%
9

4
#


















7

ý
øþ(

.
þ
I
üþ	

0 "ñþ




'))$3#0þ%*.,
'		J#	 