o
    þÑÐbƒ¼  ã                   @   sò  d Z ddlmZ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
j-“de
j.“de
j/“de
j0“de
j1“i de
j2“de
j3“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
j4“d$e
j5“d%e
j6“d&e
j7“d'e
j8“d(e
j9“¥i d)e
j:“d*e
j;“d+e
j<“d,e
j=“d-e
j>“d.e
j?“d/e
j@“d0e
j“d1e
j“d2e
j“d3e
j“d4e
j“d5e
j“d6e
j“d7e
j“d8e
j“d9e
j“¥d:e
ji¥ZAe
j7e
j-e
j:e
j;e
j<e
j=e
j9e
j>d;œZBi 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“i dEdE“dFdF“dGdG“d>d>“dHdH“dIdI“dJdJ“dKdK“dLdL“dMdM“dNdN“dOdO“dPdP“dd“dQdQ“dd“¥ZCdRdSdOddTdUœZDdVdWdXdYdZd[d\d]œZEG d^d_„ d_e	ƒZFd`da„ ZGdbdc„ ZHddde„ ZIdfdg„ ZJdhdi„ ZKdjdk„ ZLdldm„ ZMdndo„ ZNdpdq„ ZOdrds„ ZPdtdu„ ZQdvdw„ ZRdxdy„ ZSdzd{„ ZTG d|d}„ d}e	ƒZUd~S )zExpression Parser.é   )Ú
BYTE_TYPESÚget_item_or_attr)ÚDbDoc©ÚMessageÚmysqlxpb_enumc                   @   sp  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@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZS )[Ú	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   éY   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ÚOVERLAPS© r½   r½   úJ/var/www/secure340b-portal/env/lib/python3.10/site-packages/mysqlx/expr.pyr   %   s´    r   ÚandÚorÚxorÚisÚnotÚlikeÚinÚoverlapsÚregexpÚbetweenÚintervalÚescapeÚcastÚdivÚhexÚbinÚtrueÚfalseÚnullÚsecondÚminuteÚhourÚdayÚweekÚmonthZquarterÚyearÚmicrosecondÚascÚdescÚasÚbinaryÚdatetimeÚtimeÚcharÚdateÚdecimalÚsignedÚunsignedÚintegerÚjsonZsecond_microsecondZminute_microsecondZminute_secondZhour_microsecondZhour_secondZhour_minuteZday_microsecondZ
day_secondZ
day_minuteZday_hourZ
year_month)rÝ   rË   rà   rá   râ   rã   rß   rä   ú=ú==ú&&ú||ú^ú!=ú<>ú>ú>=ú<ú<=ú&ú|ú<<ú>>ú+ú-Ú*ú/ú~ú%Úcont_inZ	sign_plusZ
sign_minusú!)rö   r÷   rú   rÃ   rý   Úis_notZnot_betweenZ
not_regexpZnot_likeZnot_inZnot_cont_inZnot_overlaps)rÂ   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   |   ¡ S r   )Ú__str__©r  r½   r½   r¾   Ú__repr__  s   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   rv   rx   rw   Úformatr  r  r½   r½   r¾   r    s   
ÿ
þzToken.__str__N)r   )ra   rb   rc   r  r  r  r½   r½   r½   r¾   rÿ     s    
rÿ   c                 C   s¨   t dƒ}t| t ƒr| S t| tƒr| jddS t| ttfƒr-tdƒ|d< t| ƒ ¡ |d< |S t| t	t
fƒrDtdƒ|d< t| ƒ ¡ |d< |S td	ƒ|d< t| ƒ ¡ |d
< |S )NúMysqlx.Expr.ExprT)Úreparseú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    

úþr  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  ÚstrÚ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  6  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   Úencoder  r  Úextend)Úobjr  r.  r  Úpairr½   r½   r¾   r  F  s   

r  c                 C   s$   t dƒ}|d  dd„ | D ƒ¡ |S )NúMysqlx.Expr.Arrayr  c                 S   s   g | ]}t |ƒ ¡ ‘qS r½   )r  r  )Ú.0r  r½   r½   r¾   Ú
<listcomp>U  s    zbuild_array.<locals>.<listcomp>)r   r3  )r  r  r½   r½   r¾   r  S  s   r  c                  C   s   t dƒ} tdƒ| d< | S )NúMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr  r   )r  r½   r½   r¾   r)  Y  s   r)  c                 C   ó    t dƒ}tdƒ|d< | |d< |S )Nr9  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr  Zv_doubler   r  r½   r½   r¾   r(  _  ó   r(  c                 C   r:  )Nr9  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr  Zv_signed_intr   r  r½   r½   r¾   r&  f  r;  r&  c                 C   r:  )Nr9  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr  Zv_unsigned_intr   r  r½   r½   r¾   Úbuild_unsigned_int_scalarl  r;  r<  c                 C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d|d< |S )Nzutf-8r9  z%Mysqlx.Datatypes.Scalar.Type.V_STRINGr  zMysqlx.Datatypes.Scalar.Stringr+  Zv_string)r  r   ÚbytesÚ	bytearrayr   r   r  r½   r½   r¾   r!  r  s   
r!  c                 C   r:  )Nr9  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr  Zv_boolr   r  r½   r½   r¾   r$  {  r;  r$  c                 C   s(   t dƒ}tdƒ|d< t d| d|d< |S )Nr9  z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr  zMysqlx.Datatypes.Scalar.Octetsr+  Zv_octetsr   r  r½   r½   r¾   r"  ‚  ó   r"  c                 C   r:  )Nr
  r  r  r  r   r  r½   r½   r¾   Úbuild_literal_expr‰  r;  r@  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   )rB  rC  rE  r  r½   r½   r¾   Úbuild_unary_op  s   rG  c                 C   s   |   dd¡S )Nú"z"")Úreplace)Ústringr½   r½   r¾   Úescape_literalš  ó   rK  c                   @   sÆ  e Zd Zdpdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdqd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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dqdCdD„Z#dEdF„ Z$dGdH„ Z%dIdJ„ Z&dKdL„ Z'dMdN„ Z(dOdP„ Z)dQdR„ Z*dSdT„ Z+dUdV„ Z,dWdX„ Z-dYdZ„ Z.d[d\„ Z/d]d^„ Z0dqd_d`„Z1dqdadb„Z2dcdd„ Z3dedf„ Z4dgdh„ Z5didj„ Z6dkdl„ Z7dmdn„ Z8doS )rr  Tc                 C   s>   || _ g | _g | _d| _|| _i | _d| _|  ¡  |  ¡  d S ©Né    )	rJ  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rJ  Zallow_relationalr½   r½   r¾   r  Ÿ  s   zExprParser.__init__c                 C   s   d  | j¡S )Nz<mysqlx.ExprParser '{}'>)r	  rJ  r  r½   r½   r¾   r  ª  rL  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   éÿÿÿÿú;NZSELECTr   ZWHEREr   )r  rJ  r   ÚreprÚstripÚlenÚupperr  r½   r½   r¾   rU  ­  s   ÿzExprParser.clean_expressionc                 C   s$   |d t | jƒk o| j|d  |kS ©Nr   )r\  rJ  )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   )r\  rJ  Úisdigitr*  rÿ   r   rx   )r  rQ  ÚstartZ	found_dotÚvalr½   r½   r¾   Ú
lex_numberÁ  s   ÿøÿ	zExprParser.lex_numberFc                 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   ú()r\  rJ  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONrÿ   r   rv   Ú_RESERVED_WORDSÚKeyError)r  ÚiZallow_spacerb  rc  Útokenr½   r½   r¾   Ú	lex_alphaÑ  sB   ÿÿþþýÿÿþþ
ÿýþþ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rttj|t|ƒd ƒS ttj|t|ƒd ƒS )NÚ r   ú\z*Unterminated quoted string starting at {0}ú`r	   )rJ  r\  r*  r	  rÿ   r   rv   rw   )r  r.  Ú
quote_charrc  rb  rà   r½   r½   r¾   Úlex_quoted_tokenã  s2   

ÿòÿ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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 )/NrN  Fr   re  ú?ú:Ú{Ú}rö   r÷   rî   z->r	   Trø   z**rù   ú$rû   rç   rè   rò   ré   rë   ró   rê   rf  ú)ú[ú]rú   ú,rý   rì   rð   rí   rô   rñ   rõ   rï   r`  z.*ú'rH  rr  zUnknown character at {0})3r\  rJ  rh  ra  rd  Úisalpharo  rÿ   r   r˜   r›   rž   rŸ   r‡   r_  r¥   rˆ   r™   r‰   rŠ   rz   rš   r|   r   r‚   r„   rœ   rƒ   ri   rj   rk   rl   r   r{   r}   rŽ   r…   r   r€   r†   r   r~   r¡   ry   r¦   rt  r*  r	  rO  Úappendr  )r  rm  Z
arrow_lastZinside_arrowrà   rn  r½   r½   r¾   rV  þ  sÆ   













(
—zExprParser.lexc                 C   sX   | j t| jƒkrtd || j ¡ƒ‚| j| j  j|kr*td || j | j| j  | j¡ƒ‚d S )Nz5Expected token type {0} at pos {1} but no tokens leftzDExpected token type {0} at pos {1} but found type {2}, on tokens {3})rQ  r\  rO  r*  r	  r  ©r  r  r½   r½   r¾   Úassert_cur_tokenm  s   
ÿÿþÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r   ©Úpos_token_type_isrQ  r  r½   r½   r¾   Úcur_token_type_isw  s   zExprParser.cur_token_type_isc                 G   s"   | j t| jƒk o| j| j  j|v S r   ©rQ  r\  rO  r  ©r  Útypesr½   r½   r¾   Úcur_token_type_inz  s   ÿzExprParser.cur_token_type_inc                 C   s   |   | jd |¡S r^  rƒ  r  r½   r½   r¾   Únext_token_type_is~  s   zExprParser.next_token_type_isc                 G   s&   | j t| jƒk o| j| j d  j|v S r^  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   )r\  rO  r  )r  rQ  r  r½   r½   r¾   r„  …  s   ÿzExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S r^  )r‚  rO  rQ  r  )r  r  r  r½   r½   r¾   Úconsume_token‰  s   
zExprParser.consume_tokenc                 C   sî   g }d}|   tj¡ |  tj¡sh|  ¡  ¡ }t|dƒr+|jj	r+| j
 d|jj	¡ d}nt|dƒsGd|v rGd|d v rG| j
 d|d d ¡ d}| |¡ |  tj¡rh|  jd7  _| |  ¡  ¡ ¡ |  tj¡sR|   tj¡ |ru| j
 ¡  |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        FÚ
identifierrN  TrB  r   )rŒ  r   ri   r…  rj   Ú_exprr  Úhasattrr  rB  rP  Úinsertr€  r{   rQ  Úpop)r  ÚexprsZpath_name_addedÚmsg_exprr½   r½   r¾   Úparen_expr_list  s0   
ÿ
ÿ
þ
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_namerB  r   )
r‚  r   rv   r   rŠ  ry   rŒ  rO  rQ  r  )r  Úidentr½   r½   r¾   r  ¨  s   zExprParser.identifierc                 C   sD   t dƒ}|  ¡ |d< |  ¡ |d< t dƒ}tdƒ|d< | ¡ |d< |S )NzMysqlx.Expr.FunctionCallrB  rC  r
  zMysqlx.Expr.Expr.Type.FUNC_CALLr  Úfunction_call)r   r  r”  r   r  )r  r—  r“  r½   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 )Nrr  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   ry   rO  rQ  r  rv   r  Ú
startswithÚendswithr*  r	  rw   r   r   )r  rn  Ú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  rN  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   rk   r…  r‰   rl   r   r   rx   r%  Ú
IndexErrorr	  rQ  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  |  ¡ ¡ | j	r9| j	d |d< t d	ƒ}td
ƒ|d< ||d< |S )NúMysqlx.Expr.ColumnIdentifierr˜  r™  r  r  Údocument_pathrN  rB  r
  úMysqlx.Expr.Expr.Type.IDENTr  )
r   r…  r   rv   r   rŒ  r3  r  r£  rP  )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_ASTERISKrN  r   z$JSON path may not end in '**' at {0})r…  r   ry   r€  rž  r  r¡   rŒ  r   r   rk   r¡  r™   r\  r   r*  r	  rQ  )r  Zdoc_pathr  r1  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¢  rN  rB  r   Z
table_namer	   r•  FTr£  r˜  r™  r  rp  r  r
  r¤  r  )r€  rŒ  r   rv   r…  ry   r\  r*  r	  rQ  Úreverser   Úrangerz   r£  r¥   r¦   r   r3  r  )r  Úpartsr¥  rm  Zis_docZ	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   )rQ  r\  rO  r*  )r  rn  r½   r½   r¾   Ú
next_tokenK  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  rn  r½   r½   r¾   Úexpect_tokenR  s   
ÿzExprParser.expect_tokenc                 C   s   | j | j S r   )rO  rQ  r  r½   r½   r¾   Ú
peek_tokenW  rL  zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S r^  )rO  rQ  r  )r  r  r½   r½   r¾   Úconsume_any_tokenZ  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)* ] "]"
        r6  r  r
  r  r  r  )r   rQ  r\  rO  r…  r   rl   r3  rŽ  r  r{   rŒ  r   )r  r  r  r½   r½   r¾   Úparse_json_array_  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   rQ  r\  rO  r…  r   rŸ   rŒ  rw   r›   rŽ  r  r3  r{   r   )r  r  Úitemr  r½   r½   r¾   Úparse_json_docq  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 rH| j| |d< |S | j|d< | j| j|< |  jd7  _|S )Nrp  z)Invalid placeholder name at token pos {0}r
  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )r…  r   rx   rŒ  rv   r  r˜   r   rT  r*  r	  rQ  r   r   rS  )r  rn  Zplace_holder_namer“  r½   r½   r¾   Úparse_place_holderˆ  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
        rA  rË   ©rB  rC  r
  ©rE  rD  r  )r   rŒ  r   ri   r3  rŽ  r  r¤   r"  r   r2  Úcast_data_typer@  rj   r   )r  rE  Ztype_scalarr  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*  rQ  )r  rn  Ú	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krCd 	|d ¡S dj	|Ž S )z4 dimension ::= LPAREN LNUM (, LNUM)? RPAREN
        Nr   z({0})rN  z	({0},{1}))
r…  r   ri   rŒ  r€  rx   r{   rj   r\  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
  rD  r  rA  rø   r´  rE  r   )r  r  r½   r½   r¾   Ústar_operatorá  r?  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 objectr`  r   r	   r
   zAUnknown token type = {0}  when expecting atomic expression at {1})5r«  r  r   r˜   r›   r³  rž   r±  rk   r¯  r    rË   ri   rŽ  r¬  rj   r‡   rˆ   r­  rx   r  rO  rQ  Úatomic_exprrG  rd   r   rŽ   rw   r@  r!  ro   r)  r(  r'  r&  r%  rn   rp   r$  rz   r¦  r‰   r¹  rv   rŠ  ry   r„  r—  rR  rª  r*  r	  )r  rn  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
  rD  r  rA  rB  rC  r   rE  )
rQ  r\  rO  r  r   r   Ú
_OPERATORSr  r  r3  )r  rˆ  Zinner_parserÚlhsr  rE  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 )NrA  rC  Zdate_addZdate_subrB  z&Expected interval type at position {0}r
  rµ  rD  r  )rº  r‰  r   r‡   rˆ   rŠ  rs   r«  r   r3  r  r  rŒ  Úbit_exprÚ_INTERVAL_UNITSr*  r	  rQ  r   r2  r®  r]  r@  r"  r   )r  r½  rn  rE  r½   r½   r¾   Úadd_sub_interval1  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_exprL  ó   þ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_exprQ  ó   ÿzExprParser.add_sub_exprc                 C   rÆ  r   )r¾  rÃ  r   r…   r†   rÇ  r  r½   r½   r¾   Ú
shift_exprU  rÈ  zExprParser.shift_exprc                 C   rÂ  r   )r¾  rÃ  r   r‚   rƒ   r„   rÉ  r  r½   r½   r¾   r¿  Y  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_expr^  s   ÿþzExprParser.comp_exprc                 C   sR  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}| |   ¡  	¡ ¡ nˆ|  tj¡r|  tj¡ | |   ¡  	¡ ¡ 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}rA  rB  rC  r
  rD  r  rE  )rÊ  r…  r   rd   rŒ  rQ  r\  rO  r€  r  r  rh   rq   ri   r3  r”  r¼   rr   ru   rm   re   rt   r*  r	  r   Ú	_NEGATIONr   )r  Úparamsr½  rþ   Zop_namerE  r“  r½   r½   r¾   Ú	ilri_exprc  sn   €ÿÿzExprParser.ilri_exprc                 C   rÆ  r   )r¾  rÃ  r   re   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   rg   rÎ  r  r½   r½   r¾   Úxor_expr¡  s   ÿzExprParser.xor_exprc                 C   rÆ  r   )r¾  rÃ  r   rf   rœ   rÏ  r  r½   r½   r¾   Úor_expr¥  rÈ  zExprParser.or_exprc                 C   s,   |rg | _ d| _i | _d| _|  ¡  |  ¡ S rM  )rO  rQ  rS  rT  rV  rÐ  )r  r  r½   r½   r¾   rŽ  ©  s   zExprParser._exprc                 C   s`   |   |¡}| j}|  t| jƒd tj¡r|d7 }|t| jƒk r.td | j| jd … | j¡ƒ‚|S )Nr	   z9Unused token types {} found in expression at position: {})	rŽ  rQ  r„  r\  rO  r   r¤   r*  r	  )r  r  Z
expressionZused_tokensr½   r½   r¾   r  ²  s   
ÿÿzExprParser.exprc                 C   s   t d|  tj¡dS )NzMysqlx.Crud.Columnr´  )r   rŒ  r   rv   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}  rf  rz  r{  r|  rw  rx  z{1},{0})rJ  Úsplitr§  r‘  Úcountr	  r€  r[  )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Ø  rQ  r\  rO  rŒ  r   r{   r   rŽ  r…  r¤   rv   r€  r  )r  Zproject_exprÚfirstrÕ  Z
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)rQ  r\  rO  rŒ  r   r{   r   rŽ  r…  r¢   r   r£   r€  r  )r  Z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)	rQ  r\  rO  rŒ  r   r{   r€  rŽ  r  )r  Z	expr_listrÛ  r½   r½   r¾   Úparse_expr_listö  s   üzExprParser.parse_expr_listN)T)F)9ra   rb   rc   r  r  rU  r_  rd  ro  rt  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  ž  sn    

o

	 1
 8:

	r  N)VÚ__doc__Úhelpersr   r   Z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À  re   rf   rg   rh   rd   rr   rq   r¼   rt   rm   rs   ru   r    rŠ   r‹   rŒ   rn   rp   ro   r¢   r£   r¤   r§   r¨   r©   rª   r«   r¬   r­   r¯   r®   r°   rk  rj  r¼  rF  rË  rÿ   r  r  r  r  r)  r(  r&  r<  r!  r$  r"  r@  rG  rK  r  r½   r½   r½   r¾   Ú<module>   sÜ  \ìÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì8øÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß%û	ù	
