o
    8Di4H                    @  s&  d dl mZ d dlZd dlZd dlZd dl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mZ d dlmZmZ d d	lmZ d d
lmZ ejrod dlmZ d dl m!Z! ej"dddZ#ej$e#ege%f Z&e'dZ(e)dZ*dZ+dddZ,G dd de-Z.G dd de.dZ/dS )    )annotationsN)defaultdict)reducewraps)exp)
ErrorLevelUnsupportedErrorconcat_messages)apply_index_offsetcsvname_sequenceseq_get)ALL_JSON_PATH_PARTSJSON_PATH_PART_TRANSFORMS)format_time)	TokenType)E)DialectTypeG	Generator)boundsqlglotz\\(\d+)zEArgument '{}' is not supported for expression '{}' when targeting {}.argst.Union[str, t.Tuple[str, str]]return.t.Callable[[GeneratorMethod], GeneratorMethod]c                    sD   i  | D ]}t |trd |< q|d  |d < qd	 fdd}|S )
z
    Decorator that can be used to mark certain args of an `Expression` subclass as unsupported.
    It expects a sequence of argument names or pairs of the form (argument_name, diagnostic_msg).
    N   r   funcGeneratorMethodr   c                   s   t  d	 fdd}|S )
N	generatorr   
expressionr   r   strc                   sV   |j j}| jj j}  D ]\}}|j|r%|pt|||}| | q| |S N)		__class____name__dialectitemsr   getUNSUPPORTED_TEMPLATEformatunsupported)r   r    expression_namedialect_namearg_name
diagnostic)diagnostic_by_argr    J/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/generator.py_func,   s   


z2unsupported_args.<locals>.decorator.<locals>._func)r   r   r    r   r   r!   )r   )r   r2   r/   r   r1   	decorator+   s   z#unsupported_args.<locals>.decorator)r   r   r   r   )
isinstancer!   )r   argr5   r0   r3   r1   unsupported_args   s   

r8   c                      s   e Zd Z fddZ  ZS )
_Generatorc                   s4   t  | |||}t|j D ]	}|j|d  q|S r"   )super__new__r   SUPPORTED_JSON_PATH_PARTS
TRANSFORMSpop)clsclsnamebasesattrsklasspartr#   r0   r1   r;   @   s   z_Generator.__new__)r$   
__module____qualname__r;   __classcell__r0   r0   rE   r1   r9   ?   s    r9   c                   @  s*  e Zd ZU dZi ei ejdd ejdd ejdd ej	dd ej
dd ejdd ejd	d ejd
d ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd i ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ej dd ej!dd ej"dd ej#d d ej$d!d ej%d"d ej&d#d ej'd$d i ej(d%d ej)d&d ej*d'd ej+d(d ej,d)d ej-d*d ej.d+d ej/d,d ej0d-d ej1d.d ej2d/d ej3d0d ej4d1d ej5d2d ej6d3d ej7d4d ej8d5d i ej9d6d ej:d7d ej;d8d ej<d9d ej=d:d ej>d;d ej?d<d ej@d=d ejAd>d ejBd?d ejCd@d ejDdAd ejEdBd ejFdCd ejGdDd ejHdEd ejIdFd i ejJdGd ejKdHd ejLdId ejMdJd ejNdKd ejOdLd ejPdMd ejQdNd ejRdOd ejSdPd ejTdQd ejUdRd ejVdSd ejWdTd ejXdUd ejYdVd ejZdWd ej[dXd ej\dYd ej]dZd ej^d[d ej_d\d ej`d]d ejad^d ejbd_d ejcd`d ejddad ejedbd iZfdcegdd< deZhdfegdg< dhZidhZjdeZkdeZldeZmdeZndhZodeZpdiZqdhZrdeZsdjZtdkZudeZvdeZwdeZxdlZydeZzdeZ{dhZ|deZ}deZ~dhZdeZdmZdnegdo< deZdeZdeZdeZdeZdeZdeZdeZdeZdpZdeZdqZdhZdhZdhZdeZdeZdeZdeZdeZdrZdsZdhZdhZdeZdhZdeZdhZdeZdhZe ZdhZdeZdhZdeZdeZdhZdeZdeZdeZdtZduZdvZdeZdhZdeZdeZdhZdeZdhZdhZdhZdwZdxegdy< dzZd{egd|< d}Zd~Zdfegd< deZejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdejjjdiZdddddddddd	Zdd dd dd dd dd dZi Zdegd< dZdZdrZeӃ Zdegd< i ejejjjדejejjjٓejejjjדejejjjדejejjjדejejjjܓejejjjדejejjjܓejejjjדejejjjדejejjjדejejjjדejejjjדejejjjדejejjjܓejejjjדejejjjٓi ejejjjדejejjjדejejjjٓejejjjדejejjjדejejjjדejejjjejejjjדejejjjדej ejjjדej"ejjjٓejejjjܓejejjjejejjjܓej%ejjjٓej&ejjjej(ejjjדi ej'ejjjٓejejjjדej*ejjjדejejjjܓejejjjܓej.ejjjדejejjjדej/ejjjדejejjjדejejjjej0ejjjܓej1ejjjٓejejjjܓej3ejjjej6ejjjדej5ejjjejejjjדi ej9ejjjדejejjjejejjjדejejjjדejejjjej@ejjjדejAejjjדejejjjדejejjjדej ejjjדejBejjjדejejjjדejCejjjٓejDejjjדejejjjדejejjjדejGejjjדi ejFejjjٓejEejjjדejHejjjejejjjejejjjדejIejjjדejJejjjٓejKejjjדejejjjדejMejjjٓejNejjjדejQejjjejRejjjٓejUejjjדejWejjjٓejVejjjדejejjjדejYejjjejZejjjej_ejjjej`ejjjejejjjejaejjjejbejjjejcejjjej	ejjjejeejjji
Z
eӃ Zdegd< ejejejejejejejejejejejejejejejejejfZdegd< ejejfZdegd< ejej ej!ej"fZ#degd< ejjjejjj$ejjj%ejjjhZ&eӃ Z'degd< dZ(degd< dZ)dZ*d~dhdhddd~e+j,ddhdded~fdddZ-ddddĄZ.dddƄZ/dddɄZ0ddd̈́Z1ddddфZ2ddddԄZ3dddׄZ4	~	~	hdddd܄Z5ddd߄Z6dddZ7dddZ8		~	h	hddddZ9	~	eddddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@ddddZAdddZBdd
dZCdddZDdddZEdddZFdddZGdddZHdddZIdddZJdd!d"ZKdd&d'ZLdÐd(d)ZMdĐd+d,ZNdŐd.d/ZOdƐd1d2ZPdǐd4d5ZQdȐd6d7ZRdɐd9d:ZSdʐd<d=ZTdːd?d@ZUd̐dBdCZV	~d͐dΐdFdGZWdϐdIdJZXdАdLdMZYdѐdOdPZZdҐdRdSZ[dӐdUdVZ\dԐdXdYZ]dՐd[d\Z^d֐d^d_Z_dאdadbZ`dאdcddZadؐdfdgZbdِdidjZcdڐdldmZddېdodpZedܐdrdsZfdݐdudvZgdސdxdyZhdߐd{d|Zidd~dZjdddZkddddZldddZmdddZndddZo		l		eddddZpdddZqdddZrddddZsdddZtdddZudddZvdddZwdddZxdddZydddZzdddZ{dddZ|dddZ}dddZ~dddZdddÄZddŐdƄZddȐdɄZddːd̄ZddΐdτZddѐd҄ZddԐdՄZddאd؄Zd dڐdۄZddݐdބZ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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eddddZdddZdddZdddZdddZ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d1d2Zdd3d4Zddd7d8Zdd:d;Zd d=d>Zd!d@dAZd"dCdDZd#dFdGZd$dIdJZdd%dMdNZd&dPdQZddRdSZd'dUdVZdd(dYdZZd)d\d]Zd*d_d`Zd+dbdcZd,dedfZd-dhdiZd.dkdlZd/dndoZd0dqdrZd1dsdtZd1dudvZd2dxdyZd3d~dZd4ddZd5ddZd6ddZd6ddZd7ddZd8ddZÐd9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@ddZːdAddZ̐dBddZ͐dCddZΐdDddZ	~d͐dEddZАdFddZѐdGddZҐdHddZӐdIddÄZԐdJdŐdƄZՐdKdȐdɄZ֐dLdːd̄ZאdMdΐdτZؐdNdѐd҄ZِdOdԐdՄZڐdPdאd؄ZېdQdڐdۄZܐdRdݐdބZݐdSddZސdSddZߐdTddZdUddZdVddZdWddZdXddZdYddZdZddZd[ddZd\ddZd]d dZd^ddZd_ddZd`d	d
ZdaddZdbddZdcddZddddZdeddZdfddZdgddZdhd!d"Zdid$d%Zdjd'd(Zdkd*d+Zdld-d.Zdmd0d1Zdnd3d4Zdod6d7Zdpd9d:Zdpd;d<Zdqd>d?ZdrdAdBZ	~d͐dsdFdGZ 	~d͐dtdIdJZ	~d͐dudLdMZ	~d͐dvdPdQZdwdSdTZdxdVdWZdydYdZZdzd\d]Zd{d_d`Zd|dbdcZ	d͐d}dfdgZ
d~didjZddldmZddodpZddrdsZddudvZddxdyZdd{d|Zdd~dZdddZdddZdddZdddZdddZdddZdddZdddZdddZd1ddZdddZdddZdddZdddZ dddZ!dddZ"dddZ#dddZ$dddZ%dddZ&dddZ'dddZ(dddÄZ)ddŐdƄZ*ddȐdɄZ+ddːd̄Z,ddΐdτZ-ddѐd҄Z.ddԐdՄZ/ddאd؄Z0ddڐdۄZ1ddݐdބZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dd
dZAdddZBdddZCdddZDdddZEdddZFdddZGddded dd#d$ZHdld%dd&d'ZIdd)d*ZJ	~	~ddd/d0ZK	~	~	~	h	e	h	h	l		h	hddd4d5ZLddd6d7ZMdd8d9ZNdd;d<ZOdÐd?d@ZPdĐdBdCZQdŐdEdFZRdƐdHdIZSdǐdKdLZTdȐdNdOZUdɐdQdRZVedSdʐdUdVZWdːdXdYZXd̐d[d\ZYd͐d^d_ZZdΐdadbZ[dϐdddeZ\dАdgdhZ]dѐdjdkZ^dҐdmdnZ_dӐdpdqZ`dԐdsdtZadՐdvdwZbd֐dydzZcdאd|d}ZddؐddZedِddZfdڐddZgdېddZhdܐddZidݐddZjdސddZkdߐddZldddZmdddZndddZodddZpdddZqdddZrdddZsdddZtdddZudddZvdddZwdddZxdddZydddZzdddZ{ddÐdĄZ|ddƐdǄZ}ddɐdʄZ~dd̐d̈́ZddϐdЄZddҐdӄZddՐdքZddؐdلZddېd܄Zddސd߄ZdddZdddZdddZ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d
dZdddZdddZd	ddZd
ddZdddZdddZddd Zdd"d#Zdd%d&Zdd(d)ZedSdd+d,Zdd.d/Zdd1d2Zdd4d5Zdd7d8Zdd:d;Zdd=d>Zdd@dAZddCdDZddFdGZddIdJZddLdMZddOdPZddRdSZddUdVZd dXdYZd!d[d\Zd"d^d_Zd#dadbZd$dddeZd%dgdhZd&djdkZd'dmdnZd(dpdqZd)dsdtZd*dvdwZd+dydzZd,d|d}Zd-ddZd.ddZd/ddZd0ddZd1ddZd2ddZd3ddZd4ddZd5ddZd6ddZÐd7ddZd~S (8  r   a)  
    Generator converts a given syntax tree to the corresponding SQL string.

    Args:
        pretty: Whether to format the produced SQL string.
            Default: False.
        identify: Determines when an identifier should be quoted. Possible values are:
            False (default): Never quote, except in cases where it's mandatory by the dialect.
            True or 'always': Always quote.
            'safe': Only quote identifiers that are case insensitive.
        normalize: Whether to normalize identifiers to lowercase.
            Default: False.
        pad: The pad size in a formatted string. For example, this affects the indentation of
            a projection in a query, relative to its nesting level.
            Default: 2.
        indent: The indentation size in a formatted string. For example, this affects the
            indentation of subqueries and filters under a `WHERE` clause.
            Default: 2.
        normalize_functions: How to normalize function names. Possible values are:
            "upper" or True (default): Convert names to uppercase.
            "lower": Convert names to lowercase.
            False: Disables function name normalization.
        unsupported_level: Determines the generator's behavior when it encounters unsupported expressions.
            Default ErrorLevel.WARN.
        max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError.
            This is only relevant if unsupported_level is ErrorLevel.RAISE.
            Default: 3
        leading_comma: Whether the comma is leading or trailing in select expressions.
            This is only relevant when generating in pretty mode.
            Default: False
        max_text_width: The max number of characters in a segment before creating new lines in pretty mode.
            The default is on the smaller end because the length only represents a segment and not the true
            line length.
            Default: 80
        comments: Whether to preserve comments in the output SQL code.
            Default: True
    c                 C     d| j |dd S )NzALLOWED_VALUES Tflatexpressionsselfer0   r0   r1   <lambda>s      zGenerator.<lambda>c                 C     |  |dS NthissqlrN   r0   r0   r1   rQ   u       c                 C     | j |dddS )NWITH  )prefixseprL   rN   r0   r0   r1   rQ   v       c                 C  rS   )Nz@>binaryrN   r0   r0   r1   rQ   w   rX   c                 C  rS   )Nz&&r_   rN   r0   r0   r1   rQ   x   rX   c                 C     d|  |d S )NzAUTO REFRESH rU   rV   rN   r0   r0   r1   rQ   y       c                 C  ra   )NzBACKUP rU   rV   rN   r0   r0   r1   rQ   z   rb   c                 C      |j drd dS d dS )Nnot_NOT  CASESPECIFICr   r'   _rP   r0   r0   r1   rQ   {       c                 C  
   |  |S r"   
ceil_floorrN   r0   r0   r1   rQ   }      
 c                 C  ra   )NzCHARACTER SET rU   rV   rN   r0   r0   r1   rQ   ~   rb   c                 C  s&   |j drdnd d| |d S )NdefaultDEFAULT rf   CHARACTER SET=rU   r   r'   rW   rN   r0   r0   r1   rQ      s   &c                 C     d| j |ddd dS )NzCLUSTERED (rU   Findent)rL   rN   r0   r0   r1   rQ         c                 C  ra   )NzCOLLATE rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NCOMMENT rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NzCONNECT_BY_ROOT rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  s    |  d|j|jd |jdS )NCONVERTdestsource)r   rU   r   r'   rN   r0   r0   r1   rQ      s    c                  G     dS )NzCOPY GRANTSr0   rj   r0   r0   r1   rQ          c                 C  rt   )NzCREDENTIALS=(rM   r[   r]   rw   rL   rN   r0   r0   r1   rQ      rx   c                 C  ra   )NzFORMAT rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )Nrq   rU   rV   rN   r0   r0   r1   rQ      rb   c                  G  r}   )NDYNAMICr0   r~   r0   r0   r1   rQ      r   c                  G  r}   )NEMPTYr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )NzENCODE rU   rV   rN   r0   r0   r1   rQ      rb   c                 C     d| j |dd dS )NzENVIRONMENT (TrJ   rw   rL   rN   r0   r0   r1   rQ          c                 C  s$   d|j rd| |d  S d S )N	EPHEMERALr[   rU   rf   )rU   rW   rN   r0   r0   r1   rQ         $c                 C  s   d|  |d  S )NzEXCLUDE rU   )rW   lstriprN   r0   r0   r1   rQ      r   c                 C  rl   r"   naked_propertyrN   r0   r0   r1   rQ      ro   c                 C  rl   r"   set_operationsrN   r0   r0   r1   rQ      ro   c                  G  r}   )NEXTERNALr0   r~   r0   r0   r1   rQ      r   c                 C  rl   r"   rm   rN   r0   r0   r1   rQ      ro   c                 C  rl   r"   get_put_sqlrN   r0   r0   r1   rQ      ro   c                  G  r}   )NGLOBALr0   r~   r0   r0   r1   rQ      r   c                  G  r}   )NHEAPr0   r~   r0   r0   r1   rQ      r   c                  G  r}   )NICEBERGr0   r~   r0   r0   r1   rQ      r   c                 C  r   )Nz
INHERITS (TrJ   rw   rL   rN   r0   r0   r1   rQ      r   c                 C  ra   )NzINLINE LENGTH rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NINPUTrU   rV   rN   r0   r0   r1   rQ      rb   c                 C  rl   r"   r   rN   r0   r0   r1   rQ      ro   c                 C     |  |d d|  |d S )NrU    TO r    rV   rN   r0   r0   r1   rQ          c                 C     |  t|jtjjjS r"   )rW   r   castrU   DataTypeTypeBIGINTrN   r0   r0   r1   rQ          c                 C  rl   r"   r   rN   r0   r0   r1   rQ      ro   c                 C  rl   r"   r   rN   r0   r0   r1   rQ      ro   c                 C  rc   )NnoNO rf   LOGrh   ri   r0   r0   r1   rQ           c                  G  r}   )NMATERIALIZEDr0   r~   r0   r0   r1   rQ      r   c                 C  rt   )NzNONCLUSTERED (rU   Fru   rw   rL   rN   r0   r0   r1   rQ      rx   c                  G  r}   )NzNO PRIMARY INDEXr0   r~   r0   r0   r1   rQ      r   c                  G  r}   )NzNOT FOR REPLICATIONr0   r~   r0   r0   r1   rQ      r   c                 C  s"   d|j drd dS d dS )Nz
ON COMMIT deleteDELETEPRESERVE ROWSrh   ri   r0   r0   r1   rQ         "c                 C  ra   )NON rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )Nz
ON UPDATE rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  rS   Nrf   r_   rN   r0   r0   r1   rQ      rX   c                 C  ra   )NOUTPUTrU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NzPATH rU   rV   rN   r0   r0   r1   rQ      rb   c                 C     |  d|j|jS )NBUCKETr   rU   r    rN   r0   r0   r1   rQ      rb   c                 C  r   )NTRUNCATEr   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NANYrU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NzPROJECTION POLICY rU   rV   rN   r0   r0   r1   rQ         c                 C  rl   r"   r   rN   r0   r0   r1   rQ      ro   c                 C  ra   )NzREMOTE WITH CONNECTION rU   rV   rN   r0   r0   r1   rQ      r   c                 C  s   |j drdS | |S )NnullzRETURNS NULL ON NULL INPUT)r   r'   r   rN   r0   r0   r1   rQ         c                 C  ra   )Nz
SAMPLE BY rU   rV   rN   r0   r0   r1   rQ      rb   c                  G  r}   )NSECUREr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )Nz	SECURITY rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  rS   rT   rV   rN   r0   r0   r1   rQ      rX   c                 C  rc   )NmultiMULTIrf   SETrh   ri   r0   r0   r1   rQ      r   c                 C  s   d|  d | | S )NSETTINGSrf   segrM   rN   r0   r0   r1   rQ      r   c                 C  ra   )NzSHARING=rU   rV   rN   r0   r0   r1   rQ      rb   c                 C     |j S r"   nameri   r0   r0   r1   rQ          c                 C  s   d|j drd S d S )NzSQL SECURITY definerDEFINERINVOKERrh   ri   r0   r0   r1   rQ         c                 C  r   r"   r   ri   r0   r0   r1   rQ      r   c                 C  ra   )NzSTREAM rU   rV   rN   r0   r0   r1   rQ      rb   c                  G  r}   )N	STREAMINGr0   r~   r0   r0   r1   rQ      r   c                  G  r}   )NSTRICTr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )Nz
SWAP WITH rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  s   |  |jS r"   rW   rU   rN   r0   r0   r1   rQ      rX   c                 C  r   )NzTAG (TrJ   rw   rL   rN   r0   r0   r1   rQ      r   c                  G  r}   )N	TEMPORARYr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )NzTITLE rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NzMAP rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  s   d|  |j S )NzTO r   rN   r0   r0   r1   rQ      rb   c                 C     | j dg|jR  S )N	TRANSFORMr   rM   rN   r0   r0   r1   rQ          c                  G  r}   )N	TRANSIENTr0   r~   r0   r0   r1   rQ      r   c                 C  rl   r"   r   rN   r0   r0   r1   rQ      ro   c                  G  r}   )NUNLOGGEDr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )NzUSING TEMPLATE rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  ra   )NzUSING DATA rU   rV   rN   r0   r0   r1   rQ      rb   c                  G  r}   )NzUUID()r0   r~   r0   r0   r1   rQ      r   c                  G  r}   )N	UPPERCASEr0   r~   r0   r0   r1   rQ      r   c                 C  s   |  d|jd |jd S )NMAPkeysvalues)r   r   rN   r0   r0   r1   rQ      r   c                 C  ra   )NrZ   rU   rV   rN   r0   r0   r1   rQ      rb   c                  G  r}   )NVOLATILEr0   r~   r0   r0   r1   rQ      r   c                 C  ra   )NzWITH JOURNAL TABLE=rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  rI   )NrZ   TrJ   rL   rN   r0   r0   r1   rQ      r   c                 C  ra   )NzWITH SCHEMA rU   rV   rN   r0   r0   r1   rQ      rb   c                 C  r   )NrU   z WITH oprV   rN   r0   r0   r1   rQ      r   c                  G  r}   )NFORCEr0   r~   r0   r0   r1   rQ      r   z4t.Dict[t.Type[exp.Expression], t.Callable[..., str]]r=   Tt.Optional[bool]NULL_ORDERING_SUPPORTEDFALL,ON, )STRUCTVALUEzt.Tuple[str, ...]SELECT_KINDSTABLESAMPLESEED:z OVERWRITE TABLEEXCEPTHEXWITH
PARSE_JSONt.Optional[str]PARSE_JSON_NAMEARRAY_LENGTHr!   ARRAY_SIZE_NAMEzSET DATA TYPENARRAY_SIZE_DIM_REQUIRED	TIMESTAMPCHARVARCHARTEXT	VARBINARYBLOBINETMICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR)	MICROSECONDSSECONDSMINUTESHOURSDAYSWEEKSMONTHSQUARTERSYEARSc                 C  rS   )NclusterrV   rN   r0   r0   r1   rQ     rX   c                 C  rS   )N
distributerV   rN   r0   r0   r1   rQ     rX   c                 C  rS   )NsortrV   rN   r0   r0   r1   rQ   	  rX   c                 C  s*   |j dr| d| j|ddd S dS )NwindowszWINDOW TkeyrK   rf   )r   r'   r   rM   rN   r0   r0   r1   rQ   
  s   
c                 C  rS   )NqualifyrV   rN   r0   r0   r1   rQ     rX   )r   r   r  r  r  zt.Dict[TokenType, str]TOKEN_MAPPING)<>@z
t.Set[str])EXPRESSION_PRECEDES_PROPERTIES_CREATABLESRESERVED_KEYWORDSz$t.Tuple[t.Type[exp.Expression], ...]WITH_SEPARATED_COMMENTSEXCLUDE_COMMENTSUNWRAPPED_INTERVAL_VALUESzt.Set[t.Type[exp.Expression]]EXPRESSIONS_WITHOUT_NESTED_CTESr0   ,RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS__SQLGLOT__LB__)prettyidentify	normalizepad_indentnormalize_functionsunsupported_levelmax_unsupportedleading_commamax_text_widthcommentsr%   unsupported_messages_escaped_quote_end_escaped_identifier_end
_next_name_identifier_start_identifier_end#_quote_json_path_key_using_brackets      P   r  r  
str | boolr  boolr  intrv   r  t.Optional[str | bool]r  r   r  r  r  r  r%   r   c                 C  s   dd l }ddlm} |d ur|n|j| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _|| _||| _|d u r=| jjn|| _g | _| jjjd | jj | _| jjd | _td| _| jj| _| jj| _d| _d S )Nr   Dialectr$  _tT)r   sqlglot.dialectsr,  r  r  r  r  r  r  r  r  r  r  get_or_raiser%   NORMALIZE_FUNCTIONSr  r  tokenizer_classSTRING_ESCAPES	QUOTE_ENDr  IDENTIFIER_ENDr  r   r   IDENTIFIER_STARTr!  r"  r#  )rO   r  r  r  r  rv   r  r  r  r  r  r  r%   r   r,  r0   r0   r1   __init__  s.   



zGenerator.__init__r    exp.Expressioncopyr   c                 C  s   |r|  }| |}g | _| | }| jr|| jd}| jt	j
kr'|S | jt	jkr:| jD ]}t| q0|S | jt	jkrL| jrLtt| j| j|S )aQ  
        Generates the SQL string corresponding to the given syntax tree.

        Args:
            expression: The syntax tree.
            copy: Whether to copy the expression. The generator performs mutations so
                it is safer to copy.

        Returns:
            The SQL string corresponding to `expression`.
        
)r8  
preprocessr  rW   stripr  replaceSENTINEL_LINE_BREAKr  r   IGNOREWARNloggerwarningRAISEr   r	   r  )rO   r    r8  rW   msgr0   r0   r1   generate  s    

zGenerator.generatec                 C  s(   |  |}| jrddlm} ||}|S )zBApply generic preprocessing transformations to a given expression.r   )ensure_bools)_move_ctes_to_top_levelENSURE_BOOLSsqlglot.transformsrE  )rO   r    rE  r0   r0   r1   r:    s
   
zGenerator.preprocessr   c                   sJ    j s#t | jv r#t fdd tjD r#ddlm} |   S )Nc                 3  s    | ]}|j  uV  qd S r"   )parent).0noder    r0   r1   	<genexpr>(      z4Generator._move_ctes_to_top_level.<locals>.<genexpr>r   )move_ctes_to_top_level)	rI  typer  anyfind_allr   WithrH  rO  )rO   r    rO  r0   rL  r1   rF  $  s   z!Generator._move_ctes_to_top_levelmessageNonec                 C  s$   | j tjkr
t|| j| d S r"   )r  r   	IMMEDIATEr   r  append)rO   rT  r0   r0   r1   r*   /  s   zGenerator.unsupportedr[   r]   c                 C  s   | j r
|  dS |S )Nr9  )r  r;  )rO   r]   r0   r0   r1   r]   4  rx   zGenerator.seprW   c                 C  s   |  | | S r"   r   )rO   rW   r]   r0   r0   r1   r   7  r   zGenerator.segcommentc                 C  sJ   |d   r
d| n|}|d   r|d n|}| jjjs#|dd}|S )Nr   r[   */z* /)r;  r%   r1  NESTED_COMMENTSr<  )rO   rX  r0   r0   r1   sanitize_comment:  s
   
zGenerator.sanitize_commentt.Optional[exp.Expression]t.Optional[t.List[str]]	separatedc                   s    j r|d u r|o|j n|nd }|rt| jr|S d fdd|D }|s*|S  |}|s7t| jrS|r?|d  rI   | | S |    | S | d| S )Nr[   c                 3  s&    | ]}|rd   | dV  qdS )z/*rZ  N)r\  )rJ  rX  rO   r0   r1   rM  T  s    
z*Generator.maybe_comment.<locals>.<genexpr>r   )r  r6   r  join_replace_line_breaksr  isspacer]   )rO   rW   r    r  r_  comments_sqlr0   r`  r1   maybe_commentD  s.   	 

zGenerator.maybe_commentexp.Expression | strc                 C  s\   t |tjr| |n| |d}|sdS | j|ddd}d| d | | jddd	 S )
NrU   ()r   r   )levelr  (rf   rw   r   )r6   r   UNWRAPPED_QUERIESrW   rv   r]   r   rO   r    this_sqlr0   r0   r1   wrapf  s   

"zGenerator.wrapr   t.Callable[..., str]c                 O  s$   | j }d| _ ||i |}|| _ |S )NF)r  )rO   r   r   kwargsoriginalresultr0   r0   r1   no_identifyr  s
   zGenerator.no_identifyr   c                 C  s2   | j dks
| j du r| S | j dkr| S |S )NupperTlower)r  rs  rt  )rO   r   r0   r0   r1   normalize_funcy  s
   
zGenerator.normalize_funcr   rh  t.Optional[int]
skip_first	skip_lastc                   sP   j r|s|S d u rjn|dd fddtD S )Nr9  c                 3  sR    | ]$\}}r|d ksr|t d kr|nd j    | V  qdS )r   r   r[   N)lenr  )rJ  ilinerh  linesr  rO   rw  rx  r0   r1   rM    s    
z#Generator.indent.<locals>.<genexpr>)r  r  splitra  	enumerate)rO   rW   rh  r  rw  rx  r0   r|  r1   rv     s   

zGenerator.indent t.Optional[str | exp.Expression]r  c                 C  s   |sdS t |tr|S |r|j|}|r| |S dS | j|j}t|r-|| |}nFt |tj	rg|j
 d}t| |rFt| ||}n-t |tjrR| |}n!t |tjr^| |}ntd|jj tdt| d| | jr~|r~| ||S |S )Nrf   _sqlzUnsupported expression type z!Expected an Expression. Received z: )r6   r!   r   r'   rW   r=   r#   callabler   
Expressionr  hasattrgetattrFuncfunction_fallback_sqlPropertyproperty_sql
ValueErrorr$   rP  r  re  )rO   r    r  rX  value	transformrW   exp_handler_namer0   r0   r1   rW     s.   


zGenerator.sqlexp.Uncachec                 C  0   |  |d}|jdrdnd}d| d| S )NrU   exists
 IF EXISTSrf   zUNCACHE TABLEr[   rW   r   r'   )rO   r    table
exists_sqlr0   r0   r1   uncache_sql     zGenerator.uncache_sql	exp.Cachec                 C  s   |j drdnd}| |d}|j d}|r+d| |d  d| |d	  d
nd}| |d}|r>d|   | nd}d| d| | | }| ||S )Nlazyz LAZYrf   rU   optionsz	 OPTIONS(r    = r   rw   r     ASCACHE TABLE )r   r'   rW   r]   prepend_ctes)rO   r    r  r  r  rW   r0   r0   r1   	cache_sql  s   .zGenerator.cache_sqlexp.CharacterSetc                 C  sJ   t |jtjrd| |d S |jdrdnd}| d| |d S )NzCHAR CHARACTER SET rU   rp   rq   rf   rr   )r6   rI  r   CastrW   r   r'   )rO   r    rp   r0   r0   r1   characterset_sql  s   zGenerator.characterset_sql
exp.Columnc              	     s@   d  fdd|jd|jd|jd|jdfD S )N.c                 3  s    | ]
}|r  |V  qd S r"   rV   rJ  rD   r`  r0   r1   rM    s    
z)Generator.column_parts.<locals>.<genexpr>catalogdbr  rU   ra  r   r'   rO   r    r0   r`  r1   column_parts  s   



zGenerator.column_partsc                 C  s@   |j drdnd}|r| jjsd}| d | | | S )N	join_markz (+)rf   z:Outer join syntax using the (+) operator is not supported.)r   r'   r%   SUPPORTS_COLUMN_JOIN_MARKSr*   r  )rO   r    r  r0   r0   r1   
column_sql  s
   
zGenerator.column_sqlexp.ColumnPositionc                 C  s6   |  |d}|rd| nd}|  |d}| | S )NrU   r[   rf   positionrV   )rO   r    rU   r  r0   r0   r1   columnposition_sql  s   zGenerator.columnposition_sqlexp.ColumnDefc                 C  s   |  |d}|  |d}| j|dddd}|jdrdnd	}|r'| | nd	}|r0d| nd	}|  |d
}|r?d| nd	}|tjrL| jsLd	}| | | | | S )NrU   kindconstraintsr[   Tr  r]   rK   r  IF NOT EXISTS rf   r  )rW   rM   r   r'   findr   ComputedColumnConstraintCOMPUTED_COLUMN_WITH_TYPE)rO   r    r]   columnr  r  r  r  r0   r0   r1   columndef_sql  s   zGenerator.columndef_sqlexp.ColumnConstraintc                 C  s4   |  |d}|  |d }|rd| d| S |S )NrU   r  CONSTRAINT r[   )rW   r;  )rO   r    rU   kind_sqlr0   r0   r1   columnconstraint_sql  s   zGenerator.columnconstraint_sqlexp.ComputedColumnConstraintc                 C  sB   |  |d}|jdrd}n|jdrd}nd}d| | S )NrU   not_nullz PERSISTED NOT NULL	persistedz
 PERSISTEDrf   AS r  )rO   r    rU   r  r0   r0   r1   computedcolumnconstraint_sql  s   z&Generator.computedcolumnconstraint_sqlc                 C  s   |  tjS r"   )	token_sqlr   AUTO_INCREMENTrO   rj   r0   r0   r1   !autoincrementcolumnconstraint_sql     z+Generator.autoincrementcolumnconstraint_sqlexp.CompressColumnConstraintc                 C  s:   t |jtr| | j|ddd}n| |d}d| S )NrU   Tr  z	COMPRESS )r6   rU   listrm  rM   rW   rO   r    rU   r0   r0   r1   compresscolumnconstraint_sql  s   
z&Generator.compresscolumnconstraint_sql'exp.GeneratedAsIdentityColumnConstraintc                 C  sX  d}|j d ur|jdrdnd}|j rdnd| }|jd}|r(d| nd}|jd}|r7d	| nd}|jd
}|rFd| nd}|jd}|rUd| nd}|jd}d}	|d urv|sgdnd d}	|st|st|	 n|	}	d}
|s~|s~|	r| | | | |	 }
d|
  d}
| |d}|rd| dnd}d| d| |
 S )Nrf   on_nullz ON NULLz ALWAYSz BY DEFAULTstartSTART WITH 	increment INCREMENT BY minvalue
 MINVALUE maxvalue
 MAXVALUE cycle NOz CYCLE (rw   r    ri  IDENTITY	GENERATED AS )rU   r   r'   r;  rW   )rO   r    rU   r  r  r  r  r  r  	cycle_sqlsequence_optsexprr0   r0   r1   'generatedasidentitycolumnconstraint_sql  s0   
z1Generator.generatedasidentitycolumnconstraint_sql"exp.GeneratedAsRowColumnConstraintc                 C  s6   |j drdnd}|j drdnd}d| | S )Nr  STARTENDhiddenz HIDDENrf   zGENERATED ALWAYS AS ROW rh   )rO   r    r  r  r0   r0   r1   "generatedasrowcolumnconstraint_sql8  s   z,Generator.generatedasrowcolumnconstraint_sql!exp.PeriodForSystemTimeConstraintc                 C  s"   d|  |d d|  |d dS )NzPERIOD FOR SYSTEM_TIME (rU   r   r    rw   rV   r  r0   r0   r1   !periodforsystemtimeconstraint_sql?  s   "z+Generator.periodforsystemtimeconstraint_sqlexp.NotNullColumnConstraintc                 C  rc   )N
allow_nullrf   re   NULLrh   r  r0   r0   r1   notnullcolumnconstraint_sqlD  rk   z%Generator.notnullcolumnconstraint_sqlexp.PrimaryKeyColumnConstraintc                 C  sX   |j d}|d urd|rd S d S | j|dddd}|r%d| nd	}d| S )
NdesczPRIMARY KEY DESC ASCr  Tr[   r  rK   r]   rf   r   r'   rM   )rO   r    r  r  r0   r0   r1   primarykeycolumnconstraint_sqlG  s   
z(Generator.primarykeycolumnconstraint_sqlexp.UniqueColumnConstraintc                 C  s   |  |d}|rd| nd}|jd}|rd| nd}|  |d}|r+d| nd}|jdr5dnd}| j|d	d
dd}|rGd| nd}d| | | | | S )NrU   r[   rf   
index_type USING on_conflictnullsz NULLS NOT DISTINCTr  Tr  UNIQUErW   r   r'   rM   )rO   r    rU   r  r  	nulls_sqlr  r0   r0   r1   uniquecolumnconstraint_sqlO  s   z$Generator.uniquecolumnconstraint_sql
exp.Create	locationst.DefaultDictc                 C  rS   rT   rV   )rO   r    r  r0   r0   r1   createable_sql[  r  zGenerator.createable_sqlc                 C  s  |  |d}| jj|p|}|jd}|r| |nt }| ||}d}|tj	j
js7|tj	j
jre|  tj	g |tj	j
j |tj	j
j d}|tj	j
jr]|  | }n| jsed| }|jdrmdnd}|jdrwd	nd}|  |d
}	|	r| |   |	 | }	| jst|jtjsd}
|tj	j
jr| jtj	|tj	j
j ddd}
|
rd|
 nd}
d|
 |	 }	d}|tj	j
jr| jtj	|tj	j
j dddd}| j|dddd}|rd| nd}|| }|jdrdnd}|jdrdnd}|jdrdnd}|jd}|d u r d}n|r&d}nd}d}|tj	j
jrE| jtj	|tj	j
j ddddd}d|||||f}d}|tj	j
jrl| jtj	|tj	j
j ddddd}|jdrudnd}|jdrdnd}|jdrd nd}|  |d!}|rd| nd}|| jv r|	 | }n| |	 }d"| d| | | d| | | | | | }	| ||	S )#Nr  
propertiesrf   rL   r[   beginz BEGINendz ENDr    F)wrappedr  )r  r\   indexes)r  rv   r]   r<  z OR REPLACErefreshz OR REFRESHuniquez UNIQUE	clusteredz CLUSTERED COLUMNSTOREz NONCLUSTERED COLUMNSTORE)r]   r\   r  concurrently CONCURRENTLYr   IF NOT EXISTSno_schema_bindingz WITH NO SCHEMA BINDINGcloneCREATE)rW   r%   INVERSE_CREATABLE_KIND_MAPPINGr'   r   locate_propertiesr   r  r   
PropertiesLocationPOST_SCHEMA	POST_WITHr]   r  CREATE_FUNCTION_RETURN_ASr6   r    Return
POST_ALIASr   
POST_INDEXrM   POST_CREATEra  POST_EXPRESSIONr
  r  )rO   r    r  r   properties_locsrU   properties_sqlr  r  expression_sqlpostalias_props_sqlpostindex_props_sqlr  	index_sqlr<  r  r  r  clustered_sqlpostcreate_props_sql	modifierspostexpression_props_sqlr  r  r  r  properties_expressionr0   r0   r1   
create_sql^  s   	

	2zGenerator.create_sqlexp.SequencePropertiesc           
      C  s  |  |d}|rd| nd}|  |d}|rd| nd}|  |d}|r+d| nd}|  |d}|r:d	| nd}|  |d
}|rId| nd}|jd}|d u rXd}n|du r_d}nd| }| j|dddd}	|	rtd|	 nd}	| | | | | |	 |  S )Nr  r  rf   r  r  r  r  r  r  ownedz
 OWNED BY cacheTz CACHEz CACHE r  r[   r  )rW   r   r'   rM   r   )
rO   r    r  r  r  r  r'  r(  	cache_strr  r0   r0   r1   sequenceproperties_sql  s&   
$z Generator.sequenceproperties_sql	exp.Clonec                 C  sL   |  |d}|jdrdnd}|jdr| jrdnd}| | d| S )	NrU   shallowzSHALLOW rf   r8  COPYCLONEr[   )rW   r   r'   SUPPORTS_TABLE_COPY)rO   r    rU   r,  keywordr0   r0   r1   	clone_sql  s   zGenerator.clone_sqlexp.Describec                 C  sz   |j d}|rd| nd}| |d}|rd| nd}| |d}|r+d| nd}d| | d| |d | S )Nstyler[   rf   	partitionr)   DESCRIBErU   rs   )rO   r    r3  r4  r)   r0   r0   r1   describe_sql  s    zGenerator.describe_sqlexp.Heredocc                 C  s,   |  |d}d| d|  |d d| dS )Ntag$rU   rV   )rO   r    r8  r0   r0   r1   heredoc_sql  s    zGenerator.heredoc_sqlc                 C  s(   |  |d}|r| |   | }|S )Nwith)rW   r]   )rO   r    rW   with_r0   r0   r1   r    s   zGenerator.prepend_ctesexp.Withc                 C  sX   | j |dd}| jr|jdrdnd}| |d}|r!d| nd}d| | | S )	NTrJ   	recursivez
RECURSIVE rf   searchr[   rZ   )rM   CTE_RECURSIVE_KEYWORD_REQUIREDr   r'   rW   )rO   r    rW   r>  r?  r0   r0   r1   with_sql  s   
zGenerator.with_sqlexp.CTEc                 C  sh   |j d}|r||  | |d}|j d}|du r"d}n|r&d}| d|p,d | | S )NaliasmaterializedFzNOT MATERIALIZED zMATERIALIZED r  rf   )r   r'   add_commentspop_commentsrW   rm  )rO   r    rC  	alias_sqlrD  r0   r0   r1   cte_sql
  s   zGenerator.cte_sqlexp.TableAliasc                 C  sh   |  |d}| j|ddd}|rd| dnd}|r$| js$d}| d |s.| jjs.|  }| | S )	NrU   columnsTr  ri  rw   rf   z/Named columns are not supported in table alias.)rW   rM   SUPPORTS_TABLE_ALIAS_COLUMNSr*   r%   UNNEST_COLUMN_ONLYr   )rO   r    rC  rJ  r0   r0   r1   tablealias_sql  s   

zGenerator.tablealias_sqlexp.BitStringc                 C  s8   |  |d}| jjr| jj | | jj S t|d S )NrU   r$  )rW   r%   	BIT_STARTBIT_ENDr)  r  r0   r0   r1   bitstring_sql'  s   zGenerator.bitstring_sqlexp.HexStringbinary_function_reprc                 C  s   |  |d}|jd}|r| jjr| jjs|st|d S |s5|r,| |tj	
|S | jjr5| d | jj | | jj S )NrU   
is_integer   z5Unsupported transpilation from BINARY/BLOB hex string)rW   r   r'   r%   HEX_STRING_IS_INTEGER_TYPE	HEX_STARTr)  r   r   Literalstringr*   HEX_END)rO   r    rS  rU   is_integer_typer0   r0   r1   hexstring_sql-  s   
zGenerator.hexstring_sqlexp.ByteStringc                 C  s0   |  |d}| jjr| jj | | jj S |S rT   )rW   r%   
BYTE_STARTBYTE_ENDr  r0   r0   r1   bytestring_sqlF  s   zGenerator.bytestring_sqlexp.UnicodeStringc           	      C  s   |  |d}|jd}| jjrd}| jj| jj}}nd}| jj| jj}}|r@t	|j
 d}| jr=d|  | nd}nt}d}| jjrM|rS| jsS|||}| | | | S )NrU   escapez\\\1z\\u\1z(\d+)z	 UESCAPE rf   )rW   r   r'   r%   UNICODE_STARTUNICODE_ENDQUOTE_STARTr3  recompiler   SUPPORTS_UESCAPEESCAPED_UNICODE_REsub)	rO   r    rU   rb  escape_substitute
left_quoteright_quoteescape_pattern
escape_sqlr0   r0   r1   unicodestring_sqlL  s   zGenerator.unicodestring_sqlexp.RawStringc                 C  sF   |j }d| jjjv r|dd}| j|dd}| jj | | jj S )N\z\\F)escape_backslash)rU   r%   r1  r2  r<  
escape_strre  r3  )rO   r    rY  r0   r0   r1   rawstring_sqlc  s
   zGenerator.rawstring_sqlexp.DataTypeParamc                 C  s<   |  |d}|  |d}|r| jrd| nd}| | S NrU   r    r[   rf   )rW   DATA_TYPE_SPECIFIERS_ALLOWED)rO   r    rU   	specifierr0   r0   r1   datatypeparam_sqlk  s   zGenerator.datatypeparam_sqlexp.DataTypec                 C  sD  d}d}| j |dd}|j}|tjjjkr"|jdr"| |d}nt	|tjjr1| j
||jn|}|r|jdrq| jd  | | jd  }|jdd urp|tjjjkrZd	nd
}| j |ddd}|d  | |d  }n|tjjjkr~d| }nd| d}| | | }| jr|tjjjtjjjfv r| d}|S )Nrf   TrJ   r  nestedr   r   r   )[])ri  rw   r  r[   ri  rw   z WITH TIME ZONE)rM   rU   r   r   r   USERDEFINEDr   r'   rW   r6   TYPE_MAPPINGr  STRUCT_DELIMITERARRAYINTERVALTZ_TO_WITH_TIME_ZONETIMETZTIMESTAMPTZ)rO   r    r|  r   interior
type_valuetype_sql
delimitersr0   r0   r1   datatype_sqlq  s8   
zGenerator.datatype_sqlexp.Directoryc                 C  sL   |j drdnd}| |d}|rd| nd}| d| |d | S )NlocalzLOCAL rf   
row_formatr[   z
DIRECTORY rU   rs   )rO   r    r  r  r0   r0   r1   directory_sql  s   zGenerator.directory_sql
exp.Deletec           
      C  s   |  |d}|rd| nd}|  |d}|rd| nd}|  |d}|r+d| nd}|  |d}|  |d	}|  |d
}| j|dd}|rMd| nd}| jra| | | | | | }	n| | | | | | }	| |d| |	 S )NrU    FROM rf   usingr  r   r[   where	returninglimittablesr  r   rW   rM   RETURNING_ENDr  )
rO   r    rU   r  r   r  r  r  r  r  r0   r0   r1   
delete_sql  s   zGenerator.delete_sqlexp.Dropc                 C  s(  |  |d}| j|dd}|rd| dnd}|jd }| jj|p$|}|jdr-d	nd
}|jdr7dnd}|  |d}|rFd
| nd}|jdrPdnd}|jdrZdnd}	|jdrddnd}
|jdrndnd}|jdrxdnd}d| |	 d
| | | | | | |
 | | S )NrU   TrJ   r  rw   rf   r  r   IF EXISTS r[   r  r	  r   	temporary
 TEMPORARYrD   MATERIALIZEDcascadez CASCADEr  z CONSTRAINTSpurgez PURGEDROP)rW   rM   r   r%   r  r'   )rO   r    rU   rM   r  r  concurrently_sql
on_clusterr  rD  r  r  r  r0   r0   r1   drop_sql  s   
4zGenerator.drop_sqlexp.SetOperationc           
      C  s  t |}|j }|jd}|du r&|tjtjfv r&| js&| 	| d | j
j| }|d u r>|}|d u r>| 	| d ||u rEd}n|rIdnd}dtd |j|jg}|r^| dnd}|jd	rhd
nd}| j|ddd}	|	rzd|	 dnd}	| | | | |	 S )NdistinctFz ALL is not supportedz) requires DISTINCT or ALL to be specifiedrf   	 DISTINCT ALLr[   by_name BY NAMEonTr  z ON (rw   )rP  r  rs  r   r'   r   Except	Intersect#EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSEr*   r%   SET_OP_DISTINCT_BY_DEFAULTra  filtersider  rM   )
rO   r    op_typeop_namer  default_distinctdistinct_or_all	side_kindr  r  r0   r0   r1   set_operation  s,   
zGenerator.set_operationc           	      C  s  | j s>|jd}|jd}|s|r>| tj|dddjddd}|r.|j| dd}|r9|j	| dd}| 
|S g }|g}|ru| }t|tjrk||j || j| ||jdd ||j n|| 
| |sE|  |}| ||}| ||S )	Nr  order_l_0Fr8  *T)r  r_  )SET_OP_MODIFIERSr   r'   rF  r   subqueryselectr  r>   order_byrW   r6   SetOperationrW  r    re  r  r  rU   r]   ra  query_modifiersr  )	rO   r    r  r  r  sqlsstackrK  rU   r0   r0   r1   r     s:   
zGenerator.set_operations	exp.Fetchc                 C  sp   |j d}|rd| nd}| |d}|rd| nd}| |d}|r)| nd}| d | | | S )N	directionr[   rf   countlimit_optionsz
 ROWS ONLYFETCH)r   r'   rW   r   )rO   r    r  r  r  r0   r0   r1   	fetch_sql  s   zGenerator.fetch_sqlexp.LimitOptionsc                 C  sX   |j drdnd}|j drdnd}|j drdnd}|s$|r$d}| | | S )	Npercent PERCENTrf   rowsr   	with_tiesz
 WITH TIES ONLYrh   )rO   r    r  r  r  r0   r0   r1   limitoptions_sql  s   zGenerator.limitoptions_sql
exp.Filterc                 C  sl   | j r| |d}| |d }| d| dS |j}|j}|jj}|tj| | d | |S )NrU   r    z FILTER(rw   rU   true)	AGGREGATE_FILTER_SUPPORTEDrW   r;  rU   r    r<  r   Ifr8  )rO   r    rU   r  aggagg_argcondr0   r0   r1   
filter_sql  s   
zGenerator.filter_sqlexp.Hintc                 C  s0   | j s
| d dS d| j|| jd  dS )NzHints are not supportedrf   z /*+ r   z */)QUERY_HINTSr*   rM   QUERY_HINT_SEPr;  r  r0   r0   r1   hint_sql!  s   
zGenerator.hint_sqlexp.IndexParametersc           
      C  s  |  |d}|rd| nd}| j|ddd}|rd| dnd}| j|d	dd}|r0d
| nd}|  |d}| j|ddd}|rHd| d}| j|ddd}|rXd| dnd}|  |d}|rgd| nd}|  |d}	|	rvd|	 nd}	| | | | | | | |	 S )Nr  r  rf   rJ  Tr  ri  rw   partition_byz PARTITION BY r  includez
 INCLUDE (with_storage WITH (
tablespacez USING INDEX TABLESPACE r   ON rW   rM   )
rO   r    r  rJ  r  r  r  r  r  r  r0   r0   r1   indexparameters_sql(  s"   $zGenerator.indexparameters_sql	exp.Indexc           	      C  s   |j drdnd}|j drdnd}|j drdnd}| |d}|r+| d	nd}| |d
}|r=| j d	| nd}|sCdnd}| |d}| | | | | | | S )Nr  zUNIQUE rf   primaryzPRIMARY ampzAMP rU   r[   r  zINDEX params)r   r'   rW   INDEX_ON)	rO   r    r  r  r  r   r  indexr  r0   r0   r1   r  <  s    zGenerator.index_sqlexp.Identifierc                 C  s   |j }| }| jr|js|n|}|| j| j}|js5| j|| j	s5|| j
v s5| jjs?|d d  r?| j | | j }|S )Nr   )r   rt  r  quotedr<  r"  r  r%   can_identifyr  r   IDENTIFIERS_CAN_START_WITH_DIGITisdigitr!  )rO   r    textrt  r0   r0   r1   identifier_sqlJ  s   
zGenerator.identifier_sqlexp.Hexc                 C  s.   |  | j| |d}| jjr|  d|}|S NrU   LOWERr   HEX_FUNCrW   r%   HEX_LOWERCASErO   r    r  r0   r0   r1   hex_sqlX  s   zGenerator.hex_sqlexp.LowerHexc                 C  s.   |  | j| |d}| jjs|  d|}|S r  r  r  r0   r0   r1   lowerhex_sql_  s   zGenerator.lowerhex_sqlexp.InputOutputFormatc                 C  sN   |  |d}|rd| nd}|  |d}|rd| nd}|  ||fS )Ninput_formatzINPUTFORMAT rf   output_formatzOUTPUTFORMAT )rW   r]   ra  )rO   r    r   r  r0   r0   r1   inputoutputformat_sqle  s
   zGenerator.inputoutputformat_sqlNexp.Nationalr\   c                 C  s    |  tj|j}| | S r"   )rW   r   rX  rY  r   )rO   r    r\   rY  r0   r0   r1   national_sqll  s   zGenerator.national_sqlexp.Partitionc                 C  s.   |j drdnd}| d| j|dd dS )NsubpartitionSUBPARTITION	PARTITIONri  TrJ   rw   r  )rO   r    partition_keywordr0   r0   r1   partition_sqlp  s   zGenerator.partition_sqlexp.Propertiesc                 C  s   g }g }|j D ]!}| j|j }|tjjjkr|| q|tjjjkr(|| q| 	tj|d}| 
tj|d}|rF|rF| jsFd| }|| S )NrL   r[   )rM   PROPERTIES_LOCATIONr#   r   r  r  r  rW  r  root_propertieswith_propertiesr  )rO   r    r  r  pp_loc
root_props
with_propsr0   r0   r1   r  t  s   

zGenerator.properties_sqlr   c                 C  s   |j r| j |dddS dS )NFr[   )rv   r]   rf   rL   rO   r   r0   r0   r1   r    s   zGenerator.root_propertiesrf   suffixr  c                 C  sP   |j r&| j ||dd}|r&|r| |n|}| | rdnd | | S dS )NFr]   rv   r[   rf   )rM   rm  r;  )rO   r   r\   r]   r  r  rM   r0   r0   r1   r     s    zGenerator.propertiesc                 C  s   | j || j| jdddS )Nrf   r   )r\   )r   r   WITH_PROPERTIES_PREFIXr  r0   r0   r1   r    r   zGenerator.with_propertiesc                 C  sT   t t}|jD ] }| j|j }|tjjjkr|| 	| q| 
d|j  q|S )NUnsupported property )r   r  rM   r  r#   r   r  r  UNSUPPORTEDrW  r*   r  )rO   r   r  r  r  r0   r0   r1   r    s   
zGenerator.locate_propertiesexp.Property
string_keyc                 C  s2   t |jtjr| |dS |rd|j dS |jS )NrU   ')r6   rU   r   DotrW   r   )rO   r    r  r0   r0   r1   property_name  s   zGenerator.property_namec                 C  sf   |j }|tjkr| | d| |d S tjj|}|s(| d|j	  | d| |d S )N=r  r  rU   )
r#   r   r  r  rW   r  PROPERTY_TO_NAMEr'   r*   r  )rO   r    property_clsr  r0   r0   r1   r    s   
zGenerator.property_sqlexp.LikePropertyc                   s    j r6d fdd|jD }|rd| nd}d |d | } jr4t|jtjs4d| d}|S |jr> 	d	 t
d
|jd}d | S )Nr[   c                 3  s(    | ]}|j  d  |d V  qdS )r[   r  N)r   rW   rJ  rP   r`  r0   r1   rM    s   & z-Generator.likeproperty_sql.<locals>.<genexpr>rf   zLIKE rU   ri  rw   z5Transpilation of LIKE property options is unsupportedr  r   r  )SUPPORTS_CREATE_TABLE_LIKEra  rM   rW   LIKE_PROPERTY_INSIDE_SCHEMAr6   rI  r   Schemar*   r  from_rU   r  )rO   r    r  liker  r0   r`  r1   likeproperty_sql  s   
zGenerator.likeproperty_sqlexp.FallbackPropertyc                 C  s6   |j drdnd}|j drdnd}| d| S )Nr   r   rf   
protectionz PROTECTIONFALLBACKrh   )rO   r    r   r+  r0   r0   r1   fallbackproperty_sql  s   zGenerator.fallbackproperty_sqlexp.JournalPropertyc                 C  s   |j drdnd}|j d}|r| dnd}|j dr!dnd}|j dr+d	nd}|j d
r5dnd}| | | | | dS )Nr   r   rf   r  r[   dualzDUAL beforezBEFORE afterzAFTER JOURNALrh   )rO   r    r   r  r/  r0  r1  r0   r0   r1   journalproperty_sql  s   zGenerator.journalproperty_sqlexp.FreespacePropertyc                 C  s.   |  |d}|jdrdnd}d| | S )NrU   r  r  rf   z
FREESPACE=r  )rO   r    	freespacer  r0   r0   r1   freespaceproperty_sql  s   zGenerator.freespaceproperty_sqlexp.ChecksumPropertyc                 C  s2   |j dr	d}n|j drd}nd}d| S )Nrp   DEFAULTr  r   OFFz	CHECKSUM=rh   )rO   r    propertyr0   r0   r1   checksumproperty_sql  s   
zGenerator.checksumproperty_sqlexp.MergeBlockRatioPropertyc                 C  sJ   |j drdS |j drdS |j drdnd}d| |d	 | S )
Nr   zNO MERGEBLOCKRATIOrp   zDEFAULT MERGEBLOCKRATIOr  r  rf   zMERGEBLOCKRATIO=rU   rs   )rO   r    r  r0   r0   r1   mergeblockratioproperty_sql  s   z%Generator.mergeblockratioproperty_sqlexp.DataBlocksizePropertyc                 C  s   |j d}|j d}|j d}|s|s|r)|rd}n|r"d}nd}| dS |j d}|r6d	| nd
}d| |d | S )Nrp   minimummaximumr8  MINIMUMMAXIMUMz DATABLOCKSIZEunitsr[   rf   zDATABLOCKSIZE=sizers   )rO   r    rp   r?  r@  proprC  r0   r0   r1   datablocksizeproperty_sql  s   
z#Generator.datablocksizeproperty_sqlexp.BlockCompressionPropertyc                 C  s   |j d}|j d}|j d}|j d}|j d}|d ur,d| | d}n|r1d}n|r6d	}n	|r;d
}n|r?d}d| S )Nautotempalwaysrp   manualneverz	AUTOTEMP(rw   ALWAYSr8  MANUALNEVERzBLOCKCOMPRESSION=r  )rO   r    rH  rI  rp   rJ  rK  rE  r0   r0   r1   blockcompressionproperty_sql  s    
z&Generator.blockcompressionproperty_sqlexp.IsolatedLoadingPropertyc                 C  sb   |j d}|r
dnd}|j d}|rdnd}| |d}|r%d| nd}d| | d	| S )
Nr   r  rf   
concurrentz CONCURRENTtargetr[   r   z ISOLATED LOADINGrs   )rO   r    r   rQ  rR  r0   r0   r1   isolatedloadingproperty_sql  s   z%Generator.isolatedloadingproperty_sqlexp.PartitionBoundSpecc                 C  s   t |jtrd| j|ddd dS |jr*| |d}| |d}d| d| dS | j|d	dd}| j|d
dd}d| d| dS )NzIN (rU   Tr  rw   r    zWITH (MODULUS z, REMAINDER from_expressionsto_expressionszFROM (z) TO ()r6   rU   r  rM   rW   )rO   r    modulus	remainderrU  rV  r0   r0   r1   partitionboundspec_sql  s   z Generator.partitionboundspec_sqlexp.PartitionedOfPropertyc                 C  sB   |  |d}|j}t|tjrd|  | }nd}d| | S )NrU   z FOR VALUES z DEFAULTzPARTITION OF )rW   r    r6   r   PartitionBoundSpec)rO   r    rU   for_values_or_defaultr0   r0   r1   partitionedofproperty_sql'  s   z#Generator.partitionedofproperty_sqlexp.LockingPropertyc                 C  s   |j d}|jrd| |d nd}|j d}|r!d| nd}|j d}|j dr1dnd}d	| | | d| | S )
Nr  r[   rU   rf   	for_or_in	lock_typeoverridez	 OVERRIDEzLOCKING )r   r'   rU   rW   )rO   r    r  rU   r_  r`  ra  r0   r0   r1   lockingproperty_sql2  s   zGenerator.lockingproperty_sqlexp.WithDataPropertyc                 C  sT   d|j dr	dnd d}|j d}d}|d ur$d|sdnd d}| | S )	NrZ   r   r   rf   DATA
statistics AND 
STATISTICSrh   )rO   r    data_sqlre  statistics_sqlr0   r0   r1   withdataproperty_sql;  s   zGenerator.withdataproperty_sql exp.WithSystemVersioningPropertyc                 C  s   |  |d}|rd| nd}|  |d}|rd| nd }|  |d}|r+d| nd }|r8| d|||}n
|jd	r@dnd
}d| }|jdrSd| dS |S )NrU   zHISTORY_TABLE=rf   data_consistencyzDATA_CONSISTENCY_CHECK=retention_periodzHISTORY_RETENTION_PERIOD=r   r  r9  zSYSTEM_VERSIONING=r;  zWITH(rw   )rW   r   r   r'   )rO   r    rU   rl  rm  on_sqlrW   r0   r0   r1    withsystemversioningproperty_sqlC  s   
z*Generator.withsystemversioningproperty_sql
exp.Insertc                 C  s  |  |d}|jd}t|jtjr|rdnd}n|r| jnd}|  |d}|r.d| nd}|jd}|r=d	| nd}|jd
rGdnd}|jd}|rV| d}| d|  |d }|jdridnd}	|  |d}
|
r||   d|
 nd}
|   |  |d }|  |d}|rd| nd}|jdrdnd}|  |d}| j	r| | | }n| | | }|  |d}|rd| nd}|  |d}|rd| nd}|  |d}|rd| nd}d| | | | | | |	 | | |
 | | }| 
||S )Nhint	overwrite
 OVERWRITEz INTOstoredr[   rf   alternativez OR ignorez IGNOREis_functionz	 FUNCTIONrU   r  r  r  zREPLACE WHERE r    conflictr  r  r  r4  settingsr|   TABLE INSERT)rW   r   r'   r6   rU   r   	DirectoryINSERT_OVERWRITEr]   r  r  )rO   r    rq  rr  rU   rt  ru  rv  rw  r  r  r  r  r  r  r  ry  r|   rW   r0   r0   r1   
insert_sqlX  sB   
6zGenerator.insert_sqlexp.Introducerc                 C  r   NrU   r[   r    rV   r  r0   r0   r1   introducer_sql  r   zGenerator.introducer_sqlexp.Killc                 C  sJ   |  |d}|rd| nd}|  |d}|rd| nd}d| | S )Nr  r[   rf   rU   KILLrV   rO   r    r  rU   r0   r0   r1   kill_sql  s
   zGenerator.kill_sqlexp.PseudoTypec                 C  r   r"   r   r  r0   r0   r1   pseudotype_sql     zGenerator.pseudotype_sqlexp.ObjectIdentifierc                 C  r   r"   r   r  r0   r0   r1   objectidentifier_sql  r  zGenerator.objectidentifier_sqlexp.OnConflictc           	      C  s   |j drdnd}| |d}|rd| nd}| j|ddd	}|r)d
| dnd}| |d}| j|dd}|rH| jr?dnd}d| | }| |d}| | | | | | S )N	duplicatezON DUPLICATE KEYzON CONFLICT
constraintz ON CONSTRAINT rf   conflict_keysTr  ri  z) r[   actionrJ   SET r  )r   r'   rW   rM   DUPLICATE_KEY_UPDATE_WITH_SET)	rO   r    rx  r  r  r  rM   set_keywordr  r0   r0   r1   onconflict_sql  s   zGenerator.onconflict_sqlexp.Returningc                 C  s   |  d d| j|dd S )N	RETURNINGr[   TrJ   r   r  r0   r0   r1   returning_sql  r   zGenerator.returning_sqlexp.RowFormatDelimitedPropertyc                 C  s   |  |d}|rd| nd}|  |d}|rd| nd}|  |d}|r+d| nd}|  |d}|r:d	| nd}|  |d
}|rId| nd}|  |d}|rXd| nd}d| | | | | | S )Nfieldsz FIELDS TERMINATED BY rf   escapedz ESCAPED BY collection_itemsz  COLLECTION ITEMS TERMINATED BY map_keysz MAP KEYS TERMINATED BY r}  z LINES TERMINATED BY r   z NULL DEFINED AS zROW FORMAT DELIMITEDrV   )rO   r    r  r  r&   r   r}  r   r0   r0   r1   rowformatdelimitedproperty_sql  s   z(Generator.rowformatdelimitedproperty_sqlexp.WithTableHintc                 C  r   )NzWITH (TrJ   rw   rL   r  r0   r0   r1   withtablehint_sql     zGenerator.withtablehint_sqlexp.IndexTableHintc                 C  sN   |  |d d}|  |d}|rd| nd}| | d| j|dd d	S )
NrU    INDEXrR   FOR rf   r  TrJ   rw   r  )rO   r    rU   rR  r0   r0   r1   indextablehint_sql  s   zGenerator.indextablehint_sqlexp.HistoricalDatac                 C  s:   |  |d}|  |d}|  |d}| d| d| dS )NrU   r  r    r  z => rw   rV   rO   r    rU   r  r  r0   r0   r1   historicaldata_sql     zGenerator.historicaldata_sql	exp.Tablec                   s6   d  fdd|jd|jd|jdfD S )Nr  c                 3  s"    | ]}|d ur  |V  qd S r"   rV   r  r`  r0   r1   rM    s    z(Generator.table_parts.<locals>.<genexpr>r  r  rU   r  r  r0   r`  r1   table_parts  s   


zGenerator.table_partsr  c                 C  s   |  |}|jdrdnd}| |d}|rd| nd}| |d}|r+d| nd}| |d}|r;| | nd}| |d}| jjrL|}	d}
nd}	|}
| j|d	dd
}|rb| jrbd| nd}| j|dddd}| j| j|dddddd}| j|ddd
}| |d}|r| |d}|rd| nd}d| | d}|jdpd}|rd| }d}| |d}|r| d| }| |d}|rd| nd}| j|dd}|rd| 	| }| | | | | | |	 | | | |
 | | | S )NonlyzONLY rf   r4  r[   versionrC  samplehintsr  r]   pivotsTr  joinsrw  lateralsr)   patternz, PATTERN => z (FILE_FORMAT => rw   
ordinality WITH ORDINALITYwhenchanges	rows_fromr  z
ROWS FROM )
r  r   r'   rW   r%   ALIAS_POST_TABLESAMPLErM   TABLE_HINTSrv   rm  )rO   r    r]   r  r  r4  r  rC  r  sample_pre_aliassample_post_aliasr  r  r  r  file_formatr  r  r  r  r  r0   r0   r1   	table_sql  sN   

<zGenerator.table_sqlexp.TableFromRowsc                 C  s~   |  d|j}| |d}|rd| nd}| |d}| j|dddd}| j| j|d	ddddd
}| | | | | S )NTABLErC  r  rf   r  r  Tr  r  r  )r   rU   rW   rM   rv   )rO   r    r  rC  r  r  r  r0   r0   r1   tablefromrows_sql  s   zGenerator.tablefromrows_sqlexp.TableSampletablesample_keywordc                 C  s   |  |d}|r| jr| dnd}|  |d}|  |d}|  |d}|r+d| nd}|r9d| d	| | nd}|  |d
}|rMd| j d| dnd}|  |d}	|	r_| jr_|	 d}	|  |d}
|
rp| jjsp|
 d}
| |
 |	 }| jrd| d}d|p| j d| | | S )Nmethodr[   rf   bucket_numeratorbucket_denominatorbucket_fieldr  zBUCKET z OUT OF seedr  rw   rD  r   r  r  ri  )rW   TABLESAMPLE_WITH_METHODTABLESAMPLE_SEED_KEYWORDTABLESAMPLE_SIZE_IS_ROWSr%   TABLESAMPLE_SIZE_IS_PERCENTTABLESAMPLE_REQUIRES_PARENSTABLESAMPLE_KEYWORDS)rO   r    r  r  	numeratordenominatorfieldbucketr  rD  r  r  r0   r0   r1   tablesample_sql  s&   


zGenerator.tablesample_sql	exp.Pivotc              
   C  sv  | j |dd}|jrdnd}| |d}|jrg| |d}|s$d| S | d d	| }| |d
}|r@| d d	| nd}| j |ddd}|rV| d d	| nd}| d	| | | | | S | |d}	|	rtd|	 nd}	| j |dd	ddddd}
|jd}|d ur|rdnd}nd}| |d}|rd| dnd}| | | d| d|
 | | d|	 
S )NTrJ   UNPIVOTPIVOTgrouprU   zUNPIVOT r   r[   intoINTOrf   r  r  USINGrC  r  r  )r]   dynamicnew_linerw  rx  include_nullsz INCLUDE NULLS z EXCLUDE NULLS default_on_nullz DEFAULT ON NULL (rw   ri  r  )rM   unpivotrW   rU   r   r   r'   )rO   r    rM   r  r  rU   r  r  r  rC  r  r  r  r  r0   r0   r1   	pivot_sql,  s>   

,zGenerator.pivot_sqlexp.Versionc                 C  s6   d|j  }|d}| |d}| d| d| S )NFOR r  r    r[   )r   r  rW   r  r0   r0   r1   version_sqlU  s   
zGenerator.version_sql	exp.Tuplec                 C  s   d| j |ddddd dS )Nri  Tr  r  rw  rx  rw   rL   r  r0   r0   r1   	tuple_sql[     zGenerator.tuple_sql
exp.Updatec                 C  s   |  |d}| j|dd}|  |d}|  |d}|  |d}|  |d}|  |d}| jr7| | | }	n| | | }	d	| d
| |	 | | }
| ||
S )NrU   TrJ   fromr  r  r  r  UPDATE  SET r  )rO   r    rU   set_sqlfrom_sql	where_sqlr  r  r  r  rW   r0   r0   r1   
update_sql^  s   zGenerator.update_sql
exp.Valuesvalues_as_tablec                   sb  |o j }|s|tjtjsF |} |d}d d | } jr9|s3t	|j
tjtjfr9d| dn|}|rD| d| S |S |jd}|oP|j}g }t|jD ] \}	}
|
j}|	dkro|rodd	 t||D }|tj|d
 qX jrtdd |} |j|o|jddS |rd |d nd}d fdd|D }d| d| S )NrC  VALUESrf   ri  rw   r  r   c                 S  s   g | ]
\}}t ||qS r0   )r   alias_)rJ  r  column_namer0   r0   r1   
<listcomp>  s    z(Generator.values_sql.<locals>.<listcomp>rL   c                 S  s   t j| |dddS )NF)r  r8  )r   unionxyr0   r0   r1   rQ     rb   z&Generator.values_sql.<locals>.<lambda>Fr  rU   z UNION ALL c                 3      | ]}  |V  qd S r"   rV   )rJ  r  r`  r0   r1   rM    rN  z'Generator.values_sql.<locals>.<genexpr>)VALUES_AS_TABLEfind_ancestorr   FromJoinrM   rW   r   WRAP_DERIVED_VALUESr6   rI  Tabler   r'   rJ  r  ziprW  Selectr  r   subquery_sqlr  rU   ra  )rO   r    r  r   rC  r   
alias_nodecolumn_namesselectsrz  tuprowqueryunionsr0   r`  r1   
values_sqlm  s<   


zGenerator.values_sqlexp.Varc                 C  rS   rT   rV   r  r0   r0   r1   var_sql  r  zGenerator.var_sqlrM   exp.Intoc                 C  sL   |j drdnd}|j drdnd}| d |p| d| |d S )	Nr  r  rf   unlogged	 UNLOGGEDr  r[   rU   )r   r'   r   rW   )rO   r    r  r  r0   r0   r1   into_sql  s   $zGenerator.into_sqlexp.Fromc                 C  s   |  d d| |d S )NFROMr[   rU   )r   rW   r  r0   r0   r1   r    r  zGenerator.from_sqlexp.GroupingSetsc                 C  s   | j |dd}d| | S )NFru   zGROUPING SETS rM   rm  )rO   r    grouping_setsr0   r0   r1   groupingsets_sql  s   zGenerator.groupingsets_sql
exp.Rollupc                 C  &   | j |dd}|rd| | S dS )NFru   zROLLUP WITH ROLLUPr  rO   r    rM   r0   r0   r1   
rollup_sql     zGenerator.rollup_sqlexp.Cubec                 C  r  )NFru   zCUBE 	WITH CUBEr  r  r0   r0   r1   cube_sql  r  zGenerator.cube_sql	exp.Groupc           	      C  s   |j d}|du rd}n	|du rd}nd}| d| |}| j|dd	}| j|d
d	}| j|dd	}t|r<| |nd|rD| |nd|rL| |nd|j drX| dnd| jd}|jrp|rp| dvrp| | j }| | S )NallTr  Fr  rf   zGROUP BYr  r  cuberolluptotalszWITH TOTALSr   )r  r  )r   r'   op_expressionsrM   r   r   GROUPINGS_SEPr;  )	rO   r    group_by_allmodifiergroup_byr  r#  r$  	groupingsr0   r0   r1   	group_sql  s0   	zGenerator.group_sql
exp.Havingc                 C  ,   |  | |d}| d |   | S )NrU   HAVINGrv   rW   r   r]   r  r0   r0   r1   
having_sql     zGenerator.having_sqlexp.Connectc                 C  sb   |  |d}|r| d| nd}|jdrdnd}|  |d}| d| d| }|| S )	Nr  r  rf   nocyclez NOCYCLEconnectz
CONNECT BYr[   )rW   r   r   r'   )rO   r    r  r4  r5  r0   r0   r1   connect_sql  s   zGenerator.connect_sql	exp.Priorc                 C  ra   )NzPRIOR rU   rV   r  r0   r0   r1   	prior_sql  r   zGenerator.prior_sqlexp.Joinc                   s   j s|jdv rd }n|j}ddd |j|jdrdnd ||j jr'|jnd fD } 	|d}|r;d| d	nd
} 	|d}|jd}|sX|rXt
 fdd|D  }|j} 	|} |}	|	rq| d |	 }|r j|dd} jr d j nd}
|r|
 d| d	}n"|
 d| }n|st|tjr|jdd urd| S d| S |dkr|r| dnd} j|dd
dd} | d| | | | S )N)SEMIANTIr[   c                 s      | ]}|r|V  qd S r"   r0   )rJ  r   r0   r0   r1   rM    s    
z%Generator.join_sql.<locals>.<genexpr>globalr   match_conditionz MATCH_CONDITION (rw   rf   r  r  c                 3  r  r"   rV   )rJ  r  r`  r0   r1   rM    rN  r   Tr  zUSING (r   cross_applyr   STRAIGHT_JOINz JOINJOINr  r  )SEMI_ANTI_JOIN_WITH_SIDEr  r  ra  r  r   r'   
JOIN_HINTSrq  rW   r   rU   rM   r   rv   r  r  r6   r   Lateral)rO   r    r  op_sql
match_condrn  r  rU   rl  exprsspacer  r0   r`  r1   join_sql  sH   




 zGenerator.join_sql->
exp.Lambda	arrow_seprm  c                 C  sP   | j |dd}|rt|ddkrd| dn|}| d| d| |d S )	NTrJ   r   r   ri  rw   r[   rU   )rM   ry  r~  rW   )rO   r    rL  rm  r   r0   r0   r1   
lambda_sql	  s   &zGenerator.lambda_sqlexp.Lateralc                 C  s6   |j d}|du rd}n	|du rd}nd}| dS )Nr?  TzINNER JOIN Fz
LEFT JOIN rf   LATERALrh   )rO   r    r?  r   r0   r0   r1   
lateral_op	  s   
zGenerator.lateral_opc                 C  s   |  |d}|jdrK|jd }| j|ddd}|jr"d|j nd}|r+d	| nd}| d
|jdr8dnd }| |   | | | S |  |d}|rXd	| nd}|jdpad}|rkd| }d}| | d| | | S )NrU   viewrC  rJ  Tr  r[   rf   r  zLATERAL VIEWouterz OUTERr  r  )rW   r   r'   rM   r   r   r]   rP  )rO   r    rU   rC  rJ  r  rE  r  r0   r0   r1   lateral_sql$	  s   
 
zGenerator.lateral_sql	exp.Limittopc                   s     d}fdd fdddD D }dfdd|D }|r3td	d |D r3d
| dn|}j dd}  d}|rId| nd}| |rSdnd d| | | S )NrU   c                   s$   g | ]}|r j r |n|qS r0   )LIMIT_ONLY_LITERALS_simplify_unless_literalr#  r`  r0   r1   r  <	  s    z'Generator.limit_sql.<locals>.<listcomp>c                 3  s    | ]	} j |V  qd S r"   rh   )rJ  krL  r0   r1   rM  >	  s    z&Generator.limit_sql.<locals>.<genexpr>)offsetr    r   c                 3  r  r"   rV   r#  r`  r0   r1   rM  B	  rN  c                 s  s    | ]}|j  V  qd S r"   )	is_numberr#  r0   r0   r1   rM  C	      ri  rw   TrJ   r   BY rf   TOPLIMITr[   )rW   ra  rQ  rM   r   )rO   r    rU  rU   r   args_sqlrM   r  r0   r    rO   r1   	limit_sql9	  s   
&(zGenerator.limit_sql
exp.Offsetc                 C  sh   |  |d}|j}| jr| |n|}| j|dd}|r!d| nd}| | d d|  | | S )NrU   TrJ   r\  rf   OFFSETr[   )rW   r    rV  rW  rM   r   )rO   r    rU   r  rM   r0   r0   r1   
offset_sqlJ	  s   "zGenerator.offset_sqlexp.SetItemc                 C  s~   |  |d}|r| dnd}|  |d}| |}|  |d}|r'd| nd}|jdr1dnd}| | | | | S )	Nr  r[   rf   rU   collate	 COLLATE r=  zGLOBAL )rW   rM   r   r'   )rO   r    r  rU   rM   rf  global_r0   r0   r1   setitem_sqlR	  s   
zGenerator.setitem_sqlexp.Setc                 C  sH   d| j |dd }|jdrdnd}|jdrdnd	 | | S )
Nr[   TrJ   r8  z TAGrf   unsetUNSETr   rM   r   r'   )rO   r    rM   r8  r0   r0   r1   r  \	  s    zGenerator.set_sql
exp.Pragmac                 C  ra   )NzPRAGMA rU   rV   r  r0   r0   r1   
pragma_sqla	  r   zGenerator.pragma_sqlexp.Lockc                 C  s   | j s
| d dS |jd rdnd}| j|dd}|r!d| nd}|jd	}|d urBt|tjr<d
| | }n|r@dnd}| | |pId S )Nz8Locking reads using 'FOR UPDATE/SHARE' are not supportedrf   updatez
FOR UPDATEz	FOR SHARETrJ   z OF waitz WAIT z NOWAITz SKIP LOCKED)	LOCKING_READS_SUPPORTEDr*   r   rM   r'   r6   r   rX  rW   )rO   r    r`  rM   rr  r0   r0   r1   lock_sqld	  s   
zGenerator.lock_sqlexp.Literalc                 C  s2   |j pd}|jr| jj | | | jj }|S r   )rU   	is_stringr%   re  rt  r3  r  r0   r0   r1   literal_sqlv	  s   
zGenerator.literal_sqlr  rs  c                   sB   | j jr| j jd fdd|D }| || j j| jS )Nrf   c                 3  s,    | ]} s
|d kr ||n|V  qdS )rr  N)r'   )rJ  chrs  
to_escapedr0   r1   rM  	  s    
z'Generator.escape_str.<locals>.<genexpr>)r%   ESCAPED_SEQUENCESra  rb  r<  r3  r  )rO   r  rs  r0   ry  r1   rt  |	  s   

zGenerator.escape_strexp.LoadDatac           	      C  s   |j drdnd}d| |d }|j drdnd}d| |d	 }| |d
}|r3d| nd}| |d}|rBd| nd}| |d}|rQd| nd}d| | | | | | | S )Nr  z LOCALrf   z INPATH inpathrr  rs  z INTO TABLE rU   r4  r[   r   z INPUTFORMAT serdez SERDE z	LOAD DATArs   )	rO   r    r  r}  rr  rU   r4  r   r~  r0   r0   r1   loaddata_sql	  s   "zGenerator.loaddata_sqlc                 G  r}   )Nr  r0   r  r0   r0   r1   null_sql	     zGenerator.null_sqlexp.Booleanc                 C  s   |j rdS dS )NTRUEFALSErU   r  r0   r0   r1   boolean_sql	     zGenerator.boolean_sql	exp.OrderrK   c                 C  sR   |  |d}|r| dn|}|jdrdnd}| j| d| d||p&|dS )	NrU   r[   siblingsz	SIBLINGS rf   zORDER BYrJ   )rW   r   r'   r&  )rO   r    rK   rU   r  r0   r0   r1   	order_sql	  s    zGenerator.order_sqlexp.WithFillc                   s     |d}|rd| nd}  |d}|rd| nd}  |d}|r+d| nd} fdd	|jd
p9g D }|rGdd| dnd}d| | | | S )Nr  r  rf   tor   stepz STEP c                   sB   g | ]}t |tjr |d  d |d n |dqS rC  r  rU   )r6   r   AliasrW   r#  r`  r0   r1   r  	  s    
 
z*Generator.withfill_sql.<locals>.<listcomp>interpolatez INTERPOLATE (r   rw   z	WITH FILL)rW   r   r'   ra  )rO   r    r  to_sqlstep_sqlinterpolated_valuesr  r0   r`  r1   withfill_sql	  s   
zGenerator.withfill_sqlexp.Clusterc                 C     |  d|S )Nz
CLUSTER BYr&  r  r0   r0   r1   cluster_sql	  r  zGenerator.cluster_sqlexp.Distributec                 C  r  )NzDISTRIBUTE BYr  r  r0   r0   r1   distribute_sql	  r  zGenerator.distribute_sqlexp.Sortc                 C  r  )NzSORT BYr  r  r0   r0   r1   sort_sql	  r  zGenerator.sort_sqlexp.Orderedc                 C  s  |j d}| }|j d}| }| jjdk}| jjdk}| jjdk}| |d}	|r.dn|du r4d	nd
}
d
}|rG|r>|sD|rB|sD|rGd}n|rU|rM|sQ|rU|rU|sUd}|r| js|tjtj	}t
|tjr||j dr|| d|  d d
}nl| jdu r|r|dks|r|dkr|tjtjtj	}t
|tjr|j}t
|tjr| d|  d|
 d d
}n1| jd u r|jjr| d|  d nt
|jtjs|dkrdnd
}d|	 d| d|	 }	d
}| |d}|rd| nd
}|	 |
 | | S )Nr  nulls_firstnulls_are_largenulls_are_smallnulls_are_lastrU   r  Fr  rf   z NULLS FIRSTz NULLS LASTspecr  z/' translation not supported in window functionsz9' translation not supported for aggregate functions with z sort orderz4' translation not supported with positional orderingz
CASE WHEN z IS NULL THEN 1 ELSE 0 ENDr   	with_fillr[   )r   r'   r%   NULL_ORDERINGrW   r   r  r   Windowr  r6   r*   r;  AggFuncrU   is_intRand)rO   r    r  ascr  
nulls_lastr  r  r  rU   
sort_ordernulls_sort_changewindowancestornull_sort_orderr  r0   r0   r1   ordered_sql	  s   


zGenerator.ordered_sqlexp.MatchRecognizeMeasurec                 C  s6   |  |d}|r| dnd}|  |d}| | S )Nwindow_framer[   rf   rU   rV   )rO   r    r  rU   r0   r0   r1   matchrecognizemeasure_sql	  s   z#Generator.matchrecognizemeasure_sqlexp.MatchRecognizec              	     s>    |} |d} j|dd}|r d | nd} |d}|r. |nd} |d}|r= |nd} |d}|rP d	| d
nd} fdd|jdg D } j|d}	|	rs d |	 nd}
d|||||||
f} |d}|rd| nd} d d | | S )Nr  measuresr  MEASURESrf   r  r1  r  z	PATTERN (rw   c                   s*   g | ]}  |d  d  |d qS r  rV   )rJ  
definitionr`  r0   r1   r  
  s    z0Generator.matchrecognize_sql.<locals>.<listcomp>definer  DEFINErC  r[   MATCH_RECOGNIZE)partition_by_sqlrW   rM   r   r   r'   ra  rm  )rO   r    r4  r  r  r  r1  r  definition_sqlsdefinitionsr  bodyrC  r0   r`  r1   matchrecognize_sql
  s8   

zGenerator.matchrecognize_sqlr  c                   s\   j d}jdkrt|tjrtjt|j dd}njdkr5t|tjr5tjdt|jd}t	g |fdd	 j d
pEg D 
 dfdd	 j dpZg D 
 d
 d
 d
 d
 d fdd	j D 
 d t|tj|   R ddiS )Nr  r^  r  rL  r  FIRST)r  r  c                      g | ]}  |qS r0   rV   )rJ  ra  r`  r0   r1   r  ,
  r   z-Generator.query_modifiers.<locals>.<listcomp>r  matchc                   r  r0   rV   )rJ  lateralr`  r0   r1   r  .
  r   r  prewherer  r5  r  havingc                   s   g | ]}| qS r0   r0   )rJ  genr`  r0   r1   r  4
  r   r  r]   rf   )r   r'   LIMIT_FETCHr6   r   FetchLimit
maybe_copyr    r   rW    AFTER_HAVING_MODIFIER_TRANSFORMSr   offset_limit_modifiersafter_limit_modifiersoptions_modifierfor_modifiers)rO   r    r  r  r0   r`  r1   r  "
  sL   





	

zGenerator.query_modifiersc                 C  s    | j |dd}|rd| S dS )Nr  r  r[   rf   rL   )rO   r    r  r0   r0   r1   r  =
  s   zGenerator.options_modifierc                 C  s.   | j |dd}|r|   d| | S dS )Nforr  zFOR XMLrf   rM   r]   r   )rO   r    r  r0   r0   r1   r  A
  s    zGenerator.for_modifiersexp.QueryOptionc                 C     |  d dS )NzUnsupported query option.rf   r*   r  r0   r0   r1   queryoption_sqlE
     
zGenerator.queryoption_sqlfetchr  !t.Optional[exp.Fetch | exp.Limit]t.List[str]c                 C  s6   |r|  |dn|  ||r|  |gS |  |dgS )NrY  rV   )rO   r    r  r  r0   r0   r1   r  I
  s
   
z Generator.offset_limit_modifiersc                 C  s2   | j |ddd}|rd| nd}|| |dgS )Nlocksr[   r  rf   r  rM   rW   )rO   r    r  r0   r0   r1   r  Q
  s   zGenerator.after_limit_modifiers
exp.Selectc              
   C  s  |j d}| js|r|  | |d}| |d}|r"d| nd}| |d}|j d}t|tjrE| jrE| j	|dd	}|  nd}| 
|}|rs|| jv rYd
| }n|dkrq| j
| tjdd |j
D dgd}d}| j
|ddd}	|	r|   |	 nd}	| jr| | | n| | | }
|r|   | n|}| |d|
 |	 | | | j|ddd| j|ddd}|j dr| ||}|  | ||}| js|r|j drd}n| jr|j drd}nd}d| d| |j d
| }|S )Nr  rq  r  r[   rf   r  r  T)rU  r  r   c                 S  s4   g | ]}t |tjrtj|jd |jdn|qS )rC  rU   r    )r6   r   r  
PropertyEQr   r'   rU   r#  r0   r0   r1   r  r
  s    
z(Generator.select_sql.<locals>.<listcomp>rL   r  operation_modifiersr  SELECTFrX  r  r;  r  r  r  r  r  r  )r   r'   SUPPORTS_SELECT_INTOr>   rW   r6   r   r  LIMIT_IS_TOPra  rM   r   Structr]   r  re  rF  r  SUPPORTS_UNLOGGED_TABLESrU   )rO   r    r  rq  r  r  r  rU  rM   r  top_distinctrW   
table_kindr0   r0   r1   
select_sqlV
  sd   



&zGenerator.select_sql
exp.Schemac                 C  s4   |  |d}| |}|r|r| d| S |p|S )NrU   r[   )rW   schema_columns_sql)rO   r    rU   rW   r0   r0   r1   
schema_sql
  s   
zGenerator.schema_sqlc                 C  s2   |j rd| d |  | | jddd S dS )Nri  rf   rw   r   r  r  r0   r0   r1   r  
  s   (zGenerator.schema_columns_sqlexp.Starc                 C  s   | j |ddd}|r| | j d| dnd}| j |ddd}|r-| d d| dnd}| j |d	dd}|rD| d
 d| dnd}d| | | S )NexceptTr  r  rw   rf   r<  REPLACErenameRENAMEr  )rM   r   STAR_EXCEPT)rO   r    except_r<  r  r0   r0   r1   star_sql
  s    zGenerator.star_sqlexp.Parameterc                 C  s   |  |d}| j | S rT   )rW   PARAMETER_TOKENr  r0   r0   r1   parameter_sql
  s   zGenerator.parameter_sqlexp.SessionParameterc                 C  s2   |  |d}|d}|r| d}d| | S )NrU   r  r  z@@)rW   r  rO   r    rU   r  r0   r0   r1   sessionparameter_sql
  s
   

zGenerator.sessionparameter_sqlexp.Placeholderc                 C  s   |j r| j |j S dS )N?)rU   NAMED_PLACEHOLDER_TOKENr   r  r0   r0   r1   placeholder_sql
  r   zGenerator.placeholder_sqlexp.Subqueryc                 C  s   |  |d}|r| | nd}|  |d}| jjr(|r(| | }|dd  | j|dddd}| || |||}| ||S )NrC  rf   r  r  Tr  )rW   r%   r  setrM   r  rm  r  )rO   r    r]   rC  r  r  rW   r0   r0   r1   r  
  s   zGenerator.subquery_sqlexp.Qualifyc                 C  r.  )NrU   QUALIFYr0  r  r0   r0   r1   qualify_sql
  r2  zGenerator.qualify_sql
exp.Unnestc                 C  s   | j |dd}|jd}|jd}| jr$|r$t|tjr$|d| |r9| jj	r9|j
}|r6| |d nd}n| |}|rEd| n|}| jrT|rQd	| n|}nt|tjre| d
| | }n
|rm| d}n|}d| d| S )NTrJ   rC  rY  rJ  r   rf   r  r  z WITH OFFSET AS z WITH OFFSETzUNNEST(rw   )rM   r   r'   UNNEST_WITH_ORDINALITYr6   r   r  rW  r%   rL  rJ  rW   )rO   r    r   rC  rY  rJ  r  r0   r0   r1   
unnest_sql
  s&   
zGenerator.unnest_sqlexp.PreWherec                 C  r}   r   r0   r  r0   r0   r1   prewhere_sql
  r  zGenerator.prewhere_sql	exp.Wherec                 C  r.  )NrU   WHEREr0  r  r0   r0   r1   r  
  r2  zGenerator.where_sql
exp.Windowc           
      C  s   |  |d}| |}|jd}|r| j|ddnd}|  |d}|  |d}|  |dp/d	}| d
|jdkr:dn| }|jd}|d u rKd}n|rOdnd}|s`|s`|s`|r`| d
| S | jdd |||||fD dd
i}	| d|	 dS )NrU   r  TrJ   rf   r  rC  overOVERr[   r  ASfirstr  LASTc                 S  s   g | ]}|r|qS r0   r0   rJ  r7   r0   r0   r1   r  
  r   z(Generator.window_sql.<locals>.<listcomp>r]   r  rw   )rW   r  r   r'   r  arg_keyformat_args)
rO   r    rU   r4  r  r  rC  r  r  r   r0   r0   r1   
window_sql
  s(   
zGenerator.window_sqlexp.Window | exp.MatchRecognizec                 C  s"   | j |ddd}|rd| S dS )Nr  Tr  zPARTITION BY rf   rL   )rO   r    r4  r0   r0   r1   r    s   zGenerator.partition_by_sqlexp.WindowSpecc                 C  s   |  |d}t|  |d|  |ddd}t|  |d|  |dddp%d}| d	| d
| }|  |d}|rI| jrD|d| 7 }|S | d |S )Nr  r  
start_sider[   r   r  end_sidezCURRENT ROW	 BETWEEN rf  excludez	 EXCLUDE z4EXCLUDE clause is not supported in the WINDOW clause)rW   r   SUPPORTS_WINDOW_EXCLUDEr*   )rO   r    r  r  r  window_specr  r0   r0   r1   windowspec_sql  s   
zGenerator.windowspec_sqlexp.WithinGroupc                 C  s0   |  |d}|  |ddd  }| d| dS )NrU   r    r   z WITHIN GROUP (rw   rV   rO   r    rU   r  r0   r0   r1   withingroup_sql%  r  zGenerator.withingroup_sqlexp.Betweenc                 C  s8   |  |d}|  |d}|  |d}| d| d| S )NrU   lowhighr  rf  rV   )rO   r    rU   r#  r$  r0   r0   r1   between_sql*  s   zGenerator.between_sqlexp.Bracketindex_offsett.List[exp.Expression]c                 C  s,   t |j|j|p
| jj|jdd | jdS )NrY  r   r%   )r
   rU   rM   r%   INDEX_OFFSETr   r'   )rO   r    r'  r0   r0   r1   bracket_offset_expressions0  s   z$Generator.bracket_offset_expressionsc                   s:     |}d fdd|D } |d d| dS )Nr   c                 3  r  r"   rV   r#  r`  r0   r1   rM  <  rN  z(Generator.bracket_sql.<locals>.<genexpr>rU   r}  r~  )r+  ra  rW   )rO   r    rM   expressions_sqlr0   r`  r1   bracket_sql:  s   
zGenerator.bracket_sqlexp.Allc                 C     d|  | S )NzALL rm  r  r0   r0   r1   all_sql?     zGenerator.all_sqlexp.Anyc                 C  sR   |  |d}t|jg tjtjR r$t|jtjr| |}d| S d| S )NrU   r   zANY )rW   r6   rU   r   rj  Parenrm  r  r0   r0   r1   any_sqlB  s   


zGenerator.any_sql
exp.Existsc                 C  r/  )NEXISTSr0  r  r0   r0   r1   r  J  r2  zGenerator.exists_sqlexp.Casec                 C  s   |  |d}|rd| ndg}|jd D ]}|d|  |d  |d|  |d  q|  |d}|r@|d	|  |d
 | jrX| |rX| jd|dddS d|S )NrU   zCASE CASEifsWHEN zTHEN r  rp   ELSE r  r9  Trw  rx  r[   )rW   r   rW  r  too_widerv   ra  )rO   r    rU   
statementsrP   rp   r0   r0   r1   case_sqlM  s   

zGenerator.case_sqlexp.Constraintc                 C  *   |  |d}| j|dd}d| d| S )NrU   TrJ   r  r[   r  rO   r    rU   rM   r0   r0   r1   constraint_sqla     zGenerator.constraint_sqlexp.NextValueForc                 C  s@   |j d}|rd| j|dd dnd}d| |d | S )	Nr  z OVER (TrJ   rw   rf   zNEXT VALUE FOR rU   )r   r'   r  rW   )rO   r    r  r0   r0   r1   nextvaluefor_sqlf  s   zGenerator.nextvaluefor_sqlexp.Extractc                 C  sZ   ddl m} | jr||j| jn|j}| jr| |n|j}| |d}d| d| dS )Nr   )map_date_partr    zEXTRACT(r  rw   )sqlglot.dialects.dialectrI  NORMALIZE_EXTRACT_DATE_PARTSrU   r%   EXTRACT_ALLOWS_QUOTESrW   r   )rO   r    rI  rU   rl  r  r0   r0   r1   extract_sqlk  s   zGenerator.extract_sqlexp.Trimc                 C  s>   |  |d}|dkrd}n	|dkrd}nd}| ||j|jS )Nr  LEADINGLTRIMTRAILINGRTRIMTRIM)rW   r   rU   r    )rO   r    	trim_type	func_namer0   r0   r1   trim_sqlx  s   zGenerator.trim_sqlexp.Concat | exp.ConcatWsc                 C  sf   |j }t|tjr|dd  }| jjr |jdr dd |D }| jjs1|jdr1dd |D }|S )Nr   safec                 S  s   g | ]}t |t jjjqS r0   r   r   r   r   r   r#  r0   r0   r1   r    r   z1Generator.convert_concat_args.<locals>.<listcomp>coalescec              	   S  s"   g | ]}t d |t jdqS )rZ  rf   )r   r   rX  rY  r#  r0   r0   r1   r    s   " )	rM   r6   r   ConcatWsr%   STRICT_STRING_CONCATr   r'   CONCAT_COALESCE)rO   r    r   r0   r0   r1   convert_concat_args  s   zGenerator.convert_concat_args
exp.Concatc                 C  s<   |  |}| jst|dkr| |d S | jdg|R  S )Nr   r   CONCAT)r^  SUPPORTS_SINGLE_ARG_CONCATry  rW   r   r  r0   r0   r1   
concat_sql  s   
zGenerator.concat_sqlexp.ConcatWsc                 C  s"   | j dt|jdg| |R  S )N	CONCAT_WSr   )r   r   rM   r^  r  r0   r0   r1   concatws_sql  s
   zGenerator.concatws_sql	exp.Checkc                 C  s   | j |dd}d| dS )NrU   r  CHECK (rw   rV   r  r0   r0   r1   	check_sql  s   zGenerator.check_sqlexp.ForeignKeyc                 C  s   | j |dd}|rd| dnd}| |d}|rd| nd}| |d}|r-d	| nd}| |d
}|r<d| nd}| j |dddd}|rNd| nd}d| | | | | S )NTrJ   r  rw   rf   	referencer[   r   z ON DELETE rq  z ON UPDATE r  r  zFOREIGN KEYr  )rO   r    rM   rj  r   rq  r  r0   r0   r1   foreignkey_sql  s   zGenerator.foreignkey_sqlc                 C  sB   | j |dd}| j |dddd}|rd| nd}d| d| S )	NTrJ   r  r[   r  rf   zPRIMARY KEY (rw   rL   )rO   r    rM   r  r0   r0   r1   primarykey_sql  s   zGenerator.primarykey_sqlexp.Ifc                 C  s   |  tj|g|jddS )Nfalser:  rp   )r@  r   Caser   r'   r  r0   r0   r1   if_sql  r   zGenerator.if_sqlexp.MatchAgainstc                 C  sJ   |j d}|rd| nd}| jdg|jR   d| |d | dS )Nr)  r[   rf   MATCHz	 AGAINST(rU   rw   )r   r'   r   rM   rW   )rO   r    r)  r0   r0   r1   matchagainst_sql  s   ,zGenerator.matchagainst_sqlexp.JSONKeyValuec                 C  s$   |  |d | j d|  |d S r  )rW   JSON_KEY_VALUE_PAIR_SEPr  r0   r0   r1   jsonkeyvalue_sql  r   zGenerator.jsonkeyvalue_sqlexp.JSONPathc                 C  sN   | j |dddd}|jdr| |}| jr%| jj | | jj }|S )Nrf   T)r]   rK   r  rb  )	rM   r   r   r'   rt  QUOTE_JSON_PATHr%   re  r3  )rO   r    pathr0   r0   r1   jsonpath_sql  s   
zGenerator.jsonpath_sqlint | str | exp.JSONPathPartc                 C  s   t |tjr"| j|j}t|s| d|jj  dS || |S t |t	r+t
|S | jr?| jr?|dd}d| d}|S |dd}d| d}|S )NzUnsupported JSONPathPart type rf   r  z\'"z\")r6   r   JSONPathPartr=   r'   r#   r  r*   r$   r)  r!   r#  JSON_PATH_SINGLE_QUOTE_ESCAPEr<  )rO   r    r  r  r0   r0   r1   json_path_part  s   

zGenerator.json_path_partexp.FormatJsonc                 C  s   |  |d dS )NrU   z FORMAT JSONrV   r  r0   r0   r1   formatjson_sql  r   zGenerator.formatjson_sqlexp.FormatPhrasec                 C  (   |  |d}|  |d}| d| dS )NrU   r)   z	 (FORMAT rw   rV   )rO   r    rU   fmtr0   r0   r1   formatphrase_sql  s   zGenerator.formatphrase_sql"exp.JSONObject | exp.JSONObjectAggc                 C  s   |j d}|rd| nd}|j d}|d ur$d|rdnd d}nd}| |d}|r3d	| nd}| |d
}|rBd| nd}| jt|tjrNdndg|jR d| | | | diS )Nnull_handlingr[   rf   unique_keysr   WITHOUT UNIQUE KEYSreturn_type RETURNING encodingz
 ENCODING JSON_OBJECTJSON_OBJECTAGGr  rw   )r   r'   rW   r   r6   r   
JSONObjectrM   )rO   r    r  r  r  r  r0   r0   r1   jsonobject_sql  s"   zGenerator.jsonobject_sqlexp.JSONObjectAggc                 C  rl   r"   )r  r  r0   r0   r1   jsonobjectagg_sql      
zGenerator.jsonobjectagg_sqlexp.JSONArrayc                 C  sx   |j d}|rd| nd}| |d}|rd| nd}|j dr&dnd}| jdg|jR d	| | | d
iS )Nr  r[   rf   r  r  strict STRICT
JSON_ARRAYr  rw   )r   r'   rW   r   rM   )rO   r    r  r  r  r0   r0   r1   jsonarray_sql  s   zGenerator.jsonarray_sqlexp.JSONArrayAggc                 C  s   |  |d}|  |d}|jd}|rd| nd}|  |d}|r(d| nd}|jdr2d	nd}| jd
|| | | | ddS )NrU   r  r  r[   rf   r  r  r  r  JSON_ARRAYAGGrw   r  rW   r   r'   r   )rO   r    rU   r  r  r  r  r0   r0   r1   jsonarrayagg_sql  s   zGenerator.jsonarrayagg_sqlexp.JSONColumnDefc                 C  sx   |  |d}|rd| nd}|  |d}|rd| d| S |  |d}|  |d}|r2d| nd}| | | S )	Nrz  z PATH rf   nested_schemaNESTEDr[   rU   r  rV   )rO   r    rz  r  rU   r  r0   r0   r1   jsoncolumndef_sql  s   zGenerator.jsoncolumndef_sqlexp.JSONSchemac                 C  r   )NCOLUMNSr   r  r0   r0   r1   jsonschema_sql(  rR   zGenerator.jsonschema_sqlexp.JSONTablec              	   C  s   |  |d}|  |d}|rd| nd}|jd}|r"d| nd}|jd}|r1d| nd}|  |d}| jd	|| | | d| d
dS )NrU   rz  r   rf   error_handlingr[   empty_handlingschema
JSON_TABLErw   r  r  )rO   r    rU   rz  r  r  r  r0   r0   r1   jsontable_sql+  s   zGenerator.jsontable_sqlexp.OpenJSONColumnDefc                 C  s`   |  |d}|  |d}|  |d}|rd| nd}|jdr#dnd}| d| | | S )NrU   r  rz  r[   rf   as_jsonz AS JSONr  )rO   r    rU   r  rz  r  r0   r0   r1   openjsoncolumndef_sql8  s   zGenerator.openjsoncolumndef_sqlexp.OpenJSONc                 C  sx   |  |d}|  |d}|rd| nd}| |}|r0d| j| |dd | jddd nd}d| | d| S )	NrU   rz  r   rf   r  r   rw   z	OPENJSON()rW   rM   r   rv   )rO   r    rU   rz  rM   r<  r0   r0   r1   openjson_sql@  s   
*zGenerator.openjson_sqlexp.Inc                 C  s   |j d}|j d}|j d}|j drdnd}|r$| |}n|r,| |}n|r4| |}nd| j|ddddd	 d
}| |d | d| S )Nr	  unnestr  	is_globalz GLOBALrf   ri  Tr  rw   rU    IN )r   r'   rW   in_unnest_oprM   )rO   r    r	  r  r  r  in_sqlr0   r0   r1   r  L  s   zGenerator.in_sqlr  c                 C  s   d|  | dS )Nz(SELECT rw   rV   )rO   r  r0   r0   r1   r  ]  r   zGenerator.in_unnest_opexp.Intervalc                 C  s   |  |d}| js| j||}|rd| nd}| jr4|jr#|jjnd}|r/d| | dS d| S |  |d}|rPt|j| j}|rJd| nd| d	}d| | S )
Nunitr[   rf   z
INTERVAL 'r  r  rU   r  rw   )	rW   INTERVAL_ALLOWS_PLURAL_FORMTIME_PART_SINGULARSr'   SINGLE_STRING_INTERVALrU   r   r6   r  )rO   r    r  rU   	unwrappedr0   r0   r1   interval_sql`  s   zGenerator.interval_sql
exp.Returnc                 C  ra   )NzRETURN rU   rV   r  r0   r0   r1   
return_sqlq  r   zGenerator.return_sqlexp.Referencec                 C  sd   |  |d}| j|dd}|rd| dnd}| j|dddd	}|r'd| nd}d
| | | S )NrU   TrJ   ri  rw   rf   r  r[   r  zREFERENCES r  )rO   r    rU   rM   r  r0   r0   r1   reference_sqlt  s   zGenerator.reference_sqlexp.Anonymousc                 C  s@   |j }t|tjo||ju }| j| |dg|jR d| iS )NrU   r  )rI  r6   r   r  r    r   rW   rM   )rO   r    rI  is_qualifiedr0   r0   r1   anonymous_sql|  s   
zGenerator.anonymous_sql	exp.Parenc                 C  s4   | j | | |ddd}d| | j ddd S )NrU   rf   r   ri  rw   )r   rv   rW   )rO   r    rW   r0   r0   r1   	paren_sql  s   zGenerator.paren_sqlexp.Negc                 C  s.   |  |d}|d dkrdnd}d| | S )NrU   r   -r[   rf   rV   )rO   r    rl  r]   r0   r0   r1   neg_sql  s   zGenerator.neg_sqlexp.Notc                 C  ra   )Nre   rU   rV   r  r0   r0   r1   not_sql  r   zGenerator.not_sql	exp.Aliasc                 C  s2   |  |d}|rd| nd}|  |d | S )NrC  r  rf   rU   rV   )rO   r    rC  r0   r0   r1   rG    s   zGenerator.alias_sqlexp.PivotAliasc                 C  s   |j d }|j}|o|j}t|tjrB|jrBt|tj}t|tj}|r2| js2|	tj
|j n|sB|rB| jrB|	t|j | |S )NrC  )r   rI  r6   r   Pivotr  
IdentifierrX  UNPIVOT_ALIASES_ARE_IDENTIFIERSr<  rY  output_nameto_identifierrG  )rO   r    rC  rI  pivotidentifier_aliasliteral_aliasr0   r0   r1   pivotalias_sql  s   



zGenerator.pivotalias_sqlexp.Aliasesc                 C  s"   |  |d d| j|dd dS )NrU   z AS (TrJ   rw   r  r  r0   r0   r1   aliases_sql  r   zGenerator.aliases_sqlexp.AtTimeZonec                 C  &   |  |d}|  |d}| d| S )NrU   r    z AT rV   )rO   r    rU   r  r0   r0   r1   atindex_sql     zGenerator.atindex_sqlc                 C  r  )NrU   zone AT TIME ZONE rV   rO   r    rU   r  r0   r0   r1   attimezone_sql  r  zGenerator.attimezone_sqlexp.FromTimeZonec                 C  r  )NrU   r  r  z AT TIME ZONE 'UTC'rV   r  r0   r0   r1   fromtimezone_sql     zGenerator.fromtimezone_sqlexp.Addc                 C  rS   )N+r_   r  r0   r0   r1   add_sql  r  zGenerator.add_sqlexp.Andr  (t.Optional[t.List[str | exp.Expression]]c                 C     |  |d|S )NANDconnector_sqlrO   r    r  r0   r0   r1   and_sql     zGenerator.and_sqlexp.Orc                 C  r  )NORr  r  r0   r0   r1   or_sql  r  zGenerator.or_sqlexp.Xorc                 C  r  )NXORr  r  r0   r0   r1   xor_sql  r  zGenerator.xor_sqlexp.Connectorr   c           
      C  s*  |d ur@|j r|| j |d| dd |S ||j |jr6| jr6|jD ]}|r5|d| | d7 }q&|||jf |S |g}g }t }|r| }t	|t
jrd|t| |j d|| n| |}|r}|d |v r}|d  d| 7  < n|| |sJ| jr| |rdnd}	|	|S )Nr[   r   z /*rZ  r  rY  r9  )rM   rW  rightr  r\  extendleftr  r>   r6   r   	Connectoraddr  r  rW   r  r>  ra  )
rO   r    r   r  rX  r  opsrK  rW   r]   r0   r0   r1   r    s4   
 


zGenerator.connector_sqlexp.BitwiseAndc                 C  rS   )N&r_   r  r0   r0   r1   bitwiseand_sql  r  zGenerator.bitwiseand_sqlexp.BitwiseLeftShiftc                 C  rS   )Nz<<r_   r  r0   r0   r1   bitwiseleftshift_sql  r  zGenerator.bitwiseleftshift_sqlexp.BitwiseNotc                 C  ra   )N~rU   rV   r  r0   r0   r1   bitwisenot_sql  r   zGenerator.bitwisenot_sqlexp.BitwiseOrc                 C  rS   )N|r_   r  r0   r0   r1   bitwiseor_sql  r  zGenerator.bitwiseor_sqlexp.BitwiseRightShiftc                 C  rS   )Nz>>r_   r  r0   r0   r1   bitwiserightshift_sql  r  zGenerator.bitwiserightshift_sqlexp.BitwiseXorc                 C  rS   )N^r_   r  r0   r0   r1   bitwisexor_sql  r  zGenerator.bitwisexor_sqlexp.Castsafe_prefixc              	   C  s   |  |d}|rd| nd}|  |d}|rd| nd}|  |d}|r+d| nd}|  |d}|r;d| d	nd}|p@d d
|  |d d| | | | d	S )Nr)   z FORMAT rf   r  r[   r  rp   z	 DEFAULT z ON CONVERSION ERRORzCAST(rU   r  rw   rV   )rO   r    r  
format_sqlr  r  rp   r0   r0   r1   cast_sql  s   .zGenerator.cast_sqlexp.CurrentDatec                 C  s    |  |d}|rd| dS dS )NrU   zCURRENT_DATE(rw   CURRENT_DATErV   )rO   r    r  r0   r0   r1   currentdate_sql     zGenerator.currentdate_sqlexp.Collatec                 C  s   | j r| |S | |dS )NCOLLATE)COLLATE_IS_FUNCr  r`   r  r0   r0   r1   collate_sql  s   
zGenerator.collate_sqlexp.Commandc                 C  s    |  |d d|d  S r  )rW   r  r;  r  r0   r0   r1   command_sql  rk   zGenerator.command_sqlexp.Commentc              
   C  sl   |  |d}|jd }|jdrdnd}|jdrdnd}|  |d	}d
| d| d| d| d| 
S )NrU   r  rD  r  rf   r  r  r[   r    COMMENTr   z IS r  )rO   r    rU   r  rD  r  r  r0   r0   r1   comment_sql  s   
"zGenerator.comment_sqlexp.MergeTreeTTLActionc                 C  s   |  |d}|jdrdnd}|  |d}|rd| nd}|  |d}|r,d| nd}|  |d	}|r;d
| nd}| | | | | S )NrU   r   z DELETErf   
recompressz RECOMPRESS to_diskz	 TO DISK 	to_volumez TO VOLUME r  )rO   r    rU   r   r   r!  r"  r0   r0   r1   mergetreettlaction_sql   s   z Generator.mergetreettlaction_sqlexp.MergeTreeTTLc                 C  s   |  |d}|  |d}| j|dd}|r| d| | nd}|s8|s8|s8t|jdkr8d| j|d	d
 S d| | | | | | S )Nr  r  
aggregatesr  r   rf   r   zTTL TrJ   TTL)rW   rM   r   ry  )rO   r    r  r  r%  r0   r0   r1   mergetreettl_sql+  s   "zGenerator.mergetreettl_sqlexp.Transactionc                 C  r}   )NBEGINr0   r  r0   r0   r1   transaction_sql6  r  zGenerator.transaction_sql
exp.Commitc                 C  s.   |j d}|d ur|rdnd}d|pd S )Nchainz
 AND CHAINz AND NO CHAINCOMMITrf   rh   )rO   r    r,  r0   r0   r1   
commit_sql9  s   zGenerator.commit_sqlexp.Rollbackc                 C  s(   |j d}|rd| nd}d| S )N	savepointr   rf   ROLLBACKrh   )rO   r    r0  r0   r0   r1   rollback_sql@  s   
zGenerator.rollback_sqlexp.AlterColumnc                 C  sD  |  |d}|  |d}|rD|  |d}|rd| nd}|  |d}|r*d| nd}| jr4| jd nd}d	| d| | | | S |  |d
}|rTd	| d| S |  |d}|rdd	| d| S |jd}	|	rtd	| d|	 S |jd}
|jd}|s|
s| d |
d ur|rdnd}d	| d| dS d	| dS )NrU   dtyperf  rg  rf   r  r  r[   zALTER COLUMN rp   z SET DEFAULT rX  z	 COMMENT visibler  r  dropzUnsupported ALTER COLUMN syntaxr  r   z	 NOT NULLz DROP DEFAULT)rW   ALTER_SET_TYPEr   r'   r*   )rO   r    rU   r4  rf  r  alter_set_typerp   rX  r5  r  r6  r0  r0   r0   r1   altercolumn_sqlE  s4   
zGenerator.altercolumn_sqlexp.AlterIndexc                 C  s4   |  |d}|jd}|rdnd}d| d| S )NrU   r5  VISIBLE	INVISIBLEzALTER INDEX r[   r  )rO   r    rU   r5  visible_sqlr0   r0   r1   alterindex_sqli  s   zGenerator.alterindex_sqlexp.AlterDistStylec                 C  s.   |  |d}t|jtjsd| }d| S )NrU   zKEY DISTKEY zALTER DISTSTYLE )rW   r6   rU   r   Varr  r0   r0   r1   alterdiststyle_sqlq  s   

zGenerator.alterdiststyle_sqlexp.AlterSortKeyc                 C  sV   |j drdnd}| |d}| j|dd}|rd| dnd}d	| d
|p(| S )Ncompoundz	 COMPOUNDrf   rU   TrJ   ri  rw   ALTERz	 SORTKEY )r   r'   rW   rM   )rO   r    rC  rU   rM   r0   r0   r1   altersortkey_sqlw  s
   zGenerator.altersortkey_sqlexp.AlterRenamec                 C  s2   | j s|dd tj}| |d}d| S )Nc                 S  s   t | tjrt| jS | S r"   )r6   r   r   table_rU   )nr0   r0   r1   rQ         z+Generator.alterrename_sql.<locals>.<lambda>rU   z
RENAME TO )RENAME_TABLE_WITH_DBr  	assert_isr   AlterRenamerW   r  r0   r0   r1   alterrename_sql~  s   
zGenerator.alterrename_sqlexp.RenameColumnc                 C  sB   |j drdnd}| |d}| |d}d| d| d| S )	Nr  r  rf   rU   r  zRENAME COLUMNr[   r   rs   )rO   r    r  
old_column
new_columnr0   r0   r1   renamecolumn_sql  s   zGenerator.renamecolumn_sqlexp.AlterSetc                 C  s*   | j |dd}| jrd| d}d| S )NTrJ   ri  rw   r  )rM   ALTER_SET_WRAPPED)rO   r    rG  r0   r0   r1   alterset_sql  s   
zGenerator.alterset_sql	exp.Alterc                 C  sb  |j d }| jjst|d tjr| j|ddd}d| }n3g }|D ]&}t|tjtjfr4| |}n| 	|}t|tj
rDd| }|| q#| j| d}|j drZd	nd
}| 	|d}|rid| nd
}|j drsdnd
}	| j|dd}
|
rd|
 nd
}
| 	|d}|j drdnd
}d| | |	 d| 	|d | |   | | |
 S )Nactionsr   Tr  ADD r  r9  r  r  rf   r   r[   r  r  r  r  r   r  	not_validz
 NOT VALIDzALTER rU   )r   r%   (ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMNr6   r   	ColumnDefrM   r&  add_column_sqlrW   QueryrW  r  r   r'   r]   )rO   r    rV  actions_sqlactions_listr  
action_sqlr  r  r  r  r  rX  r0   r0   r1   	alter_sql  s0   




8zGenerator.alter_sqlc                 C  sH   |  |}t|tjrd}nt|tjr| jrd}nd}d| d| S )Nz COLUMNSz COLUMNrf   ADDr[   )rW   r6   r   r&  rZ  "ALTER_TABLE_INCLUDE_COLUMN_KEYWORD)rO   r    rW   column_textr0   r0   r1   r[    s   
zGenerator.add_column_sqlexp.DropPartitionc                 C  s,   |  |}|jdrdnd}d| | S )Nr  r  r[   r  rm  )rO   r    rM   r  r0   r0   r1   droppartition_sql  s   
zGenerator.droppartition_sqlexp.AddConstraintc                 C  rI   )NrW  Fru   rL   r  r0   r0   r1   addconstraint_sql  rR   zGenerator.addconstraint_sqlexp.AddPartitionc                 C  s*   |j drdnd}d| | |j S )Nr  r  rf   rW  r   r'   rW   rU   )rO   r    r  r0   r0   r1   addpartition_sql     zGenerator.addpartition_sqlexp.Distinctc                 C  s   | j |dd}| js4t|j dkr4t }|j D ]}||t t }q| |	d| d}|r;d| nd}| |d}|rJd	| nd}d
| | S )NTrJ   r   ri  rw   r[   rf   r  r  DISTINCT)
rM   MULTI_ARG_DISTINCTry  r   caser  is_r   rW   else_)rO   r    rU   ro  r7   r  r0   r0   r1   distinct_sql  s   
zGenerator.distinct_sqlexp.IgnoreNullsc                 C  rS   )NzIGNORE NULLS_embed_ignore_nullsr  r0   r0   r1   ignorenulls_sql  r  zGenerator.ignorenulls_sqlexp.RespectNullsc                 C  rS   )NzRESPECT NULLSrt  r  r0   r0   r1   respectnulls_sql  r  zGenerator.respectnulls_sqlexp.HavingMaxc                 C  s@   |  |d}|  |d}|jdrdnd}| d| d| S )NrU   r    maxMAXMIN HAVING r[   r  )rO   r    rl  r  r  r0   r0   r1   havingmax_sql  s   zGenerator.havingmax_sql
exp.IntDivc                 C  s0   |  tjtj|j|jdtjtjjjddS )Nr  r  )rU   r  )	rW   r   r  DivrU   r    r   r   INTr  r0   r0   r1   
intdiv_sql  s   zGenerator.intdiv_sql	exp.DPipec                 C  s@   | j jr|jdr| jdgdd | D R  S | |dS )NrX  r`  c                 s  s"    | ]}t |t jjjV  qd S r"   rY  r#  r0   r0   r1   rM    s     z&Generator.dpipe_sql.<locals>.<genexpr>z||)r%   r\  r   r'   r   flattenr`   r  r0   r0   r1   	dpipe_sql  s   zGenerator.dpipe_sqlexp.Divc                 C  s   |j |j}}| jjs!|jdr!|tj|	 tj
dd | jjrI|jdsI|jtjj sH|jtjj sH|tj|	 tjjjd n'| jjsp|jdrp|jtjj rp|jtjj rp| tj|| tjjjdS | |dS )NrX  r   r  typedr  /)r  r  r%   SAFE_DIVISIONr   r'   r<  r   Nullifr8  rX  numberTYPED_DIVISIONis_typer   
REAL_TYPESr   r   DOUBLEINTEGER_TYPESrW   r   r`   )rO   r    lrr0   r0   r1   div_sql  s     zGenerator.div_sqlexp.SafeDividec                 C  sD   t |jt j}t |jt j}| t j|d|| t  dS )Nr   )rU   r  rn  )	r   _wraprU   Binaryr    rW   r  neqNull)rO   r    rH  dr0   r0   r1   safedivide_sql  s   $zGenerator.safedivide_sqlexp.Overlapsc                 C  rS   )NOVERLAPSr_   r  r0   r0   r1   overlaps_sql  r  zGenerator.overlaps_sqlexp.Distancec                 C  rS   )Nz<->r_   r  r0   r0   r1   distance_sql  r  zGenerator.distance_sqlexp.Dotc                 C  r   )NrU   r  r    rV   r  r0   r0   r1   dot_sql  r   zGenerator.dot_sqlexp.EQc                 C  rS   )Nr  r_   r  r0   r0   r1   eq_sql  r  zGenerator.eq_sqlexp.PropertyEQc                 C  rS   )Nz:=r_   r  r0   r0   r1   propertyeq_sql  r  zGenerator.propertyeq_sql
exp.Escapec                 C  rS   )NESCAPEr_   r  r0   r0   r1   ro    r  zGenerator.escape_sqlexp.Globc                 C  rS   )NGLOBr_   r  r0   r0   r1   glob_sql"  r  zGenerator.glob_sqlexp.GTc                 C  rS   )Nr  r_   r  r0   r0   r1   gt_sql%  r  zGenerator.gt_sqlexp.GTEc                 C  rS   )Nz>=r_   r  r0   r0   r1   gte_sql(  r  zGenerator.gte_sql	exp.ILikec                 C  rS   )NILIKEr_   r  r0   r0   r1   	ilike_sql+  r  zGenerator.ilike_sqlexp.ILikeAnyc                 C  rS   )Nz	ILIKE ANYr_   r  r0   r0   r1   ilikeany_sql.  r  zGenerator.ilikeany_sqlexp.Isc                 C  sB   | j st|jtjr| |jjr|jS t|jS | |dS )NIS)	IS_BOOL_ALLOWEDr6   r    r   BooleanrW   rU   rd   r`   r  r0   r0   r1   is_sql1  s   
zGenerator.is_sqlexp.Likec                 C  rS   )NLIKEr_   r  r0   r0   r1   like_sql8  r  zGenerator.like_sqlexp.LikeAnyc                 C  rS   )NzLIKE ANYr_   r  r0   r0   r1   likeany_sql;  r  zGenerator.likeany_sqlexp.SimilarToc                 C  rS   )Nz
SIMILAR TOr_   r  r0   r0   r1   similarto_sql>  r  zGenerator.similarto_sqlexp.LTc                 C  rS   )Nr  r_   r  r0   r0   r1   lt_sqlA  r  zGenerator.lt_sqlexp.LTEc                 C  rS   )Nz<=r_   r  r0   r0   r1   lte_sqlD  r  zGenerator.lte_sqlexp.Modc                 C  rS   )N%r_   r  r0   r0   r1   mod_sqlG  r  zGenerator.mod_sqlexp.Mulc                 C  rS   )Nr  r_   r  r0   r0   r1   mul_sqlJ  r  zGenerator.mul_sqlexp.NEQc                 C  rS   )Nz<>r_   r  r0   r0   r1   neq_sqlM  r  zGenerator.neq_sqlexp.NullSafeEQc                 C  rS   )NzIS NOT DISTINCT FROMr_   r  r0   r0   r1   nullsafeeq_sqlP  r  zGenerator.nullsafeeq_sqlexp.NullSafeNEQc                 C  rS   )NzIS DISTINCT FROMr_   r  r0   r0   r1   nullsafeneq_sqlS  r  zGenerator.nullsafeneq_sql	exp.Slicec                 C  rS   )Nr   r_   r  r0   r0   r1   	slice_sqlV  r  zGenerator.slice_sqlexp.Subc                 C  rS   )Nr  r_   r  r0   r0   r1   sub_sqlY  r  zGenerator.sub_sqlexp.TryCastc                 C  s   | j |ddS )NTRY_)r  r  r  r0   r0   r1   trycast_sql\  r  zGenerator.trycast_sqlexp.JSONCastc                 C  rl   r"   r  r  r0   r0   r1   jsoncast_sql_  r  zGenerator.jsoncast_sqlexp.Tryc                 C  s*   | j s| d | |dS | d|jS )NzUnsupported TRY functionrU   TRY)TRY_SUPPORTEDr*   rW   r   rU   r  r0   r0   r1   try_sqlb  s   
zGenerator.try_sqlexp.Logc                 C  sv   |j }|j}| jjdu r||}}n"| jjd u r4|r4|jdv r)| d|j |S | d| |  | d||S )NF)210r   z Unsupported logarithm with base )rU   r    r%   LOG_BASE_FIRSTr   r   r*   rW   rO   r    rU   r  r0   r0   r1   log_sqli  s   
zGenerator.log_sqlexp.Usec                 C  sX   |  |d}|rd| nd}|  |dp| j|dd}|r#d| nd}d| | S )Nr  r[   rf   rU   TrJ   USEr  r  r0   r0   r1   use_sqlw  s
   zGenerator.use_sql
exp.Binaryc                 C  s   g }|g}t |}|rL| }t ||u rB|jd}|r&d| | d}||j |d| j||jd d ||j	 n|| | |sd
|S )Noperatorz	OPERATOR(rw   r[   r  rf   )rP  r>   r   r'   rW   rW  r  re  r  r  ra  )rO   r    r   r  r  binary_typerK  op_funcr0   r0   r1   r`   ~  s   
zGenerator.binaryexp.Ceil | exp.Floorc                 C  s<   |  |d}|r|  d|  |d d| dS | |S )Nr  ri  rU   r   rw   )rW   sql_namer  )rO   r    	to_clauser0   r0   r1   rn     s   "
zGenerator.ceil_floorexp.Funcc                 C  s   g }|j D ]!}|j|}t|tr|D ]}|| qq|d ur&|| q| jjr9|jr4|j	dp7|
 }n|
 }| j|g|R  S )Nr   )	arg_typesr   r'   r6   r  rW  r%   PRESERVE_ORIGINAL_NAMES_metametar  r   )rO   r    r   r  	arg_valuer  r   r0   r0   r1   r    s   


zGenerator.function_fallback_sqlri  rw   )r\   r  r  r    t.Optional[exp.Expression | str]c                G  s,   |r|  |n|}| | | j|  | S r"   )ru  r  )rO   r   r\   r  r  r   r0   r0   r1   r     s   zGenerator.funcr   c                  sX   t  fdd|D } jr' |r' jd|  d| d dddS ||S )Nc                 3  s,    | ]}|d urt |ts |V  qd S r"   )r6   r(  rW   r  r`  r0   r1   rM    s    "z(Generator.format_args.<locals>.<genexpr>r9  Tr=  )tupler  r>  rv   r;  ra  )rO   r]   r   arg_sqlsr0   r`  r1   r    s   
zGenerator.format_args
t.Iterablec                 C  s   t dd |D | jkS )Nc                 s  s    | ]}t |V  qd S r"   )ry  r  r0   r0   r1   rM    r[  z%Generator.too_wide.<locals>.<genexpr>)sumr  )rO   r   r0   r0   r1   r>    rx   zGenerator.too_wideinverse_time_mappingt.Optional[t.Dict[str, str]]inverse_time_triet.Optional[t.Dict]c                 C  s$   t | |d|p| jj|p| jjS )Nr)   )r   rW   r%   INVERSE_TIME_MAPPINGINVERSE_TIME_TRIE)rO   r    r  r  r0   r0   r1   r     s
   


zGenerator.format_time.t.Optional[t.Collection[str | exp.Expression]]r  r  c                   s  |r
|j |pdn|}|sdS |r#|dd  fdd|D D S t|}g }t|D ]g\}} j|dd}|s;q-t|tjrG 	d|nd} j
r jrc||dkrW|nd |	 | |  q-||	 | |d	 |k rw|ru| n|nd |  q-||	 | | |d	 |k r|nd  q- j
r|
r |r|r|dd |d d
dd |D }nd|}|rƈ j|||dS |S )NrM   rf   c                 s  r<  r"   r0   )rJ  rW   r0   r0   r1   rM    r[  z(Generator.expressions.<locals>.<genexpr>c                 3  r  r"   rV   r#  r`  r0   r1   rM    rN  Fr  r   r   r9  c                 s  s    | ]}|  V  qd S r"   )rstrip)rJ  sr0   r0   r1   rM    r[  r=  )r   r'   ra  ry  r  rW   r6   r   r  re  r  r  rW  r  r>  insertrv   )rO   r    r  r  rK   rv   rw  rx  r]   r\   r  r  rM   num_sqlsresult_sqlsrz  rP   rW   r  
result_sqlr0   r`  r1   rM     s<   "(.,

zGenerator.expressionsc                 C  sT   |pt |jtj}| j||d}|r| d| S | | |r$|  nd | S )NrJ   r[   rf   )r6   rI  r   r  rM   r   r]   )rO   r   r    rK   r,  r0   r0   r1   r&  	  s
   "zGenerator.op_expressionsc                 C  s>   t jj|j}|s| d|jj  | d| |d S )Nr  r[   rU   )r   r  r   r'   r#   r*   r$   rW   )rO   r    r  r0   r0   r1   r     s   zGenerator.naked_propertyexp.Tagc                 C  s(   |j d | |j |j d S )Nr\   postfixri  r  r0   r0   r1   tag_sql  s   (zGenerator.tag_sql
token_typer   c                 C  s   | j ||jS r"   )r  r'   r   )rO   r
  r0   r0   r1   r    r2  zGenerator.token_sqlexp.UserDefinedFunctionc                 C  sV   |  |d}| | j|}|jdr| |nd| }| dkr)| | S |S )NrU   r  r[   rf   )rW   rr  rM   r   r'   rm  r;  rC  r0   r0   r1   userdefinedfunction_sql  s
   z!Generator.userdefinedfunction_sqlexp.JoinHintc                 C  s*   |  |d}| j|dd}| d| dS )NrU   TrJ   ri  rw   r  rC  r0   r0   r1   joinhint_sql$  rE  zGenerator.joinhint_sql	exp.Kwargc                 C  rS   )Nz=>r_   r  r0   r0   r1   	kwarg_sql)  r  zGenerator.kwarg_sqlexp.Whenc                 C  s  |j d rdnd}| jr|j drdnd}| |d}|r#d| nd}|j d	}t|tjrR| |d
}|r>d| nd}| |d}|rO| d| n|}n,t|tjryt|j dtjrld| |d }nd| 	  | 
| }n| |}d| | | d| S )NmatchedMATCHEDzNOT MATCHEDr|   z
 BY SOURCErf   	conditionrf  thenrU   INSERT r{  r    z VALUES rM   r  z
UPDATE SETr;   THEN )r   MATCHED_BY_SOURCEr'   rW   r6   r   InsertUpdateStarr]   rM   )rO   r    r  r|   r  then_expressionrU   r  r0   r0   r1   when_sql,  s    
zGenerator.when_sql	exp.Whensc                 C  rY   )Nr[   Fr  rL   r  r0   r0   r1   	whens_sqlA  r2  zGenerator.whens_sql	exp.Mergec                 C  s   |j }d}|jd}|r%|jr%t|d tjr%d| |jd   }| |}d| |d }d| |d	 }| |d
}| |d}	|	rP| |	 }| 	 }
| 
|d| | |
 | |
 | |
 | 	S )Nrf   r  r   r  rC  USING r  r   r  whensr  zMERGE INTO )rU   r   r'   rC  r6   r   WithTableHintrW   r>   r]   r  )rO   r    r  table_aliasr  rU   r  r  r"  r  r]   r0   r0   r1   	merge_sqlD  s"   
$zGenerator.merge_sqlr)   
exp.ToCharc                 C  r   r"   )rW   r   r   rU   r   r   r   r  r0   r0   r1   
tochar_sql]     zGenerator.tochar_sqlexp.ToNumberc                 C  sn   | j s| d | t|jtjjjS |j	
d}|s/| d | t|jtjjjS | d|j|S )NzUnsupported TO_NUMBER functionr)   z+Conversion format is required for TO_NUMBER	TO_NUMBER)SUPPORTS_TO_NUMBERr*   rW   r   r   rU   r   r   r  r   r'   r   )rO   r    r  r0   r0   r1   tonumber_sqla  s   

zGenerator.tonumber_sqlexp.DictPropertyc                 C  sf   |  |d}|  |d}| j|ddd}|r'd| d | | jddd	 nd
}| d| | dS )NrU   r  ry  r[   r  ri  rf   rw   r   rg  )rW   rM   r]   r   )rO   r    rU   r  settings_sqlr   r0   r0   r1   dictproperty_sqlm  s
   *zGenerator.dictproperty_sqlexp.DictRangec                 C  s:   |  |d}|  |d}|  |d}| d| d| dS )NrU   rz  minz(MIN z MAX rw   rV   )rO   r    rU   rz  r1  r0   r0   r1   dictrange_sqlt  r  zGenerator.dictrange_sqlexp.DictSubPropertyc                 C  r   )NrU   r[   r  rV   r  r0   r0   r1   dictsubproperty_sqlz  r   zGenerator.dictsubproperty_sqlexp.DuplicateKeyPropertyc                 C  r   )NzDUPLICATE KEY (TrJ   rw   rL   r  r0   r0   r1   duplicatekeyproperty_sql}  r  z"Generator.duplicatekeyproperty_sqlexp.UniqueKeyPropertyc                 C  r   )NzUNIQUE KEY (TrJ   rw   rL   r  r0   r0   r1   uniquekeyproperty_sql  r  zGenerator.uniquekeyproperty_sqlexp.DistributedByPropertyc                 C  sr   | j |dd}|rd| | nd}| |d}| |d}|r&d| nd}| |d}d	| | | | S )
NTrJ   r[   rf   bucketsr  z	 BUCKETS r  zDISTRIBUTED BY )rM   rm  rW   )rO   r    rM   r:  r  r  r0   r0   r1   distributedbyproperty_sql  s   z#Generator.distributedbyproperty_sqlexp.OnClusterc                 C  r}   r   r0   r  r0   r0   r1   oncluster_sql  r  zGenerator.oncluster_sqlexp.ClusteredByPropertyc                 C  sX   | j |ddd}| j |ddd}|rd| dnd}| |d}d	| d| d
| dS )NrM   Tr  	sorted_byz SORTED BY (rw   rf   r:  zCLUSTERED BY ( INTO z BUCKETSr  )rO   r    rM   r?  r:  r0   r0   r1   clusteredbyproperty_sql  s
   z!Generator.clusteredbyproperty_sqlexp.AnyValuec                 C  sL   |  |d}|  |d}|r | d|jdrdnd d| }| d|S )	NrU   r  r}  rz  r{  r|  r[   	ANY_VALUEr  )rO   r    rU   r  r0   r0   r1   anyvalue_sql  s
   $zGenerator.anyvalue_sqlexp.QueryTransformc           	      C  s   | j dg|jR  }| |d}|rd| nd}| |d}|r&d| nd}d| |d }| |d	}|r>d
| nd}| |d}|rMd| nd}| |d}|r\d| nd}| | | | | | | S )Nr   row_format_beforer[   rf   record_writerz RECORDWRITER r  command_scriptr  r  row_format_afterrecord_readerz RECORDREADER )r   rM   rW   )	rO   r    r  rF  rG  r  r  rI  rJ  r0   r0   r1   querytransform_sql  s    zGenerator.querytransform_sqlexp.IndexConstraintOptionc           	      C  s   |  |d}|rd| S |  |d}|rd| S |  |d}|r'd| S |  |d}|r4d| S |jd	}|d urD|rBd
S dS |  |d}|rQd| S |  |d}|r^d| S | d dS )Nkey_block_sizezKEY_BLOCK_SIZE = r  r!  parserzWITH PARSER rX  ry   r5  r;  r<  engine_attrzENGINE_ATTRIBUTE = secondary_engine_attrzSECONDARY_ENGINE_ATTRIBUTE = z$Unsupported index constraint option.rf   )rW   r   r'   r*   )	rO   r    rM  r  rN  rX  r5  rO  rP  r0   r0   r1   indexconstraintoption_sql  s.   






z#Generator.indexconstraintoption_sqlexp.CheckColumnConstraintc                 C  s,   |j drdnd}d| |d d| S )Nenforcedz	 ENFORCEDrf   rg  rU   rw   rs   )rO   r    rS  r0   r0   r1   checkcolumnconstraint_sql     z#Generator.checkcolumnconstraint_sqlexp.IndexColumnConstraintc                 C  s   |  |d}|r| dnd}|  |d}|rd| nd}|  |d}|r+d| nd}| j|d	d
}|r<d| dnd}| j|ddd}|rMd| nd}| | | | | S )Nr  r  INDEXrU   r[   rf   r  r  TrJ   r  rw   r  r  r  )rO   r    r  rU   r  rM   r  r0   r0   r1   indexcolumnconstraint_sql  s   z#Generator.indexcolumnconstraint_sqlexp.Nvl2c                 C  sf   | j r| |S t j|jt jdd|j	d dd}|j	
d}|r.|j|dd | |S )NFr  r  rn  )NVL2_SUPPORTEDr  r   rp  r  rU   rp  r   rd   r   r'   rq  rW   )rO   r    ro  	else_condr0   r0   r1   nvl2_sql  s   

zGenerator.nvl2_sqlexp.Comprehensionc                 C  sZ   |  |d}|  |d}|  |d}|  |d}|rd| nd}| d| d| | S )	NrU   r    iteratorr  z IF rf   r  r  rV   )rO   r    rU   r  r^  r  r0   r0   r1   comprehension_sql  s   zGenerator.comprehension_sqlexp.ColumnPrefixc                 C  s    |  |d d|  |d dS )NrU   ri  r    rw   rV   r  r0   r0   r1   columnprefix_sql  rk   zGenerator.columnprefix_sqlexp.Opclassc                 C  r   r  rV   r  r0   r0   r1   opclass_sql  r   zGenerator.opclass_sqlexp.Predictc                 C  s^   |  |d}d| }|  |d}t|jtjsd| n|}|  |d}| d|||p-d S )NrU   zMODEL r    rz  params_structPREDICT)rW   r6   r    r   Subqueryr   )rO   r    modelr  
parametersr0   r0   r1   predict_sql  s   
zGenerator.predict_sql	exp.ForInc                 C  s(   |  |d}|  |d}d| d| S )NrU   r    r  z DO rV   r   r0   r0   r1   	forin_sql  r  zGenerator.forin_sqlexp.Refreshc                 C  s0   |  |d}t|jtjrdnd}d| | S )NrU   rf   rz  zREFRESH )rW   r6   rU   r   rX  )rO   r    rU   r  r0   r0   r1   refresh_sql  s   zGenerator.refresh_sqlexp.ToArrayc                 C  sr   |j }|jsddlm} ||| jd}|tjjj	r | 
|S |t }| 
td|t tj|ddS )Nr   )annotate_typesr)  IFFr  )rU   rP   sqlglot.optimizer.annotate_typesrp  r%   r  r   r   r   r  rW   rp  r   r   array)rO   r    r7   rp  cond_for_nullr0   r0   r1   toarray_sql  s   
$zGenerator.toarray_sqlexp.TsOrDsToTimec                 C  sz   |j }| |}|r| ttj||jd dtjjj	S t
|tjs,|tjjj	r1| |S | t|tjjj	S Nr)   rU   r)   )rU   r   rW   r   r   	StrToTimer   r   r   TIMEr6   TsOrDsToTimer  rO   r    rU   time_formatr0   r0   r1   tsordstotime_sql  s   

zGenerator.tsordstotime_sqlexp.TsOrDsToTimestampc                 C  J   |j }t|tjs|tjjjr| |S | tj	|tjjj| j
dS Nr)  )rU   r6   r   TsOrDsToTimestampr  r   r   r   rW   r   r%   r  r0   r0   r1   tsordstotimestamp_sql.     
zGenerator.tsordstotimestamp_sqlexp.TsOrDsToDatetimec                 C  r  r  )rU   r6   r   TsOrDsToDatetimer  r   r   DATETIMErW   r   r%   r  r0   r0   r1   tsordstodatetime_sql5  r  zGenerator.tsordstodatetime_sqlexp.TsOrDsToDatec                 C  s   |j }| |}|r(|| jj| jjfvr(| ttj||j	d dtj
jjS t|tjs6|tj
jjr;| |S | t|tj
jjS rw  )rU   r   r%   TIME_FORMATDATE_FORMATrW   r   r   ry  r   r   r   DATEr6   TsOrDsToDater  r|  r0   r0   r1   tsordstodate_sql<  s   

zGenerator.tsordstodate_sqlexp.UnixDatec                 C  s.   |  td|jttjdtjjj	dS )NDATEDIFFz
1970-01-01day)
rW   r   r   rU   r   rX  rY  r   r   r  r  r0   r0   r1   unixdate_sqlM  s   zGenerator.unixdate_sqlexp.LastDayc                 C  s>   | j r| |S |d}|r|dkr| d | d|jS )Nr  r   z)Date parts are not supported in LAST_DAY.LAST_DAY)LAST_DAY_SUPPORTS_DATE_PARTr  r  r*   r   rU   )rO   r    r  r0   r0   r1   lastday_sqlW  s   


zGenerator.lastday_sqlexp.DateAddc                 C  s$   ddl m} | d|j|j||S )Nr   )unit_to_strDATE_ADD)rJ  r  r   rU   r    )rO   r    r  r0   r0   r1   dateadd_sqla  s   zGenerator.dateadd_sqlexp.ArrayAnyc                 C  s   | j r*tj|j|jd}tj|dd}tj|jdd}| t	|
|S ddlm} | jj|kr;| d | |S )Nr  r  r   r+  zARRAY_ANY is unsupported)CAN_IMPLEMENT_ARRAY_ANYr   ArrayFilterrU   r    	ArraySizer  eqrW   parenor_r.  r,  r%   r#   r*   r  )rO   r    filteredfiltered_not_emptyoriginal_is_emptyr,  r0   r0   r1   arrayany_sqlh  s   

zGenerator.arrayany_sql
exp.Structc                 C  s"   | ddd |jD  | |S )NrM   c                 S  s:   g | ]}t |tjrt|j|jjr|jn|jn|qS r0   )r6   r   r  r  r    rU   rv  r   r#  r0   r0   r1   r  z  s    
 z(Generator.struct_sql.<locals>.<listcomp>)r  rM   r  r  r0   r0   r1   
struct_sqlw  s   

zGenerator.struct_sqlexp.PartitionRangec                 C  r  )NrU   r    r   rV   )rO   r    r#  r$  r0   r0   r1   partitionrange_sql  s   zGenerator.partitionrange_sqlexp.TruncateTablec           	      C  s   |j drdnd}d| | }|j drdnd}| |d}|r)d| nd}| |d	}|r9d| d
nd}| |d}|rHd| nd}| |d}|rWd| nd}d| | | | | | | S )Nis_databaseDATABASEr  r[   r  r  rf   r   identityz	 IDENTITYoptionr4  z	TRUNCATE )r   r'   rM   rW   )	rO   r    rR  r  r  r  r  r  r4  r0   r0   r1   truncatetable_sql  s   "zGenerator.truncatetable_sqlexp.Convertc                 C  s  |j }|j}|jd}|jd}|jd}|r|sdS t|jds9|j | jv r9tjj	|j tj
dgdd}d }|r@tjntj}t|tj
r|jrdd	lm}	 |j}
|	j|
}|se| d
|
  tj
|}|j tjjjkr{tj||d}n7|j tjjjtjjjfv rtj||d}n"|j | jv r|tj||d||d}n|j tjjjkrtj||d}|s||||d}| |S )Nr3  rX  r  rf   r      F)rM   r|  )TSQLz!Unsupported T-SQL 'style' value: rx  )rU   r  rX  )rU   r    r   r'   r   rM   PARAMETERIZABLE_TEXT_TYPESr   r   buildrX  r  r  TryCastr6   r  sqlglot.dialects.tsqlr  r   CONVERT_FORMAT_MAPPINGr*   rY  r   r  	StrToDater  	DATETIME2ry  	TimeToStrr   rW   )rO   r    r  r  r3  rX  r  transformedr   r  style_valueconverted_styler  r0   r0   r1   convert_sql  s:   
zGenerator.convert_sqlexp.JSONPathKeyc                 C  sp   |j }t|tjr| |}|rd| S dS tj|r"d| S | |}| jr3| jr3d| dS d| S )Nr  rf   r}  r~  )	rU   r6   r   JSONPathWildcardr  SAFE_IDENTIFIER_REr  r#  !JSON_PATH_BRACKETED_KEY_SUPPORTEDr  r0   r0   r1   _jsonpathkey_sql  s   


zGenerator._jsonpathkey_sqlexp.JSONPathSubscriptc                 C  s    |  |j}|rd| dS dS )Nr}  r~  rf   )r  rU   r  r0   r0   r1   _jsonpathsubscript_sql  r  z Generator._jsonpathsubscript_sqlc                 C  s*   t |tjsddlm} ||| jd}|S )Nr   )simplifyr)  )r6   r   rX  sqlglot.optimizer.simplifyr  r%   )rO   r    r  r0   r0   r1   rW    s   z"Generator._simplify_unless_literal"exp.IgnoreNulls | exp.RespectNullsc                 C  s  |j }t|| jr| dt|j d| jjj  | 	|S | j
ry|jdsyt|tjtjtjdd d}|rX|d }|j|j  d}d	|jd< |j | | 	|j S |tj}|ry| j	|d
dd d d| d }| j||jdS | 	|d d| S )Nz*RESPECT/IGNORE NULLS is not supported for z in inlinec                 S  s$   t | tjrdS t | tjrdS dS )Nr   r   r$  )r6   r   	HavingMaxOrder)r  r0   r0   r1   rQ     s   
z/Generator._embed_ignore_nulls.<locals>.<lambda>r  r   r  TFr  rY  r[   rw   r  rU   )rU   r6   r  r*   rP  r  r%   r#   r$   rW   IGNORE_NULLS_IN_FUNCr  r'   sortedrR  r   r  r  r  r8  r<  r  r  re  r  )rO   r    r  rU   modsmodagg_funcagg_func_sqlr0   r0   r1   ru    s,   

"zGenerator._embed_ignore_nullsrY  c                 C  s   | j r
|d| jS |S )zXWe don't want to extra indent line breaks so we temporarily replace them with sentinels.r9  )r  r<  r=  )rO   rY  r0   r0   r1   rb    s   zGenerator._replace_line_breaksexp.CopyParameterc                 C  s   |  |d}|jr/| }|dkrdnd}|dv rdnd}| j|d|d}| | d	| d
S |  |d}|s9|S | jr>dnd}| | | S )NrU   FILE_FORMATr[   r   )COPY_OPTIONSFORMAT_OPTIONSr  T)rK   r]   ri  rw   r    )rW   rM   rs  COPY_PARAMS_EQ_REQUIRED)rO   r    r  rs  r]   r   r   r  r0   r0   r1   copyparameter_sql  s   zGenerator.copyparameter_sqlexp.Credentialsc                 C  s   |j d}t|tjr| |d}|rd| nd}n| j|dddd}|d ur/d| dnd}| |d	}|r>d
| nd}| j|dddd}|rQd| dnd}| |d}|r`d| nd}| |d}|rod| nd}| | | | | S )NcredentialszCREDENTIALS rf   Tr[   r  zCREDENTIALS = (rw   storagezSTORAGE_INTEGRATION = 
encryptionz ENCRYPTION = (iam_rolez	IAM_ROLE regionz REGION )r   r'   r6   r   rX  rW   rM   )rO   r    	cred_exprr  r  r  r  r  r0   r0   r1   credentials_sql#  s   zGenerator.credentials_sqlexp.Copyc              	   C  s   |  |d}| jrd| nd| }|  |d}|r | |nd}| |jdr,dnd}| j|d	d
d}| jjr=dnd}| j|d|d
d
d
| jd}|r`| jrXd| d}n| j	s`d| }d| | d| | | S )NrU   r@  r[   r  rf   r  r  TOfilesTr  r   r  )r  r]   r  rx  rw  rv   r  rw   r-  )
rW   COPY_HAS_INTO_KEYWORDr   r   r'   rM   r%   COPY_PARAMS_ARE_CSVCOPY_PARAMS_ARE_WRAPPEDr  )rO   r    rU   r  r  r  r]   r  r0   r0   r1   copy_sql<  s,   

zGenerator.copy_sqlexp.Semicolonc                 C  r}   r   r0   r  r0   r0   r1   semicolon_sqlX  r  zGenerator.semicolon_sqlexp.DataDeletionPropertyc                 C  sp   |j drdnd}| |d}|rd| nd }| |d}|r&d| nd }|s,|r3| d||}d| S )	Nr  r   r9  filter_columnzFILTER_COLUMN=rm  zRETENTION_PERIOD=zDATA_DELETION=)r   r'   rW   r   )rO   r    rn  
filter_colrm  r0   r0   r1   datadeletionproperty_sql[  s   
z"Generator.datadeletionproperty_sql!exp.MaskingPolicyColumnConstraintc                 C  s<   |  |d}| j|dd}|rd| dnd}d| | S )NrU   TrJ   z USING (rw   rf   zMASKING POLICY r  rC  r0   r0   r1   !maskingpolicycolumnconstraint_sqlg  s   z+Generator.maskingpolicycolumnconstraint_sqlexp.GapFillc                 C  s:   |  |d}d| }| jd|gdd |j D R  S )NrU   rz  GAP_FILLc                 S  s   g | ]
\}}|d kr|qS r  r0   )rJ  rX  vr0   r0   r1   r  r  rI  z)Generator.gapfill_sql.<locals>.<listcomp>)rW   r   r   r&   r  r0   r0   r1   gapfill_sqlo  s   
$zGenerator.gapfill_sqlrhs
scope_namec                 C  s   |  d|pd |S )NSCOPE_RESOLUTIONr4   )rO   r  r  r0   r0   r1   scope_resolutiont  r   zGenerator.scope_resolutionexp.ScopeResolutionc                 C  sX   |  |d}|j}t|tjr |  |d d| j|j  d}n|  |d}| ||S )NrU   ri  rw   r    )rW   r    r6   r   r  r  rM   r  r  r0   r0   r1   scoperesolution_sqlw  s   "zGenerator.scoperesolution_sqlexp.ParseJSONc                 C  s*   | j d u r| |jS | | j |j|jS r"   )r   rW   rU   r   r    r  r0   r0   r1   parsejson_sql  s   
zGenerator.parsejson_sqlexp.Randc              	   C  sT   |  |d}|  |d}|r#|r#d| d| d| d|j d| S | d|jS )Nrt  rs  ri  z - z) * RANDz + rW   r   rU   )rO   r    rt  rs  r0   r0   r1   rand_sql  s
   &zGenerator.rand_sqlexp.Changesc                 C  sv   |  |d}d| }|  |d}|r| d | nd}|  |d}|r/| d | nd}d| d| | S )NinformationzINFORMATION => 	at_beforerf   r  z	CHANGES (rw   )rW   r   )rO   r    r   r  r  r0   r0   r1   changes_sql  s   
zGenerator.changes_sqlexp.Padc                 C  sL   |j drdnd}| |dpd }|s| jrd}| | d|j|j|S )Nis_leftLRfill_patternz' 'PAD)r   r'   rW   PAD_FILL_PATTERN_IS_REQUIREDr   rU   r    )rO   r    r\   r  r0   r0   r1   pad_sql  s
   
zGenerator.pad_sqlexp.Summarizec                 C  s,   |j drdnd}d| d| |j S )Nr  z TABLErf   	SUMMARIZEr[   ri  )rO   r    r  r0   r0   r1   summarize_sql  rU  zGenerator.summarize_sqlexp.ExplodingGenerateSeriesc                 C  s|   t jdi |j}|j}t|t jt jfr|j}| jr.t|t jt j	fs.| 
t j	|gdS t|t jr9| d | 
|S )NrL   z5GenerateSeries projection unnesting is not supported.r0   )r   GenerateSeriesr   rI  r6   r  
TableAliasSUPPORTS_EXPLODING_PROJECTIONSr   UnnestrW   r  r*   )rO   r    generate_seriesrI  r0   r0   r1   explodinggenerateseries_sql  s   

z%Generator.explodinggenerateseries_sqlARRAY_CONCATexp.ArrayConcatc                 C  s:   |j }| jstdd |}n|  |}| ||j|pd S )Nc                 S  s   t j| |gdS )N)rU   rM   )r   ArrayConcatr  r0   r0   r1   rQ     r^   z+Generator.arrayconcat_sql.<locals>.<lambda>)rM   ARRAY_CONCAT_IS_VAR_LENr   r   rU   )rO   r    r   rG  r  r0   r0   r1   arrayconcat_sql  s
   
zGenerator.arrayconcat_sqlexp.ConvertTimezonec                 C  sp   | j r| |S |jd}|jd}|jd}|r,|r,tjt|tjjj	|d}tj||d}| 
|S )N	source_tz	target_tz	timestamp)rU   r  )SUPPORTS_CONVERT_TIMEZONEr  r   r'   r   
AtTimeZoner   r   r   TIMESTAMPNTZrW   )rO   r    r  r  r  r  r0   r0   r1   converttimezone_sql  s   

zGenerator.converttimezone_sqlexp.JSONc                 C  sl   |  |d}|rd| nd}|jd}|d u rd}n|s!d}nd}|jdr+dnd}d	| | | S )
NrU   r[   rf   r;  z WITHOUTz WITHr  r  JSONr  )rO   r    rU   _withrA  
unique_sqlr0   r0   r1   json_sql  s   zGenerator.json_sqlexp.JSONValuec                   sr   d fdd}  |d}  |d}|rd	| nd
}  |d}|r)d| nd
} d|j| | | S )Nr7   t.Anyr   r!   c                   s   t | tr| S d |  S )Nrq   )r6   r!   rW   )r7   r`  r0   r1   _generate_on_options  r   z5Generator.jsonvalue_sql.<locals>._generate_on_optionsrz  r  r  rf   on_conditionr[   
JSON_VALUE)r7   r(  r   r!   r  )rO   r    r)  rz  r  r*  r0   r`  r1   jsonvalue_sql  s   zGenerator.jsonvalue_sqlexp.ConditionalInsertc                 C  s\   |j drdnd}| |d}|rd| dn|}| |dtdd   }| | S )	Nrq  r<  rf   r    r;  r  rU   r{  )r   r'   rW   ry  r;  )rO   r    rq  r  r  r0   r0   r1   conditionalinsert_sql  s
   zGenerator.conditionalinsert_sqlexp.MultitableInsertsc              	   C  sD   |  |d}| | j|dd}d| | | |  |d }|S )Nr  r[   r   r  r|   )rW   r   rM   )rO   r    r  rM   resr0   r0   r1   multitableinserts_sql  s    zGenerator.multitableinserts_sqlexp.OnConditionc                 C  s   |j d}t|tjrd| dn| |d}|j d}t|tjr*d| dn| |d}|rH|rH| jjr?| d| n| d| }d}| |d}| | | S )	Nemptyrq   z	 ON EMPTYerrorz	 ON ERRORr[   rf   r   )r   r'   r6   r   r  rW   r%   ON_CONDITION_EMPTY_BEFORE_ERROR)rO   r    r3  r4  r   r0   r0   r1   oncondition_sql  s$   



zGenerator.oncondition_sqlexp.JSONExtractQuotec                 C  s*   |j drdnd}| |d d| S )Nscalarz ON SCALAR STRINGrf   r  z QUOTESrs   )rO   r    r8  r0   r0   r1   jsonextractquote_sql  rk  zGenerator.jsonextractquote_sqlexp.JSONExistsc                 C  sr   |  |d}|  |d}| |d}|rd| nd}|  |d}|r(d| nd}| | | }| d||S )	NrU   rz  passingz	 PASSING rf   r*  r[   JSON_EXISTS)rW   rM   r   )rO   r    rU   rz  r;  r*  r0   r0   r1   jsonexists_sql  s   zGenerator.jsonexists_sqlexp.ArrayAggc                 C  s   |  |}| jjrP|jdrP|j}t|tjr.|j	j
}|||j
t   |S |j
}|tjrPt|tjrB| |n| |d}| d| d}|S )Nnulls_excludedrU   z FILTER(WHERE z IS NOT NULL))r  r%   ARRAY_AGG_INCLUDES_NULLSr   r'   rI  r6   r   Filterr    rU   r<  and_rp  r   rd   r  ColumnDistinctrM   rW   )rO   r    	array_aggrI  parent_condrU   rl  r0   r0   r1   arrayagg_sql*  s   
 

zGenerator.arrayagg_sql	exp.Applyc                 C  r  )NrU   r    z APPLY(rw   rV   r  r0   r0   r1   	apply_sqlC  s   zGenerator.apply_sql	exp.Grantc                 C  s   | j |ddd}| |d}|rd| nd}| |d}|r$d| nd}| j |ddd}|jd	r6d
nd}d| d| | d| | S )N
privilegesTr  r  r[   rf   	securable
principalsgrant_optionz WITH GRANT OPTIONzGRANT z ONr   )rM   rW   r   r'   )rO   r    privileges_sqlr  rL  rM  rN  r0   r0   r1   	grant_sqlI  s   zGenerator.grant_sqlexp.GrantPrivilegec                 C  s:   |  |d}| j|dd}|rd| dnd}| | S )NrU   TrJ   ri  rw   rf   r  )rO   r    rU   rJ  r0   r0   r1   grantprivilege_sqlX  s   zGenerator.grantprivilege_sqlexp.GrantPrincipalc                 C  s6   |  |d}|  |d}|r| dnd}| | S )NrU   r  r[   rf   rV   r  r0   r0   r1   grantprincipal_sql_  s   zGenerator.grantprincipal_sqlexp.Columnsc                 C  s$   |  |}|jdrd| }|S )Nunpackr  )r  r   r'   )rO   r    r   r0   r0   r1   columns_sqlg  s   

zGenerator.columns_sqlexp.Overlayc                 C  s^   |  |d}|  |d}|  |d}|  |d}|rd| nd}d| d| d	| | d
S )NrU   r    r  r  r  rf   zOVERLAY(z	 PLACING r  rw   rV   )rO   r    rU   r  r  for_sqlr0   r0   r1   overlay_sqln  s   zGenerator.overlay_sqlexp.ToDoublec                 C  r   r"   )rW   r   r   rU   r   r   r  r  r0   r0   r1   todouble_sqlw  r(  zGenerator.todouble_sql
exp.Stringc                 C  sF   |j }|jd}|rtjtjd||d}| t|tj	j
jS )Nr  UTC)r  r  r  )rU   r   r'   r   ConvertTimezonerX  rY  rW   r   r   r   r   r  r0   r0   r1   
string_sql{  s   zGenerator.string_sql
exp.Medianc                 C  s.   | j s| tj|jtjddS | |S )Ng      ?r  )SUPPORTS_MEDIANrW   r   PercentileContrU   rX  r  r  r  r0   r0   r1   
median_sql  s
   
zGenerator.median_sqlexp.OverflowTruncateBehaviorc                 C  sB   |  |d}|rd| nd}|jdrdnd}d| d| S )NrU   r[   rf   
with_countz
WITH COUNTzWITHOUT COUNTr   r  )rO   r    fillerrf  r0   r0   r1   overflowtruncatebehavior_sql  s   z&Generator.overflowtruncatebehavior_sqlexp.UnixSecondsc                 C  sJ   | j r| |S tjtjdtjjjd}| 	tj
|j|tddS )Nz1970-01-01 00:00:00+00r  r   )rU   r    r  )SUPPORTS_UNIX_SECONDSr  r   r   rX  rY  r   r   r  rW   TimestampDiffrU   var)rO   r    start_tsr0   r0   r1   unixseconds_sql  s   
zGenerator.unixseconds_sqlexp.ArraySizec                 C  sZ   |j }|r| jd u r|jr|jdks| d d }| jr$|s$tjd}| | j	|j
|S )N1z4Cannot transpile dimension argument for ARRAY_LENGTHr   )r    r   r  r   r*   r   rX  r  r   r   rU   )rO   r    dimr0   r0   r1   arraysize_sql  s   

zGenerator.arraysize_sql
exp.Attachc                 C  sR   |  |d}|jdrdnd}| |}|rd| dnd}d| d| | S )	NrU   r  r
  rf   r  rw   ATTACHr[   r  )rO   r    rU   r  rM   r0   r0   r1   
attach_sql  s
   
zGenerator.attach_sql
exp.Detachc                 C  r  )NrU   r  z DATABASE IF EXISTSrf   DETACHr[   r  )rO   r    rU   r  r0   r0   r1   
detach_sql  s   zGenerator.detach_sqlexp.AttachOptionc                 C  s6   |  |d}|  |d}|rd| nd}| | S rw  rV   )rO   r    rU   r  r0   r0   r1   attachoption_sql  s   zGenerator.attachoption_sqlexp.FeaturesAtTimec              	   C  sN   |  |d}t|jtjrd| }| d||jd|jd|jdS )NrU   rz  FEATURES_AT_TIMEtimenum_rowsignore_feature_nulls)rW   r6   rU   r   r   r   r   r'   rk  r0   r0   r1   featuresattime_sql  s   



zGenerator.featuresattime_sqlexp.WatermarkColumnConstraintc                 C  s    d|  |d d|  |d S )NzWATERMARK FOR rU   r  r    rV   r  r0   r0   r1   watermarkcolumnconstraint_sql  s   z'Generator.watermarkcolumnconstraint_sqlexp.EncodePropertyc                 C  sR   |j drdnd}| d| |d }|j d}|r'| d| | }|S )Nr  z
KEY ENCODEENCODEr[   rU   r   )r   r'   rW   r   )rO   r    encoder   r0   r0   r1   encodeproperty_sql  s   zGenerator.encodeproperty_sqlexp.IncludePropertyc                 C  sV   |  |d}d| }|  |d}|r| d| }|  |d}|r)| d| }|S )NrU   zINCLUDE 
column_defr[   rC  r  rV   )rO   r    rU   r  r  rC  r0   r0   r1   includeproperty_sql  s   
zGenerator.includeproperty_sqlexp.XMLElementc                 C  s(   d|  |d }| jd|g|jR  S )NNAME rU   
XMLELEMENT)rW   r   rM   )rO   r    r   r0   r0   r1   xmlelement_sql  s   zGenerator.xmlelement_sqlexp.XMLKeyValueOptionc                 C  s8   |  |d}|  |d}|rd| dnd}| | S )NrU   r    ri  rw   rf   rV   r  r0   r0   r1   xmlkeyvalueoption_sql  s   zGenerator.xmlkeyvalueoption_sqlexp.PartitionByRangePropertyc                 C  s4   |  |d}|  |d}d| | d| | S )Npartition_expressionscreate_expressionszPARTITION BY RANGE r[   r  )rO   r    
partitionscreater0   r0   r1   partitionbyrangeproperty_sql  s   z&Generator.partitionbyrangeproperty_sql#exp.PartitionByRangePropertyDynamicc              
   C  sz   |  |d}|  |d}|jd }t|tjr&|jjr&|jtj	|j
 d| | d| | d| |  | S )Nr  r  everyzSTART z END z EVERY )rW   r   r6   r   IntervalrU   rv  r<  rX  r  r   rm  )rO   r    r  r  r  r0   r0   r1   #partitionbyrangepropertydynamic_sql  s   
.z-Generator.partitionbyrangepropertydynamic_sqlexp.UnpivotColumnsc                 C  rB  )NrU   TrJ   r  z VALUE r  )rO   r    r   r   r0   r0   r1   unpivotcolumns_sql  s   zGenerator.unpivotcolumns_sqlexp.AnalyzeSamplec                 C  s(   |  |d}|  |d}d| d| S )Nr  r  zSAMPLE r[   rV   )rO   r    r  r  r0   r0   r1   analyzesample_sql  r  zGenerator.analyzesample_sqlexp.AnalyzeStatisticsc                 C  sz   |  |d}|  |d}|rd| nd}|  |d}|r"d| nd}| |}|r0d| nd}| | d| | S )Nr  r  r[   rf   rU    STATISTICSr  )rO   r    r  r  rU   rJ  r0   r0   r1   analyzestatistics_sql  s   
zGenerator.analyzestatistics_sqlexp.AnalyzeHistogramc                 C  sj   |  |d}| |}|  |d}|rd| nd}|  |d}|r(d| dnd}| d| | | S )NrU   r    r[   rf   update_optionsz UPDATEz HISTOGRAM ON r  )rO   r    rU   rJ  inner_expressionr  r0   r0   r1   analyzehistogram_sql#  s   
zGenerator.analyzehistogram_sqlexp.AnalyzeDeletec                 C  s*   |  |d}|rd| nd}d| dS )Nr  r[   rf   r   r  rV   )rO   r    r  r0   r0   r1   analyzedelete_sql,  s   zGenerator.analyzedelete_sqlexp.AnalyzeListChainedRowsc                 C  s   |  |d}d| S )Nr    zLIST CHAINED ROWSrV   )rO   r    r  r0   r0   r1   analyzelistchainedrows_sql1  s   
z$Generator.analyzelistchainedrows_sqlexp.AnalyzeValidatec                 C  sH   |  |d}|  |d}|rd| nd}|  |d}d| | | S )Nr  rU   r[   rf   r    z	VALIDATE rV   )rO   r    r  rU   r  r0   r0   r1   analyzevalidate_sql5  s
   zGenerator.analyzevalidate_sqlexp.Analyzec           	      C  s   | j |ddd}|rd| nd}| |d}|rd| nd}| |d}|r-d| nd}| |d}|r<d| nd}| |d}|rKd| nd}| |d	}|rZd| nd}| |d
}|rid| nd}d| | | | | | | S )Nr  r[   r  rf   r  rU   moder   r4  r    ANALYZEr  )	rO   r    r  r  rU   r  r   r4  r  r0   r0   r1   analyze_sql<  s   "zGenerator.analyze_sqlexp.XMLTablec                 C  s   |  |d}| j|dd}|rd| dnd}| j|dd}|r,|   d| | nd}| j|d	d}|rC|   d
| | nd}|jdrR|   dnd}d| d | || | | |  | jddd S )NrU   
namespacesr  zXMLNAMESPACES(z), rf   r;  PASSINGrJ  r  by_refzRETURNING SEQUENCE BY REFz	XMLTABLE(rw   r   )rW   rM   r]   r   r   r'   rv   )rO   r    rU   r  r;  rJ  r  r0   r0   r1   xmltable_sqlM  s     8zGenerator.xmltable_sqlexp.XMLNamespacec                 C  s(   |  |d}t|jtjr|S d| S )NrU   rq   )rW   r6   rU   r   r  r  r0   r0   r1   xmlnamespace_sqlX  s   zGenerator.xmlnamespace_sql
exp.Exportc                 C  sL   |  |d}|  |d}|rd| dnd}|  |d}d| | d| S )	NrU   
connectionzWITH CONNECTION r[   rf   r  zEXPORT DATA r  rV   )rO   r    rU   r  r  r0   r0   r1   
export_sql\  s
   zGenerator.export_sqlexp.Declarec                 C  rI   )NzDECLARE TrJ   rL   r  r0   r0   r1   declare_sqlc  rR   zGenerator.declare_sqlexp.DeclareItemc                 C  sf   |  |d}|  |d}|rd| nd}|  |d}t|jdtjr*d| }| d| | S )NrU   rp   r  rf   r  rz  r  )rW   r6   r   r'   r   r&  )rO   r    variablerp   r  r0   r0   r1   declareitem_sqlf  s   
zGenerator.declareitem_sqlexp.RecursiveWithSearchc                 C  sr   |  |d}|  |d}|  |d}|  |d}|rd| nd}|dkr'|nd| d	}| d
| d| | S )Nr  rU   r    r  r  rf   CYCLEzSEARCH z	 FIRST BYr[   r  rV   )rO   r    r  rU   r  r  r  r0   r0   r1   recursivewithsearch_sqlq  s   z!Generator.recursivewithsearch_sqlexp.ParameterizedAggc                 C  s2   | j |ddd}| j|jg|j R  d| d S )Nr  Tr  ri  rw   )rM   r   r   )rO   r    r  r0   r0   r1   parameterizedagg_sql|  s   "zGenerator.parameterizedagg_sqlexp.AnonymousAggFuncc                 C  s   | j |jg|jR  S r"   )r   r   rM   r  r0   r0   r1   anonymousaggfunc_sql  r  zGenerator.anonymousaggfunc_sqlexp.CombinedAggFuncc                 C  rl   r"   )r  r  r0   r0   r1   combinedaggfunc_sql  r  zGenerator.combinedaggfunc_sqlexp.CombinedParameterizedAggc                 C  rl   r"   )r  r  r0   r0   r1   combinedparameterizedagg_sql  r  z&Generator.combinedparameterizedagg_sqlexp.Showc                 C  r  )NzUnsupported SHOW statementrf   r  r  r0   r0   r1   show_sql  r  zGenerator.show_sqlexp.Put | exp.Getc                 C  sr   |j d}|r| j|ddddnd}| |d}| |d}t|tjr/d| d| | S d	| d| | S )
Nr   r[   F)r\   r]   r  rf   rU   rR  zPUT zGET )r   r'   r   rW   r6   r   Put)rO   r    props	props_sqlrU   rR  r0   r0   r1   r     s   zGenerator.get_put_sqlexp.TranslateCharactersc                 C  sB   |  |d}|  |d}|jdrdnd}d| d| | dS )	NrU   r    
with_errorz WITH ERRORrf   z
TRANSLATE(r  rw   r  )rO   r    rU   r  r  r0   r0   r1   translatecharacters_sql  s   z!Generator.translatecharacters_sqlexp.DecodeCasec              	   C  s4  | j r| jdg|jR  S |j^}}g }t|d d d |dd d D ]^\}}t|tjr;|tj|	||d q#t|tj
rQ|tj|t
 |d q#t|tjr\t|}tj|	|tj|t
 |t
 dddd}|tj||d q#tj|t|d dkr|d nd d}| |S )	NDECODEr$  r   r  Fr  rY  ro  )SUPPORTS_DECODE_CASEr   rM   r  r6   r   rX  rW  r  r  r  rp  r  r  r  rB  rp  ry  rW   )rO   r    rM   r:  r?  rq  r  ro  r0   r0   r1   decodecase_sql  s&   
& 
"&
zGenerator.decodecase_sql)r  r   r  r'  r  r(  r  r)  rv   r)  r  r*  r  r   r  r)  r  r(  r  r)  r  r(  r%   r   )T)r    r7  r8  r(  r   r!   )r    r7  r   r7  )r    r   r   r   )rT  r!   r   rU  )r[   )r]   r!   r   r!   )rW   r!   r]   r!   r   r!   )rX  r!   r   r!   )NNF)
rW   r!   r    r]  r  r^  r_  r(  r   r!   )r    rf  r   r!   )r   rn  r   r!   )r   r!   r   r!   )r   NFF)rW   r!   rh  r)  r  rv  rw  r(  rx  r(  r   r!   )NT)r    r  r  r   rX  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!   )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    r2  r   r!   )r    r7  r   r!   )r    r7  rW   r!   r   r!   )r    r=  r   r!   )r    rB  r   r!   )r    rI  r   r!   )r    rN  r   r!   r"   )r    rR  rS  r   r   r!   )r    r]  r   r!   )r    ra  r   r!   )r    rq  r   r!   )r    rv  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    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!   )rf   r   rf   T)r   r  r\   r!   r]   r!   r  r!   r  r(  r   r!   )r   r  r   r  )F)r    r  r  r(  r   r!   )r    r  r   r!   )r    r"  r   r!   )r    r*  r   r!   )r    r.  r   r!   )r    r4  r   r!   )r    r7  r   r!   )r    r<  r   r!   )r    r>  r   r!   )r    rG  r   r!   )r    rP  r   r!   )r    rT  r   r!   )r    rZ  r   r!   )r    r^  r   r!   )r    rc  r   r!   )r    rk  r   r!   )r    rp  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    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    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    r3  r   r!   )r    r7  r   r!   )r    r9  r   r!   )rJ  T)r    rK  rL  r!   rm  r(  r   r!   )r    rN  r   r!   )r    rT  rU  r(  r   r!   )r    rb  r   r!   )r    re  r   r!   )r    rj  r   r!   )r    rn  r   r!   )r    rp  r   r!   )r    ru  r   r!   )r  r!   rs  r(  r   r!   )r    r|  r   r!   )r    r  r   r!   )r    r  rK   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    r7  r  r!   r   r!   )r    r7  r   r!   )r    r  r   r!   )r    r7  r  r(  r  r  r   r  )r    r7  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   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'  rv  r   r(  )r    r&  r   r!   )r    r.  r   r!   )r    r3  r   r!   )r    r6  r   r!   )r    r8  r   r!   )r    rA  r   r!   )r    rF  r   r!   )r    rH  r   r!   )r    rN  r   r!   )r    rW  r   r(  )r    r_  r   r!   )r    rc  r   r!   )r    rf  r   r!   )r    ri  r   r!   )r    rm  r   r!   )r    rr  r   r!   )r    ru  r   r!   )r    rx  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    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!   )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    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  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    r3  r   r!   )r    r:  r   r!   )r    r?  r   r!   )r    rB  r   r!   )r    rF  r   r!   )r    rN  r   r!   )r    rR  r   r!   )r    rU  r   r!   )r    rd  r   r!   )r    rf  r   r!   )r    rh  r   r!   )r    rl  r   r!   )r    rs  r   r!   )r    rw  r   r!   )r    ry  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    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!   )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   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(  )NN)r    r7  r  r  r  r  r   r   )NNNFTFFr   rf   FF)r    r]  r  r   r  r   rK   r(  rv   r(  rw  r(  rx  r(  r]   r!   r\   r!   r  r(  r  r(  r   r!   )r   r!   r    r7  rK   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!   )r    r-  r   r!   )r    r0  r   r!   )r    r3  r   r!   )r    r5  r   r!   )r    r7  r   r!   )r    r9  r   r!   )r    r<  r   r!   )r    r>  r   r!   )r    rB  r   r!   )r    rE  r   r!   )r    rL  r   r!   )r    rR  r   r!   )r    rV  r   r!   )r    rY  r   r!   )r    r]  r   r!   )r    r`  r   r!   )r    rb  r   r!   )r    rd  r   r!   )r    rk  r   r!   )r    rm  r   r!   )r    ro  r   r!   )r    rv  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    r  r   r!   )r    r  r   r!   )r    r  r   r!   )r    r  r  r!   r   r!   )rY  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  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-  r   r!   )r    r/  r   r!   )r    r2  r   r!   )r    r7  r   r!   )r    r:  r   r!   )r    r>  r   r!   )r    rH  r   r!   )r    rJ  r   r!   )r    rQ  )r    rS  )r    rU  )r    rX  )r    r[  r   r!   )r    r]  r   r!   )r    ra  )r    re  r   r!   )r    ri  r   r!   )r    ro  r   r!   )r    rs  r   r!   )r    rv  r   r!   )r    ry  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    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!   )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$   rF   rG   __doc__r   r   AllowedValuesPropertyAnalyzeColumnsAnalyzeWithArrayContainsAllArrayOverlapsAutoRefreshPropertyBackupPropertyCaseSpecificColumnConstraintCeilCharacterSetColumnConstraintCharacterSetPropertyClusteredColumnConstraintCollateColumnConstraintCommentColumnConstraintConnectByRootConvertToCharsetCopyGrantsPropertyCredentialsPropertyDateFormatColumnConstraintDefaultColumnConstraintDynamicPropertyEmptyPropertyEncodeColumnConstraintEnviromentPropertyEphemeralColumnConstraintExcludeColumnConstraintExecuteAsPropertyr  ExternalPropertyFloorGetGlobalPropertyHeapPropertyIcebergPropertyInheritsPropertyInlineLengthColumnConstraintInputModelPropertyr  IntervalSpanInt64LanguagePropertyLocationPropertyLogPropertyMaterializedPropertyNonClusteredColumnConstraintNoPrimaryIndexProperty!NotForReplicationColumnConstraintOnCommitProperty
OnPropertyOnUpdateColumnConstraintOperatorOutputModelPropertyPathColumnConstraintPartitionedByBucketPartitionByTruncatePivotAny ProjectionPolicyColumnConstraintr  !RemoteWithConnectionModelPropertyReturnsPropertySamplePropertySecurePropertySecurityPropertySetConfigPropertySetPropertySettingsPropertySharingPropertySqlReadWritePropertySqlSecurityPropertyStabilityPropertyStreamStreamingTablePropertyStrictProperty	SwapTableTableColumnTagsTemporaryPropertyTitleColumnConstraintToMapToTablePropertyTransformModelPropertyTransientPropertyUnionUnloggedPropertyUsingTemplateProperty	UsingDataUuidUppercaseColumnConstraintVarMapViewAttributePropertyVolatilePropertyWithJournalTablePropertyWithProcedureOptionsWithSchemaBindingPropertyWithOperatorForcePropertyr=   __annotations__r   r  rs  r  r  r  r  r  r  r  rV  rJ  r'  r  rC  r  r  r  r  r  r  r  rL  r  rZ  r   r  rb  r  r  rB  r  r/  r  r  r  r  r  r  rx  rG  r@  ra  r  rK  r  rv  r}  r  r  r$  r%  rn  !JSON_TYPE_REQUIRED_FOR_EXTRACTIONr  r  r   r8  r<   r  r+  r  r  r  r  r  r  rh  r  r  r  ry  r	  r  r  r  rb  rj  rS  rK  r   r   r7  r   r  r   r   r  NCHARNVARCHAR
MEDIUMTEXTLONGTEXTTINYTEXTr   
MEDIUMBLOBLONGBLOBTINYBLOBr   
ROWVERSIONSMALLDATETIMEr  r  r  r  r  r  r  r  r
  r  r  r  AlgorithmPropertyr  AutoIncrementPropertyBlockCompressionProperty	POST_NAMEChecksumPropertyCollatePropertyClusterClusteredByPropertyDistributedByPropertyDuplicateKeyPropertyDataBlocksizePropertyDataDeletionPropertyDefinerProperty	DictRangeDictPropertyDistKeyPropertyDistStylePropertyEncodePropertyr  EnginePropertyFallbackPropertyFileFormatPropertyr  FreespacePropertyIncludePropertyIsolatedLoadingPropertyJournalPropertyLikePropertyLockPropertyLockingPropertyr  MergeBlockRatioPropertyr  PartitionedByPropertyPartitionedOfProperty
PrimaryKeyr  RowFormatPropertyRowFormatDelimitedPropertyRowFormatSerdePropertySchemaCommentPropertySerdePropertiesSetSequencePropertiesSortKeyPropertyStorageHandlerPropertyMergeTreeTTLWithDataPropertyWithSystemVersioningPropertyr  r  CommandCreateDescribeDeleteDropr  r  r  MultitableInsertsGroupHavingr  r  r  WhererS  r  r  r  rC  rX  Negr4  r  r   r   r  r  r  r=  	__slots__r   r?  r6  rD  r:  rF  r*   r]   r   r\  re  rm  rr  ru  rv   rW   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r*  r1  r6  r:  r  rA  rH  rM  rQ  r\  r`  rp  ru  rz  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-  r3  r6  r;  r=  rF  rO  rS  rY  r]  rb  rj  ro  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r8   r  r  r  r  r   r,  r1  r6  r8  rI  rM  rP  rS  ra  rd  ri  r  ro  rt  rw  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+  r-  r1  r5  r  r@  rD  rG  rM  rV  r^  rb  re  rh  rk  rl  rq  rt  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rG  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.  r2  r9  r>  rA  rE  rM  rQ  rT  r`  r[  re  rg  rj  rr  rv  rx  r~  r  r  r  r  r  r  r  r  r  ro  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r`   rn   r  r   r  r>  r   rM   r&  r   r	  r  r  r  r  r  r  r%  r'  r,  r/  r2  r4  r6  r8  r;  r=  rA  rD  rK  rQ  rT  rX  r\  r_  ra  rc  rj  rl  rn  ru  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  rW  ru  rb  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r!  r&  r,  r.  r1  r6  r9  r=  rG  rI  rP  rR  rT  rW  rZ  r\  r`  rd  rh  rn  rr  ru  rx  rz  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  r0   r0   r0   r1   r   J   s  
 &






	

















 
!
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
8
9
:
<
=
>
?
@
A
B
C
D
F
G
I
L
M
N
O
P
Q
R
S
T
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f









v












	
 !"#$%&'()*+,-./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c

0""
&
	!m
$!%						,2)+
 3
? H	
	
	$$	!
8
		 

* 
		
		

	)	metaclass)r   r   r   r   )0
__future__r   loggingrf  typingtcollectionsr   	functoolsr   r   r   r   sqlglot.errorsr   r   r	   sqlglot.helperr
   r   r   r   sqlglot.jsonpathr   r   sqlglot.timer   sqlglot.tokensr   TYPE_CHECKINGsqlglot._typingr   rJ  r   TypeVarr   Callabler!   r   	getLoggerr@  rg  ri  r(   r8   rP  r9   r   r0   r0   r0   r1   <module>   s.    


"