a
    còfƒ¼  ã                5   @   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 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
j0e
j1e
j2e
j3e
je
je
je
je
je
je
je
je
je
j4e
j5e
j6e
j7e
j8e
j9e
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dœ4ZAe
j7e
j-e
j:e
j;e
j<e
j=e
j9e
j>dœZBd	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d d!d"d#d$d%d&œ!ZCd'd(d!dd)d*œZDd+d,d-d.d/d0d1d2œZEG d3d4„ d4e	ƒZFd5d6„ ZGd7d8„ ZHd9d:„ ZId;d<„ ZJd=d>„ ZKd?d@„ ZLdAdB„ ZMdCdD„ ZNdEdF„ ZOdGdH„ ZPdIdJ„ ZQdKdL„ ZRdMdN„ ZSdOdP„ ZTG dQdR„ dRe	ƒZUdSS )Tz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½   úH/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysqlx/expr.pyr   %   s²   r   )4Ú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ä   ú==ú&&rÌ   ú||rÃ   rÁ   ú^rÂ   rÈ   rÅ   rÄ   ú!=ú>ú>=ú<ú<=ú&ú|ú<<ú>>ú+ú-Ú*ú/ú~ú%rË   Úcont_inrÆ   )!ú=rç   r¿   rÌ   ré   rÀ   rÃ   rÁ   rê   rÂ   rÈ   rÅ   rÄ   rë   ú<>rì   rí   rî   rï   rð   rè   rñ   rò   ró   rô   rõ   rö   r÷   rø   rù   rË   rú   rÆ   Z	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r4d | 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ƒrXtdƒ|d< t| ƒ ¡ |d< nHt| t	t
fƒr„tdƒ|d< t| ƒ ¡ |d< n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   s~   t | tƒrt| ƒS t | tƒr$t| ƒS t | tƒr6t| ƒS t | tƒrHt| ƒS t | t	ƒrZt
| ƒS | d u rhtƒ S td t| ƒ¡ƒ‚d S )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 ]N\}}tdƒ}t |tƒrF| ¡ 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  ó    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   s    t dƒ}tdƒ|d< | |d< |S )Nr:  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr  Zv_doubler   r  r½   r½   r¾   r(  _  s    r(  c                 C   s    t dƒ}tdƒ|d< | |d< |S )Nr:  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr  Zv_signed_intr   r  r½   r½   r¾   r&  f  s    r&  c                 C   s    t dƒ}tdƒ|d< | |d< |S )Nr:  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr  Zv_unsigned_intr   r  r½   r½   r¾   Úbuild_unsigned_int_scalarl  s    r;  c                 C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d�|d< |S )Nzutf-8r:  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   s    t dƒ}tdƒ|d< | |d< |S )Nr:  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr  Zv_boolr   r  r½   r½   r¾   r$  {  s    r$  c                 C   s(   t dƒ}tdƒ|d< t d| d�|d< |S )Nr:  z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr  zMysqlx.Datatypes.Scalar.Octetsr+  Zv_octetsr   r  r½   r½   r¾   r"  ‚  s    r"  c                 C   s    t dƒ}tdƒ|d< | |d< |S )Nr
  r  r  r  r   r  r½   r½   r¾   Úbuild_literal_expr‰  s    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   )r@  rA  rC  r  r½   r½   r¾   Úbuild_unary_op�  s    rE  c                 C   s   |   dd¡S )Nú"z"")Úreplace)Ústringr½   r½   r¾   Úescape_literalš  s    rI  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"drdCdD„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^„ Z0dsd_d`„Z1dtdadb„Z2dcdd„ Z3dedf„ Z4dgdh„ Z5didj„ Z6dkdl„ Z7dmdn„ Z8doS )ur  Tc                 C   s>   || _ g | _g | _d| _|| _i | _d| _|  ¡  |  ¡  d S ©Né    )	rH  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rH  Zallow_relationalr½   r½   r¾   r  Ÿ  s    zExprParser.__init__c                 C   s   d  | j¡S )Nz<mysqlx.ExprParser '{}'>)r	  rH  r  r½   r½   r¾   r  ª  s    zExprParser.__str__c                 C   s¢   t | jtƒst| jƒ| _| j d¡| _t| jƒdkrR| jd dkrR| jdd… | _d| jdd…  ¡ v rx| jdd… | _d| jdd	…  ¡ v rž| jd	d… | _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  rH  r   ÚreprÚstripÚlenÚupperr  r½   r½   r¾   rR  ­  s    zExprParser.clean_expressionc                 C   s$   |d t | jƒk o"| j|d  |kS ©Nr   )rY  rH  )r  r.  rà   r½   r½   r¾   Únext_char_is¾  s    zExprParser.next_char_isc                 C   s~   |}d}|t | jƒk r^| j|  ¡ s2| j| dkr^| j| dkrT|du rPtdƒ‚d}|d7 }q| j||… }ttj|t |ƒƒS )NFÚ.Tz"Invalid number. Found multiple '.'r   )rY  rH  Úisdigitr*  rÿ   r   rx   )r  rN  ÚstartZ	found_dotÚvalr½   r½   r¾   Ú
lex_numberÁ  s    ÿ
zExprParser.lex_numberFc                 C   sÞ   |}|t | jƒk rJ| j|  ¡ s@| j| dks@| j|  ¡ rJ|rJ|d7 }q| j||… }z\|t | jƒk r–| j| dkr–| ¡ tvr–ttj|t |ƒƒ}ntt	| ¡  | ¡ t |ƒƒ}W n$ t
yØ   ttj|t |ƒƒ}Y n0 |S )NÚ_r   ú()rY  rH  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONrÿ   r   rv   Ú_RESERVED_WORDSÚKeyError)r  ÚiZallow_spacer_  r`  Útokenr½   r½   r¾   Ú	lex_alphaÑ  s*    ÿÿþþ

ÿ zExprParser.lex_alphac                 C   s  | j | }d}|d7 }|}|t| j ƒk r°| j | }||krb|d t| j ƒk rb| j |d  |krbq°nD||ksr|dkrž|d t| j ƒkr†q°|d7 }|| j | 7 }n||7 }|d7 }q|t| j ƒksÌ| j | |krÚt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	   )rH  rY  r*  r	  rÿ   r   rv   rw   )r  r.  Ú
quote_charr`  r_  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�n´| ¡ rR|  |¡}�nž| ¡ sb|dkrr|  ||¡}�n~|dkrŠttj	|ƒ}�nf|dkr¢ttj
|ƒ}�nN|dkrºttj|ƒ}�n6|dkrÒttj|ƒ}�n|d	krêttj|ƒ}�n|d
k�r,|  |d¡�r|�sttjddƒ}d}nttj|ƒ}�nÄ|dk�rd|  |d¡�rTttjddƒ}nttj|ƒ}�nŒ|dk�r~ttj|ƒ}�nr|dk�r˜ttj|ƒ}�nX|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ƒ}nttj|ƒ}�nÌ|dk�r>ttj|ƒ}�n²|dk�rv|  |d¡�rfttjddƒ}nttj|ƒ}�nz|dk�r�ttj|ƒ}�n`|dk�rªttj|ƒ}�nF|dk�rÄ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�rJ|  |d¡�r:ttj"d"dƒ}nttj#|ƒ}�n¦|d#k�r¾|  |d¡�rrttj"d$dƒ}nH|  |d#¡�r�ttj$d%dƒ}n*|  |d¡�r®ttj%d&dƒ}nttj&|ƒ}�n2|dk�r|  |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 t | jƒk �rn| j|d   ¡ �rn|  |¡}nttj+|ƒ}nt|d+k�s�|d,k�r¸|�r¸ttj,|ƒ}|�s®d}nd}d}n8|d,k�sÖ|d+k�sÖ|d-k�râ|  -|¡}nt.d. /|¡ƒ‚| j0 1|¡ ||j27 }qd S )/NrK  Fr   rb  ú?ú:Ú{Ú}rô   rõ   rì   z->r	   Trö   z**r÷   ú$rù   rû   rç   rð   rè   rê   rñ   ré   rc  ú)ú[ú]rø   ú,rý   rë   rî   rü   rò   rï   ró   rí   r]  z.*ú'rF  ro  zUnknown character at {0})3rY  rH  re  r^  ra  Úisalpharl  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¦   rq  r*  r	  rL  Úappendr  )r  rj  Z
arrow_lastZinside_arrowrà   rk  r½   r½   r¾   rS  þ  sÄ    



















(zExprParser.lexc                 C   sX   | j t| jƒkr"td || j ¡ƒ‚| j| j  j|krTt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})rN  rY  rL  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_isrN  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   ©rN  rY  rL  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   )rY  rL  r  )r  rN  r  r½   r½   r¾   r�  …  s    ÿzExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S r[  )r  rL  rN  r  )r  r  r  r½   r½   r¾   Úconsume_token‰  s    
zExprParser.consume_tokenc                 C   sä   g }d}|   tj¡ |  tj¡sÆ|  ¡  ¡ }t|dƒrV|jj	rV| j
 d|jj	¡ d}n8t|dƒsŽd|v rŽd|d v rŽ| j
 d|d d ¡ d}| |¡ |  tj¡rÆ|  jd7  _| |  ¡  ¡ ¡ q˜|   tj¡ |rà| j
 ¡  |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        FÚ
identifierrK  Tr@  r   )r‰  r   ri   r‚  rj   Ú_exprr  ÚhasattrrŠ  r@  rM  Úinsertr}  r{   rN  Úpop)r  ÚexprsZpath_name_addedÚmsg_exprr½   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_namer@  r   )
r  r   rv   r   r‡  ry   r‰  rL  rN  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.FunctionCallr@  rA  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r`|j d¡rL|j 	d¡rLt
d |j¡ƒ‚|   tj¡ |j}n0|jtjkr€|   tj¡ |j}nt
d | j¡ƒ‚tdƒ}tdƒ|d< ||d< |S )Nro  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   rL  rN  r  rv   r  Ú
startswithÚendswithr*  r	  rw   r   r   )r  rk  Úmember_nameÚdoc_path_itemr½   r½   r¾   Údocpath_member»  s*    ÿÿÿzExprParser.docpath_memberc                 C   s¼   |   tj¡ |  tj¡rH|   tj¡ |   tj¡ tdƒ}tdƒ|d< |S |  tj¡r¨t	|   tj¡ƒ}|dk r|t
d | j¡ƒ‚|   tj¡ tdƒ}tdƒ|d< ||d< |S td | j¡ƒ‚d S )	Nr•  z6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKr  rK  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	  rN  r*  )r  rš  r  r½   r½   r¾   Údocpath_array_locÑ  s2    ÿÿÿþzExprParser.docpath_array_locc                 C   s’   t dƒ}|  tj¡rLt dƒ}tdƒ|d< |  tj¡|d< |d  | ¡ g¡ |d  |  ¡ ¡ | j	rr| j	d |d< t d	ƒ}td
ƒ|d< ||d< |S )NúMysqlx.Expr.ColumnIdentifierr•  r–  r  r  Údocument_pathrK  r@  r
  úMysqlx.Expr.Expr.Type.IDENTrŠ  )
r   r‚  r   rv   r   r‰  r3  r  r   rM  )r  Úcol_idrš  r  r½   r½   r¾   Údocument_fieldê  s    ÿzExprParser.document_fieldc                 C   sþ   g }|   tj¡r$| |  ¡  ¡ ¡ q|   tj¡r`|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ q|   tj
¡r€| |  ¡  ¡ ¡ q|   tj¡rÀ|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ qqÀ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)
        r•  z1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKr  z1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKrK  r   z$JSON path may not end in '**' at {0})r‚  r   ry   r}  r›  r  r¡   r‰  r   r   rk   rž  r™   rY  r   r*  r	  rN  )r  Zdoc_pathrš  r1  r½   r½   r¾   r   ú  s8    ÿÿÿÿzExprParser.document_pathc                 C   sÂ  g }|  |  tj¡¡ |  tj¡rB|  tj¡ |  |  tj¡¡ qt|ƒdkr^td | j	¡ƒ‚| 
¡  tdƒ}tdt|ƒƒD ]D}|dkr–|d |d< q||dkr¬|d |d< q||dkr||d |d	< q|d
}|  tj¡rðd}|  tj¡ |  ¡ |d< nj|  tj¡�rZd}|  tj¡ d
}|  tj¡�r0d}|  tj¡ |  tj¡ |  ¡ |d< |�rZ|  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Ÿ  rK  r@  r   Z
table_namer	   r’  FTr   r•  r–  r  rm  r  r
  r¡  rŠ  )r}  r‰  r   rv   r‚  ry   rY  r*  r	  rN  Úreverser   Úrangerz   r   r¥   r¦   r   r3  r  )r  Úpartsr¢  rj  Zis_docZ	is_quotedrš  r�  r½   r½   r¾   Úcolumn_identifier  sZ    ÿÿ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   )rN  rY  rL  r*  )r  rk  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  rk  r½   r½   r¾   Úexpect_tokenR  s    
zExprParser.expect_tokenc                 C   s   | j | j S r   )rL  rN  r  r½   r½   r¾   Ú
peek_tokenW  s    zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S r[  )rL  rN  r  )r  r  r½   r½   r¾   Úconsume_any_tokenZ  s    zExprParser.consume_any_tokenc                 C   sˆ   t dƒ}| jt| jƒk rX|  tj¡sX|d  |  ¡  	¡ g¡ |  tj
¡sJqX|  tj
¡ q|  tj¡ t dƒ}tdƒ|d< | 	¡ |d< |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        r6  r  r
  r  r  r  )r   rN  rY  rL  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 rˆ|  tj¡sˆt dƒ}|  tj¡|d< |  tj	¡ |  
¡  ¡ |d< |d  | ¡ g¡ |  tj¡szqˆ|  tj¡ q|  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   rN  rY  rL  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¡}nB|   tj¡r8|  tj¡}n(|jtjkrPt| jƒ}nt	d 
| j¡ƒ‚tdƒ}tdƒ|d< || jv rŽ| j| |d< n$| j|d< | j| j|< |  jd7  _|S )Nrm  z)Invalid placeholder name at token pos {0}r
  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )r‚  r   rx   r‰  rv   r  r˜   r   rQ  r*  r	  rN  r   r   rP  )r  rk  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
        r?  rË   ©r@  rA  r
  ©rC  rB  r  )r   r‰  r   ri   r3  r‹  r  r¤   r"  r   r2  Úcast_data_typer>  rj   r   )r  rC  Ztype_scalarr  r½   r½   r¾   rË      s    ÿzExprParser.castc                 C   sØ   |   ¡ }|jtjtjtjtjfv rB|  ¡ }|r<d |j	|¡S |j	S |jtj
u rp|  d¡}|rjd |j	|¡S |j	S |jtjtjfv r |  tj¡rš|  tj¡ |j	S |jtjtjtjfv r¼|j	S td |j| j|j	¡ƒ‚dS )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})N)r¨  r  r   r§   rª   r¨   r©   Úcast_data_type_dimensionr	  r  r¬   r­   r¯   r‚  r®   r‰  r°   r«   r*  rN  )r  rk  Ú	dimensionr½   r½   r¾   r³  °  s4    ÿÿÿ
ÿÿÿÿzExprParser.cast_data_typec                 C   s�   |   tj¡sdS g }|  tj¡ | |  tj¡¡ |r`|   tj¡r`|  tj¡ | |  tj¡¡ |  tj¡ t|ƒdkr†d 	|d ¡S dj	|Ž S )z4 dimension ::= LPAREN LNUM (, LNUM)? RPAREN
        Nr   z({0})rK  z	({0},{1}))
r‚  r   ri   r‰  r}  rx   r{   rj   rY  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
  rB  r  r?  rö   r±  rC  r   )r  r  r½   r½   r¾   Ústar_operatorá  s    zExprParser.star_operatorc                 C   s`  |   ¡ }|jtjtjfv r$|  |¡S |jtjkr8|  ¡ S |jtjkrL|  	¡ S |jtj
kr`|  ¡ S |jtjkr„|  ¡ }|  tj¡ |S |jtjtjfv rØ|  ¡ }|jtjkrÈ|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�r4tt ƒ ƒS |jtjk�rrd|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�rH| jd | _|  -tj¡�s(|  -tj.¡�r0|  /| jd tj,¡�r0|  /| jd tj¡�r0|  0¡ S | j1�s@|  )¡ S |  2¡ S t3d 4|j| j¡ƒ‚dS )z<Parse an atomic expression and return a protobuf Expr objectr]  r   r	   r
   zAUnknown token type = {0}  when expecting atomic expression at {1}N)5r¨  r  r   r˜   r›   r°  rž   r®  rk   r¬  r    rË   ri   r‹  r©  rj   r‡   rˆ   rª  rx   r  rL  rN  Úatomic_exprrE  rd   r�   rŽ   rw   r>  r!  ro   r)  r(  r'  r&  r%  rn   rp   r$  rz   r£  r‰   r¶  rv   r‡  ry   r�  r”  rO  r§  r*  r	  )r  rk  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< |}q|S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionr
  rB  r  r?  r@  rA  r   rC  )
rN  rY  rL  r  r   r   Ú
_OPERATORSr  r  r3  )r  r…  Zinner_parserÚlhsr  rC  r½   r½   r¾   Úparse_left_assoc_binary_op_expr  s    ÿz*ExprParser.parse_left_assoc_binary_op_exprc                 C   sè   |   ¡ }|  tjtj¡rä|  tj¡rä|  ¡ }tdƒ}|d  	| 
¡ g¡ |jtju rXdnd|d< |  tj¡ |d  	|  ¡  
¡ g¡ | jtŽ sžtd | j¡ƒ‚t |  ¡  ¡ ¡}|d  	tt|ƒƒ 
¡ g¡ td|d�}td	ƒ|d
< |S )Nr?  rA  Zdate_addZdate_subr@  z&Expected interval type at position {0}r
  r²  rB  r  )r·  r†  r   r‡   rˆ   r‡  rs   r¨  r   r3  r  r  r‰  Úbit_exprÚ_INTERVAL_UNITSr*  r	  rN  r   r2  r«  rZ  r>  r"  r   )r  rº  rk  rC  r½   r½   r¾   Úadd_sub_interval1  s.    
ÿÿ
ÿ
ÿzExprParser.add_sub_intervalc                 C   s   |   ttjtjtjgƒ| j¡S r   )r»  Úsetr   r‰   rŠ   rš   r¾  r  r½   r½   r¾   Úmul_div_exprL  s    þzExprParser.mul_div_exprc                 C   s   |   ttjtjgƒ| j¡S r   )r»  r¿  r   r‡   rˆ   rÀ  r  r½   r½   r¾   Úadd_sub_exprQ  s    ÿzExprParser.add_sub_exprc                 C   s   |   ttjtjgƒ| j¡S r   )r»  r¿  r   r…   r†   rÁ  r  r½   r½   r¾   Ú
shift_exprU  s    ÿzExprParser.shift_exprc                 C   s   |   ttjtjtjgƒ| j¡S r   )r»  r¿  r   r‚   rƒ   r„   rÂ  r  r½   r½   r¾   r¼  Y  s    þ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   sb  g }|   ¡ }d}|  tj¡r,d}|  tj¡ | jt| jƒk �r^| | 	¡ ¡ | j| j j
}|  tj¡r¤|  tj¡ |  tj¡rŽd}|  tj¡ | |   ¡  	¡ ¡ �nj|  tj¡rò|  tj¡ |  tj¡rØ| |  ¡ ¡ nd}| |   ¡  	¡ ¡ �n|  tj¡�r |  tj¡ | |   ¡  	¡ ¡ nî|  tj¡�rz|  tj¡ | |   ¡  	¡ ¡ |  tj¡�r|  tj¡ | |   ¡  	¡ ¡ n”|  tj¡�rÆ|  tj¡ | |   ¡  	¡ ¡ |  tj¡ | |   ¡  	¡ ¡ nH|  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}r?  r@  rA  r
  rB  r  rC  )rÃ  r‚  r   rd   r‰  rN  rY  rL  r}  r  r  rh   rq   ri   r3  r‘  r¼   rr   ru   rm   re   rt   r*  r	  r   Ú	_NEGATIONr   )r  Úparamsrº  rþ   Zop_namerC  r�  r½   r½   r¾   Ú	ilri_exprc  sl    ÿÿzExprParser.ilri_exprc                 C   s   |   ttjtjgƒ| j¡S r   )r»  r¿  r   re   r�   rÆ  r  r½   r½   r¾   Úand_expr�  s    ÿ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   s   |   ttjtjgƒ| j¡S r   )r»  r¿  r   rf   rœ   rÈ  r  r½   r½   r¾   Úor_expr¥  s    ÿzExprParser.or_exprc                 C   s,   |r$g | _ d| _i | _d| _|  ¡  |  ¡ S rJ  )rL  rN  rP  rQ  rS  rÉ  )r  r  r½   r½   r¾   r‹  ©  s    zExprParser._exprc                 C   s`   |   |¡}| j}|  t| jƒd tj¡r0|d7 }|t| jƒk r\td | j| jd … | j¡ƒ‚|S )Nr	   z9Unused token types {} found in expression at position: {})	r‹  rN  r�  rY  rL  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s`| d¡| d¡ks`| d¡| d¡krrd | ¡ |¡}q$| | ¡ ¡ q|S )	Nrz  rc  rw  rx  ry  rt  ru  z{1},{0})rH  Úsplitr¤  rŽ  Úcountr	  r}  rX  )r  ÚfieldsÚtempÚfieldr½   r½   r¾   Ú_table_fieldsÄ  s    ÿþzExprParser._table_fieldsc                 C   s’   g }d}|   ¡ }| jt| jƒk rŽ|s0|  tj¡ d}td|  ¡ d�}|  	tj
¡rn|  tj
¡ |  tj¡|d< n|t|ƒ |d< | | ¡ ¡ q|S )NTFzMysqlx.Crud.Projection)ÚsourceÚalias)rÑ  rN  rY  rL  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 r–|s(|  tj¡ d}td|  ¡ d�}|  tj	¡rbt
dƒ|d< |  tj	¡ n$|  tj¡r†t
dƒ|d< |  tj¡ | | ¡ ¡ q|S )NTFzMysqlx.Crud.Order)r  zMysqlx.Crud.Order.Direction.ASCÚ	directionz Mysqlx.Crud.Order.Direction.DESC)rN  rY  rL  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   sD   g }d}| j t| jƒk r@|s(|  tj¡ d}| |  ¡  ¡ ¡ q|S )NTF)	rN  rY  rL  r‰  r   r{   r}  r‹  r  )r  Z	expr_listrÔ  r½   r½   r¾   Úparse_expr_listö  s    zExprParser.parse_expr_listN)T)F)F)F)F)9ra   rb   rc   r  r  rR  r\  ra  rl  rq  rS  r  r‚  r†  r‡  rˆ  r�  r‰  r‘  rŠ  r”  r›  rž  r£  r   r§  r¨  r©  rª  r«  r¬  r®  r°  rË   r³  r´  r¶  r·  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:
	
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°   rh  rg  r¹  rD  rÄ  rÿ   r  r  r  r  r)  r(  r&  r;  r!  r$  r"  r>  rE  rI  r  r½   r½   r½   r¾   Ú<module>   s0  \ìÌ8øß%û	ù	
