o
    8Dii                     @  sX   d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ G dd de	ZdS )	    )annotationsN)exp)NormalizationStrategy)TSQL)	TokenTypec                   @  s:   e Zd ZdZejZG dd dejZG dd dej	Z	dS )Fabrica  
    Microsoft Fabric Data Warehouse dialect that inherits from T-SQL.

    Microsoft Fabric is a cloud-based analytics platform that provides a unified
    data warehouse experience. While it shares much of T-SQL's syntax, it has
    specific differences and limitations that this dialect addresses.

    Key differences from T-SQL:
    - Case-sensitive identifiers (unlike T-SQL which is case-insensitive)
    - Limited data type support with mappings to supported alternatives
    - Temporal types (DATETIME2, DATETIMEOFFSET, TIME) limited to 6 digits precision
    - Certain legacy types (MONEY, SMALLMONEY, etc.) are not supported
    - Unicode types (NCHAR, NVARCHAR) are mapped to non-unicode equivalents

    References:
    - Data Types: https://learn.microsoft.com/en-us/fabric/data-warehouse/data-types
    - T-SQL Surface Area: https://learn.microsoft.com/en-us/fabric/data-warehouse/tsql-surface-area
    c                   @  s&   e Zd Zi ejjejejdZdS )zFabric.Tokenizer)	TIMESTAMPUTINYINTN)	__name__
__module____qualname__r   	TokenizerKEYWORDSr   r   r	    r   r   P/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/dialects/fabric.pyr   "   s    r   c                      s"  e Zd Zi ejji ejjj	dejjj
dejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjd	ejjjd	ejjjd
ejjjdiZd fddZdd fddZdddZ  ZS )zFabric.Generator	DATETIME2DECIMAL	VARBINARYINTVARCHARCHAR
ROWVERSIONDATETIMEOFFSETSMALLINTzVARBINARY(MAX)
expressionexp.DataTypereturnstrc                   s   |j tjj r;|jtjjjkr;|tj}d}|r(|jj	r(|j
 }t|d}nd}tj|jtjtj|dgd}t |S )N   )this)r   expressions)is_typer   DataTypeTEMPORAL_TYPESr   TypeDATEfindDataTypeParamis_intto_pyminLiteralnumbersuperdatatype_sql)selfr   precision_paramtarget_precisioncurrent_precision	__class__r   r   r.   E   s   
zFabric.Generator.datatype_sqlNexp.Castsafe_prefixt.Optional[str]c                   sb   |j r*|j tjjjr*|tjtj}t	|tjs*tj|tj
dd}| |S t ||S )NUTC)r   zone)tor!   r   r"   r$   TIMESTAMPTZfind_ancestor
AtTimeZoneSelect
isinstancer+   stringsqlr-   cast_sql)r/   r   r6   
attimezoneat_time_zoner3   r   r   rB   `   s   
zFabric.Generator.cast_sqlexp.UnixToTimec           	      C  s   |j d}|j}|d tjjfvr| d| d dS |tjd }t	d|d}t
|tjjj}tj
dd	d
d}tj||tjdd}| |S )NscalezUnixToTime scale z is not supported by Fabric 1e6roundr   z'1970-01-01'zdatetime2(6)fabric)dialectMICROSECONDS)r   r   unit)argsgetr   r   
UnixToTimeSECONDSunsupportedr+   r,   funccastr"   r$   BIGINTDateAddr@   rA   )	r/   r   rF   	timestampmicrosecondsroundedrounded_ms_as_bigintepoch_startdateaddr   r   r   unixtotime_sqlk   s   

zFabric.Generator.unixtotime_sql)r   r   r   r   )N)r   r5   r6   r7   r   r   )r   rE   r   r   )r
   r   r   r   	GeneratorTYPE_MAPPINGr   r"   r$   DATETIMEr   IMAGEr   JSONMONEYNCHARNVARCHARr   SMALLDATETIME
SMALLMONEYr   TIMESTAMPNTZr;   TINYINTr	   UUIDXMLr.   rB   r]   __classcell__r   r   r3   r   r^   ,   sV    







	










r^   N)
r
   r   r   __doc__r   CASE_SENSITIVENORMALIZATION_STRATEGYr   r   r^   r   r   r   r   r      s
    
r   )
__future__r   typingtsqlglotr   sqlglot.dialects.dialectr   sqlglot.dialects.tsqlr   sqlglot.tokensr   r   r   r   r   r   <module>   s    