U
    æã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½   ú//tmp/pip-unpacked-wheel-mzf9r1ws/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ÚmicrosecondZ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 k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  s     zbuild_array.<locals>.<listcomp>)r   r2  )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 )Nr8  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 )Nr8  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 )Nr8  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr  Zv_unsigned_intr   r  r½   r½   r¾   Úbuild_unsigned_int_scalarl  s    r9  c                 C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d|d< |S )Nzutf-8r8  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 )Nr8  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 )Nr8  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>  r?  rA  r  r½   r½   r¾   Úbuild_unary_op  s    rC  c                 C   s   |   dd¡S )Nú"z"")Úreplace)Ústringr½   r½   r¾   Úescape_literalš  s    rG  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é    )	rF  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rF  Zallow_relationalr½   r½   r¾   r  Ÿ  s    zExprParser.__init__c                 C   s   d  | j¡S )Nz<mysqlx.ExprParser '{}'>)r  rF  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…  ¡ krx| jdd… | _d| jdd	…  ¡ k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  rF  r  ÚreprÚstripÚlenÚupperr  r½   r½   r¾   rP  ­  s    zExprParser.clean_expressionc                 C   s$   |d t | jƒk o"| j|d  |kS ©Nr   )rW  rF  )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krPtdƒ‚d}|d7 }q| j||… }ttj|t |ƒƒS )NFÚ.Tz"Invalid number. Found multiple '.'r   )rW  rF  Úisdigitr)  rþ   r   rx   )r  rL  Ú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kr–ttj|t |ƒƒ}ntt	| ¡  | ¡ t |ƒƒ}W n& t
k
rÚ   ttj|t |ƒƒ}Y nX |S )NÚ_r   ú()rW  rF  Ú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	   )rF  rW  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rt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#¡rt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 )/NrI  Fr   r`  ú?ú:Ú{Ú}ró   rô   rë   z->r	   Trõ   z**rö   ú$rø   rú   ræ   rï   rç   ré   rð   rè   ra  ú)ú[ú]r÷   ú,rü   rê   rí   rû   rñ   rî   rò   rì   r[  z.*ú'rD  rm  zUnknown character at {0})3rW  rF  rc  r\  r_  Úisalpharj  rþ   r   r˜   r›   rž   rŸ   r‡   rZ  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¦   ro  r)  r  rJ  Úappendr  )r  rh  Z
arrow_lastZinside_arrowrß   ri  r½   r½   r¾   rQ  þ  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})rL  rW  rJ  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_isrL  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|kS rÿ   ©rL  rW  rJ  r   ©r  Útypesr½   r½   r¾   Úcur_token_type_inz  s    ÿzExprParser.cur_token_type_inc                 C   s   |   | jd |¡S rY  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|kS rY  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ÿ   )rW  rJ  r   )r  rL  r   r½   r½   r¾   r  …  s    ÿzExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S rY  )r}  rJ  rL  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|krŽd|d k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Ú
identifierrI  Tr>  r   )r‡  r   ri   r€  rj   Ú_exprr  Úhasattrrˆ  r>  rK  Úinsertr{  r{   rL  Ú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‡  rJ  rL  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>  r?  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 )Nrm  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   rJ  rL  r   rv   r  Ú
startswithÚendswithr)  r  rw   r   r   )r  ri  Ú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  rI  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  rL  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_pathrI  r>  r	  úMysqlx.Expr.Expr.Type.IDENTrˆ  )
r   r€  r   rv   r   r‡  r2  r  rž  rK  )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_ASTERISKrI  r   z$JSON path may not end in '**' at {0})r€  r   ry   r{  r™  r  r¡   r‡  r   r   rk   rœ  r™   rW  r   r)  r  rL  )r  Zdoc_pathr˜  r0  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  rI  r>  r   Z
table_namer	   r  FTrž  r“  r”  r  rk  r  r	  rŸ  rˆ  )r{  r‡  r   rv   r€  ry   rW  r)  r  rL  Úreverser   Úrangerz   rž  r¥   r¦   r   r2  r  )r  Úpartsr   rh  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   )rL  rW  rJ  r)  )r  ri  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   ri  r½   r½   r¾   Úexpect_tokenR  s    
zExprParser.expect_tokenc                 C   s   | j | j S rÿ   )rJ  rL  r  r½   r½   r¾   Ú
peek_tokenW  s    zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S rY  )rJ  rL  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)* ] "]"
        r5  r  r	  r  r  r  )r   rL  rW  rJ  r€  r   rl   r2  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   rL  rW  rJ  r€  r   rŸ   r‡  rw   r›   r‰  r  r2  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krŽ| j| |d< n$| j|d< | j| j|< |  jd7  _|S )Nrk  z)Invalid placeholder name at token pos {0}r	  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )r€  r   rx   r‡  rv   r   r˜   r  rO  r)  r  rL  r   r   rN  )r  ri  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>  r?  r	  ©rA  r@  r  )r   r‡  r   ri   r2  r‰  r  r¤   r!  r  r1  Úcast_data_typer<  rj   r   )r  rA  Ztype_scalarr  r½   r½   r¾   rË      s    ÿzExprParser.castc                 C   sØ   |   ¡ }|jtjtjtjtjfkrB|  ¡ }|r<d |j	|¡S |j	S |jtj
krp|  d¡}|rjd |j	|¡S |j	S |jtjtjfkr |  tj¡rš|  tj¡ |j	S |jtjtjtjfk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)  rL  )r  ri  Ú	dimensionr½   r½   r¾   r±  °  s:     ÿÿÿ
ÿÿÿ  ÿ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})rI  z	({0},{1}))
r€  r   ri   r‡  r{  rx   r{   rj   rW  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  r=  rõ   r¯  rA  r   )r  r  r½   r½   r¾   Ústar_operatorá  s    zExprParser.star_operatorc                 C   s`  |   ¡ }|jtjtjfk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krØ|  ¡ }|jtjkrÈ|j|j | j| j _|  ¡ S t|j|  ¡ ƒS |jtjtjtjfk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kr`tt!t"|jƒƒƒS tt#t$|jƒƒƒS |jtj%tj&fk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  rJ  rL  Úatomic_exprrC  rd   r   rŽ   rw   r<  r   ro   r(  r'  r&  r%  r$  rn   rp   r#  rz   r¡  r‰   r´  rv   r…  ry   r  r’  rM  r¥  r)  r  )r  ri  r  Úpeekr½   r½   r¾   rµ  ç  sr    

ÿÿ
ÿþýÿþ þzExprParser.atomic_exprc                 C   sž   |ƒ }| j t| jƒk rš| j| j  j|k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	  r@  r  r=  r>  r?  r   rA  )
rL  rW  rJ  r   r   r   Ú
_OPERATORSr  r  r2  )r  rƒ  Zinner_parserÚlhsr  rA  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k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=  r?  Zdate_addZdate_subr>  z&Expected interval type at position {0}r	  r°  r@  r  )rµ  r„  r   r‡   rˆ   r…  rs   r¦  r   r2  r  r   r‡  Úbit_exprÚ_INTERVAL_UNITSr)  r  rL  r  r1  r©  rX  r<  r!  r   )r  r¸  ri  rA  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>  r?  r	  r@  r  rA  )rÁ  r€  r   rd   r‡  rL  rW  rJ  r{  r  r  rh   rq   ri   r2  r  r¼   rr   ru   rm   re   rt   r)  r  r   Ú	_NEGATIONr   )r  Úparamsr¸  rý   Zop_namerA  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 rH  )rJ  rL  rN  rO  rQ  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‰  rL  r  rW  rJ  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 )	Nrx  ra  ru  rv  rw  rr  rs  z{1},{0})rF  Úsplitr¢  rŒ  Úcountr  r{  rV  )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Ï  rL  rW  rJ  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)rL  rW  rJ  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)	rL  rW  rJ  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  rP  rZ  r_  rj  ro  rQ  r}  r€  r„  r…  r†  r  r‡  r  rˆ  r’  r™  rœ  r¡  rž  r¥  r¦  r§  r¨  r©  rª  r¬  r®  rË   r±  r²  r´  rµ  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__Zhelpersr   r   Zdbdocr   Z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°   rf  re  r·  rB  rÂ  rþ   r  r  r  r  r(  r'  r%  r9  r   r#  r!  r<  rC  rG  r  r½   r½   r½   r¾   Ú<module>   s0  \ìÌ8øß%û	ù	
