o
    SDiԭ                     @   sz  d dl Z d dl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Z d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z. ddl/m0Z0 ddlm1Z1m2Z2 ddlm3Z3 ddl4m5Z5 ddl6m7Z7 ddlm8Z8m9Z9m:Z:m;Z; e<g dZ=e>dej?ej@B ZAe<dd ejBD CdhZDe<dd ejBD CdhZE	 eFd d!G d"d# d#e$ZGejHjFd$d!G d%d& d&ejIZJG d'd( d(ejKZLG d)d* d*ejMZNG d+d, d,ejOZPG d-d. d.ejQZRG d/d0 d0ejSZTed1difgZUeVd2e3d3 dS )4    N)List)exc)inspectsql)util)default)context)_MapperEntity)SequenceTable)compiler
expression	functions)CompileState)BindParameterquoted_name)
Executable)LateralSelectState)DIALECT_NAME)IS_VERSION_20args_reducerstring_types)	AWSBucketAzureContainerExternalStage   )NOT_NULL).CustomOptionsAreOnlySupportedOnSnowflakeTablesUnexpectedOptionTypeError)flatten)CustomTableBase)TableOption)_find_left_clause_to_join_from+_set_connection_interpolate_empty_sequences_Snowflake_ORMJoin_Snowflake_Selectable_Join):ALLALTERANDANYASBETWEENBYCHECKCOLUMNCONNECTCOPYCREATECURRENTDELETEDISTINCTDROPELSEEXISTSFORFROMGRANTGROUPHAVINGININSERT	INTERSECTINTOISLIKENOTNULLOFONORORDERREVOKEROWROWSSAMPLESELECTSETSTARTTABLETHENTOTRIGGERUNIONUNIQUEUPDATEVALUESWHENEVERWHEREWITHREGEXPRLIKESOMEMINUS	INCREMENTz&\s*(?:UPDATE|INSERT|DELETE|MERGE|COPY)c                 C      h | ]}|qS  rb   .0drb   rb   R/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/sqlalchemy/base.py	<setcomp>x       rg   $c                 C   ra   rb   rb   rc   rb   rb   rf   rg   |   rh   _r   selectc                   @   s&   e Zd Zdd Zeddd ZdS )SnowflakeSelectStatec              	   C   s   |D ]U\}}}}|d }|d }|d u r|  ||||\}}	n| |}	|	d urI| j|	 }
| jd |	 t|
||||df | j|	d d   | _q| jt|||||df | _qd S )Nisouterfull)rm   rn   r   )"_join_determine_implicit_left_side_join_place_explicit_left_sidefrom_clausesr&   )selfargsraw_columnsrightonclauseleftflagsrm   rn   replace_from_obj_indexleft_clauserb   rb   rf   _setup_joins   s@   




z!SnowflakeSelectState._setup_joinszsqlalchemy.sql.utilc                 C   s   d}| j }|rt|||}t|dkr|d }|| }n=i }| j}	ttjdd |D tjdd |	jD D ]}
d||
< q:t|	 }t|||}t|dkrY||d  }t|dkrdt
d|snt
d	|f ||fS )
When join conditions don't express the left side explicitly,
        determine if an existing FROM or entity in this query
        can serve as the left hand side.

        Nr   r   c                 S      g | ]}|j qS rb   _from_objectsrd   elementrb   rb   rf   
<listcomp>       zKSnowflakeSelectState._join_determine_implicit_left_side.<locals>.<listcomp>c                 S   r}   rb   r~   r   rb   rb   rf   r      r   rb     Can't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.Don't know how to join to %r. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.)rq   r#   len	statement	itertoolschainfrom_iterable_where_criterialistkeyssa_excInvalidRequestError)rr   rt   rw   ru   rv   ry   rq   indexes	potentialr   from_clauseall_clausesrb   rb   rf   ro      sD   
z7SnowflakeSelectState._join_determine_implicit_left_sideN)__name__
__module____qualname__r{   sa_utilpreload_modulero   rb   rb   rb   rf   rl      s    )rl   ormc                   @   s&   e Zd Zdd Zedddd ZdS )SnowflakeORMSelectCompileStatec                 C   sH  t |}d }}| jr6t| j|j|}t|dkr#|d }| j| }n|t|dkr.tdtd|f |ri }	t|D ]*\}
}|j}|du rJq>t |}||u rSq>t	|t
jra|
|f|	|j< q>d|f|	|j< q>t|	 }t||j|}t|dkr|	||d   \}}nt|dkrtdtd|f td|||fS )r|   Nr   r   r   r   zgNo entities to join from; please use select_from() to establish the left entity/selectable of this join)r   rq   r#   
selectabler   r   r   	enumerateentity_zero_or_selectable
isinstancer   r	   r   r   )rr   entities_collectionrw   ru   rv   r_infory   use_entity_indexr   r   entity_indexententityent_infor   rb   rb   rf   ro      sb   
		
zASnowflakeORMSelectCompileState._join_determine_implicit_left_side)      )positions_to_dropc              	   C   s<  |du r|du s
J |  ||||\}}}	n| ||\}}	||u r+td||f tr9| ||||\}
}}n| ||||dd\}
}}|
jsO| |
}nd}|durx| j| }| jd| t	||||||dg | j|d d  | _dS |	durt
||	 tsJ ||	 j}n|}| jt	||
||||dg | _dS )zgiven raw "left", "right", "onclause" parameters consumed from
        a particular key within _join(), add a real ORMJoin object to
        our _from_obj list (or augment an existing one)

        Nz>Can't construct a join from %s to %s, they are the same entityFrb   )rm   rn   _extra_criteriar   )ro   rp   r   r   r    _join_check_and_adapt_right_sideis_selectable_get_extra_criteriarq   r%   r   r	   r   )rr   r   rw   ru   rv   prop	outerjoinrn   ry   r   r   extra_criteriarz   rb   rb   rf   _join_left_to_right]  sv   

	

z2SnowflakeORMSelectCompileState._join_left_to_rightN)r   r   r   ro   r   r   rb   rb   rb   rf   r      s    lr   c                       sh   e Zd Zdd eD ZeZeZ fddZ	dd Z
ddd	Zdd
dZdedefddZdd Z  ZS )SnowflakeIdentifierPreparerc                 C   s   h | ]}|  qS rb   )lower)rd   xrb   rb   rf   rg     s    z%SnowflakeIdentifierPreparer.<setcomp>c                    s   d}t  j|||d d S )N")initial_quoteescape_quote)super__init__)rr   dialectkwquote	__class__rb   rf   r     s   z$SnowflakeIdentifierPreparer.__init__c                    s   t  fdd|D S )zF
        Unilaterally identifier-quote any number of strings.
        c                 3   s"    | ]}|d ur  |V  qd S Nr   )rd   irr   rb   rf   	<genexpr>  s     zFSnowflakeIdentifierPreparer._quote_free_identifiers.<locals>.<genexpr>)tuple)rr   idsrb   r   rf   _quote_free_identifiers  s   z3SnowflakeIdentifierPreparer._quote_free_identifiersNc                 C   s   |  |}d| j| S )zF
        Split schema by a dot and merge with required quotes
        .)_split_schema_by_dotjoinr   )rr   schemaforceidentsrb   rb   rf   quote_schema  s   
z(SnowflakeIdentifierPreparer.quote_schemac                 C   sJ   |p|j }|| jd}t|tr|jd u r| |S |jr#| |S |S )N )namereplacer   r   r   r   quote_identifier)rr   labelr   nsrb   rb   rf   format_label  s
   

z(SnowflakeIdentifierPreparer.format_labelvaluereturnc                 C   sD   |  }|| jv p!|| jv p!|d | jv p!| jt| p!||kS )z5Return True if the given identifier requires quoting.r   )r   reserved_wordsillegal_identifiersillegal_initial_characterslegal_charactersmatchstr)rr   r   lc_valuerb   rb   rf   _requires_quotes  s   
z,SnowflakeIdentifierPreparer._requires_quotesc                    s   g }d}d}d}|t  k rh|s5 | dkr(||k r(| ||  |d }n& | dkr4d}|d }n | dkrN||k rN| ||  d}|d }|d7 }|t  k rb | dkrb|d7 }|t  k s||k ru| ||   fdd|D }|S )	Nr   Fr   r   r   Tc                    s    g | ]}t |t d ddqS )r   Nr   )r   getattr)rd   r   r   rb   rf   r     s    zDSnowflakeIdentifierPreparer._split_schema_by_dot.<locals>.<listcomp>)r   append)rr   r   retidxpre_idxin_quote
quoted_retrb   r   rf   r     s6   

z0SnowflakeIdentifierPreparer._split_schema_by_dotr   )r   r   r   RESERVED_WORDSr   ILLEGAL_INITIAL_CHARACTERSr   ILLEGAL_IDENTIFIERSr   r   r   r   r   r   boolr   r   __classcell__rb   rb   r   rf   r     s    

	r   c                       s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd)d!d"Zd#d$ Z fd%d&Z fd'd(Z  ZS )*SnowflakeCompilerc                 K   s   | j j|d S )N.nextval)r   identifier_preparerformat_sequence)rr   sequencer   rb   rb   rf   visit_sequence  s   z SnowflakeCompiler.visit_sequencec                 K      dS )NCURRENT_TIMESTAMPrb   )rr   nowr   rb   rb   rf   visit_now_func     z SnowflakeCompiler.visit_now_funcc                    s   d  fdd|jD }|jjfddi }|jjfddi }|jjfi  }d| d| d| |rAd|  S d	 S )
N c                 3   s"    | ]}|j fi  V  qd S r   _compiler_dispatch)rd   clauser   rr   rb   rf   r     s    
z5SnowflakeCompiler.visit_merge_into.<locals>.<genexpr>asfromTzMERGE INTO z USING  ON r   )r   clausestargetr   sourceon)rr   
merge_intor   r   r   r   r  rb   r   rf   visit_merge_into  s   
z"SnowflakeCompiler.visit_merge_intoc                    s$  |j d urdt|j jfi   nd}|jdkrZt|j  \}}t|t|}} ddrCtt	|j t
dd \}}d||jd	|d	t fd
d|S t|j } ddrp|jt
dd |jrd	 fdd|D nd}d||j|jrd| S dS )Nz AND r   r?   deterministicFr   keyz+WHEN NOT MATCHED{} THEN {} ({}) VALUES ({}), c                    s   | j fi  S r   r   )er   rb   rf   <lambda>-  r   z;SnowflakeCompiler.visit_merge_into_clause.<locals>.<lambda>c                    s0   g | ]}|d   d|d j fi   qS )r    = r   r   )rd   setr   rb   rf   r   5  s    "z=SnowflakeCompiler.visit_merge_into_clause.<locals>.<listcomp>zWHEN MATCHED{} THEN {}{}z SET %s)	predicater   r   commandzipr  itemsr   getsortedoperator
itemgetterformatr   mapsort)rr   merge_into_clauser   case_predicatesetssets_tosset_listrb   r   rf   visit_merge_into_clause  sF   


z)SnowflakeCompiler.visit_merge_into_clausec              	      s  t |dr|jd ur|jjfi  }nd}|jjfddi }d }t|jtr0|jj}n+t|jtsBt|jt	sBt|jt
rM|jjfi  }nd|jjfi   d}d }t|jttfro|jjddid}n|jd urw|j}|d ur|dkrd	| nd}d
\}}	t|tr|\}}}	n
t|tr|\}}}	t|j }
 ddr|
jtdd |jrd fdd|
D nd}|r|d| 7 }|	r|d|	 7 }d| dd||||g S )N	formatterr   r   T()literal_binds)compile_kwargszPARTITION BY )r   r   r  Fr   r  r   c              	      s>   g | ]\}}d  |t|ddr|jfi  nt|qS )z{} = {}compiler_dispatchF)r  r   r   r   rd   r   vr   rb   rf   r   p  s    	
z5SnowflakeCompiler.visit_copy_into.<locals>.<listcomp>z
COPY INTO z FROM )hasattrr  r   intor   from_r   r   r   r   r   partition_byr   r   compiler   r   copy_optionsr  r  r  r  r  r   )rr   	copy_intor   r  r&  r'  partition_by_valuer(  credentials
encryptionoptions_listoptionsrb   r   rf   visit_copy_intoC  s`   








	z!SnowflakeCompiler.visit_copy_intoc              	      s~   t  j }ddr|jtdd d jv r$d jd  dS d j jr<d	d		 fd
d|D  S dS )Nr  Fr   r  format_namezFILE_FORMAT=(format_name = r  zFILE_FORMAT=(TYPE={}{})r   c              	      s@   g | ]\}}d  |t|dr|jfi n ||qS ){}={}r   )r  r%  r   
value_reprrd   r   r   r  r   rr   rb   rf   r     s    	
z:SnowflakeCompiler.visit_copy_formatter.<locals>.<listcomp>r   )
r   r0  r  r  r  r  r  r  file_formatr   )rr   r  r   r/  rb   r6  rf   visit_copy_formatter  s$   
	z&SnowflakeCompiler.visit_copy_formatterc                 K   s   t |j }|ddr|jtdd dddd |D }t |j	 }|ddr9|jtdd d	dd
d |D }d|j
|jrSd|j nd}||jr\|nd|j	rc|fS dfS )Nr  Fr   r  CREDENTIALS=({})r   c                 s   $    | ]\}}| d | dV  qdS =''Nrb   r#  rb   rb   rf   r        " z5SnowflakeCompiler.visit_aws_bucket.<locals>.<genexpr>ENCRYPTION=({})c                 s   s.    | ]\}}t |trd nd||V  qdS )z{}='{}'r3  N)r   r   r  r#  rb   rb   rf   r     s
    
z's3://{}{}'/r   )r   credentials_usedr  r  r  r  r  r  r   encryption_usedbucketpath)rr   
aws_bucketr   credentials_listr-  encryption_listr.  urirb   rb   rf   visit_aws_bucket  s.   
z"SnowflakeCompiler.visit_aws_bucketc                 K   s   t |j }|ddr|jtdd dddd |D }t |j	 }|ddr9|jtdd d	dd
d |D }d|j
|j|jrUd|j nd}||jr^|nd|j	re|fS dfS )Nr  Fr   r  r9  r   c                 s   r:  r;  rb   r#  rb   rb   rf   r     r>  z:SnowflakeCompiler.visit_azure_container.<locals>.<genexpr>r?  c                 s   s<    | ]\}}t |tr| d | dn| d| V  qdS )r<  r=  =N)r   r   r#  rb   rb   rf   r     s
    &
z''azure://{}.blob.core.windows.net/{}{}'r@  r   )r   rA  r  r  r  r  r  r  r   rB  account	containerrD  )rr   azure_containerr   rF  r-  rG  r.  rH  rb   rb   rf   visit_azure_container  s2   
z'SnowflakeCompiler.visit_azure_containerc                 K   sD   |j d u rd|j |j |j S d|j |j |j d|j  dS )N@z (file_format => r  )r7  	namespacer   rD  )rr   external_stager   rb   rb   rf   visit_external_stage  s   
"z&SnowflakeCompiler.visit_external_stagec                        dd  fdd|D  S )NzUSING r  c                 3   (    | ]}|j fd  dV  qdS T)r   	fromhintsNr   rd   t
from_hintsr   rr   rb   rf   r     
    
z=SnowflakeCompiler.delete_extra_from_clause.<locals>.<genexpr>r   )rr   delete_stmt
from_tableextra_fromsrZ  r   rb   rY  rf   delete_extra_from_clause     
z*SnowflakeCompiler.delete_extra_from_clausec                    rS  )NzFROM r  c                 3   rT  rU  r   rW  rY  rb   rf   r     r[  z7SnowflakeCompiler.update_from_clause.<locals>.<genexpr>r\  )rr   update_stmtr^  r_  rZ  r   rb   rY  rf   update_from_clause  ra  z$SnowflakeCompiler.update_from_clausec                 C   sV   | j |jfi |}| j |jfi |}|jd }|d ur&| j |fi |}|||fS )Nrx   )processrw   ru   	modifiers)rr   binaryr   stringpatternrx   rb   rb   rf   _get_regexp_args  s   

z"SnowflakeCompiler._get_regexp_argsc                 K   sD   |  ||\}}}|d u rd| d| dS d| d| d| dS )NzREGEXP_LIKE(r  r  )ri  )rr   rf  r  r   rg  rh  rx   rb   rb   rf   visit_regexp_match_op_binary  s   z.SnowflakeCompiler.visit_regexp_match_op_binaryc              	   K   s   |  ||\}}}z| j|jd fi |}W n ty4   d| d| |d u r*dnd|  d Y S w |d u rEd| d| d| dS d| d| d| d| d	S )NreplacementzREGEXP_REPLACE(r  r   r  )ri  rd  re  KeyError)rr   rf  r  r   rg  rh  rx   rk  rb   rb   rf   visit_regexp_replace_op_binary  s   ,z0SnowflakeCompiler.visit_regexp_replace_op_binaryc                 K   s   d| j ||fi | S )NzNOT )rj  rr   rf  r  r   rb   rb   rf    visit_not_regexp_match_op_binary  s   z2SnowflakeCompiler.visit_not_regexp_match_op_binaryFNc                 K   s   |r|j t|jj|jj |jrd}n|jrd}nd}|jj	| fd|d|| |jj	| fd|d| }|j
d u rGt|jtrG|S |d |j
j	| fd|i| S )Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN T)r   from_linterr   rp  )edgesupdater   productrw   r   ru   rn   rm   r   rv   r   r   )rr   r   r   rp  kwargs	join_typejoin_statementrb   rb   rf   
visit_join  sF   
zSnowflakeCompiler.visit_joinc                 K   sD   | j jrtjdtdd | j|jfi |d | j|jfi | S )N%  div_is_floordiv value will be changed to False in a future release. This will generate a behavior change on true and floor division. Please review https://docs.sqlalchemy.org/en/20/changelog/whatsnew_20.html#python-division-operator-performs-true-division-for-all-backends-added-floor-division   
stacklevelz / )r   div_is_floordivwarningswarnPendingDeprecationWarningrd  rw   ru   rn  rb   rb   rf   visit_truediv_binary5  s   *z&SnowflakeCompiler.visit_truediv_binaryc                    s2   | j jrtrtjdtdd t j||fi |S )Nrx  ry  rz  )r   r|  r   r}  r~  r  r   visit_floordiv_binaryrn  r   rb   rf   r  @  s   z'SnowflakeCompiler.visit_floordiv_binaryc                    s   t  ||ddS )N\z\\)r   render_literal_valuer   )rr   r   type_r   rb   rf   r  I  s   z&SnowflakeCompiler.render_literal_value)FN)r   r   r   r   r   r  r  r1  r8  rI  rN  rR  r`  rc  ri  rj  rm  ro  rw  r  r  r  r   rb   rb   r   rf   r   
  s(    'C
'	r   c                   @   sV   e Zd ZejdejdZdd Zdd Ze	j
dd Zd	d
 Zdd Zedd ZdS )SnowflakeExecutionContextz^insert\s+into)rx   c                 C   s   |  d| j| d|S )NzSELECT r   )_execute_scalarr   r   )rr   seqr  rb   rb   rf   fire_sequenceQ  s   z'SnowflakeExecutionContext.fire_sequencec                 C   s
   t |S r   )AUTOCOMMIT_REGEXPr   )rr   r   rb   rb   rf   should_autocommit_textW  s   
z0SnowflakeExecutionContext.should_autocommit_textc                 C   sD   | j d| j r| jrtjpd}|tju r| | jS |o!| j S )N
autocommitF)	execution_optionsr  compiledr   r   PARSE_AUTOCOMMITr  unicode_statementisddl)rr   r  rb   rb   rf   should_autocommitZ  s   
z+SnowflakeExecutionContext.should_autocommitc                 C   sZ   | j r%| jjr%t| jd | jr!| j| jr#| j	dd| _d S d S d S t| jd d S )NTz%%%F)
r  r   _double_percentsr$   _dbapi_connectionexecutemanyINSERT_SQL_REr   r   r   r   rb   rb   rf   pre_execi  s   z"SnowflakeExecutionContext.pre_execc                 C   s&   | j r| jjrt| jd d S d S d S )NF)r  r   r  r$   r  r   rb   rb   rf   	post_execx  s   z#SnowflakeExecutionContext.post_execc                 C   s   | j jS r   )cursorrowcountr   rb   rb   rf   r  ~  s   z"SnowflakeExecutionContext.rowcountN)r   r   r   rer)  
IGNORECASEr  r  r  r   memoized_propertyr  r  r  propertyr  rb   rb   rb   rf   r  N  s    
r  c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )SnowflakeDDLCompilerc                 C   s8   |d u rd S |  |kr| j|  s|S | j|S r   )r   preparerr   r   )rr   r   rb   rb   rf   denormalize_column_name  s
   z,SnowflakeDDLCompiler.denormalize_column_namec                 K   s   | j || jjj|j|dg}|jduo| jj}|js!|	d | 
|}|dur1|	d|  |jdur\||jju r\|jdu r\t|jtrW|	d| jj|j d n|	d |rg|	| |j d|S )z,
        Gets Column specifications
        )type_expressionNzNOT NULLzDEFAULT r   AUTOINCREMENTr   )r  format_columnr   type_compilerrd  typeidentitysupports_identity_columnsnullabler   get_column_default_stringtable_autoincrement_columnserver_defaultr   r   r
   r   r   r   )rr   columnrt  colspechas_identityr   rb   rb   rf   get_column_specification  s*   






z-SnowflakeDDLCompiler.get_column_specificationc                    sB   d}|j t }|d}|r|dd fdd|D 7 }|S )a  
        Handles snowflake-specific ``CREATE TABLE ... CLUSTER BY`` syntax.

        Users can specify the `clusterby` property per table
        using the dialect specific syntax.
        For example, to specify a cluster by key you apply the following:

        >>> import sqlalchemy as sa
        >>> from sqlalchemy.schema import CreateTable
        >>> engine = sa.create_engine('snowflake://om1')
        >>> metadata = sa.MetaData()
        >>> user = sa.Table(
        ...     'user',
        ...     metadata,
        ...     sa.Column('id', sa.Integer, primary_key=True),
        ...     sa.Column('name', sa.String),
        ...     snowflake_clusterby=['id', 'name', text("id > 5")]
        ... )
        >>> print(CreateTable(user).compile(engine))
        <BLANKLINE>
        CREATE TABLE "user" (
            id INTEGER NOT NULL AUTOINCREMENT,
            name VARCHAR,
            PRIMARY KEY (id)
        ) CLUSTER BY (id, name, id > 5)
        <BLANKLINE>
        <BLANKLINE>
        r   	clusterbyz CLUSTER BY ({})r  c                 3   s,    | ]}t |tr |nt|V  qd S r   )r   r   r  )rd   r  r   rb   rf   r     s    
z9SnowflakeDDLCompiler.handle_cluster_by.<locals>.<genexpr>)dialect_optionsr   r  r  r   )rr   r  textinfoclusterrb   r   rf   handle_cluster_by  s   


z&SnowflakeDDLCompiler.handle_cluster_byc                 C   s   |  |}g }g }|jt  D ]\}}t|tr|| q|dvr(|| qt|dkr5tt	|t|t
rS|jdd dd |D ]}|d||  7 }qE|S t|dkr\t |S )N)r  *r   c                 S   s   | j j| jfS r   )priorityr   option_name)r   rb   rb   rf   r	    s    z8SnowflakeDDLCompiler.post_create_table.<locals>.<lambda>T)r  reverse	)r  r  r   r  r   r"   r   r   r   r  r!   r  render_optionr   )rr   r  r  r0  invalid_optionsr  optionrb   rb   rf   post_create_table  s&   



z&SnowflakeDDLCompiler.post_create_tablec                 K   s:   dj |jj|jjt|j|jrdnd|jrddS ddS )z]
        This visitor will create the SQL representation for a CREATE STAGE command.
        z/CREATE {or_replace}{temporary}STAGE {}{} URL={}OR REPLACE r   z
TEMPORARY )
or_replace	temporary)r  stagerP  r   reprrL  replace_if_existsr  )rr   create_stager   rb   rb   rf   visit_create_stage  s   z'SnowflakeDDLCompiler.visit_create_stagec              
      s<   d  jrdnd j jjd fdd jj D S )zk
        This visitor will create the SQL representation for a CREATE FILE FORMAT
        command.
        z$CREATE {}FILE FORMAT {} TYPE='{}' {}r  r   r   c                    s(   g | ]\}}| d  j || qS )r
  )r  r4  r5  r7  rb   rf   r     s    zASnowflakeDDLCompiler.visit_create_file_format.<locals>.<listcomp>)r  r  r2  r  r7  r   r0  r  )rr   r7  r   rb   r  rf   visit_create_file_format  s   

z-SnowflakeDDLCompiler.visit_create_file_formatc                 K   s   | j |j}d| dS )zSnowflake does not support setting table comments as NULL.

        Reflection has to account for this and convert any empty comments to NULL.
        zCOMMENT ON TABLE z IS '')r  format_tabler   )rr   dropr   
table_namerb   rb   rf   visit_drop_table_comment  s   z-SnowflakeDDLCompiler.visit_drop_table_commentc                 K   s"   d | j|jj| j|jS )zSnowflake does not support directly setting column comments as NULL.

        Instead we are forced to use the ALTER COLUMN ... UNSET COMMENT instead.
        z,ALTER TABLE {} ALTER COLUMN {} UNSET COMMENT)r  r  r  r   r  r  )rr   r  r   rb   rb   rf   visit_drop_column_comment  s   z.SnowflakeDDLCompiler.visit_drop_column_commentc                 K   s   d}|j d us|jd ur+|j d u rdn|j }|jd u rdn|j}|d| d| d7 }|jd ur>|jr5dnd}|d| 7 }|S )	NIDENTITYr   r  ,r  rI   NOORDERr   )start	incrementorder)rr   r  r   r  r  r  r  rb   rb   rf   visit_identity_column'  s   
z*SnowflakeDDLCompiler.visit_identity_columnc                 C   s   g }|j d ur|d|j   |jd ur|d|j  |jd ur)|d|j  |jd ur6|d|j  |jd ur@|d |jd urJ|d |jd urW|d|j  |jd urf||jrcdnd	 |j	d uru||j	rrd
nd d
|S )NzINCREMENT BY %dzSTART WITH %dzMINVALUE %dzMAXVALUE %dzNO MINVALUEzNO MAXVALUEzCACHE %dCYCLEzNO CYCLErI   r  r   )r  r   r  minvaluemaxvalue
nominvalue
nomaxvaluecachecycler  r   )rr   identity_optionsr  rb   rb   rf   get_identity_options2  s(   











z)SnowflakeDDLCompiler.get_identity_optionsN)r   r   r   r  r  r  r  r  r  r  r  r  r  rb   rb   rb   rf   r    s    (-
r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/S )0SnowflakeTypeCompilerc                 K   r   )NBYTEINTrb   rr   r  r   rb   rb   rf   visit_BYTEINTJ  r   z#SnowflakeTypeCompiler.visit_BYTEINTc                 K   r   )N	CHARACTERrb   r  rb   rb   rf   visit_CHARACTERM  r   z%SnowflakeTypeCompiler.visit_CHARACTERc                 K   r   )NDECrb   r  rb   rb   rf   	visit_DECP  r   zSnowflakeTypeCompiler.visit_DECc                 K   r   )NDOUBLErb   r  rb   rb   rf   visit_DOUBLES  r   z"SnowflakeTypeCompiler.visit_DOUBLEc                 K   r   )NFIXEDrb   r  rb   rb   rf   visit_FIXEDV  r   z!SnowflakeTypeCompiler.visit_FIXEDc                 K   r   )NINTrb   r  rb   rb   rf   	visit_INTY  r   zSnowflakeTypeCompiler.visit_INTc                 K   r   )NNUMBERrb   r  rb   rb   rf   visit_NUMBER\  r   z"SnowflakeTypeCompiler.visit_NUMBERc                 K   r   )NSTRINGrb   r  rb   rb   rf   visit_STRING_  r   z"SnowflakeTypeCompiler.visit_STRINGc                 K   r   )NTINYINTrb   r  rb   rb   rf   visit_TINYINTb  r   z#SnowflakeTypeCompiler.visit_TINYINTc                 K   r   )NVARIANTrb   r  rb   rb   rf   visit_VARIANTe  r   z#SnowflakeTypeCompiler.visit_VARIANTc                 K   s6   |j rdt nd}d|j  d|j  | dS )Nr   r   zMAP(r  r  )not_nullr   key_typer)  
value_typerr   r  r   r  rb   rb   rf   	visit_MAPh  s    zSnowflakeTypeCompiler.visit_MAPc                 K   r   )NARRAYrb   r  rb   rb   rf   visit_ARRAYn  r   z!SnowflakeTypeCompiler.visit_ARRAYc                 K   s4   |j rdS |jrdt nd}d|j  | dS )Nr  r   r   zARRAY(r  )is_semi_structuredr  r   r  r)  r  rb   rb   rf   visit_SNOWFLAKE_ARRAYq  s   z+SnowflakeTypeCompiler.visit_SNOWFLAKE_ARRAYc                 K   s   |j rdS g }|jD ],}| d|j| d   }t|j| dkr1||j| d r-dnd 7 }|| q
|g kr=dS dd| d	S )
NOBJECTr   r   r   z	 NOT NULLr   zOBJECT(r  r  )r  items_typesr)  r   r   r   )rr   r  r   contentsr  row_textrb   rb   rf   visit_OBJECTw  s   
z"SnowflakeTypeCompiler.visit_OBJECTc                 K   r   )NBINARYrb   r  rb   rb   rf   
visit_BLOB  r   z SnowflakeTypeCompiler.visit_BLOBc                 K   r   )Ndatetimerb   r  rb   rb   rf   visit_datetime  r   z$SnowflakeTypeCompiler.visit_datetimec                 K   r   )NDATETIMErb   r  rb   rb   rf   visit_DATETIME  r   z$SnowflakeTypeCompiler.visit_DATETIMEc                 K   r   )NTIMESTAMP_NTZrb   r  rb   rb   rf   visit_TIMESTAMP_NTZ  r   z)SnowflakeTypeCompiler.visit_TIMESTAMP_NTZc                 K   r   )NTIMESTAMP_TZrb   r  rb   rb   rf   visit_TIMESTAMP_TZ  r   z(SnowflakeTypeCompiler.visit_TIMESTAMP_TZc                 K   r   )NTIMESTAMP_LTZrb   r  rb   rb   rf   visit_TIMESTAMP_LTZ  r   z)SnowflakeTypeCompiler.visit_TIMESTAMP_LTZc                 K   r   )N	TIMESTAMPrb   r  rb   rb   rf   visit_TIMESTAMP  r   z%SnowflakeTypeCompiler.visit_TIMESTAMPc                 K   r   )N	GEOGRAPHYrb   r  rb   rb   rf   visit_GEOGRAPHY  r   z%SnowflakeTypeCompiler.visit_GEOGRAPHYc                 K   r   )NGEOMETRYrb   r  rb   rb   rf   visit_GEOMETRY  r   z$SnowflakeTypeCompiler.visit_GEOMETRYN)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  rb   rb   rb   rf   r  I  s0    r  r  r    	snowflake)Wr   r  r  rg  r}  typingr   
sqlalchemyr   r   r   r   r   r   sqlalchemy.enginer   sqlalchemy.ormr   sqlalchemy.orm.contextr	   sqlalchemy.schemar
   r   sqlalchemy.sqlr   r   r   sqlalchemy.sql.baser   sqlalchemy.sql.elementsr   r   sqlalchemy.sql.expressionr   sqlalchemy.sql.selectabler   r   snowflake.sqlalchemy._constantsr   snowflake.sqlalchemy.compatr   r   r   $snowflake.sqlalchemy.custom_commandsr   r   r   
_constantsr   r   r   r    #sql.custom_schema.custom_table_baser!   &sql.custom_schema.options.table_optionr"   r#   r$   r%   r&   	frozensetr   r)  IUNICODEr  digitsunionr   r   
plugin_forrl   baseORMSelectCompileStater   IdentifierPreparerr   SQLCompilerr   DefaultExecutionContextr  DDLCompilerr  GenericTypeCompilerr  construct_argumentsregister_functionrb   rb   rb   rf   <module>   sf   D
	g PK  F5 GX