o
    8Di                      @  s   d dl mZ d dl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ZmZmZ d dlmZmZ d dlmZ d d	lmZmZmZmZ dddZdddZdddZd ddZG dd deZdS )!    )annotationsN)exp)rename_funcunit_to_vartimestampdiff_sqlbuild_date_delta)_build_with_ignore_nulls)Spark2temporary_storage_provider_build_as_cast)ensure_listseq_get)	TokenType)'ctas_with_tmp_tables_to_create_tmp_viewremove_unique_constraints
preprocess%move_partitioned_by_to_schema_columnsargst.Listreturnexp.Expressionc                 C  sb   d}t | d}t | d}t| dkr!tttj|j}| d }tjtj	|dtj	|d|dS )a  
    Although Spark docs don't mention the "unit" argument, Spark3 added support for
    it at some point. Databricks also supports this variant (see below).

    For example, in spark-sql (v3.3.1):
    - SELECT DATEDIFF('2020-01-01', '2020-01-05') results in -4
    - SELECT DATEDIFF(day, '2020-01-01', '2020-01-05') results in 4

    See also:
    - https://docs.databricks.com/sql/language-manual/functions/datediff3.html
    - https://docs.databricks.com/sql/language-manual/functions/datediff.html
    Nr            thisr   
expressionunit)
r   lenr   vartcast
ExpressionnameDateDiffTsOrDsToDate)r   r   r   r    r'   O/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/dialects/spark.py_build_datediff   s   

r)   c                 C  sP   t | d}t| dkrtjt | d|tjddS tjt | d|t | ddS )Nr   r   r   DAYr   )r   r   r   	TsOrDsAddLiteralstringTimestampAdd)r   r   r'   r'   r(   _build_dateadd-   s   
r/   ec                 C  s0   t | tr
t| S t | tjrt| jS | S )zKNormalize the expressions in PARTITION BY (<expression>, <expression>, ...))
isinstancestrr   to_identifierr,   r$   r0   r'   r'   r(   _normalize_partition<   s
   

r5   selfSpark.Generatorr    exp.TsOrDsAdd | exp.TimestampAddr2   c                 C  s   |j rt|tjr|d dkr| d|j|jS | dt	||j|j}t|tjrE|j
}|tjjjtjjjsEd| d| d}|S )Nr   r*   DATE_ADDzCAST(z AS ))r   r1   r   r+   textupperfuncr   r   r   return_typeis_typeDataTypeType	TIMESTAMPDATETIME)r6   r   r   r>   r'   r'   r(   _dateadd_sqlE   s    
rD   c                   @  sF   e Zd ZdZG dd dejZG dd dejZG dd dejZdS )	SparkTc                   @  s0   e Zd ZdZdd eeje ej	j
D ZdS )zSpark.TokenizerFc                 C  s"   g | ]}d D ]}|| |fqqS ))rRr'   ).0qprefixr'   r'   r(   
<listcomp>c   s    
zSpark.Tokenizer.<listcomp>N)__name__
__module____qualname__%STRING_ESCAPES_ALLOWED_IN_RAW_STRINGSr!   r"   Listr2   r	   	TokenizerQUOTESRAW_STRINGSr'   r'   r'   r(   rQ   `   s
    
rQ   c                      s   e Zd Zi ejjeeje	e	e	e
ejeeededdd d
Zi ejjejdd iZdd	d
Zd fddZ  ZS )zSpark.ParserTIMESTAMP_LTZTIMESTAMP_NTZc                 C  s"   t jt| dtt| ddddS )Nr   r   T)r   expressionsoffsetsafe)r   Bracketr   r   )r   r'   r'   r(   <lambda>u   s    zSpark.Parser.<lambda>)
	ANY_VALUEr9   DATEADDTIMESTAMPADDTIMESTAMPDIFFDATEDIFF	DATE_DIFFrT   rU   TRY_ELEMENT_ATc                 C  s   |   S N)_parse_query_parameter)r6   r'   r'   r(   rZ      s    r   t.Optional[exp.Expression]c                 C  s&   |   }| tj | jtj|ddS )NT)r   widget)_parse_id_var_matchr   R_BRACEr   r   Placeholderr6   r   r'   r'   r(   rc      s   z#Spark.Parser._parse_query_parameterkexp.GeneratedAsIdentityColumnConstraint | exp.ComputedColumnConstraint | exp.GeneratedAsRowColumnConstraintc                   s&   t   }|jr| jtj|jdS |S )Nr   )super_parse_generated_as_identityr   r   ComputedColumnConstraintrj   	__class__r'   r(   rm      s   
z)Spark.Parser._parse_generated_as_identity)r   rd   )r   rk   )rL   rM   rN   r	   Parser	FUNCTIONSr   r   AnyValuer/   r   TimestampDiffr)   r   PLACEHOLDER_PARSERSr   L_BRACErc   rm   __classcell__r'   r'   ro   r(   rq   i   s,    

rq   c                      s6  e Zd ZdZdZdZdZdZdZi e	j
j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i e	j
jejdd	 ejeed
d	 egejedejdd	 ejedejeej eej!e"ej#e"ej$dd	 i
Ze%ej& e%ej' e%ej( d! fddZ)d"ddZ*d#ddZ+d$ddZ,d% fdd Z-  Z.S )&r7   TFzDECIMAL(15, 4)zDECIMAL(6, 4)STRINGrT   rU   c                 C  s   |  d| j dg|jR  S )NARRAY_COMPACTARRAY)r=   rV   r6   r0   r'   r'   r(   rZ      s    zSpark.Generator.<lambda>c                 C  s
   t | tS rb   )r   r
   r4   r'   r'   r(   rZ      s    ENDSWITHc                 C  s(   d|  | jdd |jjD dd S )NzPARTITIONED BY c                 S  s   g | ]}t |qS r'   )r5   )rH   r0   r'   r'   r(   rK      s    z,Spark.Generator.<lambda>.<locals>.<listcomp>T)sqls
skip_first)wraprV   r   r{   r'   r'   r(   rZ      s   (
STARTSWITHc                 C  s    |j dr| |S | |S )NrX   )r   gettrycast_sqlcast_sqlr{   r'   r'   r(   rZ      s    r   exp.Bracketr   r2   c                   s<   |j drt| j|ddd}| d|j|S t |S )NrX   r   )index_offsetr   ra   )r   r   r   bracket_offset_expressionsr=   r   rl   bracket_sql)r6   r   keyro   r'   r(   r      s   zSpark.Generator.bracket_sqlexp.ComputedColumnConstraintc                 C  s   d|  |d dS )NzGENERATED ALWAYS AS (r   r:   )sqlr6   r   r'   r'   r(   computedcolumnconstraint_sql   s   z,Spark.Generator.computedcolumnconstraint_sqlexp.AnyValuec                 C  s
   |  |S rb   )function_fallback_sqlr   r'   r'   r(   anyvalue_sql   s   
zSpark.Generator.anyvalue_sqlexp.DateDiffc                 C  s@   |  |d}|  |d}|jr| dt|||S | d||S )Nr   r   r_   )r   r   r=   r   )r6   r   endstartr'   r'   r(   datediff_sql   s
   zSpark.Generator.datediff_sqlexp.Placeholderc                   s&   |j dst |S d|j dS )Nre   {})r   r   rl   placeholder_sqlr$   r   ro   r'   r(   r      s   zSpark.Generator.placeholder_sql)r   r   r   r2   )r   r   r   r2   )r   r   r   r2   )r   r   r   r2   )r   r   r   r2   )/rL   rM   rN   SUPPORTS_TO_NUMBERPAD_FILL_PATTERN_IS_REQUIREDSUPPORTS_CONVERT_TIMEZONESUPPORTS_MEDIANSUPPORTS_UNIX_SECONDSSUPPORTS_DECODE_CASEr	   	GeneratorTYPE_MAPPINGr   r@   rA   MONEY
SMALLMONEYUUIDTIMESTAMPLTZTIMESTAMPNTZ
TRANSFORMSArrayConstructCompactCreater   r   r   EndsWithr   PartitionedByProperty
StartsWithr+   rD   r.   DatetimeDiffr   rt   TryCastpoprs   r%   Groupr   r   r   r   r   rw   r'   r'   ro   r(   r      sV    




	

	





	r   N)rL   rM   rN   SUPPORTS_ORDER_BY_ALLr	   rQ   rq   r   r'   r'   r'   r(   rE   ]   s
    	*rE   )r   r   r   r   )r0   r   r   r   )r6   r7   r   r8   r   r2   ) 
__future__r   typingr!   sqlglotr   sqlglot.dialects.dialectr   r   r   r   sqlglot.dialects.hiver   sqlglot.dialects.spark2r	   r
   r   sqlglot.helperr   r   sqlglot.tokensr   sqlglot.transformsr   r   r   r   r)   r/   r5   rD   rE   r'   r'   r'   r(   <module>   s    



	