o
    8Di'                  
   @  s  d dl m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mZmZ d dlmZ d2d3ddZd4ddZd5ddZejejejejejejejejejejf
Zd6ddZd7ddZd8ddZ d7ddZ!d9d"d#Z"d:d'd(Z#d;d*d+Z$d<d.d/Z%d=d0d1Z&dS )>    )annotationsN)exp)DialectDialectType)is_date_unitis_iso_dateis_iso_datetime)TypeAnnotator
expressionexp.Expressiondialectr   returnc                   s$   t   d fdd}t| |S )zConverts a sql expression into a standard form.

    This method relies on annotate_types because many of the
    conversions rely on type inference.

    Args:
        expression: The expression to canonicalize.
    r
   r   r   c                   s>   t | } t|  d} t|  j} t| } t| t} t| } | S )Nr   )add_text_to_concatreplace_date_funcscoerce_type!PROMOTE_TO_INFERRED_DATETIME_TYPEremove_redundant_castsensure_bools_replace_int_predicateremove_ascending_orderr
   r    W/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/optimizer/canonicalize.py_canonicalize   s   
z#canonicalize.<locals>._canonicalizeNr
   r   r   r   )r   get_or_raiser   replace_tree)r
   r   r   r   r   r   canonicalize   s   

	r   nodec                 C  s:   t | tjr| jr| jjtjjv rtj| j| j	gd} | S )N)expressions)

isinstancer   AddtypethisDataType
TEXT_TYPESConcatleftright)r   r   r   r   r   $   s   "r   c                 C  s   t | tjtjfr'| js'| jds'| jjr't	| jj
r'tj| jtjjjdS t | tjrP| jdsP| jsBddlm} || |d} tj| j| jpMtjjjdS | S )Nzonetor   )annotate_typesr   )r!   r   DateTsOrDsToDater    argsgetr$   	is_stringr   namecastr%   TypeDATE	Timestampr#    sqlglot.optimizer.annotate_typesr-   	TIMESTAMP)r   r   r-   r   r   r   r   *   s"   

r   !promote_to_inferred_datetime_typeboolc                 C  s   t | trt| j| j| | S t | tjr!t| j| jd | | S t | tj	r;| j
jjtjj s;t| j
tjjj | S t | tjtjtjfrOt| j| j | S t | tjrYt|  | S )Nlow)r!   COERCIBLE_DATE_OPS_coerce_dater(   r)   r   Betweenr$   r0   Extractr
   r#   is_typer%   TEMPORAL_TYPES_replace_castr5   DATETIMEDateAddDateSub	DateTrunc_coerce_timeunit_argunitDateDiff_coerce_datediff_args)r   r:   r   r   r   r   K   s"   

r   c                 C  sj   t | tjr| jjr| j| jjkr| jS t | tjtjfr3| jjr3| jjjtjj	j
kr3| jjjs3| jS | S N)r!   r   Castr$   r#   r,   r.   r/   r%   r5   r6   r    r   r   r   r   r   \   s   
r   replace_func"t.Callable[[exp.Expression], None]c                 C  s   t | tjr|| j || j | S t | tjr|| j | S t | tjr7t | jtj	r0| jjs7|| j | S t | tj
tjfrE|| j | S rL   )r!   r   	Connectorr(   r)   Notr$   IfparentCaseWhereHaving)r
   rN   r   r   r   r   o   s"   


	

r   c                 C  s,   t | tjr| jddu r| dd  | S )NdescF)r!   r   Orderedr0   r1   setr   r   r   r   r      s   r   abNonec                 C  s   t | |gD ]l\} }t|tjrt| |j} | j}|r.|jtj	j
vs.|jr.|jjtj	jvr/q|rc|jrO|j}t|rAtj	jj}nt|rKtj	jj}n	|j}ntj	jj}|tj|ji v r`|n|}n|}||krnt| | t|| qd S rL   )	itertoolspermutationsr!   r   IntervalrH   rI   r#   r$   r%   rB   r&   r2   r3   r   r5   r6   r   rD   r	   
COERCES_TOr1   rC   )rZ   r[   r:   a_type	date_textb_typetarget_typer   r   r   r>      s6   

r>   argrI   t.Optional[exp.Expression]c                 C  s   | j s| S | j jtjjv r@| j}t|}|r)t|r)| tj	| 
 tjjjdS |s/t|r>| tj	| 
 tjjjdS | S | j jtjjjkr\t|s\| tj	| 
 tjjjdS | S Nr+   )r#   r$   r   r%   r&   r3   r   r   replacer4   copyr5   r6   r   rD   )re   rI   rb   is_iso_date_r   r   r   rH      s   rH   exp.DateDiffc                 C  sD   | j | jfD ]}|jj tjjvr|tj| tjj	j
d qd S rg   )r$   r
   r#   r   r%   rB   rh   r4   ri   r5   rD   )r   er   r   r   rK      s
   rK   r,   exp.DATA_TYPEc                 C  s   |  tj|  |d d S rg   )rh   r   r4   ri   )r   r,   r   r   r   rC      s   rC   c                 C  sX   t | tjr|  D ]}t| q
d S | jr(| jjtjjv r*| 	| 
d d S d S d S )Nr   )r!   r   Coalesceiter_expressionsr   r#   r$   r%   INTEGER_TYPESrh   neq)r
   childr   r   r   r      s   
r   rL   )r
   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   rO   r   r   )rZ   r   r[   r   r:   r;   r   r\   )re   r   rI   rf   r   r   )r   rk   r   r\   )r   r   r,   rm   r   r\   )r
   r   r   r\   )'
__future__r   r]   typingtsqlglotr   sqlglot.dialects.dialectr   r   sqlglot.helperr   r   r   r8   r	   r   r   r   r"   SubEQNEQGTGTELTLTE
NullSafeEQNullSafeNEQr=   r   r   r   r   r>   rH   rK   rC   r   r   r   r   r   <module>   s<    







,

