o
    8Di                 	   @  s  d dl mZ d dlZd dlZd dlZd dl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mZ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& d dl'm(Z(m)Z)m*Z* d dl+m,Z, ej-ej.ej/ej0ej1ej2f Z3ej-ej.ej1ej0f Z4ej-ej5ej6f Z7ej8rd dl9m:Z:m;Z;m<Z< d dl=m>Z> ej?ej@e; ejAe>e;ge;f f ZBeCdZDdddddddddZEdMdd ZFG d!d" d"eGeZHG d#d$ d$eGeZIG d%d& d&eJZKG d'd( d(eLZMG d)d* d*eMd+ZNej-eGeNej@eN df ZOdNd/d0ZPed1dOd6d7ZQ	dPdQd<d=ZRdRd?d@ZSdSdBdCZTdSdDdEZUdTdGdHZVdUdJdKZWdVdMdNZXdWdPdQZYdXdSdTZZdYdVdWZ[dZdYdZZ\d[d\d]Z]d\d_d`Z^	a	b	b	cd]d^djdkZ_d_dmdnZ`	od`dadrdsZa	dbdcdzd{Zb	dbddd~dZc			bdedfddZddgddZedhddZfdiddZgdjdkddZhdlddZidmddZjdnddZkdoddZldoddZm	bdjdpddZndqddZo	cdrdsddZpdtddZqduddZrdvddZsdwdxddZtdyddZudzddÄZvd{ddƄZwedddɃd|dd̄Zxeddd̓d}ddЄZyd~ddՄZzdddڄZ{ddd݄Z|dddZ}dddZ~dddZdddZdddZdddZdddZdjdddZddddZddddZejeNfdddZejeNfdddZeNfdddZdddZdddZ	bddd
dZ	ddddZdddZdddZdddZdddZ	ddd!d"Zdd$d%Zdd'd(Zdd*d+Zdd-d.Zdd0d1Zdd3d4Zddd8d9Zdd;d<Z	=	>	c	bdddBdCZddEdFZddHdIZddKdLZdS (      )annotationsN)Enumauto)reduce)exp)DIALECT_MODULE_NAMES)
ParseError)	Generatorunsupported_args)AutoNameflattenis_intseq_get
subclassessuggest_closest_match_and_failto_bool)JSONPathTokenizerparse)Parser)	TIMEZONESformat_timesubsecond_precision)Token	Tokenizer	TokenType)new_trie)BEF)TypeAnnotatorsqlglot
	\)z\az\bz\fz\nz\rz\tz\vz\\	data_typeexp.DataType.Typereturn!t.Callable[[TypeAnnotator, E], E]c                       fddS )Nc                   s   |  | S N)_annotate_with_typeselfer)    Q/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/dialects/dialect.py<lambda>?       z+annotate_with_type_lambda.<locals>.<lambda>r4   r3   r4   r3   r5   annotate_with_type_lambda>      r8   c                   @  s   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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!S )"DialectszDialects supported by SQLGLot. athenabigquery
clickhouse
databricksdorisdremiodrilldruidduckdbdunefabrichivematerializemysqloraclepostgresprestoprqlredshift
risingwave	snowflakesparkspark2sqlite	starrockstableauteradatatrinotsqlexasolN)#__name__
__module____qualname____doc__DIALECTATHENABIGQUERY
CLICKHOUSE
DATABRICKSDORISDREMIODRILLDRUIDDUCKDBDUNEFABRICHIVEMATERIALIZEMYSQLORACLEPOSTGRESPRESTOPRQLREDSHIFT
RISINGWAVE	SNOWFLAKESPARKSPARK2SQLITE	STARROCKSTABLEAUTERADATATRINOTSQLEXASOLr4   r4   r4   r5   r:   B   sB    r:   c                   @  s6   e Zd ZdZe Z	 e Z	 e Z	 e Z	 e Z	dS )NormalizationStrategyzKSpecifies the strategy according to which identifiers should be normalized.N)
rZ   r[   r\   r]   r   	LOWERCASE	UPPERCASECASE_SENSITIVECASE_INSENSITIVECASE_INSENSITIVE_UPPERCASEr4   r4   r4   r5   r}   g   s    r}   c                      s   e Zd Zd fddZ  ZS )Versionversion_strt.Optional[str]c                   sX   |r | d}|dgdt|   tddd |D }ntj}tt| 	| |S )N.0   r;   c                 S  s   g | ]}| d qS )r   )zfill).0pr4   r4   r5   
<listcomp>       z#Version.__new__.<locals>.<listcomp>)
splitextendlenintjoinsysmaxsizesuperr   __new__)clsr   argskwargspartsv	__class__r4   r5   r   {   s   
zVersion.__new__)r   r   )rZ   r[   r\   r   __classcell__r4   r4   r   r5   r   z   s    r   c                      sx   e Zd ZU i Zded< dddZdd
dZedd Ze	d ddZ
e	d!ddZe		d"d#ddZ fddZ  ZS )$_Dialectzt.Dict[str, t.Type[Dialect]]_classesothert.Anyr+   boolc                 C  s>   | |u rdS t |tr| | |u S t |tr| t|u S dS )NTF)
isinstancestrgetDialecttype)r   r   r4   r4   r5   __eq__   s   

z_Dialect.__eq__r   c                 C  s   t | j S r.   )hashrZ   lower)r   r4   r4   r5   __hash__      z_Dialect.__hash__c                 C  s,   t tt | jkrtD ]}| | q| jS r.   )r   r   r   	_try_loadr   keyr4   r4   r5   classes   s   z_Dialect.classesr   str | DialectsNonec                 C  s0   t |tr|j}|tv rtd|  d S d S )Nzsqlglot.dialects.)r   r:   valuer   	importlibimport_moduler   r4   r4   r5   r      s
   
z_Dialect._try_loadr   t.Type[Dialect]c                 C  s   || j vr
| | | j | S r.   )r   r   r   r4   r4   r5   __getitem__   s   


z_Dialect.__getitem__Ndefaultt.Optional[t.Type[Dialect]]c                 C  s"   || j vr
| | | j ||S r.   )r   r   r   )r   r   r   r4   r4   r5   r      s   

z_Dialect.getc                   s  t  | ||| tj| } | j|d ur|jn| < t	 j
 _ jr-t	 jn j _dd  j
 D  _t	 j _dd  j D  _t	 j _dd  j D  _t|d}t|dtf}t|dtf}t|dtf}t|d	tf}	 jd
td
|i  _ jdtd|i  _ jdtd|i  _ jdtd|	i  _ t! jj" d \ _# _$t! jj% d \ _& _'d fdd}
|
t(j)\ _* _+|
t(j,\ _- _.|
t(j/\ _0 _1|
t(j2\ _3 _4d jj5v ri t6 j6 _6dd  j6 D  _7d jj8v  _9|dvr d j _:|dvr-d j _;d j _<|dvrH j j=> }dD ]	}|?|d  q:| j _=|dvra jj@t(jAhB  j_@ jjBt(jAhB  j_B|dvrjd j _C jDsz jjBt(jEt(jFhB  j_B S ) Nc                 S     i | ]\}}||qS r4   r4   r   kr   r4   r4   r5   
<dictcomp>   r   z$_Dialect.__new__.<locals>.<dictcomp>c                 S  r   r4   r4   r   r4   r4   r5   r      r   c                 S  r   r4   r4   r   r4   r4   r5   r      s    
r   tokenizer_classjsonpath_tokenizer_classparser_classgenerator_classr   r   r   r	   
token_typer   r+   )t.Tuple[t.Optional[str], t.Optional[str]]c                   s    t  fddjj D dS )Nc                 3  s(    | ]\}\}}| kr||fV  qd S r.   r4   )r   sr2   tr   r4   r5   	<genexpr>   s    
z:_Dialect.__new__.<locals>.get_start_end.<locals>.<genexpr>NN)nextr   _FORMAT_STRINGSitemsr   klassr   r5   get_start_end   s   

z'_Dialect.__new__.<locals>.get_start_endr(   c                 S  r   r4   r4   r   r4   r4   r5   r      r   z(+))r;   r=   r4   )r;   r<   rL   rW   rD   F)r;   r?   rG   rQ   rR   )cluster
distributesort)r;   r@   rI   )r;   r?   rJ   rN   rP   rQ   )r   r   r+   r   )Gr   r   r:   __members__r   upperr   r   r   r   TIME_MAPPING	TIME_TRIEFORMAT_MAPPINGFORMAT_TRIEr   INVERSE_TIME_MAPPINGINVERSE_TIME_TRIEINVERSE_FORMAT_MAPPINGINVERSE_FORMAT_TRIECREATABLE_KIND_MAPPINGINVERSE_CREATABLE_KIND_MAPPINGr   getattrr   r   r   r	   __dict__r   r   r   r   r   list_QUOTESQUOTE_START	QUOTE_END_IDENTIFIERSIDENTIFIER_STARTIDENTIFIER_ENDr   
BIT_STRING	BIT_STARTBIT_END
HEX_STRING	HEX_STARTHEX_ENDBYTE_STRING
BYTE_STARTBYTE_ENDUNICODE_STRINGUNICODE_STARTUNICODE_ENDSTRING_ESCAPESUNESCAPED_SEQUENCESESCAPED_SEQUENCESKEYWORDSSUPPORTS_COLUMN_JOIN_MARKSSELECT_KINDSTRY_SUPPORTEDSUPPORTS_UESCAPE AFTER_HAVING_MODIFIER_TRANSFORMScopypopID_VAR_TOKENSSTRAIGHT_JOINTABLE_ALIAS_TOKENSSUPPORTS_DECODE_CASESUPPORTS_SEMI_ANTI_JOINANTISEMI)r   clsnamebasesattrsenumbasebase_tokenizerbase_jsonpath_tokenizerbase_parserbase_generatorr   modifier_transformsmodifierr   r   r5   r      s   










z_Dialect.__new__r   r   r+   r   r+   r   )r   r   r+   r   )r   r   r+   r   r.   )r   r   r   r   r+   r   )rZ   r[   r\   r   __annotations__r   r   propertyr   classmethodr   r   r   r   r   r4   r4   r   r5   r      s   
 



r   c                /   @  s
  e Zd ZU dZ	 dZ	 dZ	 dZ	 dZ	 ej	Z
	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZded< 	 dZded< 	 dZd	ed
< 	 dZ	 dZ	 dZ	 dZ	 dZ	 dZdZdZi Zded< 	 i Zded< 	 i Z ded< 	 e! Z"ded< 	 dZ#	 dZ	 dZ$	 dZ%	 dZ&	 dZ'	 dZ(	 dZ)	 dZ*	 dZ+d	ed< 	 dZ,	 dZ-	 dZ.	 dZ/ded< 	 dZ0	 e1j2de1j3de1j4diZ5ded< 	 i Z6ded< 	 dZ7e8Z9e:Z;e<Z=e>Z?i Z@ded< i ZAded< i ZBded< i ZCded< i ZDded < i ZEded!< i ZFded"< i ZGded#< d$ZHd$ZId%ZJd%ZKd&ZLd'ed(< d&ZMd'ed)< d&ZNd'ed*< d&ZOd'ed+< d&ZPd'ed,< d&ZQd'ed-< d&ZRd'ed.< d&ZSd'ed/< i d0d1d2d1d3d1d4d1d5d1d6d1d7d1d8d9d:d9d;d9d<d9d=d>d?d>d@d>dAd>dBdCdDdCi dEdCdFdCdGdHdIdHdJdHdKdLdMdLdNdLdOdPdQdPdRdPdSdPdTdPdUdVdWdVdXdVdYdZi d[dZd\dZd]dZd^d_d`d_dad_dbd_dcd_dddedfdedgdedhdedidedjdkdldkdmdkdndki dodpdqdpdrdpdsdpdtdpdudpdvdpdwdpdxdpdydzd{dzd|dzd}dzd~dzddzddzddzi dddddddddddddddddddddddddddddddddddddddddZTe1jUjVjWe1jXe1jYe1jZe1j[e1j\e1j]e1j^he1jUjVj_e1j`he1jUjVjae1jbe1jce1jde1jee1jfe1jge1jhe1jihe1jUjVjje1jke1jle1jme1jne1joe1jpe1jqe1jrhe1jUjVjse1jte1jue1jve1jwhe1jUjVjxe1jye1jze1j{e1j|e1j}e1j~e1je1je1je1je1je1je1je1je1je1jhe1jUjVje1je1je1je1je1je1je1je1je1je1jh
e1jUjVje1je1jhe1jUjVje1jhe1jUjVje1je1je1je1jhe1jUjVje1jhe1jUjVje1je1je1je1je1je1jhe1jUjVje1je1je1je1je1jhe1jUjVje1je1je1je1je1je1je1je1je1je1je1je1je1je1je1je1je1je1je1je1jhiZded< i dd ee1j e1je1jfD dd ee1j e1jƃD dd e ǡ D i e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jUdd i e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd i e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd e1jdd Zded< i Zded< ddhZed$ddZed%ddZd&ddZd'ddZd(ddZ d)ddZd*ddZd+d,ddZd-d.ddZd/d dZd0ddZd1dd	Zd-d2ddZd3ddZ	d4ddZ
d5ddZd6ddZd7ddZd8ddZd9d"d#Zd&S (:  r   r   FTr   z
bool | strNORMALIZE_FUNCTIONSr   PRESERVE_ORIGINAL_NAMESzt.Optional[bool]LOG_BASE_FIRSTnulls_are_smallz
'%Y-%m-%d'z'%Y%m%d'z'%Y-%m-%d %H:%M:%S'zt.Dict[str, str]r   r   r   z
t.Set[str]PSEUDOCOLUMNSARRAY_AGG_INCLUDES_NULLSHEX_STRING_IS_INTEGER_TYPEz0t.Dict[t.Type[exp.Expression], t.Optional[bool]]SET_OP_DISTINCT_BY_DEFAULTzdict[str, str]r   zt.Dictr   r   r   r   r   r   r   r   '"Nr   r   r   r   r   r   r   r   r   YYEARYYYYYYYYYYRYEARSYRSMMMONTHMONMONSMONTHSDDAYDDDAYS
DAYOFMONTHzDAY OF WEEK	DAYOFWEEKWEEKDAYDOWDWWEEKDAY_ISODAYOFWEEKISODOW_ISODW_ISOzDAY OF YEAR	DAYOFYEARDOYDYWWEEKWK
WEEKOFYEARWOYWYWEEK_ISOWEEKISOWEEKOFYEARISOWEEKOFYEAR_ISOQQUARTERQTRQTRSQUARTERSHHOURHHHRHOURSHRSMMINUTEMIMINMINUTESMINSSSECONDSECSECONDSSECSMSMILLISECONDMSECMSECSMSECONDMSECONDSMILLISEC	MILLISECS
MILLISECONMILLISECONDSUSMICROSECONDUSECUSECSMICROSEC	MICROSECSUSECONDUSECONDSMICROSECONDSNS
NANOSECONDNSECNANOSECNSECONDNSECONDSNANOSECSEPOCH_SECONDEPOCHEPOCH_SECONDSEPOCH_MILLISECONDSEPOCH_MILLISECONDEPOCH_MICROSECONDSEPOCH_MICROSECONDEPOCH_NANOSECONDSEPOCH_NANOSECONDTZHTIMEZONE_HOURTZMTIMEZONE_MINUTEDECDECADEDECSDECADESMIL	MILLENIUMCENTURY)MILSMILLENIACCENTCENTS	CENTURIESz8t.Dict[exp.DataType.Type, t.Set[t.Type[exp.Expression]]]TYPE_TO_EXPRESSIONSc                 C     i | ]}|d d qS )c                 S  
   |  |S r.   )_annotate_unaryr0   r4   r4   r5   r6        
 Dialect.<dictcomp>.<lambda>r4   r   	expr_typer4   r4   r5   r         zDialect.<dictcomp>c                 C  r  )c                 S  r  r.   )_annotate_binaryr0   r4   r4   r5   r6     r  r  r4   r  r4   r4   r5   r     r  c                 C  s$   i | ]\}}|D ]}|t |qqS r4   )r8   )r   r)   expressionsr  r4   r4   r5   r   	  s    c                 C     |  |dS Nthis_annotate_by_argsr0   r4   r4   r5   r6     r7   zDialect.<lambda>c                 C     |  |tjjjS r.   r/   r   DataTypeTypeUNKNOWNr0   r4   r4   r5   r6         c                 C     | j |dddS )Nr  Tarrayr  r0   r4   r4   r5   r6         c                 C  r  r  r  r0   r4   r4   r5   r6     r7   c                 C  r  )Nr  Tr  r  r0   r4   r4   r5   r6     r  c                 C     |  |ddS Nr  r  r  r0   r4   r4   r5   r6         c                 C  r  r  r  r0   r4   r4   r5   r6     r7   c                 C  r  r.   _annotate_by_array_elementr0   r4   r4   r5   r6     r  c                 C  r  r.   r  r0   r4   r4   r5   r6     r  c                 C  r  r  r  r0   r4   r4   r5   r6     r7   c                 C  r  r  r  r0   r4   r4   r5   r6     r7   c                 C  r  r.   )_annotate_bracketr0   r4   r4   r5   r6     r  c                 C     |  ||jd S Ntor/   r   r0   r4   r4   r5   r6     r  c                 C  r  )Nr   ifsr  r0   r4   r4   r5   r6     r  c                 C  r  r  r  r0   r4   r4   r5   r6     r  c                 C  *   |  ||jdrtjjjS tjjjS )Nbig_int)r/   r   r   r   r  r  BIGINTINTr0   r4   r4   r5   r6     s
    c                 C  s   |  || S r.   )r/   r   r0   r4   r4   r5   r6      r  c                 C  r  r.   _annotate_timeunitr0   r4   r4   r5   r6   !  r  c                 C  r  r.   r  r0   r4   r4   r5   r6   "  r  c                 C  r  r.   r  r0   r4   r4   r5   r6   #  r  c                 C  r  )Nr  r  r0   r4   r4   r5   r6   $  r7   c                 C  r  r.   )_annotate_divr0   r4   r4   r5   r6   %  r  c                 C  r  r.   )_annotate_dotr0   r4   r4   r5   r6   &  r  c                 C  r  r.   )_annotate_exploder0   r4   r4   r5   r6   '  r  c                 C  r  r.   )_annotate_extractr0   r4   r4   r5   r6   (  r  c                 C  r  r  r  r0   r4   r4   r5   r6   )  r7   c                 C  s   | j |dddddS )NstartendstepTr  r  r0   r4   r4   r5   r6   *  s    
c                 C     |  |tjdS )NzARRAY<DATE>r/   r   r  buildr0   r4   r4   r5   r6   -      c                 C  r  )NzARRAY<TIMESTAMP>r  r0   r4   r4   r5   r6   0  r  c                 C  r  r  r  r0   r4   r4   r5   r6   3  r  c                 C  r  Ntruefalser  r0   r4   r4   r5   r6   4  r  c                 C  r  r  r  r0   r4   r4   r5   r6   5  r  c                 C  r  r.   )_annotate_literalr0   r4   r4   r5   r6   6  r  c                 C  r  r  r  r0   r4   r4   r5   r6   7  r7   c                 C  r  r.   _annotate_mapr0   r4   r4   r5   r6   8  r  c                 C  r  r  r  r0   r4   r4   r5   r6   9  r  c                 C  r  r  r  r0   r4   r4   r5   r6   :  r  c                 C  r  r.   )r/   r   r  r  NULLr0   r4   r4   r5   r6   ;  r  c                 C  r  )Nr  
expressionr  r0   r4   r4   r5   r6   <  r  c                 C  r  )Nr  r  r0   r4   r4   r5   r6   =  r7   c                 C  r  r.   r  r0   r4   r4   r5   r6   >  r  c                 C  r  r.   )_annotate_structr0   r4   r4   r5   r6   ?  r  c                 C  s   | j |ddddS )Nr  r  T)promoter  r0   r4   r4   r5   r6   @  r  c                 C  r  r  r  r0   r4   r4   r5   r6   A  r7   c                 C  r  )Nwith_tz)r/   r   r   r   r  r  TIMESTAMPTZ	TIMESTAMPr0   r4   r4   r5   r6   B  s    c                 C  r  r.   )_annotate_to_mapr0   r4   r4   r5   r6   F  r  c                 C  r  r  r  r0   r4   r4   r5   r6   G  r  c                 C  r  r.   )_annotate_unnestr0   r4   r4   r5   r6   H  r  c                 C  r  r.   r  r0   r4   r4   r5   r6   I  r  c                 C  r  r  r  r0   r4   r4   r5   r6   J  r7   AnnotatorsType
ANNOTATORSz3t.Dict[exp.DataType.Type, t.Set[exp.DataType.Type]]
COERCES_TOnormalization_strategyversiondialectDialectTyper+   c           
      C  s  |s|  S t |tr| S t |tr|S t |trz:|d^}}dd |D }i }|D ]%}|d  }d}t|dkr?d}nt|dkrK|d  }t|||< q,W n tyb   td	| d
w | 	| }	|	stt
d|tt |	duszJ |	di |S td| dt| d)az  
        Look up a dialect in the global dialect registry and return it if it exists.

        Args:
            dialect: The target dialect. If this is a string, it can be optionally followed by
                additional key-value pairs that are separated by commas and are used to specify
                dialect settings, such as whether the dialect's identifiers are case-sensitive.

        Example:
            >>> dialect = dialect_class = get_or_raise("duckdb")
            >>> dialect = get_or_raise("mysql, normalization_strategy = case_sensitive")

        Returns:
            The corresponding Dialect instance.
        ,c                 s  s    | ]}| d V  qdS )=N)r   )r   kvr4   r4   r5   r   q  s    z'Dialect.get_or_raise.<locals>.<genexpr>r   N   T   zInvalid dialect format: 'z@'. Please use the correct format: 'dialect [, k1 = v2 [, ...]]'.r  zInvalid dialect type for 'z': 'z'.r4   )r   r   r   r   r   stripr   r   
ValueErrorr   r   r   r   r   )
r   r  dialect_name
kv_stringskv_pairsr   pairr   r   resultr4   r4   r5   get_or_raiseV  s>   



zDialect.get_or_raiser   t.Optional[str | exp.Expression]t.Optional[exp.Expression]c                 C  sR   t |trtjt|dd | j| jS |r'|jr'tjt|j	| j| jS |S )zRConverts a time format in this dialect to its equivalent Python `strftime` format.r  )
r   r   r   Literalstringr   r   r   	is_stringr  )r   r  r4   r4   r5   r     s   

zDialect.format_timer   c                 K  sj   t |dd | _|dd }|d u r| j| _nt| | _|| _| | j	 D ]	}t
d|| j	 q)d S )Nr  r  setting)r   r   r  NORMALIZATION_STRATEGYr  r}   r   settingskeysSUPPORTED_SETTINGSr   )r1   r   r  unsupported_settingr4   r4   r5   __init__  s   
zDialect.__init__r   r   c                 C  s   t | |kS r.   )r   )r1   r   r4   r4   r5   r        zDialect.__eq__r   c                 C  s   t t| S r.   )r   r   r1   r4   r4   r5   r     r  zDialect.__hash__r   c                 C  sf   t |tjr1| jtjur1|jr| jtjtjfv r1| jtj	tjfv r&|j
 n|j
 }|d| |S )a  
        Transforms an identifier in a way that resembles how it'd be resolved by this dialect.

        For example, an identifier like `FoO` would be resolved as `foo` in Postgres, because it
        lowercases all unquoted identifiers. On the other hand, Snowflake uppercases them, so
        it would resolve it as `FOO`. If it was quoted, it'd need to be treated as case-sensitive,
        and so any normalization would be prohibited in order to avoid "breaking" the identifier.

        There are also dialects like Spark, which are case-insensitive even when quotes are
        present, and dialects like MySQL, whose resolution rules match those employed by the
        underlying operating system, for example they may always be case-sensitive in Linux.

        Finally, the normalization behavior of some engines can even be controlled through flags,
        like in Redshift's case, where users can explicitly set enable_case_sensitive_identifier.

        SQLGlot aims to understand and handle all of these different behaviors gracefully, so
        that it can analyze queries in the optimizer and successfully capture their semantics.
        r  )r   r   
Identifierr  r}   r   quotedr   r   r   r  r   r   set)r1   r  
normalizedr4   r4   r5   normalize_identifier  s(   
	
	zDialect.normalize_identifiertextr   c                   s>   | j tju rdS | j tju rtjntj t fdd|D S )zTChecks if text contains any case sensitive characters, based on the dialect's rules.Fc                 3  s    | ]} |V  qd S r.   r4   )r   charunsafer4   r5   r     s    z)Dialect.case_sensitive.<locals>.<genexpr>)r  r}   r   r   r   islowerisupperany)r1   r  r4   r   r5   case_sensitive  s   zDialect.case_sensitivesafeidentify
str | boolc                 C  s,   |du s|dkr
dS |dkr|  | S dS )ag  Checks if text can be identified given an identify option.

        Args:
            text: The text to check.
            identify:
                `"always"` or `True`: Always returns `True`.
                `"safe"`: Only returns `True` if the identifier is case-insensitive.

        Returns:
            Whether the given text can be identified.
        Talwaysr  F)r  )r1   r  r  r4   r4   r5   can_identify  s
   zDialect.can_identifyc                 C  sH   t |tjr"t |jtjs"|j}|d|p | |p tj	|  |S )as  
        Adds quotes to a given identifier.

        Args:
            expression: The expression of interest. If it's not an `Identifier`, this method is a no-op.
            identify: If set to `False`, the quotes will only be added if the identifier is deemed
                "unsafe", with respect to its characters and this dialect's normalization strategy.
        r  )
r   r   r  parentFuncr  r  r  SAFE_IDENTIFIER_REmatch)r1   r  r  namer4   r4   r5   quote_identifier   s   	zDialect.quote_identifierpathc              
   C  s   t |tjr@|j}|jrd| d}zt|| W S  ty? } z| jr4t	dt
|  W Y d }~|S W Y d }~|S d }~ww |S )N[]zInvalid JSON path syntax. )r   r   r  r  	is_numberparse_json_pathr   STRICT_JSON_PATH_SYNTAXloggerwarningr   )r1   r  	path_textr2   r4   r4   r5   to_json_path  s   
zDialect.to_json_pathsql"t.List[t.Optional[exp.Expression]]c                 K  s   | j di || ||S Nr4   )parserr   tokenizer1   r  optsr4   r4   r5   r        zDialect.parseexpression_typeexp.IntoTypec                 K  s    | j di ||| ||S r  )r  
parse_intor  )r1   r#  r  r!  r4   r4   r5   r%  "  s    zDialect.parse_intoexp.Expressionr   c                 K  s   | j di |j||dS )N)r   r4   )	generatorgenerate)r1   r  r   r!  r4   r4   r5   r(  '     zDialect.generatet.List[str]c                   s    fdd |D S )Nc                   s*   g | ]}|rj |fd di ndqS )r   Fr;   )r(  )r   r  r!  r1   r4   r5   r   +  s    z%Dialect.transpile.<locals>.<listcomp>)r   r   r4   r+  r5   	transpile*  s   zDialect.transpilet.List[Token]c                 K  s   | j di ||S r  )	tokenizerr  r   r4   r4   r5   r  0     zDialect.tokenizer   c                 K     | j di d| i|S Nr  r4   )r   r1   r!  r4   r4   r5   r.  3     zDialect.tokenizerr   c                 K  r0  r1  )r   r2  r4   r4   r5   jsonpath_tokenizer6  r3  zDialect.jsonpath_tokenizerr   c                 K  r0  r1  )r   r2  r4   r4   r5   r  9  r3  zDialect.parserr	   c                 K  r0  r1  )r   r2  r4   r4   r5   r'  <  r3  zDialect.generator
exp.Valuest.List[exp.Identifier]c                 C  s   dd t |jd jD S )Nc                 S  s    g | ]\}}t d | qS )_col_)r   to_identifier)r   i_r4   r4   r5   r   @  s    z3Dialect.generate_values_aliases.<locals>.<listcomp>r   )	enumerater  r1   r  r4   r4   r5   generate_values_aliases?  s   zDialect.generate_values_aliases)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+   r   T)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   )r  r   r+   r*  )r  r   r+   r-  )r+   r   )r+   r   )r+   r   )r+   r	   )r  r5  r+   r6  (  rZ   r[   r\   INDEX_OFFSETWEEK_OFFSETUNNEST_COLUMN_ONLYALIAS_POST_TABLESAMPLETABLESAMPLE_SIZE_IS_PERCENTr}   r~   r   IDENTIFIERS_CAN_START_WITH_DIGITDPIPE_IS_STRING_CONCATSTRICT_STRING_CONCATSUPPORTS_USER_DEFINED_TYPESr  r   COPY_PARAMS_ARE_CSVr  r  r  r  NULL_ORDERINGTYPED_DIVISIONSAFE_DIVISIONCONCAT_COALESCEHEX_LOWERCASEDATE_FORMATDATEINT_FORMATTIME_FORMATr   r   r   r  r  PREFER_CTE_ALIAS_COLUMNFORCE_EARLY_ALIAS_REF_EXPANSION(EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BYSUPPORTS_ORDER_BY_ALLHAS_DISTINCT_ARRAY_CONSTRUCTORSSUPPORTS_FIXED_SIZE_ARRAYSr  ON_CONDITION_EMPTY_BEFORE_ERRORr  !PROMOTE_TO_INFERRED_DATETIME_TYPESUPPORTS_VALUES_DEFAULT#NUMBERS_CAN_BE_UNDERSCORE_SEPARATEDr  REGEXP_EXTRACT_DEFAULT_GROUPr   Except	IntersectUnionr  r   (ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMNr   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   r   DATE_PART_MAPPINGr  r  r  ApproxDistinct	ArraySizeCountIfInt64LengthUnixDateUnixSecondsBINARY
FromBase64BOOLEANBetweenBooleanEndsWithIn
LogicalAnd	LogicalOr
RegexpLike
StartsWithDATECurrentDateDateDateFromPartsDateStrToDateDiToDate	StrToDateTimeStrToDateTsOrDsToDateDATETIMECurrentDatetimeDatetimeDatetimeAddDatetimeSubDOUBLEApproxQuantileAvgExpLnLogPowQuantileRound
SafeDivideSqrtStddev	StddevPop
StddevSampToDoubleVarianceVariancePopr  CeilDatetimeDiffDateDiffTimestampDiffTimeDiffDateToDiLevenshteinSignStrPosition
TsOrDiToDiINTERVALIntervalMakeIntervalJSON	ParseJSONTIMECurrentTimeTimeTimeAddTimeSubr  CurrentTimestampLTZr  CurrentTimestamp	StrToTimeTimeStrToTimeTimestampAddTimestampSub
UnixToTimeTINYINTDayMonthWeekYearQuarterVARCHARArrayConcatArrayToStringConcatConcatWsChrDateToDateStrDPipeGroupConcatInitcapLower	SubstringString	TimeToStrTimeToTimeStrTrimToBase64TsOrDsToDateStr	UnixToStrUnixToTimeStrUpperr  r   UnaryAliasBinaryr   Abs	AnonymousArrayAnyValueArrayAggArrayConcatAgg
ArrayFirst	ArrayLastArrayReverse
ArraySliceBracketCastCaseCoalesceCountDateAddDateSub	DateTruncDistinctDivDotExplodeExtractFilterGenerateSeriesGenerateDateArrayGenerateTimestampArrayGreatestIfLeastr  	LastValueMapMaxMinNullNullif
PropertyEQSliceStructSum	SortArray	TimestampToMapTryCastUnnestVarMapWindowr  r  r  r  r  r   r  r   r   r  r  r
  r  r  r   r%  r(  r,  r  r.  r4  r  r'  r=  r4   r4   r4   r5   r     sV  
 	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV_	

|	
















 
!
"
#
$
%
&
'
(
)
*
-
0
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
F
G
H
I
JN7,r   )	metaclassr  r   ,t.Callable[[Generator, exp.Expression], str]c                   r-   )Nc                   s   | j  gt|j R  S r.   )funcr   r   valuesr<  r  r4   r5   r6   J  s    zrename_func.<locals>.<lambda>r4   r  r4   r  r5   rename_funcI  r9   r  accuracyr1   r	   r  exp.ApproxDistinctc                 C     |  d|jS )NAPPROX_COUNT_DISTINCTr  r  r<  r4   r4   r5   approx_count_distinct_sqlM  s   r  IFfalse_value t.Optional[exp.Expression | str]$t.Callable[[Generator, exp.If], str]c                      d	 fdd}|S )
Nr1   r	   r  exp.Ifr+   r   c                   s&   |  |j|jd|jdp S r  r  r  r   r   r<  r  r  r4   r5   _if_sqlU  s   
zif_sql.<locals>._if_sql)r1   r	   r  r  r+   r   r4   )r  r  r  r4   r  r5   if_sqlR  s   r  JSON_EXTRACT_TYPEc                 C  sT   |j }| jrt|tjr|jr|t|tjj	j
 | |t|tjr'dS dS )Nz->z->>)r  !JSON_TYPE_REQUIRED_FOR_EXTRACTIONr   r   r  r  replacecastr  r  r  binaryJSONExtract)r1   r  r  r4   r4   r5   arrow_json_extract_sql`  s   r  	exp.Arrayc                 C  s   d| j |ddddd dS )Nr  T)dynamicnew_line
skip_first	skip_lastr  r  r<  r4   r4   r5   inline_array_sqlh  s   r  c                 C  s:   t |jd}t|tjr|tjr| d|S t| |S )Nr   ARRAY)	r   r  r   r   
ExpressionfindQueryr  r  )r1   r  elemr4   r4   r5   inline_array_unless_queryl  s   
r#  	exp.ILikec                 C  s(   |  tjtj|jdtj|jddS )Nr  r  r  )like_sqlr   Liker  r  r  r<  r4   r4   r5   no_ilike_sqls  s
   r)  exp.CurrentDatec                 C  s   |  |d}|rd| S dS )Nr  zCURRENT_DATE AT TIME ZONE CURRENT_DATEr  )r1   r  zoner4   r4   r5   no_paren_current_date_sql{  s   r.  exp.Withc                 C  s*   |j dr| d d|j d< | |S )N	recursivezRecursive CTEs are unsupportedF)r   r   unsupportedwith_sqlr<  r4   r4   r5   no_recursive_cte_sql  s   


r3  exp.TableSamplec                 C  s   |  d | |jS )NzTABLESAMPLE unsupported)r1  r  r  r<  r4   r4   r5   no_tablesample_sql  s   
r5  	exp.Pivotc                 C     |  d dS )NzPIVOT unsupportedr;   r1  r<  r4   r4   r5   no_pivot_sql     
r9  exp.TryCastc                 C  r  r.   )cast_sqlr<  r4   r4   r5   no_trycast_sql  s   
r=  exp.CommentColumnConstraintc                 C  r7  )Nz#CommentColumnConstraint unsupportedr;   r8  r<  r4   r4   r5    no_comment_column_constraint_sql  s   
r?  exp.MapFromEntriesc                 C  r7  )NzMAP_FROM_ENTRIES unsupportedr;   r8  r<  r4   r4   r5   no_map_from_entries_sql  r:  rA  exp.Propertyc                 C  s    | j |dd d| |d S )NT)
string_keyr  r   )property_namer  r<  r4   r4   r5   property_sql      rE  STRPOSFTexp.StrPosition	func_namesupports_positionr   supports_occurrenceuse_ansi_positionc                 C  s2  |j }|jd}|jd}|jd}	tjd}
tjd}|r+|	r+|r+|s+|}|o/| }|r9tj||d}|dkrM|rMtj|tj||dgd	}n,|d
v rU||gn||g}|r`|	| |	rr|rj|	|	 n| 
| d tj||d	}|rtj|| |d}tj||
|
|d}| |S | |S )Nsubstrposition
occurrencer   r  r  r  POSITION)r  fieldr  r  )LOCATE	CHARINDEXz+ does not support the occurrence parameter.r&  )r  r  r  )r  r   r   r   r  numberr  r  rn  appendr1  Subr  eqr  )r1   r  rI  rJ  rK  rL  r  rM  rN  rO  zeroonetranspile_positionr  r   func_with_offsetfunc_wrappedr4   r4   r5   strposition_sql  s4   



r_  exp.StructExtractc                 C  s&   |  |d d|  t|jj S )Nr  r   )r  r   r8  r  r  r<  r4   r4   r5   struct_extract_sql  s   $ra  MAPexp.Map | exp.VarMapmap_func_namec                 C  s   |j d}|j d}t|tjrt|tjs$| d | |||S g }t|j|jD ]\}}|	| 
| |	| 
| q-| j|g|R  S )Nr  r  z&Cannot convert array columns into map.)r   r   r   r   r  r1  r  zipr  rW  r  )r1   r  rd  r  r  r   r   r   r4   r4   r5   var_map_sql  s   
rf  	exp_class	t.Type[E]r  r   t.Optional[bool | str]t.Callable[[t.List], E]c                   s   d fdd}|S )a-  Helper used for time expressions.

    Args:
        exp_class: the expression class to instantiate.
        dialect: target sql dialect.
        default: the default format, True being time.

    Returns:
        A callable that can be used to return the appropriately formatted time expression.
    r   t.Listc                   sB   t | dt t | dp du rt jdS  pd dS )Nr   r  T)r  format)r   r   r   rP  r   r   r  rg  r4   r5   _builder  s   
z&build_formatted_time.<locals>._builderN)r   rk  r4   )rg  r  r   ro  r4   rn  r5   build_formatted_time  s   	rp  r  Gt.Callable[[Generator, exp.UnixToStr | exp.StrToUnix], t.Optional[str]]c                      d	 fdd}|S )
Nr1   r	   r  exp.UnixToStr | exp.StrToUnixr+   r   c                   s"   |  |}|t jkr|S dS )z
        Returns the time format for a given expression, unless it's equivalent
        to the default time format of the dialect of interest.
        N)r   r   r  rP  )r1   r  time_formatr  r4   r5   _time_format  s   
z!time_format.<locals>._time_format)r1   r	   r  rs  r+   r   r4   )r  rv  r4   ru  r5   rt    s   rt  r.  unit_mappingt.Optional[t.Dict[str, str]]default_unitr   supports_timezonec                   s   d fdd}|S )Nr   rk  r+   r   c                   s   t | dk}t | dk}|r| d nt| d}d }|s r:|r#| d ntj }r8t|j |jn|}|t| d|d}rP|rP|	d| d  |S )	Nr      r  r   r  r  r  unitr-  r  )
r   r   r   r  r  varr   r  r   r  )r   
unit_basedhas_timezoner  r}  r  ry  rg  rz  rw  r4   r5   ro    s   "z"build_date_delta.<locals>._builder)r   rk  r+   r   r4   )rg  rw  ry  rz  ro  r4   r  r5   build_date_delta  s   r  expression_class#t.Callable[[t.List], t.Optional[E]]c                   s   d fdd}|S )Nr   rk  r+   t.Optional[E]c                   sL   t | dk rd S | d }t|tjstd| d | d |jt|dS )Nr  r  z&INTERVAL expression expected but got 'r  r   r|  )r   r   r   r  r   r  unit_to_str)r   intervalr  r4   r5   ro  )  s   z0build_date_delta_with_interval.<locals>._builder)r   rk  r+   r  r4   )r  ro  r4   r  r5   build_date_delta_with_interval&  s   r  r   rk  "exp.DateTrunc | exp.TimestampTruncc                 C  sF   t | d}t | d}t|tjr|drtj||dS tj||dS )Nr   r  date)r}  r  r  r}  )r   r   r   r  is_typer  TimestampTrunc)r   r}  r  r4   r4   r5   date_trunc_to_time7  s
   

r  kindc                   r
  )
Nr1   r	   r  r&  r+   r   c              	     sB   |  |d}tj|jt|d}  d d| d|  | dS )Nr  r  r:  (, ))r  r   r  r  unit_to_var)r1   r  r  r  r)   r  r4   r5   r  C  s   "z#date_add_interval_sql.<locals>.funcr1   r	   r  r&  r+   r   r4   )r)   r  r  r4   r  r5   date_add_interval_sql@  s   r  r-  0t.Callable[[Generator, exp.TimestampTrunc], str]c                   rr  )
Nr1   r	   r  exp.TimestampTruncr+   r   c                   s6   t ||jg} r||jd | jdg|R  S )Nr-  
DATE_TRUNC)r  r  rW  r   r   r  )r1   r  r   r-  r4   r5   _timestamptrunc_sqlL  s   z/timestamptrunc_sql.<locals>._timestamptrunc_sql)r1   r	   r  r  r+   r   r4   )r-  r  r4   r  r5   timestamptrunc_sqlK  s   r  exp.Timestampc                 C  s   |j d}|s%ddlm} ||| jdjptjjj	}| 
t|j|S |j tv r>| 
tjt|jtjjj	|dS | d|j|S )Nr-  r   annotate_typesru  r  r-  r  )r   r    sqlglot.optimizer.annotate_typesr  r  r   r   r  r  r  r  r  r  r  r   r   
AtTimeZoner  )r1   r  r-  r  target_typer4   r4   r5   no_timestamp_sqlU  s   r  exp.Timec                 C  sB   t |jt jjj}t t j||jddt jjj	}| 
|S )Nr-  r  )r   r  r  r  r  r  r  r   r   r  r  r1   r  r  exprr4   r4   r5   no_time_sqlh  s
   
r  exp.Datetimec                 C  s   |j }|j}|j tv r)t|tjjj	}ttj
||dtjjj}| |S t|tjjj}t|tjjj}| ttj||dtjjjS )Nr  r&  )r  r  r  r   r   r   r  r  r  r  r  r  r  rs  r  Addr  r4   r4   r5   no_datetime_sqlq  s   
"r  exp.Leftc                 C  s"   |  tj|jtjd|jdS )Nr  )r  r  length)r  r   r  r  r  rV  r  r<  r4   r4   r5   left_to_substring_sql  s
   r  c              	   C  s0   |  tj|jtj|jdt|jd  dS )Nr%  r  rP  )r  r   r  r  re  parenr  r<  r4   r4   r5   right_to_substring_sql  s   r  exp.TimeStrToTimeinclude_precisionc                 C  s   t j|jdrt jjjnt jjj}t|j	t j
r9|r9t|j	j}|dkr9t jj|j	t jt j
|dgd}| t j|j	|| jdS )Nr-  r   r%  r  ru  )r   r  r  r   r   r  r  r  r   r  r  r   r  DataTypeParamrV  r  r  r  )r1   r  r  datatype	precisionr4   r4   r5   timestrtotime_sql  s   
r  exp.DateStrToDatec                 C  s   |  t|jtjjjS r.   )r  r   r  r  r  r  rs  r<  r4   r4   r5   datestrtodate_sql  r)  r  r&  r  c                 C  sR   |j d}|r|j dkr| d| d | ||j|r&|j dS d S )Ncharsetzutf-8z"Expected utf-8 character set, got r   r  )r   r   r  r   r1  r  r  )r1   r  r  r  r  r4   r4   r5   encode_decode_sql  s   "r  exp.Minc                 C     |j rdnd}t|| |S )NLEASTrU  r  r  r1   r  r  r4   r4   r5   min_or_least     r  exp.Maxc                 C  r  )NGREATESTMAXr  r  r4   r4   r5   max_or_greatest  r  r  exp.CountIfc              	   C  sB   |j }t|j tjr|j jd }| d | dtd|ddS )Nr   z9DISTINCT is not supported when converting COUNT_IF to SUMsumifr  )r  r   r   r  r  r1  r  )r1   r  condr4   r4   r5   count_if_to_sum  s
   
r  r;   exp.Trimdefault_trim_typec                 C  s   |  |d}|  |dp|}|  |d}|  |d}|s!| |S |r(| dnd}|r1| dnd}|s7|r9dnd}|rBd| nd}d	| | | | | d
S )Nr  rN  r  	collation r;   zFROM z	 COLLATE zTRIM(r  )r  trim_sql)r1   r  r  target	trim_typeremove_charsr  	from_partr4   r4   r5   r    s   
r  c                 C  s   |  d|j| |S )NSTRPTIME)r  r  r   r<  r4   r4   r5   str_to_time_sql  r/  r  
exp.Concatc                 C  s   |  tdd |jS )Nc                 S  s   t j| |dS Nr&  r   r  xyr4   r4   r5   r6     r  z%concat_to_dpipe_sql.<locals>.<lambda>)r  r   r  r<  r4   r4   r5   concat_to_dpipe_sql  r/  r  exp.ConcatWsc                   s"   |j ^ }| t fdd|S )Nc                   s   t j| t j |ddS r  r  r  delimr4   r5   r6         z(concat_ws_to_dpipe_sql.<locals>.<lambda>)r  r  r   )r1   r  	rest_argsr4   r  r5   concat_ws_to_dpipe_sql  s   

r  rN  rO  
parameters(exp.RegexpExtract | exp.RegexpExtractAllc                 C  s>   |j d}|r|jt| jjkrd }| | |j|j	|S )Ngroup)
r   r   r  r   r  r[  r  sql_namer  r  )r1   r  r  r4   r4   r5   regexp_extract_sql  s   r  	modifiersexp.RegexpReplacec                 C  s   |  d|j|j|jd S )NREGEXP_REPLACEreplacement)r  r  r  r   r<  r4   r4   r5   regexp_replace_sql  s   r  aggregationst.List[exp.Expression]r*  c                 C  sP   g }| D ]!}t |tjr||j q	 |dd }||j|dd q|S )Nc                 S  s    t | tjrtj| jddS | S )NF)r  r  )r   r   r  r  )noder4   r4   r5   r6     s   
z$pivot_column_names.<locals>.<lambda>r   )r  normalize_functions)r   r   r  rW  alias	transformr  )r  r  namesaggagg_all_unquotedr4   r4   r5   pivot_column_names  s   r  r  	t.Type[B]t.Callable[[t.List], B]c                   r-   )Nc                   s    t | dt | ddS )Nr   r  r&  )r   rm  r  r4   r5   r6     r  z&binary_from_function.<locals>.<lambda>r4   r  r4   r  r5   binary_from_function  r9   r  r  c                 C  s   t jt| dt| ddS )Nr  r   r  )r   r  r   rm  r4   r4   r5   build_timestamp_trunc  r)  r  exp.AnyValuec                 C  r  )Nr  r  r<  r4   r4   r5   any_value_to_max_sql"  r   r  exp.Xorc              	   C  s6   |  |j}|  |j}d| d| d| d| d	S )Nr  z
 AND (NOT z)) OR ((NOT z) AND r  )r  leftright)r1   r  abr4   r4   r5   bool_xor_sql&  s   r  c                 C  s"   t | tjpt | tjo| dS )Njson)r   r   r  r  r  r  r4   r4   r5   is_parse_json,  s   r  c                 C  s    t jt jt| dt  ddS )Nr   r&  r%  )r   ParenIsr   nullrm  r4   r4   r5   isnull_to_is_null2  rF  r  'exp.GeneratedAsIdentityColumnConstraintc                 C  s2   |  |dpd}|  |dpd}d| d| dS )Nr  1	incrementz	IDENTITY(r  r  r,  )r1   r  r  r  r4   r4   r5   'generatedasidentitycolumnconstraint_sql6  s   r  5t.Callable[[Generator, exp.ArgMax | exp.ArgMin], str]c                   s   t dd
 fdd	}|S )Ncountr1   r	   r  exp.ArgMax | exp.ArgMinr+   r   c                   s   |   |j|jS r.   )r  r  r  r<  r  r4   r5   _arg_max_or_min_sql?  s   z4arg_max_or_min_no_count.<locals>._arg_max_or_min_sql)r1   r	   r  r  r+   r   )r
   )r  r  r4   r  r5   arg_max_or_min_no_count>  s   r  exp.TsOrDsAddc                 C  sJ   | j  }| j}|tjjjrt|tjjj	}| j 
t|| | S r.   )r  r   return_typer  r   r  r  rs  r  r  r  )r  r  r  r4   r4   r5   ts_or_ds_add_castF  s   
r  r  .t.Callable[[Generator, DATE_ADD_OR_DIFF], str]c                   r
  )
Nr1   r	   r  DATE_ADD_OR_DIFFr+   r   c                   s0    rt |tjrt|}| t||j|jS r.   )r   r   	TsOrDsAddr  r  r  r  r  r<  r  r  r4   r5   
_delta_sqlT  s   z"date_delta_sql.<locals>._delta_sql)r1   r	   r  r  r+   r   r4   )r  r  r  r4   r  r5   date_delta_sqlS  s   r  r  c                 C  sB   | j d}t|tjr|S |rtj|jS |rtj|S d S )Nr}  )r   r   r   r   Placeholderr  r  r  r  r   r}  r4   r4   r5   r  b  s   r  c                 C  s6   | j d}t|tjtjfr|S |rtj|dS d S )Nr}  r%  )r   r   r   r   Varr  r  r4   r4   r5   r  l  s   r  partexp.Varc                 C     d S r.   r4   r!  r  r4   r4   r5   map_date_partt  s   r%  c                 C  r#  r.   r4   r$  r4   r4   r5   r%  y  s   c                 C  sD   | rt |j| j nd }|r | jrtj	|S t
|S | S r.   )r   r  r`  r   r  r   r  r   r  r  r~  )r!  r  mappedr4   r4   r5   r%    s
   exp.LastDayc                 C  sH   t dd|j}t d|dd}t d|dd}| t |t jjjS )N
date_truncmonthdate_addr  date_subday)r   r  r  r  r  r  r  rs  )r1   r  trunc_curr_dateplus_one_monthminus_one_dayr4   r4   r5   no_last_day_sql  s   r0  	exp.Mergec                   s  |j jd}d fdd}||j j h}|r|||j  |jd jD ]]}|jd	}|rt|tjrZ|tj	D ]}|j }t|tj
rY||jd
|v rY|t|j  q;t|tjr|j }	t|	tjr|	jD ]}
||
jd
|v r|
t|
j  qlq% |S )z2Remove table refs from columns in when statements.r  
identifiert.Optional[exp.Identifier]r+   r   c                   s   | r	 j | jS d S r.   )r  r  r  )r2  r  r4   r5   	normalize  r/  z+merge_without_target_sql.<locals>.normalizewhensthentableN)r2  r3  r+   r   )r  r   r   addr  r   r   Updatefind_allEQColumnr  columnInsertTuple	merge_sql)r1   r  r  r4  targetswhenr6  equals	equal_lhscolumn_listr=  r4   r  r5   merge_without_target_sql  s0   


rF  	t.Type[F]zero_based_indexingarrow_req_json_typet.Callable[[t.List], F]c                   s   d fdd}|S )Nr   rk  r+   r   c                   s   t  g}| dd  D ]8}t|t js|   S |j}t|r: r&|js:t|}|	t j
r2|n|d d q|	t j|d q| dd = t| dt j|d dS )Nr  r%  r  r   r  )r  r  only_json_types)r   JSONPathRootr   r  from_arg_listr  r   r  r   rW  JSONPathSubscriptJSONPathKeyr   JSONPath)r   segmentsargr  indexrI  r  rH  r4   r5   ro    s"   


z)build_json_extract_path.<locals>._builder)r   rk  r+   r   r4   )r  rH  rI  ro  r4   rT  r5   build_json_extract_path  s   rU  quoted_indexop/t.Callable[[Generator, JSON_EXTRACT_TYPE], str]c                   s   d	 fdd}|S )
Nr1   r	   r  r  r+   r   c                   s   |j }t|tjst | |S |jd}g }|jD ]/}| |}|rJt|tj	rEs2t|tj
sE|r9| |}| jj | | jj }|| qr]d d| |jg|S | j |jg|R  S )Nescaper  )r  r   r   rP  r  r   r   r  r  JSONPathPartrN  
escape_strr  r   r   rW  r   r  r  )r1   r  r  rY  rQ  segmentr  rW  rV  r4   r5   _json_extract_segments  s*   




 z5json_extract_segments.<locals>._json_extract_segmentsr1   r	   r  r  r+   r   r4   )r  rV  rW  r^  r4   r]  r5   json_extract_segments  s   r`  exp.JSONPathKeyc                 C  s   t |jtjr| d |jS )Nz.Unsupported wildcard in JSONPathKey expression)r   r  r   JSONPathWildcardr1  r  r<  r4   r4   r5   json_path_key_only_name  s   
rc  !exp.ArrayFilter | exp.ArrayRemovec                 C  s   |j }t|tjrt|jdkr|jd }|j}n!t|tjr"d}nt|tjr3d}tj	||j d}n| 
d dS tj|jgd}t|tj|d |gd|}| tj|gdS )	Nr  r   _ur&  zUnsupported filter conditionr;   r  )r7  )r  r   r   Lambdar   r  r  	PredicateArrayRemoveNEQr1  r  selectfrom_alias_wherer  r  )r1   r  r  r  unnestfilteredr4   r4   r5   filter_array_using_unnest  s   

$rp  exp.ArrayRemovec                 C  s<   t d}t j||jd}| t j|jt j||gddS )Nre  r&  rS  )r   r8  ri  r  r  ArrayFilterr  rf  )r1   r  	lambda_idr  r4   r4   r5   remove_from_array_using_filter  s   
rt  exp.ToNumberc                 C  s"   |  d|j|jd|jdS )N	TO_NUMBERrl  nlsparamr  r<  r4   r4   r5   to_number_with_nls_param  s   

rx  r  t.Optional[int]scale(t.Callable[[exp.DataType], exp.DataType]c                   s   d fdd}|S )Ndtypeexp.DataTyper+   c                   sD   | j s d u r	| S   d urd nd }tjd| dS )Nr  r;   zDECIMAL(r  )r  r   r  r  )r|  paramsr  rz  r4   r5   ro  %  s   z,build_default_decimal_type.<locals>._builder)r|  r}  r+   r}  r4   )r  rz  ro  r4   r  r5   build_default_decimal_type"  s   r  exp.Funcc                 C  s&   t | dkrtjd| dS tj| S )Nr  TIMESTAMP_FROM_PARTSrS  )r   r   r  TimestampFromPartsrM  rm  r4   r4   r5   build_timestamp_from_parts/  s   r  exp.SHA2c                 C  s   |  d|dp	d |jS )NSHAr  256)r  r  r  r<  r4   r4   r5   
sha256_sql8  r"  r  *exp.GenerateSeries | exp.GenerateDateArrayc                 C  s   |j d}|j d}|j d}t|tjr|j}nt|tjr&|j}nd }|rL|rL|rL|ddrLt|tjrF||ju rFt||}nt||}| d|||S )Nr  r  r  r  	timestampSEQUENCE)	r   r   r   r   r  r  r  r  r  )r1   r  r  r  r  r  r4   r4   r5   sequence_sql<  s   r   t.Callable[[t.List, Dialect], E]c                   rr  )
Nr   rk  r  r   r+   r   c                   s6    t | dt | dt | dptj|jt | ddS )Nr   r  r  r   )r  r  r  r  )r   r   r  rV  r[  )r   r  r  r4   r5   ro  R  s   z&build_regexp_extract.<locals>._builder)r   rk  r  r   r+   r   r4   )r  ro  r4   r  r5   build_regexp_extractQ  s   r  exp.Lateralc              	   C  sP   t |jtjr#| tjtj|jjg|jdt |jtj	dddS | 
|S )Nr  )r  r  offsetcross)r  r  )r   r  r   r  r  Joinr  r   r   
Posexplodelateral_sqlr<  r4   r4   r5   explode_to_unnest_sql]  s   


r  $exp.DatetimeDiff | exp.TimestampDiffc                 C  s   |  d|j|j|jS )NTIMESTAMPDIFF)r  r}  r  r  r<  r4   r4   r5   timestampdiff_sqll  r/  r  r  exp.MakeIntervalsepc                 C  sV   g }|j  D ]\}}t|tjr|j}|| d|  qd| j|d|i dS )Nr  z
INTERVAL 'r  r  )r   r   r   r   Kwargr  rW  format_args)r1   r  r  r   r}  r   r4   r4   r5   no_make_interval_sqlp  s   r  
exp.Lengthc                 C  s"   |j drdnd}| ||jS )Nr  LENGTHCHAR_LENGTH)r   r   r  r  )r1   r  length_funcr4   r4   r5   length_or_char_length_sql{  s   r  LISTAGGr  exp.GroupConcatwithin_groupon_overflowc                 C  s   |j }| |jdptj|}| |d}|r!|r!d| nd}|tj}	|	r3|	j r3|	j 	 }| 
|| | }
tj||
gd}|	ra|rQtj||	d}n|d|
 | j|j d g | |S )	N	separatorr  z ON OVERFLOW r;   rS  r&  r  r  )r  r  r   r   r   r  r  r   Orderr   r  r  WithinGroupr  )r1   r  rI  r  r  r  r  r  on_overflow_sqlorderr   listaggr4   r4   r5   groupconcat_sql  s   

 
r  exp.TimeToStr | exp.ToCharc                 C  sl   t | dkr0| d }|jsddlm} |||d |jtjj r0|jj	
 }ttj|dd| S tj| S )Nr  r   r  ru  T)r   )r   r   r  r  r  r   r  TEMPORAL_TYPESr   rZ   r   rp  r  ToCharrM  )r   r  r  r  r  r4   r4   r5   build_timetostr_or_tochar  s   r  exp.Replacec                 C  s.   t jt| dt| dt| dpt jddS )Nr   r  r  r;   )r  r  r  )r   Replacer   r  r  rm  r4   r4   r5   'build_replace_with_optional_replacement  s
   r  	exp.Spacec                 C  s   |  tjtjd|jdS )Nr  )r  times)r  r   Repeatr  r  r  r<  r4   r4   r5   	space_sql  s   
r  )r)   r*   r+   r,   )r  r   r+   r  )r1   r	   r  r  r+   r   )r  N)r  r   r  r  r+   r	  r_  )r1   r	   r  r  r+   r   )r1   r	   r  r$  r+   r   )r1   r	   r  r*  r+   r   )r1   r	   r  r/  r+   r   )r1   r	   r  r4  r+   r   )r1   r	   r  r6  r+   r   )r1   r	   r  r;  r+   r   )r1   r	   r  r>  r+   r   )r1   r	   r  r@  r+   r   )r1   r	   r  rB  r+   r   )rG  FFT)r1   r	   r  rH  rI  r   rJ  r   rK  r   rL  r   r+   r   )r1   r	   r  r`  r+   r   )rb  )r1   r	   r  rc  rd  r   r+   r   r.   )rg  rh  r  r   r   ri  r+   rj  )r  r  r+   rq  )Nr.  F)
rg  rh  rw  rx  ry  r   rz  r   r+   rj  )r  rh  r+   r  )r   rk  r+   r  )r)   r   r  r   r+   r  )F)r-  r   r+   r  )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r  r   r+   r   )r1   r	   r  r  r+   r   r>  )
r1   r	   r  r&  r  r   r  r   r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r;   )r1   r	   r  r  r  r   r+   r   r  )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r  r  r  r  r+   r*  )r  r  r+   r  )r   rk  r+   r  )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r  r&  r+   r   )r   rk  r+   r&  )r1   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  )r!  r&  r  r  r+   r"  )r!  r  r  r  r+   r  )r  r  )r1   r	   r  r'  r+   r   )r1   r	   r  r1  r+   r   )TF)r  rG  rH  r   rI  r   r+   rJ  )TN)r  r   rV  r   rW  r   r+   rX  )r1   r	   r  ra  r+   r   )r1   r	   r  rd  r+   r   )r1   r	   r  rq  r+   r   )r1   r	   r  ru  r+   r   r   )r  ry  rz  ry  r+   r{  )r   rk  r+   r  )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r  rh  r+   r  )r1   r	   r  r  r+   r   )r1   r	   r  r  r+   r   )r  )r1   r	   r  r  r  r   r+   r   )r1   r	   r  r  r+   r   )r  r  TF)r1   r	   r  r  r  r   r  r   r  r   r+   r   )r   rk  r  r   r+   r  )r   rk  r+   r  )r1   r	   r  r  r+   r   )
__future__r   r   loggingtypingr   r   r	  r   r   	functoolsr   r    r   sqlglot.dialectsr   sqlglot.errorsr   sqlglot.generatorr	   r
   sqlglot.helperr   r   r   r   r   r   r   sqlglot.jsonpathr   r   r  sqlglot.parserr   sqlglot.timer   r   r   sqlglot.tokensr   r   r   sqlglot.trier   r^  r  r  r  r  
TsOrDsDiffr  DATE_ADD_OR_SUBr  JSONExtractScalarr  TYPE_CHECKINGsqlglot._typingr   r   r   r  r   Dictr  Callabler  	getLoggerr  r   r8   r   r:   r}   r   r   r   r   r   r  r  r  r  r  r  r#  r)  r.  r3  r5  r9  r=  r?  rA  rE  r_  ra  rf  rp  rt  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  r  r  r  r  r  r  r  r  r  overloadr%  r0  rF  rU  r`  rc  rp  rt  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r4   r4   r4   r5   <module>   s@   $	"
%       -+	
	






%

	