§
    šŠtj`e  ã                  ó"  — d Z ddl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 ddlZddlmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZ dd	lmZmZ dd
lm Z  ddl!m"Z" ddl#m$Z$ d d„Z% e%¦   «          d!d„Z&ddœd"d„Z'd#d„Z( G d„ d¦  «        Z)dS )$ú%SQLAlchemy wrapper around a database.é    )ÚannotationsN)ÚAnyÚDictÚIterableÚListÚLiteralÚOptionalÚSequenceÚUnion)Ú
deprecated)Úget_from_env)ÚMetaDataÚTableÚcreate_engineÚinspectÚselectÚtext)ÚURLÚEngineÚResult)ÚProgrammingErrorÚSQLAlchemyError)ÚCreateTable)Ú
Executable)ÚNullTypeÚreturnÚNonec                 óä   — 	 ddl } t          | d¦  «        rEt          | j        d¦  «        r2| j        j        }t          |d¦  «        r|j        €d	d„}||_        dS dS dS dS # t
          $ r Y dS w xY w)
z?Patch DuckDBPyType to be hashable for SQLAlchemy compatibility.r   NÚtypingÚDuckDBPyTypeÚ__hash__r   Úintc                ó:   — t          t          | ¦  «        ¦  «        S ©N)ÚhashÚstr©Úselfs    úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/utilities/sql_database.pyr"   z%_patch_duckdb_types.<locals>.__hash__&   s   € Ý¥ D¡	¤	™?œ?Ð*ó    )r   r#   )ÚduckdbÚhasattrr    r!   r"   ÚImportError)r,   Úduckdb_typer"   s      r*   Ú_patch_duckdb_typesr0      s½   € ðØˆˆˆõ �6˜8Ñ$Ô$ð 	0­°´ÀÑ)OÔ)Oð 	0Ø œ-Ô4ˆKÝ˜;¨
Ñ3Ô3ð 0°{Ô7KÐ7Sð+ð +ð +ð +ð (0�Ô$Ð$Ð$ð	0ð 	0ð 	0ð 	0à7SÐ7Søõ ð ð ð àˆˆðøøøs   ‚AA! Á!
A/Á.A/Úindexú+sqlalchemy.engine.interfaces.ReflectedIndexr'   c           	     óV   — d| d         › d| d         › dt          | d         ¦  «        › �S )NzName: Únamez
, Unique: Úuniquez, Columns: Úcolumn_names©r'   )r1   s    r*   Ú_format_indexr8   3   sF   € ð	2��v”ð 	2ð 	2¨%°¬/ð 	2ð 	2Ý˜˜~Ô.Ñ/Ô/ð	2ð 	2ðr+   z...)ÚsuffixÚcontentr   Úlengthr#   r9   c               óÔ   — t          | t          ¦  «        r|dk    r| S t          | ¦  «        |k    r| S | d|t          |¦  «        z
  …                              dd¦  «        d         |z   S )z]
    Truncate a string to a certain number of words, based on the max string
    length.
    r   Nú é   )Ú
isinstancer'   ÚlenÚrsplit)r:   r;   r9   s      r*   Útruncate_wordrB   :   so   € õ �g�sÑ#Ô#ð  v°¢{ {Øˆå
ˆ7�|„|�vÒÐØˆàÐ)�V�c &™kœkÑ)Ð)Ô*×1Ò1°#°qÑ9Ô9¸!Ô<¸vÑEÐEr+   Úschemac                óV   — t          j        d| ¦  «        st          d| › d�¦  «        ‚| S )zHSanitize a schema name to only contain letters, digits, and underscores.z^[a-zA-Z0-9_]+$zSchema name 'z_' contains invalid characters. Schema names must contain only letters, digits, and underscores.)ÚreÚmatchÚ
ValueError©rC   s    r*   Úsanitize_schemarI   I   sJ   € åŒ8Ð&¨Ñ/Ô/ð 
ÝðO˜Fð Oð Oð Oñ
ô 
ð 	
ð €Mr+   c                  ó’  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dXdYd„Ze	 dZd[d„¦   «         Ze ed d!d"¬#¦  «        	 	 	 	 	 d\d]d*„¦   «         ¦   «         Ze	 	 	 	 	 d^d_d5„¦   «         Z	e
d`d6„¦   «         Zdad8„Z ed9d:d"¬;¦  «        dad<„¦   «         Ze
d`d=„¦   «         Z	 dbdcd@„ZdddC„ZdddD„Z	 dedddFœdfdO„Z	 	 dgdddFœdhdR„ZdZdidS„Z	 	 dgdddFœdjdU„ZdkdW„ZdS )lÚSQLDatabaser   Né   Fé,  Úenginer   rC   úOptional[str]ÚmetadataúOptional[MetaData]Úignore_tablesúOptional[List[str]]Úinclude_tablesÚsample_rows_in_table_infor#   Úindexes_in_table_infoÚboolÚcustom_table_infoúOptional[dict]Úview_supportÚmax_string_lengthÚlazy_table_reflectionc                óH  ‡ ‡— |‰ _         |‰ _        |r|rt          d¦  «        ‚t          ‰ j         ¦  «        ‰ _        t          t          ‰ j                             |¬¦  «        ¦  «        |	r‰ j                             |¬¦  «        ng z   |	r‰ j         	                    |¬¦  «        ng z   ¦  «        ‰ _
        |rt          |¦  «        nt          ¦   «         ‰ _        ‰ j        r$‰ j        ‰ j
        z
  }|rt          d|› d�¦  «        ‚|rt          |¦  «        nt          ¦   «         ‰ _        ‰ j        r$‰ j        ‰ j
        z
  }|rt          d|› d�¦  «        ‚‰                      ¦   «         }|rt          |¦  «        n‰ j
        ‰ _        t          |t           ¦  «        st#          d¦  «        ‚|‰ _        |‰ _        |‰ _        ‰ j        r{t          ‰ j        t*          ¦  «        st#          d¦  «        ‚t          ‰ j        ¦  «                             ‰ j
        ¦  «        Št+          ˆˆ fd„‰ j        D ¦   «         ¦  «        ‰ _        |
‰ _        |	‰ _        |pt3          ¦   «         ‰ _        |s<‰ j                             |	‰ j         t          ‰ j        ¦  «        ‰ j        ¬	¦  «         d
S d
S )z Create engine from database URI.z4Cannot specify both include_tables and ignore_tablesrH   zinclude_tables ú not found in databasezignore_tables z,sample_rows_in_table_info must be an integerz]table_info must be a dictionary with table names as keys and the desired table info as valuesc              3  ó>   •K  — | ]}|‰v ¯|‰j         |         fV — Œd S r%   )Ú_custom_table_info)Ú.0ÚtableÚintersectionr)   s     €€r*   ú	<genexpr>z'SQLDatabase.__init__.<locals>.<genexpr>˜   sG   øè è € ð +ð +àØ˜LÐ(Ð(ð ˜Ô/°Ô6Ð7à(Ð(Ð(Ð(ð+ð +r+   ©ÚviewsÚbindÚonlyrC   N)Ú_engineÚ_schemarG   r   Ú
_inspectorÚsetÚlistÚget_table_namesÚget_view_namesÚget_materialized_view_namesÚ_all_tablesÚ_include_tablesÚ_ignore_tablesÚget_usable_table_namesÚ_usable_tablesr?   r#   Ú	TypeErrorÚ_sample_rows_in_table_infoÚ_indexes_in_table_infor`   Údictrc   Ú_max_string_lengthÚ_view_supportr   Ú	_metadataÚreflect)r)   rN   rC   rP   rR   rT   rU   rV   rX   rZ   r[   r\   Úmissing_tablesÚusable_tablesrc   s   `             @r*   Ú__init__zSQLDatabase.__init__V   s  øø€ ð ˆŒØˆŒØð 	U˜mð 	UÝÐSÑTÔTÐTå! $¤,Ñ/Ô/ˆŒõ Ý�”×0Ò0¸Ð0Ñ?Ô?Ñ@Ô@Ø@LÐTˆtŒ×-Ò-°VÐ-Ñ<Ô<Ð<ÐRTñVð  ð�”×;Ò;À6Ð;ÑJÔJÐJàññ
ô 
ˆÔð 7EÐO�s >Ñ2Ô2Ð2Í#É%Ì%ˆÔØÔð 	Ø!Ô1°DÔ4DÑDˆNØð Ý ØL nÐLÐLÐLñô ð ð 5BÐL�c -Ñ0Ô0Ð0ÅsÁuÄuˆÔØÔð 	Ø!Ô0°4Ô3CÑCˆNØð Ý ØK ^ÐKÐKÐKñô ð ð ×3Ò3Ñ5Ô5ˆØ4AÐW�c -Ñ0Ô0Ð0ÀtÔGWˆÔåÐ3µSÑ9Ô9ð 	LÝÐJÑKÔKÐKà*CˆÔ'Ø&;ˆÔ#à"3ˆÔØÔ"ð 	Ý˜dÔ5µtÑ<Ô<ð Ýð3ñô ð õ
 ˜tÔ6Ñ7Ô7×DÒDÀTÔEUÑVÔVˆLÝ&*ð +ð +ð +ð +ð +à!Ô4ð+ñ +ô +ñ 'ô 'ˆDÔ#ð #4ˆÔØ)ˆÔà!Ð/¥X¡Z¤ZˆŒØ$ð 	àŒN×"Ò"Ø"Ø”\Ý˜$Ô-Ñ.Ô.Ø”|ð	 #ñ ô ð ð ð ð	ð 	r+   Údatabase_uriúUnion[str, URL]Úengine_argsÚkwargsr   r   c                ó2   — |pi } | t          |fi |¤Žfi |¤ŽS )z'Construct a SQLAlchemy engine from URI.)r   )Úclsr�   rƒ   r„   Ú_engine_argss        r*   Úfrom_urizSQLDatabase.from_uri«   s6   € ð #Ð( bˆØˆs•= Ð>Ð>°Ð>Ð>ÐIÐIÀ&ÐIÐIÐIr+   z0.3.18z¯For performing structured retrieval using Databricks SQL, see the latest best practices and recommended APIs at https://docs.unitycatalog.io/ai/integrations/langchain/ insteadz1.0)ÚmessageÚremovalÚcatalogr'   ÚhostÚ	api_tokenÚwarehouse_idÚ
cluster_idc           
     óÒ  — 	 ddl m}	 n# t          $ r t          d¦  «        ‚w xY wd}
	 ddlm}  |¦   «         }
|
j        }n# t          t          f$ r d}Y nw xY w|€t          dd|¦  «        }|
r|
j        nd}|€t          dd	|¦  «        }|€|€|
r|
j	        }nt          d
¦  «        ‚|r|rt          d¦  «        ‚|rd|› �}nd|› �}d|› d|› d|› d|› d|› �
} | j        d||dœ|¤ŽS )a¯	  
        Class method to create an SQLDatabase instance from a Databricks connection.
        This method requires the 'databricks-sql-connector' package. If not installed,
        it can be added using `pip install databricks-sql-connector`.

        Args:
            catalog (str): The catalog name in the Databricks database.
            schema (str): The schema name in the catalog.
            host (Optional[str]): The Databricks workspace hostname, excluding
                'https://' part. If not provided, it attempts to fetch from the
                environment variable 'DATABRICKS_HOST'. If still unavailable and if
                running in a Databricks notebook, it defaults to the current workspace
                hostname. Defaults to None.
            api_token (Optional[str]): The Databricks personal access token for
                accessing the Databricks SQL warehouse or the cluster. If not provided,
                it attempts to fetch from 'DATABRICKS_TOKEN'. If still unavailable
                and running in a Databricks notebook, a temporary token for the current
                user is generated. Defaults to None.
            warehouse_id (Optional[str]): The warehouse ID in the Databricks SQL. If
                provided, the method configures the connection to use this warehouse.
                Cannot be used with 'cluster_id'. Defaults to None.
            cluster_id (Optional[str]): The cluster ID in the Databricks Runtime. If
                provided, the method configures the connection to use this cluster.
                Cannot be used with 'warehouse_id'. If running in a Databricks notebook
                and both 'warehouse_id' and 'cluster_id' are None, it uses the ID of the
                cluster the notebook is attached to. Defaults to None.
            engine_args (Optional[dict]): The arguments to be used when connecting
                Databricks. Defaults to None.
            **kwargs (Any): Additional keyword arguments for the `from_uri` method.

        Returns:
            SQLDatabase: An instance of SQLDatabase configured with the provided
                Databricks connection details.

        Raises:
            ValueError: If 'databricks-sql-connector' is not found, or if both
                'warehouse_id' and 'cluster_id' are provided, or if neither
                'warehouse_id' nor 'cluster_id' are provided and it's not executing
                inside a Databricks notebook.
        r   )Úsqlzfdatabricks-sql-connector package not found, please install with `pip install databricks-sql-connector`N)Úget_contextrŒ   ÚDATABRICKS_HOSTr�   ÚDATABRICKS_TOKENz6Need to provide either 'warehouse_id' or 'cluster_id'.z/Can't have both 'warehouse_id' or 'cluster_id'.z/sql/1.0/warehouses/z/sql/protocolv1/o/0/zdatabricks://token:ú@z?http_path=z	&catalog=z&schema=)r�   rƒ   © )Ú
databricksr‘   r.   Ú!dbruntime.databricks_repl_contextr’   ÚbrowserHostNameÚAttributeErrorr   ÚapiTokenÚ	clusterIdrG   rˆ   )r†   r‹   rC   rŒ   r�   rŽ   r�   rƒ   r„   r‘   Úcontextr’   Údefault_hostÚdefault_api_tokenÚ	http_pathÚuris                   r*   Úfrom_databrickszSQLDatabase.from_databricks¶   sÝ  € ðx	Ø&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	Ýð:ñô ð ð	øøøð
 ˆð	 ØEÐEÐEÐEÐEÐEà!�k‘m”mˆGØ"Ô2ˆLˆLøÝ�^Ð,ð 	 ð 	 ð 	 ØˆLˆLˆLð	 øøøð ˆ<Ý Ð(9¸<ÑHÔHˆDà07ÐA˜GÔ,Ð,¸TÐØÐÝ$ [Ð2DÐFWÑXÔXˆIàÐ JÐ$6Øð Ø$Ô.�
�
å ØLñô ð ð ð 	P˜Jð 	PÝÐNÑOÔOÐOàð 	<Ø=¨|Ð=Ð=ˆIˆIà;¨zÐ;Ð;ˆIðG )ð Gð G¨dð Gð GØ"ðGð GØ-4ðGð GØ>DðGð Gð 	ð ˆsŒ|ÐP¨¸+ÐPÐPÈÐPÐPÐPs   ‚	 ‰#©A ÁAÁAú127.0.0.1:8902ÚrootÚ ÚcnosdbÚpublicÚurlÚuserÚpasswordÚtenantÚdatabasec                ó”   — 	 ddl m}  ||||||¦  «        }|                      |¬¦  «        S # t          $ r t          d¦  «        ‚w xY w)a  
        Class method to create an SQLDatabase instance from a CnosDB connection.
        This method requires the 'cnos-connector' package. If not installed, it
        can be added using `pip install cnos-connector`.

        Args:
            url (str): The HTTP connection host name and port number of the CnosDB
                service, excluding "http://" or "https://", with a default value
                of "127.0.0.1:8902".
            user (str): The username used to connect to the CnosDB service, with a
                default value of "root".
            password (str): The password of the user connecting to the CnosDB service,
                with a default value of "".
            tenant (str): The name of the tenant used to connect to the CnosDB service,
                with a default value of "cnosdb".
            database (str): The name of the database in the CnosDB tenant.

        Returns:
            SQLDatabase: An instance of SQLDatabase configured with the provided
            CnosDB connection details.
        r   )Úmake_cnosdb_langchain_uri)r�   zRcnos-connector package not found, please install with `pip install cnos-connector`)Úcnosdb_connectorr®   rˆ   r.   )r†   r¨   r©   rª   r«   r¬   r®   r¡   s           r*   Úfrom_cnosdbzSQLDatabase.from_cnosdb  sw   € ð<		ØBÐBÐBÐBÐBÐBà+Ð+¨C°°xÀÈÑRÔRˆCØ—<’<¨S�<Ñ1Ô1Ð1øÝð 	ð 	ð 	Ýð0ñô ð ð	øøøs	   ‚*- ­Ac                ó$   — | j         j        j        S )z/Return string representation of dialect to use.)ri   Údialectr4   r(   s    r*   r²   zSQLDatabase.dialectH  s   € ð Œ|Ô#Ô(Ð(r+   úIterable[str]c                óp   — | j         rt          | j         ¦  «        S t          | j        | j        z
  ¦  «        S ©zGet names of tables available.)rr   Úsortedrq   rs   r(   s    r*   rt   z"SQLDatabase.get_usable_table_namesM  s7   € àÔð 	0Ý˜$Ô.Ñ/Ô/Ð/Ý�dÔ&¨Ô)<Ñ<Ñ=Ô=Ð=r+   z0.0.1rt   )ÚalternativerŠ   c                ó*   — |                       ¦   «         S rµ   )rt   r(   s    r*   rn   zSQLDatabase.get_table_namesS  s   € ð ×*Ò*Ñ,Ô,Ð,r+   c                ó*   — |                       ¦   «         S )z-Information about all tables in the database.)Úget_table_infor(   s    r*   Ú
table_infozSQLDatabase.table_infoX  s   € ð ×"Ò"Ñ$Ô$Ð$r+   Útable_namesÚget_col_commentsc                ó@  ‡ ‡— ‰                       ¦   «         Š|�9t          |¦  «                             ‰¦  «        }|rt          d|› d�¦  «        ‚|Šd„ ‰ j        j        D ¦   «         }t          ‰¦  «        t          |¦  «        z
  }|r:‰ j                             ‰ j        ‰ j        t          |¦  «        ‰ j
        ¬¦  «         ˆˆ fd„‰ j        j        D ¦   «         }g }|D �]}‰ j        r4|j        ‰ j        v r&|                     ‰ j        |j                 ¦  «         Œ>	 |j                             ¦   «         D ]:\  }	}
t!          |
j        ¦  «        t"          u r|j                             |
¦  «         Œ;nq# t(          $ rd t+          |j        ¦  «                             ¦   «         D ]:\  }	}
t!          |
j        ¦  «        t"          u r|j                             |
¦  «         Œ;Y nw xY wt-          t/          |¦  «                             ‰ j        ¦  «        ¦  «        }|                     ¦   «         › }|rL	 i }|j        D ]}|j        r|j        ||j        <   Œ|r	|d|› d�z  }n# t6          $ r t          d	¦  «        ‚w xY w‰ j        p‰ j        }|r|d
z  }‰ j        r|d‰                      |¦  «        › d�z  }‰ j        r|d‰                      |¦  «        › d�z  }|r|dz  }|                     |¦  «         �Œ|                      ¦   «          d !                    |¦  «        }|S )áf  Get information about specified tables.

        Follows best practices as specified in: Rajkumar et al, 2022
        (https://arxiv.org/abs/2204.00498)

        If `sample_rows_in_table_info`, the specified number of sample rows will be
        appended to each table description. This can increase performance as
        demonstrated in the paper.
        Nztable_names r^   c                ó   — g | ]	}|j         ‘Œ
S r–   ©r4   )ra   Útbls     r*   ú
<listcomp>z.SQLDatabase.get_table_info.<locals>.<listcomp>p  s   € ÐQÐQÐQ¨S ¤ÐQÐQÐQr+   re   c                óŠ   •— g | ]?}|j         t          ‰¦  «        v r'‰j        d k    r|j                              d¦  «        °=|‘Œ@S )ÚsqliteÚsqlite_)r4   rl   r²   Ú
startswith)ra   rÂ   Úall_table_namesr)   s     €€r*   rÃ   z.SQLDatabase.get_table_info.<locals>.<listcomp>z  s\   ø€ ð 
ð 
ð 
àØŒx�3˜Ñ/Ô/Ð/Ð/Ø”\ XÒ-Ð-°#´(×2EÒ2EÀiÑ2PÔ2PÐ-ð ð .Ð-Ð-r+   z

/*
Column Comments: z
*/z:Column comments are available on PostgreSQL, MySQL, Oraclez

/*ú
z*/z

)"rt   rl   Ú
differencerG   r|   Úsorted_tablesr}   r{   ri   rm   rj   r`   r4   ÚappendÚcolumnsÚitemsÚtyper   Ú_columnsÚremoverš   ry   r'   r   ÚcompileÚrstripÚcommentÚ	Exceptionrx   rw   Ú_get_table_indexesÚ_get_sample_rowsÚsortÚjoin)r)   r¼   r½   r~   Úmetadata_table_namesÚ
to_reflectÚmeta_tablesÚtablesrb   ÚkÚvÚcreate_tabler»   Úcolumn_comments_dictÚcolumnÚhas_extra_infoÚ	final_strrÈ   s   `                @r*   rº   zSQLDatabase.get_table_info]  sÌ  øø€ ð ×5Ò5Ñ7Ô7ˆØÐ"Ý  Ñ-Ô-×8Ò8¸ÑIÔIˆNØð XÝ Ð!V°Ð!VÐ!VÐ!VÑWÔWÐWØ)ˆOàQÐQ°D´NÔ4PÐQÑQÔQÐÝ˜Ñ)Ô)­CÐ0DÑ,EÔ,EÑEˆ
Øð 	ØŒN×"Ò"ØÔ(Ø”\Ý˜*Ñ%Ô%Ø”|ð	 #ñ ô ð ð
ð 
ð 
ð 
ð 
à”~Ô3ð
ñ 
ô 
ˆð ˆØ ð 1	&ñ 1	&ˆEØÔ&ð ¨5¬:¸Ô9PÐ+PÐ+PØ—’˜dÔ5°e´jÔAÑBÔBÐBØð	1à!œM×/Ò/Ñ1Ô1ð 1ð 1‘D�A�qÝ˜AœF‘|”|¥xÐ/Ð/Øœ×-Ò-¨aÑ0Ô0Ð0øð1øõ "ð 1ð 1ð 1å  ¤Ñ/Ô/×5Ò5Ñ7Ô7ð 1ð 1‘D�A�qÝ˜AœF‘|”|¥xÐ/Ð/Øœ×-Ò-¨aÑ0Ô0Ð0øð1ð 1ð1øøøõ �{¨5Ñ1Ô1×9Ò9¸$¼,ÑGÔGÑHÔHˆLØ(×/Ò/Ñ1Ô1Ð3ˆJð  ð ðØ+-Ð(Ø"'¤-ð Oð O˜Ø!œ>ð OØ@FÄÐ0°´Ñ=øà+ð Ø"ØRÐ8LÐRÐRÐRñ˜
øøõ !ð ð ð Ý$ØTñô ð ðøøøð Ô+ÐN¨tÔ/Nð ð ð 'Ø˜hÑ&�
ØÔ*ð FØÐE 4×#:Ò#:¸5Ñ#AÔ#AÐEÐEÐEÑE�
ØÔ.ð DØÐC 4×#8Ò#8¸Ñ#?Ô#?ÐCÐCÐCÑC�
Øð #Ø˜dÑ"�
Ø�MŠM˜*Ñ%Ô%Ð%Ñ%Ø�Š‰ŒˆØ—K’K Ñ'Ô'ˆ	ØÐs    ÄAE4Å4A+G"Ç!G"È1-IÉI9rb   r   c                óš   — | j                              |j        ¦  «        }d                     t	          t
          |¦  «        ¦  «        }d|› �S )NrÉ   zTable Indexes:
)rk   Úget_indexesr4   rÙ   Úmapr8   )r)   rb   ÚindexesÚindexes_formatteds       r*   rÖ   zSQLDatabase._get_table_indexes¸  sD   € Ø”/×-Ò-¨e¬jÑ9Ô9ˆØ ŸIšI¥c­-¸Ñ&AÔ&AÑBÔBÐØ5Ð"3Ð5Ð5Ð5r+   c                óô  — t          |¦  «                             | j        ¦  «        }d                     d„ |j        D ¦   «         ¦  «        }	 | j                             ¦   «         5 }|                     |¦  «        }t          t          d„ |¦  «        ¦  «        }d d d ¦  «         n# 1 swxY w Y   d                     d„ |D ¦   «         ¦  «        }n# t          $ r d}Y nw xY w| j        › d|j        › d|› d|› �S )	Nú	c                ó   — g | ]	}|j         ‘Œ
S r–   rÁ   )ra   Úcols     r*   rÃ   z0SQLDatabase._get_sample_rows.<locals>.<listcomp>Â  s   € Ð CÐ CÐ C¨c ¤Ð CÐ CÐ Cr+   c                ó   — d„ | D ¦   «         S )Nc                ó<   — g | ]}t          |¦  «        d d…         ‘ŒS )Néd   r7   )ra   Úis     r*   rÃ   zBSQLDatabase._get_sample_rows.<locals>.<lambda>.<locals>.<listcomp>Ê  s&   € Ð#=Ð#=Ð#=°Q¥C¨¡F¤F¨4¨C¨4¤LÐ#=Ð#=Ð#=r+   r–   )Úlss    r*   ú<lambda>z.SQLDatabase._get_sample_rows.<locals>.<lambda>Ê  s   € Ð#=Ð#=¸"Ð#=Ñ#=Ô#=€ r+   rÉ   c                ó8   — g | ]}d                       |¦  «        ‘ŒS )rë   )rÙ   ©ra   Úrows     r*   rÃ   z0SQLDatabase._get_sample_rows.<locals>.<listcomp>Î  s"   € Ð(OÐ(OÐ(O¸C¨¯ª°3©¬Ð(OÐ(OÐ(Or+   r¥   z rows from z table:
)r   Úlimitrw   rÙ   rÍ   ri   ÚconnectÚexecuterm   rç   r   r4   )r)   rb   ÚcommandÚcolumns_strÚ
connectionÚsample_rows_resultÚsample_rowsÚsample_rows_strs           r*   r×   zSQLDatabase._get_sample_rows½  sk  € å˜‘-”-×%Ò% dÔ&EÑFÔFˆð —i’iÐ CÐ C°U´]Ð CÑ CÔ CÑDÔDˆð	!à”×%Ò%Ñ'Ô'ð ¨:Ø%/×%7Ò%7¸Ñ%@Ô%@Ð"å"ÝÐ=Ð=Ð?QÑRÔRñô �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð #ŸišiÐ(OÐ(OÀ;Ð(OÑ(OÔ(OÑPÔPˆOˆOøõ  ð 	!ð 	!ð 	!Ø ˆOˆOˆOð	!øøøð Ô.ð !ð !¸5¼:ð !ð !Øð!ð !àð!ð !ð	
s6   ÁC Á&4B&ÂC Â&B*Â*C Â-B*Â."C ÃC ÃC Úall©Ú
parametersÚexecution_optionsrú   úUnion[str, Executable]ÚfetchúLiteral['all', 'one', 'cursor']r  úOptional[Dict[str, Any]]r  ú'Union[Sequence[Dict[str, Any]], Result]c               ó.  — |pi }|pi }| j                              ¦   «         5 }| j        ��O| j        dk    r |                     d| j        f|¬¦  «         �n$| j        dk    r|                     d| j        f|¬¦  «         nú| j        dk    rnî| j        dk    r |                     d	| j        › �|¬¦  «         nÃ| j        d
k    r |                     d| j        › �|¬¦  «         n˜| j        dk    r |                     d| j        › �|¬¦  «         nm| j        dk    rna| j        dk    r|                     d| j        f|¬¦  «         n7| j        dk    r,|                     dt          | j        ¦  «        › �|¬¦  «         t          |t          ¦  «        rt          |¦  «        }n5t          |t          ¦  «        rnt          dt          |¦  «        › �¦  «        ‚|                     |||¬¦  «        }|j        rŠ|dk    rd„ |                     ¦   «         D ¦   «         }nW|dk    r.|                     ¦   «         }|€g n|                     ¦   «         g}n#|dk    r|cddd¦  «         S t#          d¦  «        ‚|cddd¦  «         S 	 ddd¦  «         n# 1 swxY w Y   g S )z‡
        Executes SQL command through underlying engine.

        If the statement returns no rows, an empty list is returned.
        NÚ	snowflakez"ALTER SESSION SET search_path = %s)r  ÚbigqueryzSET @@dataset_id=?ÚmssqlÚtrinozUSE r,   zSET search_path TO Úoraclez#ALTER SESSION SET CURRENT_SCHEMA = ÚsqlanyÚ
postgresqlzSET search_path TO %sÚhanazSET SCHEMA z#Query expression has unknown type: r   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r–   )Ú_asdict)ra   Úxs     r*   rÃ   z(SQLDatabase._execute.<locals>.<listcomp>+  s    € ÐEÐEÐE¨a˜aŸiši™kœkÐEÐEÐEr+   ÚoneÚcursorz8Fetch parameter must be either 'one', 'all', or 'cursor')ri   Úbeginrj   r²   Úexec_driver_sqlrI   r?   r'   r   r   rv   rÏ   rù   Úreturns_rowsÚfetchallÚfetchoner  rG   )	r)   rú   r  r  r  rü   r  ÚresultÚfirst_results	            r*   Ú_executezSQLDatabase._executeÛ  sú  € ð  Ð% 2ˆ
Ø-Ð3°ÐØŒ\×ÒÑ!Ô!ð K	 ZØŒ|Ñ'Ø”< ;Ò.Ð.Ø×.Ò.Ø<Øœ˜Ø*;ð /ñ ô ð ñ ð
 ”\ ZÒ/Ð/Ø×.Ò.Ø,Øœ˜Ø*;ð /ñ ô ð ð ð
 ”\ WÒ,Ð,ØØ”\ WÒ,Ð,Ø×.Ò.Ø-˜tœ|Ð-Ð-Ø*;ð /ñ ô ð ð ð ”\ XÒ-Ð-ð
 ×.Ò.Ø<¨d¬lÐ<Ð<Ø*;ð /ñ ô ð ð ð ”\ XÒ-Ð-Ø×.Ò.ØL¸d¼lÐLÐLØ*;ð /ñ ô ð ð ð ”\ XÒ-Ð-ð Ø”\ \Ò1Ð1Ø×.Ò.Ø/Øœ˜Ø*;ð /ñ ô ð ð ð
 ”\ VÒ+Ð+Ø×.Ò.ØE¥o°d´lÑ&CÔ&CÐEÐEØ*;ð /ñ ô ð õ
 ˜'¥3Ñ'Ô'ð WÝ˜w™-œ-��Ý˜G¥ZÑ0Ô0ð WØåÐ UÅdÈ7ÁmÄmÐ UÐ UÑVÔVÐVØ×'Ò'ØØØ"3ð (ñ ô ˆFð Ô"ð Ø˜E’>�>ØEÐE°6·?²?Ñ3DÔ3DÐEÑEÔE�F�FØ˜e’^�^Ø#)§?¢?Ñ#4Ô#4�LØ#/Ð#7˜R˜R¸l×>RÒ>RÑ>TÔ>TÐ=U�F�FØ˜hÒ&Ð&Ø!ðMK	ð K	ð K	ð K	ñ K	ô K	ð K	ð K	õP %ØRñô ð ð ðWK	ð K	ð K	ð K	ñ K	ô K	ð K	ð K	ð~ðK	ð K	ð K	ñ K	ô K	ð K	ð K	ð K	ð K	ð K	ð K	øøøð K	ð K	ð K	ð K	ðX ˆ	s   ¢H1J
É J
Ê
JÊJÚinclude_columnsú1Union[str, Sequence[Dict[str, Any]], Result[Any]]c               ó¤   ‡ — ‰                       ||||¬¦  «        }|dk    r|S ˆ fd„|D ¦   «         }|sd„ |D ¦   «         }|sdS t          |¦  «        S )zàExecute a SQL command and return a string representing the results.

        If the statement returns rows, a string of the results is returned.
        If the statement returns no rows, an empty string is returned.
        r  r  c                óP   •— g | ]"}ˆfd „|                      ¦   «         D ¦   «         ‘Œ#S )c                óD   •— i | ]\  }}|t          |‰j        ¬ ¦  «        “ŒS ))r;   )rB   rz   )ra   râ   Úvaluer)   s      €r*   ú
<dictcomp>z.SQLDatabase.run.<locals>.<listcomp>.<dictcomp>N  s?   ø€ ð ð ð á!�F˜Eð � e°DÔ4KÐLÑLÔLðð ð r+   )rÎ   )ra   Úrr)   s     €r*   rÃ   z#SQLDatabase.run.<locals>.<listcomp>M  sT   ø€ ð 
ð 
ð 
ð
 ð	ð ð ð à%&§W¢W¡Y¤Yðñ ô ð
ð 
ð 
r+   c                óP   — g | ]#}t          |                     ¦   «         ¦  «        ‘Œ$S r–   )ÚtupleÚvaluesrõ   s     r*   rÃ   z#SQLDatabase.run.<locals>.<listcomp>V  s(   € Ð6Ð6Ð6¨3•5˜Ÿš™œÑ&Ô&Ð6Ð6Ð6r+   r¥   )r  r'   )r)   rú   r  r  r  r  r  Úress   `       r*   ÚrunzSQLDatabase.run8  s˜   ø€ ð —’Ø�U zÐEVð ñ 
ô 
ˆð �HÒÐØˆMð
ð 
ð 
ð 
ð
 ð
ñ 
ô 
ˆð ð 	7Ø6Ð6°#Ð6Ñ6Ô6ˆCàð 	Ø�2å�s‘8”8ˆOr+   c                óh   — 	 |                       |¦  «        S # t          $ r}	 d|› �cY d}~S d}~ww xY w)r¿   úError: N)rº   rG   )r)   r¼   Úes      r*   Úget_table_info_no_throwz#SQLDatabase.get_table_info_no_throw]  sX   € ð	!Ø×&Ò& {Ñ3Ô3Ð3øÝð 	!ð 	!ð 	!Ø*Ø ˜Q�=�=Ð Ð Ð Ð Ð Ð øøøøð	!øøøs   ‚ —
1¡,¦1¬1úLiteral['all', 'one']c               ór   — 	 |                       |||||¬¦  «        S # t          $ r}	 d|› �cY d}~S d}~ww xY w)a*  Execute a SQL command and return a string representing the results.

        If the statement returns rows, a string of the results is returned.
        If the statement returns no rows, an empty string is returned.

        If the statement throws an error, the error message is returned.
        )r  r  r  r-  N)r+  r   )r)   rú   r  r  r  r  r.  s          r*   Úrun_no_throwzSQLDatabase.run_no_throwm  sp   € ð 
	!Ø—8’8ØØØ%Ø"3Ø /ð ñ ô ð øõ ð 	!ð 	!ð 	!Ø*Ø ˜Q�=�=Ð Ð Ð Ð Ð Ð øøøøð	!øøøs   ‚ œ
6¦1«6±6úDict[str, Any]c                óœ   — t          |                      ¦   «         ¦  «        }|                      ¦   «         }|d                     |¦  «        dœS )z4Return db context that you may want in agent prompt.z, )r»   r¼   )rm   rt   r/  rÙ   )r)   r¼   r»   s      r*   r’   zSQLDatabase.get_context‰  sF   € å˜4×6Ò6Ñ8Ô8Ñ9Ô9ˆØ×1Ò1Ñ3Ô3ˆ
Ø(¸¿ºÀ;Ñ9OÔ9OÐPÐPÐPr+   )
NNNNrL   FNFrM   F)rN   r   rC   rO   rP   rQ   rR   rS   rT   rS   rU   r#   rV   rW   rX   rY   rZ   rW   r[   r#   r\   rW   r%   )r�   r‚   rƒ   rY   r„   r   r   rK   )NNNNN)r‹   r'   rC   r'   rŒ   rO   r�   rO   rŽ   rO   r�   rO   rƒ   rY   r„   r   r   rK   )r£   r¤   r¥   r¦   r§   )r¨   r'   r©   r'   rª   r'   r«   r'   r¬   r'   r   rK   )r   r'   )r   r³   )NF)r¼   rS   r½   rW   r   r'   )rb   r   r   r'   )r   )
rú   r  r  r  r  r  r  r  r   r  )r   F)rú   r  r  r  r  rW   r  r  r  r  r   r   )r¼   rS   r   r'   )rú   r'   r  r0  r  rW   r  r  r  r  r   r   )r   r3  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r€   Úclassmethodrˆ   r   r¢   r°   Úpropertyr²   rt   rn   r»   rº   rÖ   r×   r  r+  r/  r2  r’   r–   r+   r*   rK   rK   S   sÔ  € € € € € Ø/Ð/ð
 !%Ø'+Ø-1Ø.2Ø)*Ø&+Ø,0Ø"Ø!$Ø&+ðSð Sð Sð Sð Sðj ð '+ðJð Jð Jð Jñ „[ðJð Ø€ZØðð ðñ ô ð #Ø#'Ø&*Ø$(Ø&*ð^Qð ^Qð ^Qð ^Qñô ñ „[ð^Qð@ ð $ØØØØ ð&ð &ð &ð &ñ „[ð&ðP ð)ð )ð )ñ „Xð)ð>ð >ð >ð >ð €Z�Ð%=ÀuÐMÑMÔMð-ð -ð -ñ NÔMð-ð ð%ð %ð %ñ „Xð%ð
 QVðYð Yð Yð Yð Yðv6ð 6ð 6ð 6ð

ð 
ð 
ð 
ðB 27ð[ð
 04Ø6:ð[ð [ð [ð [ð [ð [ð@ 27Ø %ð	#ð 04Ø6:ð#ð #ð #ð #ð #ð #ðJ!ð !ð !ð !ð !ð& (-Ø %ð	!ð 04Ø6:ð!ð !ð !ð !ð !ð !ð8Qð Qð Qð Qð Qð Qr+   rK   )r   r   )r1   r2   r   r'   )r:   r   r;   r#   r9   r'   r   r'   )rC   r'   r   r'   )*r8  Ú
__future__r   rE   r    r   r   r   r   r	   r
   r   r   Ú
sqlalchemyÚlangchain_core._apir   Úlangchain_core.utilsr   r   r   r   r   r   r   Úsqlalchemy.enginer   r   r   Úsqlalchemy.excr   r   Úsqlalchemy.schemar   Úsqlalchemy.sql.expressionr   Úsqlalchemy.typesr   r0   r8   rB   rI   rK   r–   r+   r*   ú<module>rD     s  ðØ +Ð +à "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ Pà Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ø -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 2Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø )Ð )Ð )Ð )Ð )Ð )Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø %Ð %Ð %Ð %Ð %Ð %ð
ð ð ð ð( Ð Ñ Ô Ð ðð ð ð ð ?Dð Fð Fð Fð Fð Fð Fðð ð ð ðzQð zQð zQð zQð zQñ zQô zQð zQð zQð zQr+   