U
    ƒe±»  ã                5   @   sŽ  d Z ddlmZ ddlmZmZ ddlmZmZ G dd„ dƒ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	j/e	j0e	j1e	j2e	je	je	je	je	je	je	je	je	je	j3e	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dœ4Z@e	j6e	j,e	j9e	j:e	j;e	j<e	j8e	j=dœZAd	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&œ!ZBd'd(d!dd)d*œZCd+d,d-d.d/d0d1d2œZDG d3d4„ d4ƒZEd5d6„ ZFd7d8„ ZGd9d:„ ZHd;d<„ ZId=d>„ ZJd?d@„ ZKdAdB„ ZLdCdD„ ZMdEdF„ ZNdGdH„ ZOdIdJ„ ZPdKdL„ ZQdMdN„ ZRdOdP„ ZSG dQdR„ dRƒZTdSS )TzExpression Parser.é   )ÚDbDoc)Ú
BYTE_TYPESÚget_item_or_attr©ÚMessageÚmysqlxpb_enumc                   @   st  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[dZZ\d[S )\Ú	TokenTypezToken types class.r   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é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__Ú__doc__Ú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¾   úL/var/www/html/assets/scripts/venv/lib/python3.8/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Zd
dd„Zdd„ Zdd„ Zd	S )ÚTokenzToken representation class.r   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   s2   | j tjtjtjfkr*| j › d| j› dS | j › S )Nú(ú))r  r   rw   ry   rx   r  r  r¾   r¾   r¿   r  !  s    ýzToken.__str__N)r   )ra   rb   rc   rd   r  r	  r  r¾   r¾   r¾   r¿   r     s   
r   c                 C   s¤   t dƒ}t| t ƒr| S t| tƒr,| 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: )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  @  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   r0  r  Úpairr¾   r¾   r¿   r  P  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>_  s     zbuild_array.<locals>.<listcomp>)r   r5  )r  r   r¾   r¾   r¿   r  ]  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+  c  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*  i  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(  p  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_scalarw  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#  ~  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   )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¦  s    rL  c                   @   sÎ  e Zd ZdZdqdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdrdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dsdDdE„Z$e%dFdG„ ƒZ&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2dtd`da„Z3dudbdc„Z4ddde„ Z5dfdg„ Z6dhdi„ Z7djdk„ Z8dldm„ Z9dndo„ Z:dpS )vr  zExpression parser class.Tc                 C   s>   || _ g | _g | _d| _|| _i | _d| _|  ¡  |  ¡  d S ©Né    )	rK  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rK  Zallow_relationalr¾   r¾   r¿   r  ­  s    zExprParser.__init__c                 C   s   d| j › dS )Nz<mysqlx.ExprParser 'z'>rJ  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  rK  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\  rK  )r  r0  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   )r\  rK  Úisdigitr,  r   r   ry   )r  rQ  Ú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   r
  )r\  rK  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr   r   rw   Ú_RESERVED_WORDSÚKeyError)r  ÚiZallow_spacerb  rc  Útokenr¾   r¾   r¿   Ú	lex_alphaà  s0    ÿþýý
ÿþ
ý zExprParser.lex_alphac                 C   s  | j | }d}|d7 }|}|t| j ƒk rª| j | }||kr`|d t| j ƒk r`| j |d  |kr`qª||df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 ú`r	   )rK  r\  r,  r   r   rw   rx   )r  r0  Ú
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| }| ¡ r8|d7 }q| ¡ rN|  |¡}n€| ¡ s^|dkrn|  ||¡}n`|dkr†ttj	|ƒ}nH|dkržttj
|ƒ}n0|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|sttjddƒ}d}nttj|ƒ}n¦|dkr`|  |d¡rPttjddƒ}nttj|ƒ}nn|dkrzttj|ƒ}nT|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ƒ}nttj|ƒ}n®|dkr:ttj|ƒ}n”|dkrr|  |d¡rbttjddƒ}nttj|ƒ}n\|dkrŒttj|ƒ}nB|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rttj!|ƒ}nÀ|d!krF|  |d¡r6ttj"d"dƒ}nttj#|ƒ}nˆ|d#krº|  |d¡rnttj"d$dƒ}nH|  |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ƒ}nttj)|ƒ}nÀ|d)krx|  |d¡r6ttj*d*dƒ}n@|d t | jƒk rj| j|d   ¡ rj|  |¡}nttj+|ƒ}nV|d+krª|rªttj,|ƒ}|s d}nd}d}n$|d,krÀ|  -|¡}nt.d-|› ƒ‚| j/ 0|¡ ||j17 }qd S ).NrN  Fr   re  ú?ú:Ú{Ú}rõ   rö   rí   z->r	   Tr÷   z**rø   ú$rú   rü   rè   rñ   ré   rë   rò   rê   r
  r  ú[ú]rù   ú,rþ   rì   rï   rý   ró   rð   rô   rî   r`  z.*)ú'rH  )rH  r|  rq  zUnknown character at )2r\  rK  rg  ra  rd  Úisalpharn  r   r   r™   rœ   rŸ   r    rˆ   r_  r¦   r‰   rš   rŠ   r‹   r{   r›   r}   rž   rƒ   r…   r   r„   rj   rk   rl   rm   rŽ   r|   r~   r   r†   r‚   r   r‡   r€   r   r¢   rz   r§   rs  r,  rO  Úappendr  )r  rl  Z
arrow_lastZinside_arrowrá   rm  r¾   r¾   r¿   rV    sÄ    



















(
zExprParser.lexc              	   C   sj   | j t| jƒkr(td|› d| j › dƒ‚| j| j  j|krftd|› d| j › d| j| j  › d| j› ƒ‚d S )NúExpected token type z at pos z but no tokens leftz but found type z, on tokens )rQ  r\  rO  r,  r  ©r  r  r¾   r¾   r¿   Úassert_cur_tokenƒ  s    ÿ&ÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r  ©Úpos_token_type_isrQ  r€  r¾   r¾   r¿   Úcur_token_type_is  s    zExprParser.cur_token_type_isc                 G   s"   | j t| jƒk o | j| j  j|kS r  ©rQ  r\  rO  r  ©r  Útypesr¾   r¾   r¿   Úcur_token_type_in’  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|k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¡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Ú
identifierrN  TrB  r   )r‹  r   rj   r„  rk   Ú_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   rw   r   r‰  rz   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r`|j d¡rL|j 	d¡rLt
|j› dƒ‚|   tj¡ |j}n0|jtjkr€|   tj¡ |j}nt
d| j› ƒ‚tdƒ}tdƒ|d< ||d< |S )Nrq  z* is not a valid JSON/ECMAScript identifierz?Expected token type IDENT or LSTRING in JSON path at token pos úMysqlx.Expr.DocumentPathItemú(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr  r  )r‹  r   rz   rO  rQ  r  rw   r  Ú
startswithÚendswithr,  rx   r   r   )r  rm  Ú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  rN  z"Array index cannot be negative at z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXÚindexzGException token type MUL or LNUM in JSON path array index at token pos )r‹  r   rl   r„  rŠ   rm   r   r   ry   r'  Ú
IndexErrorrQ  r,  )r  rœ  r  r¾   r¾   r¿   Údocpath_array_locð  s.    ÿÿ
ÿzExprParser.docpath_array_locc                 C   s¸   | j stdƒ‚|  tj¡r&|  tj¡ tdƒ}|  tj¡rrtdƒ}tdƒ|d< |  tj¡|d< |d  	| 
¡ g¡ |d  	|  ¡ ¡ | jr˜| jd |d	< td
ƒ}tdƒ|d< ||d< |S )Nz-Empty string cannot be used as document fieldúMysqlx.Expr.ColumnIdentifierr—  r˜  r  r  Údocument_pathrN  rB  r  úMysqlx.Expr.Expr.Type.IDENTrŒ  )rO  r,  r„  r   r{   r‹  r   rw   r   r5  r  r¢  rP  )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_ASTERISKrN  r   z!JSON path may not end in '**' at )r„  r   rz   r~  r  r  r¢   r‹  r   r   rl   r   rš   r\  r   r,  rQ  )r  Zdoc_pathrœ  r3  r¾   r¾   r¿   r¢    s4    ÿÿÿ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 r¡  rN  rB  r   Z
table_namer	   r”  FTr¢  r—  r˜  r  ro  r  r  r£  rŒ  )r~  r‹  r   rw   r„  rz   r\  r,  rQ  Úreverser   Úranger{   r¢  r¦   r§   r   r5  r  )r  Úpartsr¤  rl  Zis_docZ	is_quotedrœ  r’  r¾   r¾   r¿   Úcolumn_identifierA  sV    ÿ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  rm  r¾   r¾   r¿   Ú
next_tokenr  s
    zExprParser.next_tokenc                 C   s$   |   ¡ }|j|kr td|› ƒ‚d S )Nr  )rª  r  r,  )r  r  rm  r¾   r¾   r¿   Úexpect_tokeny  s    
zExprParser.expect_tokenc                 C   s   | j | j S r  )rO  rQ  r  r¾   r¾   r¿   Ú
peek_token~  s    zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S r^  )rO  rQ  r  )r  r  r¾   r¾   r¿   Úconsume_any_token  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)* ] "]"
        r8  r  r  r  r  r  )r   rQ  r\  rO  r„  r   rm   r5  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/  r0  r  r1  r  r  r  r  )r   rQ  r\  rO  r„  r   r    r‹  rx   rœ   r  r  r5  r|   r   )r  r   Úitemr  r¾   r¾   r¿   Úparse_json_doc™  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 )Nro  z&Invalid placeholder name at token pos r  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )r„  r   ry   r‹  rw   r  r™   r"  rT  r,  rQ  r   r   rS  )r  rm  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 )	z2cast ::= CAST LPAREN expr AS cast_data_type RPARENrA  rÌ   ©rB  rC  r  ©rE  rD  r  )r   r‹  r   rj   r5  r  r  r¥   r$  r"  r4  Úcast_data_typer@  rk   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krB|  ¡ }|r<|j› |› S |jS |jtj	krp|  d¡}|rj|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› d| j› d|j› dƒ‚dS )a  cast_data_type ::= ( BINARY dimension? ) |
        ( CHAR dimension? ) |
        ( DATE ) |
        ( DATETIME dimension? ) |
        ( TIME dimension? ) |
        ( DECIMAL dimension? ) |
        ( SIGNED INTEGER? ) |
        ( UNSIGNED INTEGER? ) |
        JSON
        TzUnknown token type z at position z (r  N)rª  r  r   r¨   r«   r©   rª   Úcast_data_type_dimensionr  r­   r®   r°   r„  r¯   r‹  r±   r¬   r,  rQ  )r  rm  Ú	dimensionr¾   r¾   r¿   rµ  Ö  s2    ü
ýÿ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 › dS d|d › d|d › dS )z*dimension ::= LPAREN LNUM (, LNUM)? RPARENNr   r
  rN  r  r{  )	r„  r   rj   r‹  r~  ry   r|   rk   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¿   Ústar_operator  s    zExprParser.star_operatorc                 C   sb  |   ¡ }|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r2tt ƒ ƒS |jtjkrpd|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rF| 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|j› d| j› ƒ‚dS )z<Parse an atomic expression and return a protobuf Expr objectr`  r   r	   r
   zUnknown token type = z&  when expecting atomic expression at N)4rª  r  r   r™   rœ   r²  rŸ   r°  rl   r®  r¡   rÌ   rj   r  r«  rk   rˆ   r‰   r¬  ry   r  rO  rQ  Úatomic_exprrG  re   rŽ   r   rx   r@  r#  rp   r+  r*  r)  r(  r'  ro   rq   r&  r{   r¥  rŠ   r¸  rw   r‰  rz   rƒ  r–  rR  r©  r,  )r  rm  r  Úpeekr¾   r¾   r¿   r¹    sl    

ÿ
ÿþýÿýÿ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  rD  r  rA  rB  rC  r   rE  )
rQ  r\  rO  r  r   r   Ú
_OPERATORSr  r  r5  )r  r‡  Zinner_parserÚlhsr   rE  r¾   r¾   r¿   Úparse_left_assoc_binary_op_exprS  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 )NrA  rC  Zdate_addZdate_subrB  z#Expected interval type at position r  r´  rD  r  )r¹  rˆ  r   rˆ   r‰   r‰  rt   rª  r   r5  r  r  r‹  Úbit_exprÚ_INTERVAL_UNITSr,  rQ  r"  r4  r­  r]  r@  r$  r   )r  r¼  rm  rE  r¾   r¾   r¿   Úadd_sub_intervald  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_expr  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_expr‡  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_exprŒ  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¾  ‘  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 rA  rB  rC  r  rD  r  rE  )rÅ  r„  r   re   r‹  rQ  r\  rO  r~  r  r  ri   rr   rj   r5  r“  r½   rs   rv   rn   rf   ru   r,  r   Ú	_NEGATIONr   )r  Úparamsr¼  rÿ   Zop_namerE  r’  r¾   r¾   r¿   Ú	ilri_expr¦  sd    zExprParser.ilri_exprc                 C   s   |   ttjtjgƒ| j¡S r  )r½  rÁ  r   rf   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   rh   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   rg   r   rÊ  r  r¾   r¾   r¿   Úor_expræ  s     ÿ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   sd   |   |¡}| j}|  t| jƒd tj¡r0|d7 }|t| jƒk r`td| j| jd … › d| j› ƒ‚|S )Nr	   zUnused token types z" found in expression at position: )r  rQ  rƒ  r\  rO  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   rw   r  r¾   r¾   r¿   Úparse_table_insert_field   s    z#ExprParser.parse_table_insert_fieldc                 C   s
   |   ¡ jS r  )r©  rŒ  r  r¾   r¾   r¿   Úparse_table_update_field  s    z#ExprParser.parse_table_update_fieldc                 C   sˆ   g }| j  d¡}| ¡  |r„| ¡ }| d¡| d¡ks`| d¡| d¡ks`| d¡| d¡krt| ¡ › d|› }q$| | ¡ ¡ q|S )Nr{  r
  r  ry  rz  rv  rw  )rK  Úsplitr¦  r  Úcountr~  r[  )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Ó  rQ  r\  rO  r‹  r   r|   r   r  r„  r¥   rw   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)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   sD   g }d}| j t| jƒk r@|s(|  tj¡ d}| |  ¡  ¡ ¡ q|S )NTF)	rQ  r\  rO  r‹  r   r|   r~  r  r  )r  Z	expr_listrÖ  r¾   r¾   r¿   Úparse_expr_list8  s    zExprParser.parse_expr_listN)T)F)F)F)F);ra   rb   rc   rd   r  r  rU  r_  rd  rn  rs  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¶  Ústaticmethodr¸  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  ª  sp   

o
	"1'

<8
	
r  N)Urd   Zdbdocr   Úhelpersr   r   Ú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¿  rf   rg   rh   ri   re   rs   rr   r½   ru   rn   rt   rv   r¡   r‹   rŒ   r   ro   rq   rp   r£   r¤   r¥   r¨   r©   rª   r«   r¬   r­   r®   r°   r¯   r±   rj  ri  r»  rF  rÆ  r   r!  r  r  r  r+  r*  r(  r=  r#  r&  r$  r@  rG  rL  r  r¾   r¾   r¾   r¿   Ú<module>   s2  ^ìÿÌ8øß%û	ù	
