U
    4Je÷Â  ã                5   @   sR  d Z ddlmZmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZmZ ddlmZmZmZmZ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j0ej1ej2ej3ej4ej5ej6ej7ej8ej9ej:ej;ej<ej=ej>ej?ej@ejAejBejejejejej ej!ej"ej#ejejCejDejEejFejGejHejIejJejKejLejMejNejOej$ej%ej&ej'ej(ej)ej*ej+ej,ej-ej.d
œ4ZPejFej<ejIejJejKejLejHejMdœZQd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)œ!ZRd*d+d$dd,d-œZSd.d/d0d1d2d3d4d5œZTG d6d7„ d7ƒZUeed8œd9d:„ZVeed8œd;d<„ZWe	eef ed=œd>d?„ZXee ed@œdAdB„ZYedCœdDdE„ZZe[ed8œdFdG„Z\e]ed8œdHdI„Z^e]ed8œdJdK„Z_eed8œdLdM„Z`eaed8œdNdO„Zbeced8œdPdQ„Zdeed8œdRdS„ZeefeedTœdUdV„ZgefefdWœdXdY„ZhG dZd[„ d[ƒZid\S )]zExpression Parser.é    )ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSequenceÚUnioné   )ÚDbDoc)Ú
BYTE_TYPESÚget_item_or_attr©ÚMessageÚmysqlxpb_enum)ÚBuildExprTypesÚBuildScalarTypesÚMessageTypeÚProtobufMessageCextTypeÚProtobufMessageTypeÚ
StrOrBytesc                   @   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-7_167w8m/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                   @   sB   e Zd ZdZdeeeddœdd„Zedœdd	„Zedœd
d„ZdS )ÚTokenzToken representation class.r
   N)Ú
token_typeÚvalueÚlengthÚreturnc                 C   s   || _ || _|| _d S ©N)r  r  r  )Úselfr  r  r  rÍ   rÍ   rÎ   Ú__init__#  s    zToken.__init__©r  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   r†   rˆ   r‡   r  r  rÍ   rÍ   rÎ   r  +  s    ýzToken.__str__)r
   )	rp   rq   rr   rs   ÚintÚstrr  r  r  rÍ   rÍ   rÍ   rÎ   r     s   r  )r  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_expr8  s    

r3  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'  r  Úbuild_string_scalarr   Úbuild_bytes_scalarÚboolÚbuild_bool_scalarr  Úbuild_int_scalarÚfloatÚbuild_double_scalarÚbuild_null_scalarÚ
ValueErrorr!  ©r  rÍ   rÍ   rÎ   r0  J  s    




r0  )Úobjr  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  Úencoder3  r,  Úextend)r>  r2  rA  r  ÚpairrÍ   rÍ   rÎ   r+  Z  s    

r+  )r$  r  c                 C   s$   t dƒ}|d  dd„ | D ƒ¡ |S )NúMysqlx.Expr.Arrayr  c                 S   s   g | ]}t |ƒ ¡ ‘qS rÍ   )r3  r,  )Ú.0r  rÍ   rÍ   rÎ   Ú
<listcomp>i  s     zbuild_array.<locals>.<listcomp>)r   rF  )r$  r2  rÍ   rÍ   rÎ   r/  g  s    r/  r  c                  C   s   t dƒ} tdƒ| d< | S )NúMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr!  r   ©r2  rÍ   rÍ   rÎ   r;  m  s    r;  c                 C   s    t dƒ}tdƒ|d< | |d< |S )NrK  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr!  Zv_doubler   r1  rÍ   rÍ   rÎ   r:  s  s    r:  c                 C   s    t dƒ}tdƒ|d< | |d< |S )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr!  Zv_signed_intr   r1  rÍ   rÍ   rÎ   r8  z  s    r8  c                 C   s    t dƒ}tdƒ|d< | |d< |S )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr!  Zv_unsigned_intr   r1  rÍ   rÍ   rÎ   Úbuild_unsigned_int_scalar  s    rM  c                 C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d|d< |S )Nzutf-8rK  z%Mysqlx.Datatypes.Scalar.Type.V_STRINGr!  zMysqlx.Datatypes.Scalar.Stringr=  Zv_string)r'  r  ÚbytesÚ	bytearrayr   r   r1  rÍ   rÍ   rÎ   r4  ˆ  s    
r4  c                 C   s    t dƒ}tdƒ|d< | |d< |S )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr!  Zv_boolr   r1  rÍ   rÍ   rÎ   r7  ‘  s    r7  c                 C   s(   t dƒ}tdƒ|d< t d| d|d< |S )NrK  z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr!  zMysqlx.Datatypes.Scalar.Octetsr=  Zv_octetsr   r1  rÍ   rÍ   rÎ   r5  ˜  s    r5  c                 C   s    t dƒ}tdƒ|d< | |d< |S )Nr  r%  r!  r&  r   r1  rÍ   rÍ   rÎ   Úbuild_literal_exprŸ  s    rP  )ÚnameÚparamr  c                 C   sF   t dƒ}t|  |d< | ¡ g|d< t dƒ}tdƒ|d< | ¡ |d< |S )NúMysqlx.Expr.OperatorrQ  rR  r  úMysqlx.Expr.Expr.Type.OPERATORr!  Úoperator)r   Ú_UNARY_OPERATORSr,  r   )rQ  rR  rU  r2  rÍ   rÍ   rÎ   Úbuild_unary_op¦  s    rW  )Ústringr  c                 C   s   |   dd¡S )Nú"z"")Úreplace©rX  rÍ   rÍ   rÎ   Úescape_literal°  s    r\  c                   @   s  e Zd ZdZd~eeddœdd„Zedœdd	„Zddœd
d„Ze	eedœdd„Z
e	edœdd„Zde	eedœdd„Ze	edœdd„Zddœdd„Ze	ddœdd„Ze	edœdd„Ze	ed œd!d"„Ze	edœd#d$„Ze	ed œd%d&„Ze	e	ed'œd(d)„Ze	edœd*d+„Zeeeef  dœd,d-„Zedœd.d/„Zedœd0d1„Zedœd2d3„Zedœd4d5„Z edœd6d7„Z!eeeef  dœd8d9„Z"edœd:d;„Z#edœd<d=„Z$e	ddœd>d?„Z%edœd@dA„Z&edœdBdC„Z'edœdDdE„Z(edœdFdG„Z)eedHœdIdJ„Z*edœdKdL„Z+edœdMdN„Z,d€ee-e dOœdPdQ„Z.e/edœdRdS„ƒZ0edœdTdU„Z1e2e	 e3g ef edVœdWdX„Z4edœdYdZ„Z5edœd[d\„Z6edœd]d^„Z7edœd_d`„Z8edœdadb„Z9edœdcdd„Z:edœdedf„Z;edœdgdh„Z<edœdidj„Z=edœdkdl„Z>deedmœdndo„Z?d‚eedmœdpdq„Z@edœdrds„ZAeBdœdtdu„ZCee dœdvdw„ZDeeeef  dœdxdy„ZEeeeef  dœdzd{„ZFeeeef  dœd|d}„ZGdS )ƒr(  zExpression parser class.TN)rX  Úallow_relationalr  c                 C   s>   || _ g | _g | _d| _|| _i | _d| _|  ¡  |  ¡  d S ©Nr   )	rX  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rX  r]  rÍ   rÍ   rÎ   r  ·  s    zExprParser.__init__r  c                 C   s   d| j › dS )Nz<mysqlx.ExprParser 'z'>r[  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'  rX  r  ÚreprÚstripÚlenÚupperr  rÍ   rÍ   rÎ   re  Å  s    zExprParser.clean_expression)rA  rï   r  c                 C   s$   |d t | jƒk o"| j|d  |kS ©Nr
   )rl  rX  )r  rA  rï   rÍ   rÍ   rÎ   Únext_char_isÖ  s    zExprParser.next_char_is)ra  r  c                 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
   )rl  rX  Úisdigitr<  r  r   rˆ   )r  ra  ÚstartZ	found_dotÚvalrÍ   rÍ   rÎ   Ú
lex_numberÙ  s    ÿÿ
zExprParser.lex_numberF)ÚiÚallow_spacer  c                 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  )rl  rX  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr  r   r†   Ú_RESERVED_WORDSÚKeyError)r  ru  rv  rr  rs  ÚtokenrÍ   rÍ   rÎ   Ú	lex_alphaê  s0    ÿþýý
ÿþ
ý zExprParser.lex_alpha)rA  r  c                 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   )rX  rl  r<  r  r   r†   r‡   )r  rA  Ú
quote_charrs  rr  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 ).Nr   Fr
   rw  ú?ú:Ú{Ú}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ü   rp  z.*)ú'rY  )rY  r  r‚  zUnknown character at )2rl  rX  ry  rq  rt  Úisalphar  r  r   r¨   r«   r®   r¯   r—   ro  rµ   r˜   r©   r™   rš   rŠ   rª   rŒ   r­   r’   r”   r¬   r“   ry   rz   r{   r|   r   r‹   r   rž   r•   r‘   r   r–   r   rŽ   r±   r‰   r¶   r„  r<  r_  Úappendr  )r  ru  Z
arrow_lastZinside_arrowrï   r~  rÍ   rÍ   rÎ   rf    sÄ    



















(
zExprParser.lex)r  r  c              	   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 )ra  rl  r_  r<  r  ©r  r  rÍ   rÍ   rÎ   Úassert_cur_token  s    ÿ&ÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r  ©Úpos_token_type_isra  r‘  rÍ   rÍ   rÎ   Úcur_token_type_is™  s    zExprParser.cur_token_type_is)Útypesr  c                 G   s"   | j t| jƒk o | j| j  j|kS r  ©ra  rl  r_  r  ©r  r–  rÍ   rÍ   rÎ   Úcur_token_type_inœ  s    zExprParser.cur_token_type_inc                 C   s   |   | jd |¡S rn  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 rn  r—  r˜  rÍ   rÍ   rÎ   Únext_token_type_in¢  s    þzExprParser.next_token_type_in)ra  r  r  c                 C   s   |t | jƒk o| j| j|kS r  )rl  r_  r  )r  ra  r  rÍ   rÍ   rÎ   r”  ¨  s    zExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S rn  )r’  r_  ra  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Ú
identifierr   TrQ  r
   )rœ  r   ry   r•  rz   Ú_exprr,  Úhasattrr  rQ  r`  Úinsertr  r‹   ra  Ú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_namerQ  r
   )
r’  r   r†   r   rš  r‰   rœ  r_  ra  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.FunctionCallrQ  rR  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 )Nr‚  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   r‰   r_  ra  r  r†   r  Ú
startswithÚendswithr<  r‡   r   r   )r  r~  Ú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!  r   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   r{   r•  r™   r|   r   r   rˆ   r  Ú
IndexErrorra  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_pathr   rQ  r  úMysqlx.Expr.Expr.Type.IDENTr  )r_  r<  r•  r   rŠ   rœ  r   r†   r   rF  r,  r³  r`  )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_ASTERISKr   r
   z!JSON path may not end in '**' at )r•  r   r‰   r  r®  r,  r±   rœ  r   r   r{   r±  r©   rl  r   r<  ra  )r  Zdoc_pathr­  rD  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²  r   rQ  r
   Z
table_namer   r¥  FTr³  r¨  r©  r!  r€  r  r  r´  r  )r  rœ  r   r†   r•  r‰   rl  r<  ra  Úreverser   ÚrangerŠ   r³  rµ   r¶   r   rF  r,  )r  Úpartsrµ  ru  Zis_docZ	is_quotedr­  r£  rÍ   rÍ   rÎ   Úcolumn_identifierO  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
   )ra  rl  r_  r<  )r  r~  rÍ   rÍ   rÎ   Ú
next_token€  s
    zExprParser.next_tokenc                 C   s$   |   ¡ }|j|kr td|› ƒ‚d S )Nr  )r»  r  r<  )r  r  r~  rÍ   rÍ   rÎ   Úexpect_token‡  s    
zExprParser.expect_tokenc                 C   s   | j | j S r  )r_  ra  r  rÍ   rÍ   rÎ   Ú
peek_tokenŒ  s    zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S rn  )r_  ra  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)* ] "]"
        rH  r  r  r#  r!  r$  )r   ra  rl  r_  r•  r   r|   rF  rž  r,  r‹   rœ  r   )r  r2  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@  rA  r  rB  r  r   r!  r"  )r   ra  rl  r_  r•  r   r¯   rœ  r‡   r«   rž  r,  rF  r‹   r   )r  r2  Úitemr)  rÍ   rÍ   rÎ   Úparse_json_doc§  s"    ÿzExprParser.parse_json_doc)r~  r  c                 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 )Nr€  z&Invalid placeholder name at token pos r  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr!  Úpositionr
   )r•  r   rˆ   rœ  r†   r  r¨   r  rd  r<  ra  r   r   rc  )r  r~  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 RPARENrS  rÛ   ©rQ  rR  r  ©rU  rT  r!  )r   rœ  r   ry   rF  rž  r,  r´   r5  r  rE  Úcast_data_typerP  rz   r   )r  rU  Ztype_scalarr2  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<  ra  )r  r~  Ú	dimensionrÍ   rÍ   rÎ   rÆ  ä  s2    ü
ýÿzExprParser.cast_data_type)rñ   r  c                 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  r   r  rŒ  )	r•  r   ry   rœ  r  rˆ   r‹   rz   rl  )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  rT  r!  rS  r  rÄ  rU  r   rL  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 objectrp  r
   r   r   zUnknown token type = z&  when expecting atomic expression at N)4r»  r  r   r¨   r«   rÃ  r®   rÁ  r{   r¿  r°   rÛ   ry   rž  r¼  rz   r—   r˜   r½  rˆ   r  r_  ra  Úatomic_exprrW  rt   r   rž   r‡   rP  r4  r   r;  r:  r9  r8  r  r~   r€   r7  rŠ   r¶  r™   rÉ  r†   rš  r‰   r”  r§  rb  rº  r<  )r  r~  r)  ÚpeekrÍ   rÍ   rÎ   rÊ  %  sl    

ÿ
ÿþýÿýÿzExprParser.atomic_expr)r–  Úinner_parserr  c                 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  rT  r!  rS  rQ  rR  r
   rU  )
ra  rl  r_  r  r   r   Ú
_OPERATORSr  r,  rF  )r  r–  rÌ  Úlhsr2  rU  rÍ   rÍ   rÎ   Úparse_left_assoc_binary_op_expra  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 )NrS  rR  Zdate_addZdate_subrQ  z#Expected interval type at position r  rÅ  rT  r!  )rÊ  r™  r   r—   r˜   rš  rƒ   r»  r   rF  r,  r  rœ  Úbit_exprÚ_INTERVAL_UNITSr<  ra  r  rE  r¾  rm  rP  r5  r   )r  rÎ  r~  rU  rÍ   rÍ   rÎ   Úadd_sub_intervalt  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 rS  rQ  rR  r  rT  r!  rU  )r×  r•  r   rt   rœ  ra  rl  r_  r  r,  r  rx   r   ry   rF  r¤  rÌ   r‚   r…   r}   ru   r„   r<  r   Ú	_NEGATIONr   )r  ÚparamsrÎ  r  Zop_namerU  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   ru   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   rw   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   rv   r¬   rÜ  r  rÍ   rÍ   rÎ   Úor_exprö  s     ÿzExprParser.or_expr)r  r  c                 C   s,   |r$g | _ d| _i | _d| _|  ¡  |  ¡ S r^  )r_  ra  rc  rd  rf  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ž  ra  r”  rl  r_  r   r´   r<  )r  r  Z
expressionZused_tokensrÍ   rÍ   rÎ   r)    s    
ÿzExprParser.exprc                 C   s   t d|  tj¡dS )NzMysqlx.Crud.ColumnrÄ  )r   rœ  r   r†   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  rŠ  r‹  r‡  rˆ  )rX  Úsplitr·  r¡  Úcountr  rk  )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å  ra  rl  r_  rœ  r   r‹   r   rž  r•  r´   r†   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)ra  rl  r_  rœ  r   r‹   r   rž  r•  r²   r   r³   r  r,  )r  Zorder_specsrè  ÚorderrÍ   rÍ   rÎ   Úparse_order_spec9  s    zExprParser.parse_order_specc                 C   sD   g }d}| j t| jƒk r@|s(|  tj¡ d}| |  ¡  ¡ ¡ q|S )NTF)	ra  rl  r_  rœ  r   r‹   r  rž  r,  )r  Z	expr_listrè  rÍ   rÍ   rÎ   Úparse_expr_listL  s    zExprParser.parse_expr_list)T)F)F)F)F)Hrp   rq   rr   rs   r  r6  r  r  re  r  ro  r  rt  r  r„  rf  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Ç  Ú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Í   rÍ   rÎ   r(  ´  s€   oþ
	þ$1'= 
þ8	þþþr(  N)jrs   Útypingr   r   r   r   r   r   r   r	   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Å   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÑ  ru   rv   rw   rx   rt   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Í  rV  rØ  r  r3  r0  r+  r/  r;  r9  r:  r  r8  rM  r4  r6  r7  rN  r5  rP  r  rW  r\  r(  rÍ   rÍ   rÍ   rÎ   Ú<module>   s6  ( ^ìÿÌ8øß%û	ù	
