o
    SDi                     @   s`  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m	Z
 d dlmZmZmZmZ d dlmZ d dlm  mZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z# d dl$m%Z% d dlm&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ ddlAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZN ddlOT ddlOmPZP dd lOmQZQmRZR dd!lSmTZT dd"lmUZUmVZVmWZW e)eKe*eLe,eNe+eMiZXd#ZYeeZZ[G d$d% d%eZ\G d&d' d'eZ]G d(d) d)e j^Z_e`e#d*d+d, Zae_ZbdS )-    N)defaultdict)Enum)reduce)	getLogger)time)Any
CollectionOptionalcastunquote_plus__version__)event)exc)util)URLdefault
reflection)Table)text)NullType)FLOATDateDateTimeFloatTime)errors)DEFAULT_CONFIGURATIONSnowflakeConnection)UTF8)SnowflakeRestful)TelemetryClientTelemetryDataTelemetryField)returns_unicode)
_NameUtils)_StructuredTypeInfoManager   )DIALECT_NAME)SnowflakeCompilerSnowflakeDDLCompilerSnowflakeExecutionContextSnowflakeIdentifierPreparerSnowflakeTypeCompiler)StructuredType_CUSTOM_Date_CUSTOM_DateTime_CUSTOM_Float_CUSTOM_Time)*)_CUSTOM_DECIMAL)ischema_namesparse_index_columns)CustomTablePrefix)#_update_connection_application_nameparse_url_booleanparse_url_integerTc                   @   s   e Zd ZdZdS )TelemetryEventssqlalchemy_new_connectionN)__name__
__module____qualname__NEW_CONNECTION rB   rB   Y/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/sqlalchemy/snowdialect.pyr<   F   s    r<   c                   @   s   e Zd ZdZdZdS )SnowflakeIsolationLevelzREAD COMMITTED
AUTOCOMMITN)r>   r?   r@   READ_COMMITTEDrE   rB   rB   rB   rC   rD   J   s    rD   c                       s  e Zd ZeZdZdZdZdZe	Z
dZeZeZdZdZdZdZeZdZdZdZdZdZdZdZdZdZdZdZeZ e!Z"e#Z$e%Z&e'Z(dZ)dZ*dZ+dZ,dZ-dZ.de/j0j1fde2de3e4 d	e5f fd
dZ6 fddZ7e8dd Z9e8dd Z:e;de4de5de5fddZ<de=fddZ>e?j@doddZAdd ZBdd ZCd d! ZDd"d# ZEd$d% ZFe?j@dod&d'ZGdod(d)ZHd*d+ ZId,d- ZJd.d/ ZKe?j@d0d1 ZLd2d3 ZMe;d4d5 ZNe?j@d6d7 ZOe?j@d8d9 ZPdod:d;ZQe?j@d<d= ZRd>d? ZSe?j@d@dA ZTdodBdCZUe?j@dDdE ZVdodFdGZWdHdI ZXe?j@dJdK ZYe?j@dodLdMZZdodNdOZ[e?j@dodPdQZ\e?j@dodRdSZ]dodTdUZ^dVdW Z_e?j@dodXdYZ`dodZd[Zadod\d]Zbdod^d_Zcd`da Zddddbdce3e4 dde3eee4  fdedfZfdgdh Zge?j@didj Zh fdkdlZidmdn Zj  ZkS )pSnowflakeDialect	snowflake   TFpyformatNforce_div_is_floordivisolation_levelkwargsc                    s2   t  jdd|i| || _|| _t| j| _d S )NrL   rB   )super__init__rK   div_is_floordivr&   identifier_preparer
name_utils)selfrK   rL   rM   	__class__rB   rC   rO      s   zSnowflakeDialect.__init__c                    s   t  | | j| _d S N)rN   
initializerK   rP   )rS   
connectionrT   rB   rC   rW      s   zSnowflakeDialect.initializec                 C   s   |   S rV   )import_dbapi)clsrB   rB   rC   dbapi   s   zSnowflakeDialect.dbapic                 C   s   ddl m} |S )Nr   )	connector)rH   r\   )rZ   r\   rB   rB   rC   rY      s   zSnowflakeDialect.import_dbapinamevaluereturnc                 C   s\   t |  }s	|S |\}}t|ts|f}t||r|S t|v r$t|S t|v r,t|S |S )zACast param value if possible to type defined in connector-python.)r   get
isinstancetupleboolr:   intr;   )r]   r^   maybe_type_configuration_expected_typerB   rB   rC   parse_query_param_type   s   

z'SnowflakeDialect.parse_query_param_typeurlc                 C   sV  |j dd}d|v r:dd |d dD }t|dkrnt|dkr0|d	 |d< |d |d
< n
td|d  d|v r{d|d vr{|ds{|d |d< d|d v ro|d d	|d d |d< |d dd	 |d< |d d |d< d|d< d|d< tdi |j}|	dd }|rt
|nd| _| D ]\}}| ||||< qg |fS )Nuser)usernamedatabasec                 S   s   g | ]}t |qS rB   r   ).0erB   rB   rC   
<listcomp>   s    z8SnowflakeDialect.create_connect_args.<locals>.<listcomp>/r(      r   schemaz!Invalid name space is specified: hostz.snowflakecomputing.comportaccount.-443F
autocommitcache_column_metadatarB   )translate_connect_argssplitlensa_excArgumentErrorr`   finddictquerypopr:   _cache_column_metadataitemsrh   )rS   ri   optsname_spacesr   rz   r]   r^   rB   rB   rC   create_connect_args   s:   z$SnowflakeDialect.create_connect_argsc                 K      |  |d||S )z,
        Checks if the table exists
        TABLE_has_objectrS   rX   
table_namerr   kwrB   rB   rC   	has_table      zSnowflakeDialect.has_tablec                 C   s   t jjt jjgS rV   )rD   rF   r^   rE   rS   dbapi_connectionrB   rB   rC   get_isolation_level_values   s   z+SnowflakeDialect.get_isolation_level_valuesc                 C      |   d S rV   )rollbackr   rB   rB   rC   do_rollback     zSnowflakeDialect.do_rollbackc                 C   r   rV   )commitr   rB   rB   rC   	do_commit  r   zSnowflakeDialect.do_commitc                 C   s   t jjS rV   )rD   rF   r^   )rS   
dbapi_connrB   rB   rC   get_default_isolation_level
  s   z,SnowflakeDialect.get_default_isolation_levelc                 C   s(   |t jjkr|d d S |d d S )NTF)rD   rE   r^   ry   )rS   r   levelrB   rB   rC   set_isolation_level  s   z$SnowflakeDialect.set_isolation_levelc                 K   r   )z/
        Checks if the sequence exists
        SEQUENCEr   )rS   rX   sequence_namerr   r   rB   rB   rC   has_sequence  r   zSnowflakeDialect.has_sequencec           
   
   C   sv   |  ||}z|td| d| }| }|d u}|W S  tjy: }	 z|	jjtj	kr5W Y d }	~	dS  d }	~	ww )NzDESC z /* sqlalchemy:_has_object */ F)
_denormalize_quote_joinexecuter   fetchoner~   
DBAPIErrororigrU   	sf_errorsProgrammingError)
rS   rX   object_typeobject_namerr   	full_nameresultsrowhavern   rB   rB   rC   r     s   zSnowflakeDialect._has_objectc                 C      | j |S rV   )rR   normalize_namerS   r]   rB   rB   rC   r   (  r   zSnowflakeDialect.normalize_namec                 C   r   rV   )rR   denormalize_namer   rB   rB   rC   r   +  r   z!SnowflakeDialect.denormalize_namec                    s0   | j  ttj fdd|D }d j| S )Nc                    s   g | ]}|d ur  |qS rV   )_split_schema_by_dot)rm   idsiprB   rC   ro   2      z<SnowflakeDialect._denormalize_quote_join.<locals>.<listcomp>rv   )rQ   r   operatoraddjoin_quote_free_identifiers)rS   identssplit_identsrB   r   rC   r   .  s   z(SnowflakeDialect._denormalize_quote_joinc                 K   s.   | td }| |d | |d fS )Nz,select current_database(), current_schema();r   r(   )r   r   r   r   )rS   rX   r   resrB   rB   rC   _current_database_schema6  s   z)SnowflakeDialect._current_database_schemac                 C   s   |  |\}}|S rV   )r   )rS   rX   rf   current_schemarB   rB   rC   _get_default_schema_name@  s   z)SnowflakeDialect._get_default_schema_namec                 C   s*   i }t | jjD ]
\}}|||d < q|S )Nr   )	enumeratecursordescription)resultname_to_idxidxcolrB   rB   rC   _map_name_to_idxE  s   z!SnowflakeDialect._map_name_to_idxc                 K   s   g S rV   rB   r   rB   rB   rC   get_check_constraintsL  s   z&SnowflakeDialect.get_check_constraintsc                 K   sv   | td| }i }|D ]*}| |jd }||vr)g | |jd d||< || d | |jd  q|S )NzESHOW /* sqlalchemy:_get_schema_primary_keys */PRIMARY KEYS IN SCHEMA r   constraint_nameconstrained_columnsr]   r   column_name)r   r   r   _mappingappend)rS   rX   rr   r   r   ansr   r   rB   rB   rC   _get_schema_primary_keysQ  s    
z)SnowflakeDialect._get_schema_primary_keysc                 K   s\   |p| j }| j|fi |\}}| ||r|n|}| j|| |fi ||g d dS )Nr   )default_schema_namer   r   r   r   r`   rS   rX   r   rr   r   current_databaser   full_schema_namerB   rB   rC   get_pk_constrainte  s    


z"SnowflakeDialect.get_pk_constraintc                 K   s   | td| }i }|D ]3}| |jd }||vr2| |jd g|| |jd d||< q|| d | |jd  qtt}| D ]}	|	d}
||
 |	 qJ|S )NzKSHOW /* sqlalchemy:_get_schema_unique_constraints */ UNIQUE KEYS IN SCHEMA r   r   r   )column_namesr]   r   r   )	r   r   r   r   r   r   listvaluesr   )rS   rX   rr   r   r   unique_constraintsr   r]   r   
constraintr   rB   rB   rC   _get_schema_unique_constraintsq  s*   
z/SnowflakeDialect._get_schema_unique_constraintsc                 K   sV   |p| j }| j|fi |\}}| ||r|n|}| j|| |fi ||g S rV   )r   r   r   r   r   r`   r   rB   rB   rC   get_unique_constraints  s    


z'SnowflakeDialect.get_unique_constraintsc              
   K   s  | j |fi |\}}|td| }i }|D ]}| |jd }	|	|vr| |jd }
| |jd g|
| j|fvr@|
nd | |jd | |jd g|	| |jd d||	< i }| |jd	 d
krs| |jd	 |d< | |jd d
kr| |jd |d< |||	 d< q||	 d | |jd  ||	 d | |jd  qi }| D ] \}}|d |vrg ||d < ||d  dd | D  q|S )NzGSHOW /* sqlalchemy:_get_schema_foreign_keys */ IMPORTED KEYS IN SCHEMA fk_namepk_schema_namefk_column_namepk_table_namepk_column_namefk_table_name)r   referred_schemareferred_tablereferred_columnsr]   r   delete_rulez	NO ACTIONondeleteupdate_ruleonupdateoptionsr   r   r   c                 S   s   i | ]\}}|d kr||qS )r   rB   )rm   k2v2rB   rB   rC   
<dictcomp>  r   z=SnowflakeDialect._get_schema_foreign_keys.<locals>.<dictcomp>)r   r   r   r   r   r   r   r   )rS   rX   rr   r   rf   r   r   foreign_key_mapr   r]   r   r   r   vrB   rB   rC   _get_schema_foreign_keys  sd   
z)SnowflakeDialect._get_schema_foreign_keysc           	      K   sZ   |p| j }| j|fi |\}}| ||r|n|}| j|| |fi |}||g S )z3
        Gets all foreign keys for a table
        )r   r   r   r   r   r`   )	rS   rX   r   rr   r   r   r   r   r   rB   rB   rC   get_foreign_keys  s   


z!SnowflakeDialect.get_foreign_keysc                 K   s
  i }|  |}| j||fi |}|du rdS | j|fi |\}}| ||}	| j||	fi |}
t|| j|}|D ]\}}}}}}}}}}}}| |}| |}||vr\t ||< |	drbq;| j
|d}i }|du rrt}nGt|tr||d< ||d< n9t|tjr||d< ||d< n*t|tjtjfr||d< nt|tr|j|||fi |}|r|| | q;t}|tkrtd| d| d	 |di |}|
|}|| |||d
k||d
k||r||
| d v ndd |d
kr||d|| d d< q;|S )zGet all columns in the schema, if we hit 'Information schema query returned too much data' problem return
        None, as it is cacheable and is an unexpected return type for this functionNsys_clustering_column	precisiondecimal_return_scalescalelengthzDid not recognize type 'z' of column ''YESr   F)r]   typenullabler   autoincrementcommentprimary_key)start	incrementidentityrB   )r   _query_all_columns_infor   r   r   r'   rR   r   r   
startswithr6   r`   r   
issubclassr   sqltypesNumericStringBINARYr/   get_column_infor   sa_utilwarn)rS   rX   rr   r   r   schema_namer   r   default_schemar   schema_primary_keysstructured_type_info_managerr   r   coltypecharacter_maximum_lengthnumeric_precisionnumeric_scaleis_nullablecolumn_defaultis_identityr   identity_startidentity_incrementcol_typecol_type_kwcolumn_infotype_instancecurrent_table_pksrB   rB   rC   _get_schema_columns  s   













z$SnowflakeDialect._get_schema_columnsc           	      K   s~   |p| j }|s| j|fi |\}}| j||fi |}|du r.t|| j| j }|||S | |}||vr;t || S )z;
        Gets all column info given the table info
        N)	r   r   r   r'   rR   get_table_columnsr   r~   NoSuchTableError)	rS   rX   r   rr   r   rf   schema_columnscolumn_info_managernormalized_table_namerB   rB   rC   get_columnsL  s   


zSnowflakeDialect.get_columnsc                 K   sF   g }t D ]}d|j  }||v r |||  dkr ||j q|S )Nis_Y)r8   r]   lowerr   )rS   name_to_index_mapr   r   prefixes_foundvalid_prefixkeyrB   rB   rC   get_prefixes_from_data`  s   z'SnowflakeDialect.get_prefixes_from_datac              
   K   sN   z| tdd|iW S  tjy& } z|jjdkr!W Y d }~d S  d }~ww )Na  
            SELECT /* sqlalchemy:_get_schema_columns */
                   ic.table_name,
                   ic.column_name,
                   ic.data_type,
                   ic.character_maximum_length,
                   ic.numeric_precision,
                   ic.numeric_scale,
                   ic.is_nullable,
                   ic.column_default,
                   ic.is_identity,
                   ic.comment,
                   ic.identity_start,
                   ic.identity_increment
              FROM information_schema.columns ic
             WHERE ic.table_schema=:table_schema
             ORDER BY ic.ordinal_positiontable_schemai_ )r   r   r~   r   r   errno)rS   rX   r  r   perB   rB   rC   r  h  s   z(SnowflakeDialect._query_all_columns_infoc           
      K   st   |p| j }|td| | }| |}i }|j D ]}| t||d  }| 	||}	d|	i||< q|S )zQ
        Retrieves information about all tables in the specified schema.
        z>SHOW /* sqlalchemy:get_schema_tables_info */ TABLES IN SCHEMA r]   prefixes)
r   r   r   r   r   r   fetchallr   strr.  )
rS   rX   rr   r   r   r*  tablesr   r   table_prefixesrB   rB   rC   _get_schema_tables_info  s   

z(SnowflakeDialect._get_schema_tables_infoc                 K   s$   | j |||ddd }t|S )z'
        Gets all table names.
        
info_cacheN)r8  )r7  r`   keysr   )rS   rX   rr   r   retrB   rB   rC   get_table_names  s   z SnowflakeDialect.get_table_namesc                    sJ   |p j }|r|td | }n|td} fdd|D S )z%
        Gets all view names
        z.SHOW /* sqlalchemy:get_view_names */ VIEWS IN z*SHOW /* sqlalchemy:get_view_names */ VIEWSc                       g | ]	}  |d  qS r(   r   rm   r   rS   rB   rC   ro         z3SnowflakeDialect.get_view_names.<locals>.<listcomp>)r   r   r   r   )rS   rX   rr   r   r   rB   r@  rC   get_view_names  s   
zSnowflakeDialect.get_view_namesc              	   K   s   |p| j }|r|td| | d| | }n|td| | d}| j|}z| }|r=||d  W S W dS  tyI   Y dS w )z*
        Gets the view definition
        zJSHOW /* sqlalchemy:get_view_definition */ VIEWS                     LIKE 'z' IN r   r   N)r   r   r   r   rU   r   r   	Exception)rS   rX   	view_namerr   r   r   n2ir:  rB   rB   rC   get_view_definition  s:   
z$SnowflakeDialect.get_view_definitionc                 K   sj   |p| j }|td| | }g }| j|}|D ]}||d  dkr2|| ||d   q|S )NzLSHOW /* sqlalchemy:get_temp_table_names */ TABLES                 IN SCHEMA kind	TEMPORARYr]   )r   r   r   r   rU   r   r   r   )rS   rX   rr   r   r   r:  rE  r   rB   rB   rC   get_temp_table_names  s   
z%SnowflakeDialect.get_temp_table_namesc                    s    | td} fdd|D S )z(
        Gets all schema names.
        z.SHOW /* sqlalchemy:get_schema_names */ SCHEMASc                    r<  r=  r>  r?  r@  rB   rC   ro     rA  z5SnowflakeDialect.get_schema_names.<locals>.<listcomp>)r   r   )rS   rX   r   r   rB   r@  rC   get_schema_names  s   z!SnowflakeDialect.get_schema_namesc              
      s   d |rd | nd}z|t|} fdd|D W S  tjyB } z|jjdkr7g W  Y d }~S W Y d }~d S d }~ww )NzSHOW SEQUENCES {}z
IN SCHEMA  c                    r<  )r   r>  r?  r@  rB   rC   ro     rA  z7SnowflakeDialect.get_sequence_names.<locals>.<listcomp>i  )formatr   r   r   r~   r   r   r0  )rS   rX   rr   r   sql_commandr   r1  rB   r@  rC   get_sequence_names  s   z#SnowflakeDialect.get_sequence_namesc                 K   6   d ||rd| | nd}|t|}| S )z[
        Returns comment of table in a dictionary as described by SQLAlchemy spec.
        z;SHOW /* sqlalchemy:_get_table_comment */ TABLES LIKE '{}'{} IN SCHEMA rK  rL  r   r   r   r   rS   rX   r   rr   r   rM  r   rB   rB   rC   _get_table_comment     z#SnowflakeDialect._get_table_commentc                 K   rO  )zZ
        Returns comment of view in a dictionary as described by SQLAlchemy spec.
        z9SHOW /* sqlalchemy:_get_view_comment */ VIEWS LIKE '{}'{}rP  rK  rQ  rR  rB   rB   rC   _get_view_comment  rT  z"SnowflakeDialect._get_view_commentc                 K   sF   |  |||}|du r| |||}d|r |jd r |jd iS diS )a	  
        Returns comment associated with a table (or view) in a dictionary as
        SQLAlchemy expects. Note that since SQLAlchemy may not (in fact,
        typically does not) know if this is a table or a view, we have to
        handle both cases here.
        Nr   r   )rS  rU  r   )rS   rX   r   rr   r   r   rB   rB   rC   get_table_comment  s   
z"SnowflakeDialect.get_table_commentc          	      K   sD   | j ||fi |}g }| D ]\}}||d v r|| q|S )Nr2  )r7  r   r   )	rS   rX   rr   prefixr   tables_datatable_namesr   tables_data_valuerB   rB   rC   get_table_names_with_prefix/  s   
z,SnowflakeDialect.get_table_names_with_prefix)rr   filter_namesrr   r\  c             	      sJ  |p j } j||tjj|ddd}t|dkrg S |td 	| } 
|}i }|j D ]i}	 t|	|d  }
|	|d  d|	|d   d	ksZ|
|vsZ|
|vr[q5|	|d  |	|d
  dk fddt|	|d  D  fddt|	|d  D i d}||
f|v r|||
f | q5|g|||
f< q5t| S )-
        Gets the indexes definition
        r8  N)rr   rW  r8  r   z:SHOW /* sqlalchemy:get_multi_indexes */ INDEXES IN SCHEMA tabler]   
SYS_INDEX__PRIMARY	is_uniquer(  c                       g | ]}  |qS rB   r>  rm   columnr@  rB   rC   ro   g      z6SnowflakeDialect.get_multi_indexes.<locals>.<listcomp>columnsc                    rb  rB   r>  rc  r@  rB   rC   ro   k  re  included_columns)r]   uniquer   include_columnsdialect_options)r   r[  r8   HYBRIDr]   r`   r}   r   r   r   r   r   r3  r   r4  r7   r   r   r   )rS   rX   rr   r\  r   hybrid_table_namesr   rE  indexesr   r   indexrB   r@  rC   get_multi_indexes>  sH   


 


z"SnowflakeDialect.get_multi_indexesc                 C   s2   |  t|}t|}||f|v r|||f S g S rV   )r   r4  r   )rS   datar^  rr   dic_datarB   rB   rC   _value_or_defaulty  s
   z"SnowflakeDialect._value_or_defaultc                 K   s6   |  t|}| jd|||gd|}| |||S )r]  )rX   rr   r\  NrB   )r   r4  ro  rr  )rS   rX   	tablenamerr   r   r   rp  rB   rB   rC   get_indexes  s   zSnowflakeDialect.get_indexesc                    s2   t r	tdi |}t j|i |}| | |S )NrB   )&_ENABLE_SQLALCHEMY_AS_APPLICATION_NAMEr9   rN   connect_log_new_connection_event)rS   cargscparamsrX   rT   rB   rC   rv    s
   
zSnowflakeDialect.connectc              
   C   s   zTt tt t|}t|j|jd|d}t|d}dti}zddlm	} ||d< W n	 t
y1   Y nw |tjtjjtjjtjjt|itt d |d	 |  W d S  tyv } ztd
tjjt|jt| W Y d }~d S d }~ww )Nhttps)rs   rt   protocolrX   )rest
SQLAlchemyr   r   pandasi  )	from_dict	timestamprX   z2Failed to send telemetry data for %s event: %s: %s)r
   r   objectr!   rs   rt   r"   SQLALCHEMY_VERSIONr~  r   ImportErroradd_log_to_batchr#   from_telemetry_data_dictr$   KEY_TYPEr^   r<   rA   	KEY_VALUEr4  rd   time_in_seconds
send_batchrC  loggerdebugr   r>   )rS   rX   snowflake_connectionsnowflake_rest_clientsnowflake_telemetry_clienttelemetry_valuePANDAS_VERSIONrn   rB   rB   rC   rw    sH   

z*SnowflakeDialect._log_new_connection_eventrV   )lr>   r?   r@   r)   r]   drivermax_identifier_lengthcte_follows_insertsupports_statement_cacher    encodingdefault_paramstylecolspecsr6   rP   convert_unicodesupports_unicode_statementssupports_unicode_bindsr%   returns_unicode_stringsdescription_encodingpostfetch_lastrowidsupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_decimalsupports_native_booleansupports_altersupports_sequencessupports_native_enumsupports_multivalues_insertsupports_commentsr-   preparerr+   ddl_compilerr.   type_compilerr*   statement_compilerr,   execution_ctx_clsrequires_name_normalizemultivalues_insertssupports_schemassequences_optionalsupports_is_distinct_fromsupports_identity_columnsrD   rF   r^   rc   r	   r4  r   rO   rW   classmethodr[   rY   staticmethodrh   r   r   r   cacher   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&  r.  r  r7  r;  rB  rF  rI  rJ  rN  rS  rU  rV  r[  r   ro  rr  rt  rv  rw  __classcell__rB   rB   rT   rC   rG   O   s    

(

	






=

d

	






;
	rG   before_createc                 K   s<   ddl m} || rdS t|jtr| jrtdd S d S )Nr(   )HybridTableTz-Only Snowflake Hybrid Tables supports indexes)sql.custom_schema.hybrid_tabler  is_equal_typera   dialectrG   rm  NotImplementedError)r^  rX   _ddl_runnerr   r  rB   rB   rC   check_table  s   
r  )cr   collectionsr   enumr   	functoolsr   loggingr   r   r  typingr   r   r	   r
   urllib.parser   sqlalchemy.sql.sqltypessqlr  
sqlalchemyr   r  r   sa_vntr   r~   r   r  sqlalchemy.enginer   r   r   sqlalchemy.schemar   sqlalchemy.sqlr   r   sqlalchemy.typesr   r   r   r   r   snowflake.connectorr   r   snowflake.connector.connectionr   r   snowflake.connector.constantsr    snowflake.connector.networkr!   snowflake.connector.telemetryr"   r#   r$   snowflake.sqlalchemy.compatr%   snowflake.sqlalchemy.name_utilsr&   1snowflake.sqlalchemy.structured_type_info_managerr'   
_constantsr)   baser*   r+   r,   r-   r.   custom_typesr/   r0   r1   r2   r3   parser.custom_type_parserr5   r6   r7   %sql.custom_schema.custom_table_prefixr8   r9   r:   r;   r  ru  r>   r  r<   rD   DefaultDialectrG   listens_forr  r  rB   rB   rB   rC   <module>   sj         
v
	