o
    8Di=                     @  s   d dl mZ d dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZmZ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 ejrId d	lmZ dddZG dd deZdS )    )annotationsN)exp
transforms)	NormalizationStrategyconcat_to_dpipe_sqlconcat_ws_to_dpipe_sqldate_delta_sql'generatedasidentitycolumnconstraint_sqljson_extract_segmentsno_tablesample_sqlrename_funcmap_date_part)Postgres)seq_get)	TokenTypebuild_convert_timezone)E	expr_type	t.Type[E]returnt.Callable[[t.List], E]c                   s   d fdd}|S )Nargst.Listr   r   c                   sF    t | dt | dtt | dd} tju r!|dtjd |S )N      r   )this
expressionunitreturn_type	TIMESTAMP)r   r   r   	TsOrDsAddsetDataTypebuild)r   exprr    R/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/dialects/redshift.py_builder   s   
z#_build_date_delta.<locals>._builder)r   r   r   r   r'   )r   r)   r'   r&   r(   _build_date_delta   s   r*   c                   @  sv   e Zd ZejZdZdZdZdZ	dZ
dZi ejd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dS )RedshiftFr   Tz'YYYY-MM-DD HH24:MI:SS'z%bz%Hz%I)MONHH24HHc                      s   e Zd Zi ejjdd dd eejeejeej	eej	ej
jejjdd ejjd
Zi ejjdd dd dZd	Z	
	
		
	
	
	
d!d" fddZ	d#d$ddZd%dd Z  ZS )&zRedshift.Parserc                 C  s,   t jt| dt| dt dt jddS )Nr   r   monthr    )r   r   r   r   )r   r!   r   varr#   r$   r   r'   r'   r(   <lambda>:   s    
zRedshift.Parser.<lambda>c                 C  s
   t | dS )NUTCr   r1   r'   r'   r(   r2   @      
 c                 C  s&   t jt| dt| dpt jddS )Nr   r   ,)r   r   )r   StringToArrayr   Literalstringr1   r'   r'   r(   r2   G   s    )

ADD_MONTHSCONVERT_TIMEZONEDATEADDDATE_ADDDATEDIFF	DATE_DIFFGETDATELISTAGGSPLIT_TO_ARRAYSTRTOLc                 C  s   |   S N)_parse_approximate_countselfr'   r'   r(   r2   O   s    c                 C  s   | j tjddS )NT)sysdate)r   r   CurrentTimestamprE   r'   r'   r(   r2   P   s    )APPROXIMATESYSDATETFNschemabooljoinsalias_tokens#t.Optional[t.Collection[TokenType]]parse_bracketis_db_referenceparse_partitionconsume_piper   t.Optional[exp.Expression]c           
        s<   |  tj}t j|||||d}	|r| jtj|	ddS |	S )N)rK   rM   rN   rP   rQ   T)r   unpivot)_matchr   UNPIVOTsuper_parse_tabler   r   Pivot)
rF   rK   rM   rN   rP   rQ   rR   rS   rU   table	__class__r'   r(   rY   U   s   zRedshift.Parser._parse_tablestrictsafet.Optional[bool]c                 C  s0   |   }| tj |  }| jtj|||dS )N)r   tor_   )_parse_typesrV   r   COMMA_parse_bitwiser   r   TryCast)rF   r^   r_   ra   r   r'   r'   r(   _parse_convertk   s   zRedshift.Parser._parse_convertt.Optional[exp.ApproxDistinct]c                 C  sT   | j d }|  }t|tjr#t|jtjr#| jtjt	|jj
ddS | | d S )Nr   r   )r   )_index_parse_function
isinstancer   Countr   Distinctr   ApproxDistinctr   expressions_retreat)rF   indexfuncr'   r'   r(   rD   s   s   

z(Redshift.Parser._parse_approximate_count)FFNFFFF)rK   rL   rM   rL   rN   rO   rP   rL   rQ   rL   rR   rL   rS   rL   r   rT   rC   )r^   rL   r_   r`   r   rT   )r   rg   )__name__
__module____qualname__r   Parser	FUNCTIONSr*   r   r!   
TsOrDsDiffrH   from_arg_listGroupConcatFromBaseNO_PAREN_FUNCTION_PARSERSSUPPORTS_IMPLICIT_UNNESTrY   rf   rD   __classcell__r'   r'   r\   r(   ru   7   sB    ru   c                
   @  sn   e Zd Zg Zg ZddgZi ejje	j
e	je	je	je	je	je	je	jdZed ejj Zed dS )zRedshift.Tokenizer\')z(+)	HLLSKETCHMINUSSUPERTOPUNLOADVARBYTEzBINARY VARYINGVALUES#N)rr   rs   rt   BIT_STRINGSHEX_STRINGSSTRING_ESCAPESr   	TokenizerKEYWORDSr   JOIN_MARKERr   EXCEPTr   r   COMMAND	VARBINARYpopSINGLE_TOKENScopyr'   r'   r'   r(   r   |   s&    
r   c                      sr  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZd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
ejjj dejjj!diZi ejj"i ej#dd ej$e%ej&e'ej(dd ej)dd ej*e+dej,e+dej-dd ej.dd ej/dd ej0e1dej2e3ej4e5dej6e5dej7e1dej8dd ej9e:;e:j<e:j=e:j>e:j?e:j@gejAdd ejBdd ejCe1dejDeEejFe+dejGe+dejHdd iZ"e"IejJ e"IejK e"IejL e"IejM e"IejN h dZOd8d!d"ZPd9d: fd'd(ZQd; fd*d+ZRd<d-d.ZSd= fd0d1ZTd>d3d4ZUd?d6d7ZV  ZWS )@zRedshift.GeneratorFTTO_HEX
JSON_PARSETYPE r   INTEGERTIMEr    c                 C  s   | j |ddS )NARRAY_CONCAT)name)arrayconcat_sqlrF   er'   r'   r(   r2          zRedshift.Generator.<lambda>c                 C  s   d|  |d dS )NzAPPROXIMATE COUNT(DISTINCT r   ))sqlr   r'   r'   r(   r2         c                 C  s   |j drdS dS )NrG   rJ   z	GETDATE())r   getr   r'   r'   r(   r2      r   r;   r=   c                 C  s   |  d|jS )NDISTKEY)rq   r   r   r'   r'   r(   r2      r   c                 C  
   |  |S rC   )naked_propertyr   r'   r'   r(   r2      r4   c                 C  r   rC   )explode_sqlr   r'   r'   r(   r2      r4   rB   JSON_EXTRACT_PATH_TEXTr@   c              
   C  s   |  d|  d| |dS )NUPPERr   r   )rq   r   r   r'   r'   r(   r2      s    c                 C  s&   |j d rdnd d| j|j  dS )Ncompoundz	COMPOUND  zSORTKEY(r   )r   format_argsr   r   r'   r'   r(   r2      s   &c                 C  s    |  |j d|  |j dS )Nz LIKE z || '%')r   r   r   r   r'   r'   r(   r2      s    rA   c                 C  r   rC   )_unix_to_time_sqlr   r'   r'   r(   r2      r4   >   encrypt     asdoinisonorra   allandanyascendforlunlzonewnotoffoidoldrawtagtopaz64bothcasecastdescelsefromfullgzipintojoinleftlikelunslzopnullonlyopensometdesthentruetypeuserwhenwitharraybzip2checkcrossdeltafalsegrantgroupilikeinnerlimitminusnullsorderouterpivotrightr[   unionusingwhereaes128aes256backupbinarycolumncreatedefragenableencodeexceptfreezehavingignoreisnulloffsetresortselectsystemuniqueunnestwalletanalyseanalyzebetweencollatedefaultdeflatedisableforeignleadingmostly8naturalnotnullofflinepercentplacingprimaryrecoverrespectrestoresimilarrG   text255text32krU   verbosewithoutbytedictdelta32kdistinctexplicitidentityintervalmostly16mostly32overlapsparallelsnapshottrailing	initially	intersect	localtime	partition	readratio	rejectlog	timestamp
constraint
deferrable
encryption
referencescredentialsemptyasnullpermissionsblanksasnullcurrent_datecurrent_timecurrent_usersession_userauthorizationglobaldict256globaldict64kallowoverwritelocaltimestampcurrent_user_idtruncatecolumnscurrent_timestampr   
exp.Unnestr   strc                 C  s   |j }t|}|dkr| d|  dS t|tjtjtjtjr*| d dS | 	t
|d}| j |jdddd	}|rG| d
| S |S )Nr   z+Unsupported number of arguments in UNNEST: r   z5Unsupported UNNEST when not used in FROM/JOIN clausesr   aliascolumnsT)keyflatz AS )rn   lenunsupportedrj   find_ancestorr   FromJoinSelectr   r   r   r   )rF   r   r   num_argsargrI  r'   r'   r(   
unnest_sql  s   
zRedshift.Generator.unnest_sqlNexp.Castsafe_prefixt.Optional[str]c                   s,   | tjjjr| |dS t j||dS )Nr   )rW  )is_typer   r#   TypeJSONr   rX   cast_sql)rF   r   rW  r\   r'   r(   r\    s   zRedshift.Generator.cast_sqlexp.DataTypec                   sJ   | dr|dtjjj |jd}|s|dt	d t
 |S )a}  
            Redshift converts the `TEXT` data type to `VARCHAR(255)` by default when people more generally mean
            VARCHAR of max length which is `VARCHAR(max)` in Redshift. Therefore if we get a `TEXT` data type
            without precision we convert it to `VARCHAR(max)` and if it does have precision then we just convert
            `TEXT` to `VARCHAR`.
            textr   rn   MAX)rY  r"   r   r#   rZ  VARCHARr   r   appendr0   rX   datatype_sql)rF   r   	precisionr\   r'   r(   rb    s   
zRedshift.Generator.datatype_sqlexp.AlterSetc                 C  sv   | j |dd}|rd| dnd}| |d}|rd| nd}| j |ddd	d
}|r0d| nd}d| | | S )NT)rL  z TABLE PROPERTIES (r   r   locationz
 LOCATION file_formatr   )rK  rL  sepz FILE FORMAT SET)rn   r   )rF   r   exprsre  rf  r'   r'   r(   alterset_sql  s   zRedshift.Generator.alterset_sql	exp.Arrayc                   s&   |j drt |S td| |S )Nbracket_notationARRAY)r   r   rX   	array_sqlr   rF   r   r\   r'   r(   rn    s   zRedshift.Generator.array_sqlexp.Explodec                 C  s   |  d dS )NzUnsupported EXPLODE() functionr   )rN  ro  r'   r'   r(   r     s   
zRedshift.Generator.explode_sqlexp.UnixToTimec                 C  sT   |j d}| |j}|d ur$|tjjkr$|jr$d| d|  d}d| dS )Nscale(z / POWER(10, z))z(TIMESTAMP 'epoch' + z * INTERVAL '1 SECOND'))	r   r   r   r   r   
UnixToTimeSECONDSis_intto_py)rF   r   rr  r   r'   r'   r(   r     s
   z$Redshift.Generator._unix_to_time_sql)r   rG  r   rH  rC   )r   rV  rW  rX  r   rH  )r   r]  r   rH  )r   rd  r   rH  )r   rk  r   rH  )r   rp  r   rH  )r   rq  r   rH  )Xrr   rs   rt   LOCKING_READS_SUPPORTEDQUERY_HINTSVALUES_AS_TABLETZ_TO_WITH_TIME_ZONENVL2_SUPPORTEDLAST_DAY_SUPPORTS_DATE_PARTCAN_IMPLEMENT_ARRAY_ANYMULTI_ARG_DISTINCTCOPY_PARAMS_ARE_WRAPPEDHEX_FUNCPARSE_JSON_NAMEARRAY_CONCAT_IS_VAR_LENSUPPORTS_CONVERT_TIMEZONE#EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSESUPPORTS_MEDIANALTER_SET_TYPESUPPORTS_DECODE_CASEWITH_PROPERTIES_PREFIXr   	GeneratorTYPE_MAPPINGr   r#   rZ  BINARYBLOBINTTIMETZTIMESTAMPTZr   
ROWVERSION
TRANSFORMSArrayConcatConcatr   ConcatWsr   rm   rH   DateAddr   DateDiffDistKeyPropertyDistStylePropertyExploderz   r   #GeneratedAsIdentityColumnConstraintr	   JSONExtractr
   JSONExtractScalarry   HexrR  r   
preprocesseliminate_window_clauseeliminate_distinct_oneliminate_semi_and_anti_joinsunqualify_unnest.unnest_generate_date_array_using_recursive_cteSortKeyProperty
StartsWithr6   TableSampler   r!   rw   rt  r   rZ   	ParseJSONAnyValueLastDaySHA2RESERVED_KEYWORDSrU  r\  rb  rj  rn  r   r   r}   r'   r'   r\   r(   r     s    


























* 
!


r  N)rr   rs   rt   r   CASE_INSENSITIVENORMALIZATION_STRATEGYSUPPORTS_USER_DEFINED_TYPESINDEX_OFFSETCOPY_PARAMS_ARE_CSVHEX_LOWERCASEHAS_DISTINCT_ARRAY_CONSTRUCTORSTIME_FORMATr   TIME_MAPPINGru   r   r  r'   r'   r'   r(   r+   )   s    Er+   )r   r   r   r   )
__future__r   typingtsqlglotr   r   sqlglot.dialects.dialectr   r   r   r   r	   r
   r   r   r   sqlglot.dialects.postgresr   sqlglot.helperr   sqlglot.tokensr   sqlglot.parserr   TYPE_CHECKINGsqlglot._typingr   r*   r+   r'   r'   r'   r(   <module>   s    ,
