U
    Òec±»  ã                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¾   ú//tmp/pip-unpacked-wheel-ix8dg7li/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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  r/  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   r4  )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   )rA  rB  rD  r  r¾   r¾   r¿   Úbuild_unary_opœ  s    rF  c                 C   s   |   dd¡S )Nú"z"")Úreplace©Ústringr¾   r¾   r¿   Úescape_literal¦  s    rK  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é    )	rJ  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rJ  Zallow_relationalr¾   r¾   r¿   r  ­  s    zExprParser.__init__c                 C   s   d| j › dS )Nz<mysqlx.ExprParser 'z'>rI  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  rJ  r!  ÚreprÚstripÚlenÚupperr  r¾   r¾   r¿   rT  »  s    zExprParser.clean_expressionc                 C   s$   |d t | jƒk o"| j|d  |kS ©Nr   )r[  rJ  )r  r/  rà   r¾   r¾   r¿   Únext_char_isÌ  s    zExprParser.next_char_isc                 C   s~   |}d}|t | jƒk 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[  rJ  Úisdigitr+  rÿ   r   ry   )r  rP  Ú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[  rJ  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONrÿ   r   rw   Ú_RESERVED_WORDSÚKeyError)r  ÚiZallow_spacera  rb  Ú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	   )rJ  r[  r+  rÿ   r   rw   rx   )r  r/  Ú
quote_charrb  ra  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 ).NrM  Fr   rd  ú?ú:Ú{Ú}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.*)ú'rG  )rG  r{  rp  zUnknown character at )2r[  rJ  rf  r`  rc  Úisalpharm  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§   rr  r+  rN  Úappendr  )r  rk  Z
arrow_lastZinside_arrowrà   rl  r¾   r¾   r¿   rU    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 )rP  r[  rN  r+  r  ©r  r  r¾   r¾   r¿   Úassert_cur_tokenƒ  s    ÿ&ÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r   ©Úpos_token_type_isrP  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   ©rP  r[  rN  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[  rN  r  )r  rP  r  r¾   r¾   r¿   r‚  ž  s    zExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S r]  )r€  rN  rP  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Ú
identifierrM  TrA  r   )rŠ  r   rj   rƒ  rk   Ú_exprr  Úhasattrr‹  rA  rO  Úinsertr}  r|   rP  Ú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_namerA  r   )
r€  r   rw   r   rˆ  rz   rŠ  rN  rP  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.FunctionCallrA  rB  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 )Nrp  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   rN  rP  r  rw   r  Ú
startswithÚendswithr+  rx   r   r   )r  rl  Ú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  rM  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&  Ú
IndexErrorrP  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_pathrM  rA  r  úMysqlx.Expr.Expr.Type.IDENTr‹  )rN  r+  rƒ  r   r{   rŠ  r   rw   r   r4  r  r¡  rO  )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_ASTERISKrM  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+  rP  )r  Zdoc_pathr›  r2  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   rM  rA  r   Z
table_namer	   r“  FTr¡  r–  r—  r  rn  r  r  r¢  r‹  )r}  rŠ  r   rw   rƒ  rz   r[  r+  rP  Úreverser   Úranger{   r¡  r¦   r§   r   r4  r  )r  Úpartsr£  rk  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   )rP  r[  rN  r+  )r  rl  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  rl  r¾   r¾   r¿   Úexpect_tokeny  s    
zExprParser.expect_tokenc                 C   s   | j | j S r   )rN  rP  r  r¾   r¾   r¿   Ú
peek_token~  s    zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S r]  )rN  rP  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)* ] "]"
        r7  r  r  r  r  r  )r   rP  r[  rN  rƒ  r   rm   r4  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  r0  r  r  r  r  )r   rP  r[  rN  rƒ  r   r    rŠ  rx   rœ   rŒ  r  r4  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 )Nrn  z&Invalid placeholder name at token pos r  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr   )rƒ  r   ry   rŠ  rw   r  r™   r!  rS  r+  rP  r   r   rR  )r  rl  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 RPARENr@  rÌ   ©rA  rB  r  ©rD  rC  r  )r   rŠ  r   rj   r4  rŒ  r  r¥   r#  r!  r3  Úcast_data_typer?  rk   r   )r  rD  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+  rP  )r  rl  Ú	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	  rM  r
  rz  )	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  rC  r  r@  rö   r²  rD  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  rN  rP  Úatomic_exprrF  re   rŽ   r   rx   r?  r"  rp   r*  r)  r(  r'  r&  ro   rq   r%  r{   r¤  rŠ   r·  rw   rˆ  rz   r‚  r•  rQ  r¨  r+  )r  rl  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  rC  r  r@  rA  rB  r   rD  )
rP  r[  rN  r  r   r   Ú
_OPERATORSr  r  r4  )r  r†  Zinner_parserÚlhsr  rD  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 )Nr@  rB  Zdate_addZdate_subrA  z#Expected interval type at position r  r³  rC  r  )r¸  r‡  r   rˆ   r‰   rˆ  rt   r©  r   r4  r  r  rŠ  Úbit_exprÚ_INTERVAL_UNITSr+  rP  r!  r3  r¬  r\  r?  r#  r   )r  r»  rl  rD  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 r@  rA  rB  r  rC  r  rD  )rÄ  rƒ  r   re   rŠ  rP  r[  rN  r}  r  r  ri   rr   rj   r4  r’  r½   rs   rv   rn   rf   ru   r+  r   Ú	_NEGATIONr   )r  Úparamsr»  rþ   Zop_namerD  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 rL  )rN  rP  rR  rS  rU  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Œ  rP  r‚  r[  rN  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 )Nrz  r	  r
  rx  ry  ru  rv  )rJ  Úsplitr¥  r  Úcountr}  rZ  )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Ò  rP  r[  rN  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)rP  r[  rN  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)	rP  r[  rN  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  rT  r^  rc  rm  rr  rU  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   Zhelpersr   r   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¾  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±   ri  rh  rº  rE  rÅ  rÿ   r   r  r  r  r*  r)  r'  r<  r"  r%  r#  r?  rF  rK  r  r¾   r¾   r¾   r¿   Ú<module>   s2  ^ìÿÌ8øß%û	ù	
