o
    8Di*                     @  s   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
mZmZ d dlmZmZ G dd de
Zd(ddZd)ddZd*ddZd+ddZd,ddZG d d! d!ejZG d"d# d#ejZG d$d% d%ejZG d&d' d'ejZdS )-    )annotationsN)exp	generatorparsertokens)DialectHiveTrino)	TokenTypeTokenc                      s   e Zd ZdZ fddZd fdd	Zd fddZd  fddZd!d" fddZG dd de	j
Z
G dd dejZG dd dejZ  ZS )#Athenaaw  
    Over the years, it looks like AWS has taken various execution engines, bolted on AWS-specific
    modifications and then built the Athena service around them.

    Thus, Athena is not simply hosted Trino, it's more like a router that routes SQL queries to an
    execution engine depending on the query type.

    As at 2024-09-10, assuming your Athena workgroup is configured to use "Athena engine version 3",
    the following engines exist:

    Hive:
     - Accepts mostly the same syntax as Hadoop / Hive
     - Uses backticks to quote identifiers
     - Has a distinctive DDL syntax (around things like setting table properties, storage locations etc)
       that is different from Trino
     - Used for *most* DDL, with some exceptions that get routed to the Trino engine instead:
        - CREATE [EXTERNAL] TABLE (without AS SELECT)
        - ALTER
        - DROP

    Trino:
      - Uses double quotes to quote identifiers
      - Used for DDL operations that involve SELECT queries, eg:
        - CREATE VIEW / DROP VIEW
        - CREATE TABLE... AS SELECT
      - Used for DML operations
        - SELECT, INSERT, UPDATE, DELETE, MERGE

    The SQLGlot Athena dialect tries to identify which engine a query would be routed to and then uses the
    tokenizer / parser / generator for that engine. This is unfortunately necessary, as there are certain
    incompatibilities between the engines' dialects and thus can't be handled by a single, unifying dialect.

    References:
    - https://docs.aws.amazon.com/athena/latest/ug/ddl-reference.html
    - https://docs.aws.amazon.com/athena/latest/ug/dml-queries-functions-operators.html
    c                   s6   t  jdi | tdi || _tdi || _d S )N )super__init__r   _hiver	   _trino)selfkwargs	__class__r   P/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/dialects/athena.pyr   0   s   zAthena.__init__sqlstrreturnt.List[Token]c                   (   | j |d< | j|d< t j|fi |S Nhivetrino)r   r   r   tokenizer   r   optsr   r   r   r   6      

zAthena.tokenize"t.List[t.Optional[exp.Expression]]c                   r   r   )r   r   r   parser    r   r   r   r$   ;   r"   zAthena.parseexpression_typeexp.IntoTypec                   s*   | j |d< | j|d< t j||fi |S r   )r   r   r   
parse_into)r   r%   r   r!   r   r   r   r'   @   s   

zAthena.parse_intoT
expressionexp.Expressioncopyboolc                   s,   | j |d< | j|d< t j|fd|i|S )Nr   r   r*   )r   r   r   generate)r   r(   r*   r!   r   r   r   r,   G   s   

zAthena.generatec                      s   e Zd Zejjejj Zejjejj Zejjejj Zejj	ejj	 Z	i ejj
ejj
Z
i ejjejjdejiZd fddZd fddZ  ZS )zAthena.TokenizerUNLOADargst.Anyr   r   Nonec                   t   | dd pt }| dd pt }t j|i | |j|i i |d|i| _t|i i |d|i| _d S Nr   r   dialect)	popr   r	   r   r   	tokenizer_hive_tokenizer_TrinoTokenizer_trino_tokenizerr   r.   r   r   r   r   r   r   r   _   
    zAthena.Tokenizer.__init__r   r   r   c                   s:   t  |}t|rttjdg| j| S | j|S )N )r   r   _tokenize_as_hiver   r
   HIVE_TOKEN_STREAMr6   r8   )r   r   r   r   r   r   r   h   s   zAthena.Tokenizer.tokenizer.   r/   r   r/   r   r0   r   r   r   r   )__name__
__module____qualname__r	   	TokenizerIDENTIFIERSr   STRING_ESCAPESHEX_STRINGSUNICODE_STRINGSNUMERIC_LITERALSKEYWORDSr
   COMMANDr   r   __classcell__r   r   r   r   rC   N   s&    	rC   c                      s:   e Zd Zd fddZ	ddddZ	ddddZ  ZS )zAthena.Parserr.   r/   r   r   r0   c                   r1   r2   )	r4   r   r	   r   r   r   _hive_parser_TrinoParser_trino_parserr9   r   r   r   r   q   r:   zAthena.Parser.__init__N
raw_tokensr   r   t.Optional[str]r#   c                 C  s8   |r|d j tjkr| j|dd  |S | j||S Nr      )
token_typer
   r=   rL   r$   rN   )r   rO   r   r   r   r   r$   z   s   zAthena.Parser.parseexpression_typesr&   c                 C  s<   |r|d j tjkr| j||dd  |S | j|||S rQ   )rS   r
   r=   rL   r'   rN   )r   rT   rO   r   r   r   r   r'      s   zAthena.Parser.parse_intor>   N)rO   r   r   rP   r   r#   )rT   r&   rO   r   r   rP   r   r#   )r@   rA   rB   r   r$   r'   rK   r   r   r   r   Parserp   s    
rV   c                      s*   e Zd Zd fddZddddZ  ZS )Athena.Generatorr.   r/   r   r   r0   c                   sr   | dd pt }| dd pt }t j|i | t|i i |d|i| _t|i i |d|i| _d S r2   )	r4   r   r	   r   r   _HiveGenerator_hive_generator_TrinoGenerator_trino_generatorr9   r   r   r   r      s
    zAthena.Generator.__init__Tr(   r)   r*   r+   r   c                 C  s$   t |r| j}n| j}|j||dS )N)r*   )_generate_as_hiverY   r[   r,   )r   r(   r*   r   r   r   r   r,      s   zAthena.Generator.generater>   Tr(   r)   r*   r+   r   r   )r@   rA   rB   r   r,   rK   r   r   r   r   	Generator   s    	r_   r?   )r   r   r   r#   )r%   r&   r   r   r   r#   r]   r^   )r@   rA   rB   __doc__r   r   r$   r'   r,   r   rC   r   rV   r   r_   rK   r   r   r   r   r   
   s    %"r   r   r   r   r+   c                 C  s   t | dk rdS | ^}}}|j}|j }|j}|j }|tjtjfv s)|dkr+dS |tjtjtj	fv rK|dv r;dS |tj
krBdS tdd |D S dS )N   FzMSCK REPAIRT)DATABASEEXTERNALSCHEMAc                 s  s    | ]	}|j tjkV  qd S rU   )rS   r
   SELECT).0tr   r   r   	<genexpr>   s    z$_tokenize_as_hive.<locals>.<genexpr>)lenrS   textupperr
   DESCRIBESHOWALTERCREATEDROPVIEWall)r   firstsecondrest
first_type
first_textsecond_typesecond_textr   r   r   r<      s    



r<   r(   r)   c                 C  s   t | tjr+| jdkr&| jd}|r|tjrdS t | jtj	s$dS dS | jdkS t | tj
tjtjtjfrGt | tjrE| jdkrEdS dS dS )NTABLE
propertiesTrq   F)
isinstancer   Createkindr.   getfindExternalPropertyr(   QueryAlterDropDescribeShow)r(   r{   r   r   r   r\      s   

r\   r{   exp.Propertiesc                 C  s<   | j D ]}t|tjr|jdkr|d dk  S qdS )N
table_typevalueicebergF)expressionsr|   r   Propertynamerj   lower)r{   pr   r   r   _is_iceberg_table   s
   
r   r   rW   eexp.LocationPropertyc                 C  6   d}t |jtjrt|jrd}| d| |d S )Nexternal_locationlocation=thisr|   parentr   
Propertiesr   r   r   r   	prop_namer   r   r   _location_property_sql   
   
r   exp.PartitionedByPropertyr   c                 C  r   )Npartitioned_bypartitioningr   r   r   r   r   r   r   _partitioned_by_property_sql   r   r   c                      s   e Zd Zd fddZ  ZS )rX   r(   	exp.Alterr   r   c                   sV   t |tjr%|jdkr%|jr%t |jd tjr%tj|jd}|d|g t 	|S )Nrz   r   )r   actions)
r|   r   r   r~   r   	ColumnDefSchemasetr   	alter_sql)r   r(   new_actionsr   r   r   r      s
   z_HiveGenerator.alter_sql)r(   r   r   r   )r@   rA   rB   r   rK   r   r   r   r   rX      s    rX   c                   @  s"   e Zd Zi ejjdejiZdS )r7   r-   N)r@   rA   rB   r	   rC   rI   r
   rJ   r   r   r   r   r7     s    
r7   c                   @  s&   e Zd Zi ejjejdd iZdS )rM   c                 C  s   |  | jS rU   )_parse_as_command_prev)r   r   r   r   <lambda>  s    z_TrinoParser.<lambda>N)r@   rA   rB   r	   rV   STATEMENT_PARSERSr
   USINGr   r   r   r   rM     s    

rM   c                   @  sD   e Zd Zi ejjejejj	j
iZi ejjejeejeiZdS )rZ   N)r@   rA   rB   r	   r_   PROPERTIES_LOCATIONr   LocationPropertyr   Location	POST_WITH
TRANSFORMSPartitionedByPropertyr   r   r   r   r   r   rZ     s    
rZ   )r   r   r   r+   )r(   r)   r   r+   )r{   r   r   r+   )r   rW   r   r   )r   rW   r   r   r   r   )
__future__r   typingrg   sqlglotr   r   r   r   sqlglot.dialectsr   r   r	   sqlglot.tokensr
   r   r   r<   r\   r   r   r   r_   rX   rC   r7   rV   rM   rZ   r   r   r   r   <module>   s      




