o
    –¨Êh¶  ã                   @   s´  d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZ G dd„ deƒZeejejejejejejejejejejejejejejejejejej ej!ej"gƒZ#i dej$“d	ej%“d
ej&“dej'“dej(“dej)“dej*“dej+“dej,“dej-“dej.“dej/“dej0“dej1“dej2“dej3“dej4“i dej5“dej“dej“dej“dej“dej“dej“d ej“d!ej“d"ej“d#ej6“d$ej7“d%ej8“d&ej9“d'ej:“d(ej;“d)ej<“¥i d*ej=“d+ej>“d,ej?“d-ej@“d.ejA“d/ejB“d0ej“d1ej“d2ej“d3ej“d4ej“d5ej“d6ej“d7ej“d8ej “d9ej!“d:ej"“¥ZCej9ej/ej<ej=ej>ej?ej;ej@d;œZDi d<d=“d=d=“dd>“dd“d?d?“d	d?“dd“d
d
“d@d@“dd“dd“dd“dd“dAdA“dBdA“dCdC“dDdD“dEdFdGdHdIdJdKdLdMdNdOdPddQdRœ¥ZEdSdTdOddUdVœZFdWdXdYdZd[d\d]œZGG d^d_„ d_eƒZHd`da„ ZIdbdc„ ZJddde„ ZKdfdg„ ZLdhdi„ ZMdjdk„ ZNdldm„ ZOdndo„ ZPdpdq„ ZQdrds„ ZRdtdu„ ZSdvdw„ ZTdxdy„ ZUdzd{„ ZVG d|d}„ d}eƒZWd~S )zExpression Parser.é   )ÚSTRING_TYPESÚ
BYTE_TYPESÚUNICODE_TYPES)Úget_item_or_attr)ÚDbDoc©ÚMessageÚmysqlxpb_enumc                   @   sl  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYS )ZÚ	TokenTyper   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é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   éW   éX   N)[Ú__name__Ú
__module__Ú__qualname__ÚNOTÚANDÚORÚXORÚISÚLPARENÚRPARENÚ
LSQBRACKETÚ
RSQBRACKETÚBETWEENÚTRUEÚNULLÚFALSEÚINÚLIKEÚINTERVALÚREGEXPÚESCAPEÚIDENTÚLSTRINGÚLNUMÚDOTÚDOLLARÚCOMMAÚEQÚNEÚGTÚGEÚLTÚLEÚBITANDÚBITORÚBITXORÚLSHIFTÚRSHIFTÚPLUSÚMINUSÚMULÚDIVÚHEXÚBINÚNEGÚBANGÚMICROSECONDÚSECONDÚMINUTEÚHOURÚDAYÚWEEKÚMONTHÚQUARTERÚYEARÚEROTEMEÚ
DOUBLESTARÚMODÚCOLONÚORORÚANDANDÚLCURLYÚRCURLYÚCASTÚDOTSTARÚORDERBY_ASCÚORDERBY_DESCÚASÚARROWÚQUOTEÚBINARYÚDATETIMEÚTIMEÚCHARÚDATEÚDECIMALÚSIGNEDÚINTEGERÚUNSIGNEDÚJSONÚSECOND_MICROSECONDÚMINUTE_MICROSECONDÚMINUTE_SECONDÚHOUR_MICROSECONDÚHOUR_SECONDÚHOUR_MINUTEÚDAY_MICROSECONDÚ
DAY_SECONDÚ
DAY_MINUTEÚDAY_HOURÚ
YEAR_MONTH© r½   r½   ú=/var/www/html/env/lib/python3.10/site-packages/mysqlx/expr.pyr
   &   s²    r
   ÚandÚorÚxorÚisÚnotÚlikeÚinÚregexpÚbetweenÚintervalÚescapeÚcastÚdivÚhexÚbinÚtrueÚfalseÚnullÚsecondÚminuteÚhourÚdayÚweekÚmonthÚquarterÚyearÚmicrosecondÚascÚdescÚasÚbinaryÚdatetimeÚtimeÚcharÚdateÚdecimalÚsignedÚunsignedÚintegerÚjsonÚsecond_microsecondÚminute_microsecondÚminute_secondÚhour_microsecondÚhour_secondÚhour_minuteÚday_microsecondÚ
day_secondÚ
day_minuteÚday_hourÚ
year_month)rÝ   rÊ   rà   rá   râ   rã   rß   rä   ú=ú==z&&ú||ú^ú!=ú<>ú>ú>=ú<ú<=ú&ú|ú<<ú>>ú+ú-Ú*ú/ú~ú%Úcont_in)rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  rÊ   r  Ú	sign_plusÚ
sign_minusú!)r   r  r  rÃ   r	  Úis_notÚnot_betweenÚ
not_regexpÚnot_likeÚnot_inÚnot_cont_in)rÂ   rÇ   rÆ   rÄ   rÅ   r  c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚTokenr   c                 C   s   || _ || _|| _d S ©N)Ú
token_typeÚvalueÚlength)Úselfr  r  r  r½   r½   r¾   Ú__init__  s   
zToken.__init__c                 C   ó   |   ¡ S r  )Ú__str__©r  r½   r½   r¾   Ú__repr__  ó   zToken.__repr__c                 C   s@   | j tjks| j tjks| j tjkrd | j | j¡S d | j ¡S )Nz{0}({1})z{0})r  r
   rw   ry   rx   Úformatr  r  r½   r½   r¾   r    s
   zToken.__str__N)r   )rb   rc   rd   r  r  r  r½   r½   r½   r¾   r    s    
r  c                 C   s¤   t dƒ}t| t ƒr| S t| tƒr|  ¡ S t| ttfƒr+tdƒ|d< t| ƒ ¡ |d< |S t| t	t
fƒrBtdƒ|d< t| ƒ ¡ |d< |S tdƒ|d< t| ƒ ¡ |d< |S )	NúMysqlx.Expr.ExprúMysqlx.Expr.Expr.Type.OBJECTÚtypeÚobjectúMysqlx.Expr.Expr.Type.ARRAYÚarrayúMysqlx.Expr.Expr.Type.LITERALÚliteral)r   Ú
isinstanceÚ
ExprParserÚexprÚdictr   r	   Úbuild_objectÚget_messageÚlistÚtupleÚbuild_arrayÚbuild_scalar©r  Úmsgr½   r½   r¾   Ú
build_expr   s    

úþr1  c                 C   sz   t | tƒr	t| ƒS t | tƒrt| ƒS t | tƒrt| ƒS t | tƒr$t| ƒS t | t	ƒr-t
| ƒS | d u r4tƒ S td t| ƒ¡ƒ‚)NzUnsupported data type: {0}.)r%  r   Úbuild_string_scalarr   Úbuild_bytes_scalarÚboolÚbuild_bool_scalarÚintÚbuild_int_scalarÚfloatÚbuild_double_scalarÚbuild_null_scalarÚ
ValueErrorr  r  ©r  r½   r½   r¾   r.  2  s   




r.  c                 C   sx   t | tƒr
t| jƒS tdƒ}|  ¡ D ]'\}}tdƒ}t |tƒr#| ¡ n||d< t|ƒ 	¡ |d< |d  
| 	¡ g¡ q|S )NúMysqlx.Expr.ObjectúMysqlx.Expr.Object.ObjectFieldÚkeyr  Úfld)r%  r   r)  Ú__dict__r   Úitemsr   Úencoder1  r*  Úextend)Úobjr0  r?  r  Úpairr½   r½   r¾   r)  B  s   

r)  c                 C   s$   t dƒ}|d  dd„ | D ƒ¡ |S )NúMysqlx.Expr.Arrayr  c                 S   s   g | ]}t |ƒ ¡ ‘qS r½   )r1  r*  )Ú.0r  r½   r½   r¾   Ú
<listcomp>Q  s    zbuild_array.<locals>.<listcomp>)r   rD  )r"  r0  r½   r½   r¾   r-  O  s   r-  c                  C   s   t dƒ} tdƒ| d< | S )NúMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr  r   )r0  r½   r½   r¾   r:  U  s   r:  c                 C   ó    t dƒ}tdƒ|d< | |d< |S )NrJ  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr  Úv_doubler   r/  r½   r½   r¾   r9  [  ó   r9  c                 C   rK  )NrJ  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr  Úv_signed_intr   r/  r½   r½   r¾   r7  b  rM  r7  c                 C   rK  )NrJ  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr  Úv_unsigned_intr   r/  r½   r½   r¾   Úbuild_unsigned_int_scalarh  rM  rP  c                 C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d�|d< |S )Nzutf-8rJ  z%Mysqlx.Datatypes.Scalar.Type.V_STRINGr  zMysqlx.Datatypes.Scalar.Stringr<  Úv_string)r%  r   ÚbytesÚ	bytearrayr   r	   r/  r½   r½   r¾   r2  n  s   
r2  c                 C   rK  )NrJ  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr  Úv_boolr   r/  r½   r½   r¾   r5  w  rM  r5  c                 C   s(   t dƒ}tdƒ|d< t d| d�|d< |S )NrJ  z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr  zMysqlx.Datatypes.Scalar.Octetsr<  Úv_octetsr   r/  r½   r½   r¾   r3  ~  ó   r3  c                 C   rK  )Nr  r#  r  r$  r   r/  r½   r½   r¾   Úbuild_literal_expr…  rM  rW  c                 C   sF   t dƒ}t|  |d< | ¡ g|d< t dƒ}tdƒ|d< | ¡ |d< |S )NúMysqlx.Expr.OperatorÚnameÚparamr  úMysqlx.Expr.Expr.Type.OPERATORr  Úoperator)r   Ú_UNARY_OPERATORSr*  r	   )rY  rZ  r\  r0  r½   r½   r¾   Úbuild_unary_opŒ  s   r^  c                 C   s   |   dd¡S )Nú"z"")Úreplace)Ústringr½   r½   r¾   Úescape_literal–  ó   rb  c                   @   sº  e Zd Zdmdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdmdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dmdBdC„Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dlS )nr&  Fc                 C   s8   || _ g | _d| _|| _i | _d| _|  ¡  |  ¡  d S )Né    )ra  ÚtokensÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  ra  Úallow_relationalr½   r½   r¾   r  ›  s   zExprParser.__init__c                 C   s   d  | j¡S )Nz<mysqlx.ExprParser '{}'>)r  ra  r  r½   r½   r¾   r  ¥  rc  zExprParser.__str__c                 C   s¦   t | jtƒst| jƒ| _| j d¡| _t| jƒdkr)| jd dkr)| jdd… | _d| jdd…  ¡ v r<| jdd… | _d| jdd	…  ¡ v rQ| jd	d… | _dS dS )
zµRemoves the keywords that does not form part of the expression.

        Removes the keywords "SELECT" and "WHERE" that does not form part of
        the expression itself.
        ú r   éÿÿÿÿú;NÚSELECTr   ÚWHEREr   )r%  ra  r   ÚreprÚstripÚlenÚupperr  r½   r½   r¾   rj  ¨  s   ÿzExprParser.clean_expressionc                 C   s$   |d t | jƒk o| j|d  |kS ©Nr   )rt  ra  )r  r?  rà   r½   r½   r¾   Únext_char_is¹  s   $zExprParser.next_char_isc                 C   s¦   |}d}|t | jƒk rC| j|  ¡ s| j| dkrC| j| dkr*|du r(tdƒ‚d}|d7 }|t | jƒk rC| j|  ¡ s| j| dks| j||… }ttj|t |ƒƒS )NFÚ.Tz"Invalid number. Found multiple '.'r   )rt  ra  Úisdigitr;  r  r
   ry   )r  rf  ÚstartÚ	found_dotÚvalr½   r½   r¾   Ú
lex_number¼  s   øzExprParser.lex_numberc                 C   s  |}|t | jƒk rB| j|  ¡ s | j| dks | j|  ¡ rB|rB|d7 }|t | jƒk rB| j|  ¡ s | j| dks | j|  ¡ rB|s | j||… }z1|t | jƒk rj| j| dkrj| ¡ tvrjttj|t |ƒƒ}W |S tt	| ¡  | ¡ t |ƒƒ}W |S  t
y�   ttj|t |ƒƒ}Y |S w )NÚ_r   ú()rt  ra  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr  r
   rw   Ú_RESERVED_WORDSÚKeyError)r  ÚiÚallow_spacerz  r|  Útokenr½   r½   r¾   Ú	lex_alphaÌ  s<   ÿÿÿýÿÿÿýþþzExprParser.lex_alphac                 C   s  | j | }d}|d7 }|}|t| j ƒk r]| j | }||kr0|d t| j ƒk r0| j |d  |kr0n-||ks8|dkrN|d t| j ƒkrBn|d7 }|| j | 7 }n||7 }|d7 }|t| j ƒk s|t| j ƒksk| j | |krrtd |¡ƒ‚|dkr�ttj|t|ƒd ƒS ttj|t|ƒd ƒS )NÚ r   ú\z*Unterminated quoted string starting at {0}ú`r   )ra  rt  r;  r  r  r
   rw   rx   )r  r?  Ú
quote_charr|  rz  rà   r½   r½   r¾   Úlex_quoted_tokenÞ  s0   

òÿzExprParser.lex_quoted_tokenc                 C   s  d}d}d}|t | jƒk �r�| j| }| ¡ r|d7 }q| ¡ r'|  |¡}�nF| ¡ s/|dkr7|  ||¡}�n6|dkrCttj	|ƒ}�n*|dkrOttj
|ƒ}�n|dkr[ttj|ƒ}�n|dkrgttj|ƒ}�n|d	krsttj|ƒ}�nú|d
kr’|  |d¡rŠ|sŠttjddƒ}d}�nãttj|ƒ}�nÛ|dkr­|  |d¡r¥ttjddƒ}�nÈttj|ƒ}�nÀ|dkr¹ttj|ƒ}�n´|dkrÅttj|ƒ}�n¨|dkrÑttj|ƒ}�nœ|dkrí|  |d¡rättjddƒ}�n‰ttjddƒ}�n€|dk�r
|  |d¡�rttj|dƒ}�nkttj|ƒ}�nc|dk�rttj|ƒ}�nV|dk�r4|  |d¡�r,ttjddƒ}�nAttj|ƒ}�n9|dk�rAttj|ƒ}�n,|dk�rNttj|ƒ}�n|dk�r[ttj|ƒ}�n|dk�rhttj|ƒ}�n|dk�rtttj |ƒ}nù|dk�r€ttj!|ƒ}ní|d k�r›|  |d¡�r”ttj"d!dƒ}nÙttj#|ƒ}nÒ|d"k�rÔ|  |d¡�r¯ttj"d#dƒ}n¾|  |d"¡�r¾ttj$d$dƒ}n¯|  |d¡�rÍttj%d%dƒ}n ttj&|ƒ}n™|dk�rþ|  |d¡�rèttj'd&dƒ}n…|  |d¡�r÷ttj(d'dƒ}nvttj)|ƒ}no|d(k�r3|  |d¡�rttj*d)dƒ}n[|d t | jƒk �r,| j|d   ¡ �r,|  |¡}nAttj+|ƒ}n:|d*k�s=|d+k�rQ|�rQttj,|ƒ}|�sLd}n!d}d}n|d+k�s`|d*k�s`|d,k�rf|  -|¡}nt.d- /|¡ƒ‚| j0 1|¡ ||j27 }|t | jƒk sd S d S ).Nrd  Fr   r~  ú?ú:Ú{Ú}r   r  rø   z->r   Tr  z**r  ú$r  rò   ró   rü   rõ   rý   rô   r  ú)ú[ú]r  ú,r	  rö   rú   r÷   rþ   rû   rÿ   rù   rx  z.*ú'r_  rŒ  zUnknown character at {0})3rt  ra  r�  ry  r}  Úisalphar‰  r  r
   r™   rœ   rŸ   r    rˆ   rw  r¦   r‰   rš   rŠ   r‹   r{   r›   r}   rž   rƒ   r…   r�   r„   rj   rk   rl   rm   rŽ   r|   r~   r�   r†   r‚   r�   r‡   r€   r   r¢   rz   r§   rŽ  r;  r  re  Úappendr  )r  r†  Ú
arrow_lastÚinside_arrowrà   rˆ  r½   r½   r¾   rk  ù  sÆ   













(
—zExprParser.lexc                 C   sT   | j t| jƒkrtd || j ¡ƒ‚| j| j  j|kr(td || j | j| j  ¡ƒ‚d S )Nz5Expected token type {0} at pos {1} but no tokens leftz5Expected token type {0} at pos {1} but found type {2})rf  rt  re  r;  r  r  ©r  r  r½   r½   r¾   Úassert_cur_tokenh  s   
ÿ
ÿÿÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r  ©Úpos_token_type_isrf  r�  r½   r½   r¾   Úcur_token_type_isq  s   zExprParser.cur_token_type_isc                 G   s"   | j t| jƒk o| j| j  j|v S r  ©rf  rt  re  r  ©r  Útypesr½   r½   r¾   Úcur_token_type_int  s   ÿzExprParser.cur_token_type_inc                 C   s   |   | jd |¡S rv  rŸ  r�  r½   r½   r¾   Únext_token_type_isx  s   zExprParser.next_token_type_isc                 G   s&   | j t| jƒk o| j| j d  j|v S rv  r¢  r£  r½   r½   r¾   Únext_token_type_in{  s   ÿzExprParser.next_token_type_inc                 C   s   |t | jƒk o| j| j|kS r  )rt  re  r  )r  rf  r  r½   r½   r¾   r     s   ÿzExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S rv  )rž  re  rf  r  )r  r  r  r½   r½   r¾   Úconsume_tokenƒ  s   
zExprParser.consume_tokenc                 C   sv   g }|   tj¡ |  tj¡s3| |  ¡  ¡ ¡ |  tj¡r3|  j	d7  _	| |  ¡  ¡ ¡ |  tj¡s|   tj¡ |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        r   )
r¨  r
   rj   r¡  rk   rš  r'  r*  r|   rf  )r  Úexprsr½   r½   r¾   Úparen_expr_list‰  s   þzExprParser.paren_expr_listc                 C   s`   |   tj¡ tdƒ}|  tj¡r|  tj¡|d< |  tj¡ | j| j j	|d< |  jd7  _|S )NzMysqlx.Expr.IdentifierÚschema_namerY  r   )
rž  r
   rw   r   r¦  rz   r¨  re  rf  r  )r  Úidentr½   r½   r¾   Ú
identifier—  s   zExprParser.identifierc                 C   sD   t dƒ}|  ¡ |d< |  ¡ |d< t dƒ}tdƒ|d< | ¡ |d< |S )NzMysqlx.Expr.FunctionCallrY  rZ  r  zMysqlx.Expr.Expr.Type.FUNC_CALLr  Úfunction_call)r   r­  rª  r	   r*  )r  r®  Úmsg_exprr½   r½   r¾   r®  ¡  s   zExprParser.function_callc                 C   s°   |   tj¡ | j| j }|jtjkr0|j d¡r&|j 	d¡r&t
d |j¡ƒ‚|   tj¡ |j}n|jtjkr@|   tj¡ |j}nt
d | j¡ƒ‚tdƒ}tdƒ|d< ||d< |S )NrŒ  z-{0} is not a valid JSON/ECMAScript identifierzBExpected token type IDENT or LSTRING in JSON path at token pos {0}úMysqlx.Expr.DocumentPathItemú(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr  r  )r¨  r
   rz   re  rf  r  rw   r  Ú
startswithÚendswithr;  r  rx   r   r	   )r  rˆ  Úmember_nameÚdoc_path_itemr½   r½   r¾   Údocpath_memberª  s*   ÿÿÿzExprParser.docpath_memberc                 C   s¸   |   tj¡ |  tj¡r$|   tj¡ |   tj¡ tdƒ}tdƒ|d< |S |  tj¡rTt	|   tj¡ƒ}|dk r>t
d | j¡ƒ‚|   tj¡ tdƒ}tdƒ|d< ||d< |S td | j¡ƒ‚)	Nr°  z6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKr  rd  z%Array index cannot be negative at {0}z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXÚindexzJException token type MUL or LNUM in JSON path array index at token pos {0})r¨  r
   rl   r¡  rŠ   rm   r   r	   ry   r6  Ú
IndexErrorr  rf  r;  )r  rµ  r  r½   r½   r¾   Údocpath_array_locÀ  s2   ÿÿÿþzExprParser.docpath_array_locc                 C   s~   t dƒ}|  tj¡r&t dƒ}tdƒ|d< |  tj¡|d< |d  | ¡ g¡ |d  |  ¡ ¡ t dƒ}tdƒ|d< ||d	< |S )
NúMysqlx.Expr.ColumnIdentifierr°  r±  r  r  Údocument_pathr  úMysqlx.Expr.Expr.Type.IDENTr­  )	r   r¡  r
   rw   r	   r¨  rD  r*  r»  )r  Úcol_idrµ  r'  r½   r½   r¾   Údocument_fieldÙ  s   ÿzExprParser.document_fieldc                 C   s   g }	 |   tj¡r| |  ¡  ¡ ¡ nM|   tj¡r1|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ n/|   tj
¡rA| |  ¡  ¡ ¡ n|   tj¡r_|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ nnqt|ƒ}|dkr~t||d  dƒt	dƒkr~td | j¡ƒ‚|S )	z°Parse a JSON-style document path, like WL#7909, but prefix by @.
        instead of $. We parse this as a string because the protocol doesn't
        support it. (yet)
        Tr°  z1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKr  z1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKrd  r   z$JSON path may not end in '**' at {0})r¡  r
   rz   rš  r¶  r*  r¢   r¨  r   r	   rl   r¹  rš   rt  r   r;  r  rf  )r  Údoc_pathrµ  rB  r½   r½   r¾   r»  ç  s<   ÿÿîÿÿzExprParser.document_pathc                 C   sÂ  g }|  |  tj¡¡ |  tj¡r&|  tj¡ |  |  tj¡¡ |  tj¡st|ƒdkr4td | j	¡ƒ‚| 
¡  tdƒ}tdt|ƒƒD ]"}|dkrP|d |d< qC|dkr[|d |d< qC|dkre|d |d	< qCd
}|  tj¡r}d}|  tj¡ |  ¡ |d< n2|  tj¡r¯d}|  tj¡ d
}|  tj¡r›d}|  tj¡ |  tj¡ |  ¡ |d< |r¯|  tj¡ |rÑt|d ƒdkrÑtdƒ}tdƒ|d< d|d< |d  | ¡ g¡ tdƒ}tdƒ|d< ||d< |S )Nr   z#Too many parts to identifier at {0}rº  rd  rY  r   Ú
table_namer   r«  FTr»  r°  r±  r  rŠ  r  r  r¼  r­  )rš  r¨  r
   rw   r¡  rz   rt  r;  r  rf  Úreverser   Úranger{   r»  r¦   r§   r	   rD  r*  )r  Úpartsr½  r†  Úis_docÚ	is_quotedrµ  r¯  r½   r½   r¾   Úcolumn_identifier  s^   þÿ€ÿzExprParser.column_identifierc                 C   s6   | j t| jƒkrtdƒ‚| j| j  }|  j d7  _ |S )NzUnexpected end of token streamr   )rf  rt  re  r;  )r  rˆ  r½   r½   r¾   Ú
next_token8  s
   zExprParser.next_tokenc                 C   s$   |   ¡ }|j|krtd |¡ƒ‚d S )NzExpected token type {0})rÇ  r  r;  r  )r  r  rˆ  r½   r½   r¾   Úexpect_token?  s   
ÿzExprParser.expect_tokenc                 C   s   | j | j S r  )re  rf  r  r½   r½   r¾   Ú
peek_tokenD  rc  zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S rv  )re  rf  r  )r  r  r½   r½   r¾   Úconsume_any_tokenG  s   zExprParser.consume_any_tokenc                 C   s¢   t dƒ}| jt| jƒk r9|  tj¡s9|d  |  ¡  	¡ g¡ |  tj
¡s%n|  tj
¡ | jt| jƒk r9|  tj¡r|  tj¡ t dƒ}tdƒ|d< | 	¡ |d< |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        rG  r  r  r!  r  r"  )r   rf  rt  re  r¡  r
   rm   rD  r'  r*  r|   r¨  r	   )r  r0  r'  r½   r½   r¾   Úparse_json_arrayL  s    
ÿû
ÿzExprParser.parse_json_arrayc                 C   sÒ   t dƒ}| jt| jƒk rQ|  tj¡sQt dƒ}|  tj¡|d< |  tj	¡ |  
¡  ¡ |d< |d  | ¡ g¡ |  tj¡s=n|  tj¡ | jt| jƒk rQ|  tj¡r|  tj¡ t dƒ}tdƒ|d< | ¡ |d	< |S )
z‹
        jsonDoc              ::=  "{" [jsonKeyValue ("," jsonKeyValue)*] "}"
        jsonKeyValue         ::=  STRING_DQ ":" expr
        r=  r>  r?  r  r@  r  r  r  r   )r   rf  rt  re  r¡  r
   r    r¨  rx   rœ   r'  r*  rD  r|   r	   )r  r0  Úitemr'  r½   r½   r¾   Úparse_json_doc^  s(   
ÿ÷
ÿ
zExprParser.parse_json_docc                 C   sÀ   d}|   tj¡r|  tj¡}n!|   tj¡r|  tj¡}n|jtjkr(t| jƒ}nt	d 
| j¡ƒ‚| ¡ }tdƒ}tdƒ|d< || jv rL| j| |d< |S | j|d< | j| j|< |  jd7  _|S )NrŠ  z)Invalid placeholder name at token pos {0}r  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )r¡  r
   ry   r¨  rw   r  r™   Ústrri  r;  r  rf  r‚  r   r	   rh  )r  rˆ  Úplace_holder_namer¯  r½   r½   r¾   Úparse_place_holderu  s,   ÿ
ÿ
üÿzExprParser.parse_place_holderc                 C   s’   t ddd�}|  tj¡ |d  |  ¡  ¡ g¡ |  tj¡ tt	 
|  ¡ ¡ƒ}|d  t|ƒ ¡ g¡ |  tj¡ t d| ¡ d�}tdƒ|d< |S )	z< cast ::= CAST LPAREN expr AS cast_data_type RPAREN
        rX  rÊ   ©rY  rZ  r  ©r\  r[  r  )r   r¨  r
   rj   rD  r'  r*  r¥   r3  rÏ  rC  Úcast_data_typerW  rk   r	   )r  r\  Útype_scalarr0  r½   r½   r¾   rÊ   Ž  s   ÿzExprParser.castc                 C   sÔ   |   ¡ }|jtjtjtjtjfv r!|  ¡ }|rd |j	|¡S |j	S |jtj
u r8|  d¡}|r5d |j	|¡S |j	S |jtjtjfv rP|  tj¡rM|  tj¡ |j	S |jtjtjtjfv r^|j	S td |j| j|j	¡ƒ‚)aÉ   cast_data_type ::= ( BINARY dimension? ) |
                               ( CHAR dimension? ) |
                               ( DATE ) |
                               ( DATETIME dimension? ) |
                               ( TIME dimension? ) |
                               ( DECIMAL dimension? ) |
                               ( SIGNED INTEGER? ) |
                               ( UNSIGNED INTEGER? ) |
                               JSON
        z{0}{1}Tz,Unknown token type {0} at position {1} ({2}))rÇ  r  r
   r¨   r«   r©   rª   Úcast_data_type_dimensionr  r  r­   r®   r°   r¡  r¯   r¨  r±   r¬   r;  rf  )r  rˆ  Ú	dimensionr½   r½   r¾   rÔ  ž  s4   ÿÿÿ
ÿÿÿÿzExprParser.cast_data_typec                 C   s�   |   tj¡sdS g }|  tj¡ | |  tj¡¡ |r0|   tj¡r0|  tj¡ | |  tj¡¡ |  tj¡ t|ƒdu rCd 	|d ¡S dj	|Ž S )z4 dimension ::= LPAREN LNUM (, LNUM)? RPAREN
        Nr   z({0})rd  z	({0},{1}))
r¡  r
   rj   r¨  rš  ry   r|   rk   rt  r  )r  râ   r×  r½   r½   r¾   rÖ  ¾  s   ÿz#ExprParser.cast_data_type_dimensionc                 C   s(   t dƒ}tdƒ|d< t ddd�|d< |S )Nr  r[  r  rX  r  rÒ  r\  r   )r  r0  r½   r½   r¾   Ústar_operatorÏ  rV  zExprParser.star_operatorc                 C   sL  |   ¡ }|jtjtjfv r|  |¡S |jtjkr|  ¡ S |jtjkr&|  	¡ S |jtj
kr0|  ¡ S |jtjkrB|  ¡ }|  tj¡ |S |jtjtjfv rl|  ¡ }|jtjkrd|j|j | j| j _|  ¡ S t|j|  ¡ ƒS |jtjtjtjfv rt|j|  ¡ ƒS |jtjkrŒtt|jƒƒS |jtjkr—tt ƒ ƒS |jtjkr´d|jv r«tt!t"|jƒƒƒS tt#t$|jƒƒƒS |jtj%tj&fv rÇtt'|jtj%kƒƒS |jtj(krÑ|  )¡ S |jtj*krÛ|  +¡ S |jtj,k�r| jd | _|  -tj¡�s|  -tj.¡�r|  /| jd tj,¡�r|  /| jd tj¡�r|  0¡ S | j1�s|  )¡ S |  2¡ S t3d 4|j| j¡ƒ‚)z<Parse an atomic expression and return a protobuf Expr objectrx  r   r   r   zAUnknown token type = {0}  when expecting atomic expression at {1})5rÇ  r  r
   r™   rœ   rÑ  rŸ   rÍ  rl   rË  r¡   rÊ   rj   r'  rÈ  rk   rˆ   r‰   rÉ  ry   r  re  rf  Úatomic_exprr^  re   rŽ   r�   rx   rW  r2  rp   r:  r9  r8  r7  r6  ro   rq   r5  r{   r¾  rŠ   rØ  rw   r¦  rz   r   r®  rg  rÆ  r;  r  )r  rˆ  r'  Úpeekr½   r½   r¾   rÙ  Õ  sp   


ÿÿ
ÿþýÿþþzExprParser.atomic_exprc                 C   s¾   |ƒ }| j t| jƒk r]| j| j  j|v r]tdƒ}tdƒ|d< tdƒ}t| j| j  j |d< | ¡ g|d< |  j d7  _ |d  	|ƒ  ¡ g¡ ||d< |}| j t| jƒk r]| j| j  j|v s|S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionr  r[  r  rX  rY  rZ  r   r\  )
rf  rt  re  r  r   r	   Ú
_OPERATORSr  r*  rD  )r  r¤  Úinner_parserÚlhsr0  r\  r½   r½   r¾   Úparse_left_assoc_binary_op_expr  s   ö
z*ExprParser.parse_left_assoc_binary_op_exprc                 C   sè   |   ¡ }|  tjtj¡rr|  tj¡rr|  ¡ }tdƒ}|d  	| 
¡ g¡ |jtju r,dnd|d< |  tj¡ |d  	|  ¡  
¡ g¡ | jtŽ sOtd | j¡ƒ‚t |  ¡  ¡ ¡}|d  	tt|ƒƒ 
¡ g¡ td|d�}td	ƒ|d
< |S )NrX  rZ  Údate_addÚdate_subrY  z&Expected interval type at position {0}r  rÓ  r[  r  )rÙ  r¥  r
   rˆ   r‰   r¦  rt   rÇ  r   rD  r*  r  r¨  Úbit_exprÚ_INTERVAL_UNITSr;  r  rf  rÏ  rC  rÊ  ru  rW  r3  r	   )r  rÝ  rˆ  r\  r½   r½   r¾   Úadd_sub_interval  s2   
ÿÿ
ÿ
ÿÿzExprParser.add_sub_intervalc                 C   ó   |   ttjtjtjgƒ| j¡S r  )rÞ  Úsetr
   rŠ   r‹   r›   rã  r  r½   r½   r¾   Úmul_div_expr:  ó   þzExprParser.mul_div_exprc                 C   ó   |   ttjtjgƒ| j¡S r  )rÞ  rå  r
   rˆ   r‰   ræ  r  r½   r½   r¾   Úadd_sub_expr?  ó   ÿzExprParser.add_sub_exprc                 C   rè  r  )rÞ  rå  r
   r†   r‡   ré  r  r½   r½   r¾   Ú
shift_exprC  rê  zExprParser.shift_exprc                 C   rä  r  )rÞ  rå  r
   rƒ   r„   r…   rë  r  r½   r½   r¾   rá  G  rç  zExprParser.bit_exprc              	   C   s*   |   ttjtjtjtjtjtjgƒ| j	¡S r  )
rÞ  rå  r
   r€   r   r‚   r�   r}   r~   rá  r  r½   r½   r¾   Ú	comp_exprL  s   ÿþzExprParser.comp_exprc                 C   s$  g }|   ¡ }d}|  tj¡rd}|  tj¡ | jt| jƒk �r| | 	¡ ¡ | j| j j
}|  tj¡rQ|  tj¡ |  tj¡rGd}|  tj¡ | |   ¡  	¡ ¡ n˜|  tj¡rw|  tj¡ |  tj¡rk| |  ¡ ¡ n~d}| |   ¡  	¡ ¡ nr|  tj¡r¢|  tj¡ | |   ¡  	¡ ¡ |  tj¡r¡|  tj¡ | |   ¡  	¡ ¡ nG|  tj¡rÇ|  tj¡ | |   ¡  	¡ ¡ |  tj¡ | |   ¡  	¡ ¡ n"|  tj¡rÝ|  tj¡ | |   ¡  	¡ ¡ n|rçtd | j¡ƒ‚d }|�rtdƒ}|röt| n||d< ||d< tdƒ}td	ƒ|d
< | 	¡ |d< |}|S )NFTr  z"Unknown token after NOT as pos {0}rX  rY  rZ  r  r[  r  r\  )rì  r¡  r
   re   r¨  rf  rt  re  rš  r*  r  ri   rr   rj   rD  rª  rs   rv   rn   rf   ru   r;  r  r   Ú	_NEGATIONr	   )r  ÚparamsrÝ  r
  Úop_namer\  r¯  r½   r½   r¾   Ú	ilri_exprQ  sh   €ÿÿzExprParser.ilri_exprc                 C   rè  r  )rÞ  rå  r
   rf   rž   rð  r  r½   r½   r¾   Úand_expr‡  rê  zExprParser.and_exprc                 C   s   |   ttjgƒ| j¡S r  )rÞ  rå  r
   rh   rñ  r  r½   r½   r¾   Úxor_expr‹  s   ÿzExprParser.xor_exprc                 C   rè  r  )rÞ  rå  r
   rg   r�   rò  r  r½   r½   r¾   Úor_expr�  rê  zExprParser.or_exprc                 C   r  r  )ró  r  r½   r½   r¾   r'  “  r  zExprParser.exprc                 C   s   t d|  tj¡d�S )NzMysqlx.Crud.ColumnrÒ  )r   r¨  r
   rw   r  r½   r½   r¾   Úparse_table_insert_field–  s   
ÿz#ExprParser.parse_table_insert_fieldc                 C   s
   |   ¡ jS r  )rÆ  r­  r  r½   r½   r¾   Úparse_table_update_fieldš  s   
z#ExprParser.parse_table_update_fieldc                 C   sÂ   g }| j  d¡}| ¡  |r_| ¡ }| d¡| d¡ks0| d¡| d¡ks0| d¡| d¡krVd | ¡ |¡}| d¡| d¡ks0| d¡| d¡ks0| d¡| d¡ks0| | ¡ ¡ |s|S )	Nr—  r  r”  r•  r–  r‘  r’  z{1},{0})ra  ÚsplitrÁ  ÚpopÚcountr  rš  rs  )r  ÚfieldsÚtempÚfieldr½   r½   r¾   Ú_table_fields�  s   ýúzExprParser._table_fieldsc                 C   s    g }d}|   ¡ }| jt| jƒk rN|s|  tj¡ d}td|  ¡ d�}|  	tj
¡r7|  tj
¡ |  tj¡|d< n|t|ƒ |d< | | ¡ ¡ | jt| jƒk s|S )NTFzMysqlx.Crud.Projection)ÚsourceÚalias)rü  rf  rt  re  r¨  r
   r|   r   r'  r¡  r¥   rw   rš  r*  )r  Úproject_exprÚfirstrù  Ú
projectionr½   r½   r¾   Úparse_table_select_projectionª  s   öz(ExprParser.parse_table_select_projectionc                 C   s¨   g }d}| j t| jƒk rR|s|  tj¡ d}td|  ¡ d�}|  tj	¡r1t
dƒ|d< |  tj	¡ n|  tj¡rCt
dƒ|d< |  tj¡ | | ¡ ¡ | j t| jƒk s|S )NTFzMysqlx.Crud.Order)r'  zMysqlx.Crud.Order.Direction.ASCÚ	directionz Mysqlx.Crud.Order.Direction.DESC)rf  rt  re  r¨  r
   r|   r   r'  r¡  r£   r	   r¤   rš  r*  )r  Úorder_specsr   Úorderr½   r½   r¾   Úparse_order_spec¼  s(   ÿÿózExprParser.parse_order_specc                 C   sR   g }d}| j t| jƒk r'|s|  tj¡ d}| |  ¡  ¡ ¡ | j t| jƒk s|S )NTF)	rf  rt  re  r¨  r
   r|   rš  r'  r*  )r  Ú	expr_listr   r½   r½   r¾   Úparse_expr_listÏ  s   üzExprParser.parse_expr_listN)F)8rb   rc   rd   r  r  rj  rw  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ë  rá  rì  rð  rñ  rò  ró  r'  rô  rõ  rü  r  r  r  r½   r½   r½   r¾   r&  š  sl    


o	
	 1
 86r&  N)XÚ__doc__Úcompatr   r   r   Úhelpersr   Údbdocr   Úprotobufr   r	   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   rh   ri   re   rs   rr   ru   rn   rt   rv   r¡   r‹   rŒ   r�   ro   rq   rp   r£   r¤   r¥   r¨   r©   rª   r«   r¬   r­   r®   r°   r¯   r±   r„  rƒ  rÛ  r]  rí  r  r1  r.  r)  r-  r:  r9  r7  rP  r2  r5  r3  rW  r^  rb  r&  r½   r½   r½   r¾   Ú<module>   s¶  [ìÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í7øÿþýüûúùø	÷
öõôóòñðïá#û	ú
	
