o
    9Æ&i÷Â  ã                   @   sÌ  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/i d
ej0“dej1“dej2“dej3“dej4“dej5“dej6“dej7“dej8“dej9“dej:“dej;“dej<“dej=“dej>“dej?“dej@“i dejA“dejB“dej“dej“dej“d ej“d!ej “d"ej!“d#ej"“d$ej#“d%ej“d&ejC“d'ejD“d(ejE“d)ejF“d*ejG“d+ejH“¥i d,ejI“d-ejJ“d.ejK“d/ejL“d0ejM“d1ejN“d2ejO“d3ej$“d4ej%“d5ej&“d6ej'“d7ej(“d8ej)“d9ej*“d:ej+“d;ej,“d<ej-“¥d=ej.i¥ZPejFej<ejIejJejKejLejHejMd>œZQi d?d@“d@d@“d
dA“dd“dBdB“ddB“dd“dd“dCdC“dd“dd“dd“dd“dDdD“dEdD“dFdF“dGdG“i dHdH“dIdI“dJdJ“dAdA“dKdK“dLdL“dMdM“dNdN“dOdO“dPdP“dQdQ“dRdR“dSdS“dd“dTdT“dd“¥ZRdUdVdRddWdXœZSdYdZd[d\d]d^d_d`œZTG dadb„ dbƒZUdceddefdedf„ZVdceddefdgdh„ZWdie	eef ddefdjdk„ZXdlee ddefdmdn„ZYddefdodp„ZZdce[ddefdqdr„Z\dce]ddefdsdt„Z^dce]ddefdudv„Z_dceddefdwdx„Z`dceaddefdydz„Zbdcecddefd{d|„Zddceddefd}d~„Zedefd€eddefdd‚„Zgdƒefddeffd„d…„ZhG d†d‡„ 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Í   ú6C:\wamp64\www\opt\env\Lib\site-packages\mysqlx/expr.pyr   /   s¶    r   Ú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ô   ú=ú==ú&&ú||ú^ú!=ú<>ú>ú>=ú<ú<=ú&ú|ú<<ú>>ú+ú-Ú*ú/ú~ú%Úcont_inZ	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                	   @   sH   e Zd ZdZddedededdfdd	„Zdefd
d„Zdefdd„ZdS )ÚTokenzToken representation class.r
   Ú
token_typeÚvalueÚlengthÚreturnNc                 C   s   || _ || _|| _d S ©N)r  r  r  )Ú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v 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ƒr-tdƒ|d< t| ƒ ¡ |d< |S t| t	t
fƒrDtdƒ|d< t| ƒ ¡ |d< |S 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   sz   t | tƒr	t| ƒS t | tƒrt| ƒS t | tƒrt| ƒS t | tƒr$t| ƒS t | t	ƒr-t
| ƒS | d u r4tƒ S tdt| ƒ› ƒ‚)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  Úobjc                 C   sx   t | tƒr
t| jƒS tdƒ}|  ¡ D ]'\}}tdƒ}t |tƒr#| ¡ 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$  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/  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   ó    t dƒ}tdƒ|d< | |d< |S )NrK  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr!  Zv_doubler   r1  rÍ   rÍ   rÎ   r:  s  ó   r:  c                 C   rM  )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr!  Zv_signed_intr   r1  rÍ   rÍ   rÎ   r8  z  rN  r8  c                 C   rM  )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr!  Zv_unsigned_intr   r1  rÍ   rÍ   rÎ   Úbuild_unsigned_int_scalar  rN  rO  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   rM  )NrK  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr!  Zv_boolr   r1  rÍ   rÍ   rÎ   r7  ‘  rN  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   rM  )Nr  r%  r!  r&  r   r1  rÍ   rÍ   rÎ   Úbuild_literal_exprŸ  rN  rR  ÚnameÚparamc                 C   sF   t dƒ}t|  |d< | ¡ g|d< t dƒ}tdƒ|d< | ¡ |d< |S )NúMysqlx.Expr.OperatorrS  rT  r  úMysqlx.Expr.Expr.Type.OPERATORr!  Úoperator)r   Ú_UNARY_OPERATORSr,  r   )rS  rT  rW  r2  rÍ   rÍ   rÎ   Úbuild_unary_op¦  s   rY  Ústringc                 C   s   |   dd¡S )Nú"z"")Úreplace©rZ  rÍ   rÍ   rÎ   Úescape_literal°  ó   r^  c                   @   s¶  e Zd ZdZddededdfdd„Zdefd	d
„Zd€dd„Zde	dedefdd„Z
de	defdd„Zdde	dedefdd„Zde	defdd„Zd€dd„Zde	ddfdd„Zde	defd d!„Zd"e	defd#d$„Zde	defd%d&„Zd"e	defd'd(„Zde	de	defd)d*„Zde	defd+d,„Zdeeeef  fd-d.„Zdefd/d0„Zdefd1d2„Zdefd3d4„Zdefd5d6„Z defd7d8„Z!deeeef  fd9d:„Z"defd;d<„Z#defd=d>„Z$de	ddfd?d@„Z%defdAdB„Z&defdCdD„Z'defdEdF„Z(defdGdH„Z)dIedefdJdK„Z*defdLdM„Z+defdNdO„Z,ddPede-e fdQdR„Z.e/defdSdT„ƒZ0defdUdV„Z1d"e2e	 dWe3g ef defdXdY„Z4defdZd[„Z5defd\d]„Z6defd^d_„Z7defd`da„Z8defdbdc„Z9defddde„Z:defdfdg„Z;defdhdi„Z<defdjdk„Z=defdldm„Z>ddnedefdodp„Z?ddnedefdqdr„Z@defdsdt„ZAdeBfdudv„ZCdee fdwdx„ZDdeeeef  fdydz„ZEdeeeef  fd{d|„ZFdeeeef  fd}d~„ZGdS )‚r(  zExpression parser class.TrZ  Úallow_relationalr  Nc                 C   s>   || _ g | _g | _d| _|| _i | _d| _|  ¡  |  ¡  d S ©Nr   )	rZ  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r  rZ  r`  rÍ   rÍ   rÎ   r  ·  s   zExprParser.__init__c                 C   s   d| j › dS )Nz<mysqlx.ExprParser 'z'>r]  r  rÍ   rÍ   rÎ   r  Â  ó   zExprParser.__str__c                 C   s¦   t | jtƒst| jƒ| _| j d¡| _t| jƒdkr)| jd dkr)| jdd… | _d| jdd…  ¡ v r<| jdd… | _d| jdd	…  ¡ v rQ| jd	d… | _dS 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'  rZ  r  ÚreprÚstripÚlenÚupperr  rÍ   rÍ   rÎ   rh  Å  s   ÿzExprParser.clean_expressionrA  rð   c                 C   s$   |d t | jƒk o| j|d  |kS ©Nr
   )rp  rZ  )r  rA  rð   rÍ   rÍ   rÎ   Únext_char_isÖ  s   $zExprParser.next_char_isrd  c                 C   s¦   |}d}|t | jƒk rC| j|  ¡ s| j| dkrC| j| dkr*|du r(tdƒ‚d}|d7 }|t | jƒk rC| j|  ¡ s| j| dks| j||… }ttj|t |ƒƒS )NFÚ.Tz"Invalid number. Found multiple '.'r
   )rp  rZ  Úisdigitr<  r  r   rˆ   )r  rd  ÚstartZ	found_dotÚvalrÍ   rÍ   rÎ   Ú
lex_numberÙ  s"   ÿ÷ÿ	zExprParser.lex_numberFÚiÚallow_spacec                 C   s  |}|t | jƒk rB| j|  ¡ s | j| dks | j|  ¡ rB|rB|d7 }|t | jƒk rB| j|  ¡ s | j| dks | j|  ¡ rB|s | j||… }z1|t | jƒk rj| j| dkrj| ¡ tvrjttj|t |ƒƒ}W |S tt	| ¡  | ¡ t |ƒƒ}W |S  t
y   ttj|t |ƒƒ}Y |S w )NÚ_r
   r  )rp  rZ  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr  r   r†   Ú_RESERVED_WORDSÚKeyError)r  ry  rz  rv  rw  ÚtokenrÍ   rÍ   rÎ   Ú	lex_alphaê  s>   ÿÿÿûÿÿÿýþþzExprParser.lex_alphac                 C   s  | j | }d}|d7 }|}|t| j ƒk r[| j | }||kr0|d t| j ƒk r0| j |d  |kr0n+||dfv rL|d t| j ƒkr@n|d7 }|| j | 7 }n||7 }|d7 }|t| j ƒk s|t| j ƒksi| j | |krpt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   )rZ  rp  r<  r  r   r†   r‡   )r  rA  Ú
quote_charrw  rv  rð   rÍ   rÍ   rÎ   Úlex_quoted_token  s.   

ïzExprParser.lex_quoted_tokenc                 C   sæ  d}d}d}|t | jƒk rq| j| }| ¡ r|d7 }q| ¡ r'|  |¡}n6| ¡ s/|dkr7|  ||¡}n&|dkrCttj	|ƒ}n|dkrOttj
|ƒ}n|dkr[ttj|ƒ}n|dkrgttj|ƒ}nö|d	krsttj|ƒ}nê|d
kr’|  |d¡rŠ|sŠttjddƒ}d}nÓttj|ƒ}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rÅttj|ƒ}n˜|dkrÑttj|ƒ}nŒ|dkrí|  |d¡rättjddƒ}nyttjddƒ}np|dkr
|  |d¡rttjddƒ}n[ttj|ƒ}nS|dkrttj|ƒ}nF|dkr4|  |d¡r,ttjddƒ}n1ttj|ƒ}n)|dkrAttj|ƒ}n|dkrNttj|ƒ}n|dkr[ttj|ƒ}n|dkrgttj|ƒ}nö|dkrsttj |ƒ}nê|d krttj!|ƒ}nÞ|d!krš|  |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 |  |d¡rÌttj%d&dƒ}n‘ttj&|ƒ}nŠ|dkrý|  |d¡rçttj'd'dƒ}nv|  |d¡röttj(d(dƒ}ngttj)|ƒ}n`|d)kr2|  |d¡rttj*d*dƒ}nL|d t | jƒk r+| j|d   ¡ r+|  |¡}n2ttj+|ƒ}n+|d+v rK|rKttj,|ƒ}|sFd}nd}d}n|d,v rV|  -|¡}nt.d-|› ƒ‚| j/ 0|¡ ||j17 }|t | jƒk sd S d S ).Nr   Fr
   r{  ú?ú:Ú{Ú}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ÿ   rt  z.*)ú'r[  )r[  r‘  r†  zUnknown character at )2rp  rZ  r}  ru  rx  Úisalpharƒ  r  r   r¨   r«   r®   r¯   r—   rs  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<  rb  Úappendr  )r  ry  Z
arrow_lastZinside_arrowrð   r‚  rÍ   rÍ   rÎ   ri    sÆ   













(

—zExprParser.lexr  c              	   C   sj   | j t| jƒkrtd|› d| j › dƒ‚| j| j  j|kr3t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 )rd  rp  rb  r<  r  ©r  r  rÍ   rÍ   rÎ   Úassert_cur_token  s   ÿ
ÿÿÿÿzExprParser.assert_cur_tokenc                 C   s   |   | j|¡S r  ©Úpos_token_type_isrd  r•  rÍ   rÍ   rÎ   Úcur_token_type_is™  rj  zExprParser.cur_token_type_isÚtypesc                 G   s"   | j t| jƒk o| j| j  j|v S r  ©rd  rp  rb  r  ©r  rš  rÍ   rÍ   rÎ   Úcur_token_type_inœ  s   "zExprParser.cur_token_type_inc                 C   s   |   | jd |¡S rr  r—  r•  rÍ   rÍ   rÎ   Únext_token_type_isŸ  s   zExprParser.next_token_type_isc                 G   s&   | j t| jƒk o| j| j d  j|v S rr  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  )rp  rb  r  )r  rd  r  rÍ   rÍ   rÎ   r˜  ¨  s   zExprParser.pos_token_type_isc                 C   s*   |   |¡ | j| j j}|  jd7  _|S rr  )r–  rb  rd  r  )r  r  r  rÍ   rÍ   rÎ   Úconsume_token«  s   
zExprParser.consume_tokenc                 C   sî   g }d}|   tj¡ |  tj¡sh|  ¡  ¡ }t|dƒr+|jj	r+| j
 d|jj	¡ d}nt|dƒsGd|v rGd|d v rG| j
 d|d d ¡ d}| |¡ |  tj¡rh|  jd7  _| |  ¡  ¡ ¡ |  tj¡sR|   tj¡ |ru| j
 ¡  |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        FÚ
identifierr   TrS  r
   )r   r   ry   r™  rz   Ú_exprr,  Úhasattrr¡  rS  rc  Úinsertr“  r‹   rd  Úpop)r  ÚexprsZpath_name_addedÚmsg_exprrÍ   rÍ   rÎ   Úparen_expr_list±  s.   ÿ
þ
zExprParser.paren_expr_listc                 C   s`   |   tj¡ tdƒ}|  tj¡r|  tj¡|d< |  tj¡ | j| j j	|d< |  jd7  _|S )NzMysqlx.Expr.IdentifierÚschema_namerS  r
   )
r–  r   r†   r   rž  r‰   r   rb  rd  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.FunctionCallrS  rT  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r0|j d¡r&|j 	d¡r&t
|j› dƒ‚|   tj¡ |j}n|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‰   rb  rd  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¡r$|   tj¡ |   tj¡ tdƒ}tdƒ|d< |S |  tj¡rTt	|   tj¡ƒ}|dk r>t
d| j› ƒ‚|   tj¡ tdƒ}tdƒ|d< ||d< |S td| j› ƒ‚)	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  Ú
IndexErrorrd  r<  )r  r±  r  rÍ   rÍ   rÎ   Údocpath_array_locü  s2   ÿÿÿÿzExprParser.docpath_array_locc                 C   s¸   | j stdƒ‚|  tj¡r|  tj¡ tdƒ}|  tj¡r9tdƒ}tdƒ|d< |  tj¡|d< |d  	| 
¡ g¡ |d  	|  ¡ ¡ | jrL| 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   rS  r  úMysqlx.Expr.Expr.Type.IDENTr¡  )rb  r<  r™  r   rŠ   r   r   r†   r   rF  r,  r·  rc  )r  Úcol_idr±  r)  rÍ   rÍ   rÎ   Údocument_field  s&   ÿzExprParser.document_fieldc                 C   s   g }	 |   tj¡r| |  ¡  ¡ ¡ nM|   tj¡r1|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ n/|   tj
¡rA| |  ¡  ¡ ¡ n|   tj¡r_|  tj¡ tdƒ}t	dƒ|d< | | ¡ ¡ nn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)
        Tr¬  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©   rp  r   r<  rd  )r  Zdoc_pathr±  rD  rÍ   rÍ   rÎ   r·  +  s8   ÿÿìÿzExprParser.document_pathc                 C   sÂ  g }|  |  tj¡¡ |  tj¡r&|  tj¡ |  |  tj¡¡ |  tj¡st|ƒdkr4td| j› ƒ‚| 	¡  t
dƒ}tdt|ƒƒD ]"}|dkrP|d |d< qC|dkr[|d |d< qC|dkre|d |d	< qCd
}|  tj¡r}d}|  tj¡ |  ¡ |d< n2|  tj¡r¯d}|  tj¡ d
}|  tj¡r›d}|  tj¡ |  tj¡ |  ¡ |d< |r¯|  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   rS  r
   Z
table_namer   r©  FTr·  r¬  r­  r!  r„  r  r  r¸  r¡  )r“  r   r   r†   r™  r‰   rp  r<  rd  Úreverser   ÚrangerŠ   r·  rµ   r¶   r   rF  r,  )r  Úpartsr¹  ry  Zis_docZ	is_quotedr±  r§  rÍ   rÍ   rÎ   Úcolumn_identifierO  sZ   þ€ÿzExprParser.column_identifierc                 C   s6   | j t| jƒkrtdƒ‚| j| j  }|  j d7  _ |S )NzUnexpected end of token streamr
   )rd  rp  rb  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  )rb  rd  r  rÍ   rÍ   rÎ   Ú
peek_tokenŒ  r_  zExprParser.peek_tokenc                 C   s    | j | j j}|  jd7  _|S rr  )rb  rd  r  )r  r  rÍ   rÍ   rÎ   Úconsume_any_token  s   zExprParser.consume_any_tokenc                 C   s¢   t dƒ}| jt| jƒk r9|  tj¡s9|d  |  ¡  	¡ g¡ |  tj
¡s%n|  tj
¡ | jt| jƒk r9|  tj¡r|  tj¡ t dƒ}tdƒ|d< | 	¡ |d< |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        rH  r  r  r#  r!  r$  )r   rd  rp  rb  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 rQ|  tj¡sQt dƒ}|  tj¡|d< |  tj	¡ |  
¡  ¡ |d< |d  | ¡ g¡ |  tj¡s=n|  tj¡ | jt| jƒk rQ|  tj¡r|  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   rd  rp  rb  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_docr‚  c                 C   s¸   d}|   tj¡r|  tj¡}n!|   tj¡r|  tj¡}n|jtjkr(t| jƒ}nt	d| j
› ƒ‚tdƒ}tdƒ|d< || jv rH| j| |d< |S | 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  rg  r<  rd  r   r   rf  )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 RPARENrU  rÛ   ©rS  rT  r  ©rW  rV  r!  )r   r   r   ry   rF  r¢  r,  r´   r5  r  rE  Úcast_data_typerR  rz   r   )r  rW  Ztype_scalarr2  rÍ   rÍ   rÎ   rÛ   Ö  s   zExprParser.castc                 C   sÞ   |   ¡ }|jtjtjtjtjfv r!|  ¡ }|r|j› |› S |jS |jtj	u r8|  d¡}|r5|j› |› S |jS |jtj
tjfv rP|  tj¡rM|  tj¡ |jS |jtjtjtjfv r^|jS td|j› d| j› d|j› dƒ‚)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  )r¿  r  r   r·   rº   r¸   r¹   Úcast_data_type_dimensionr  r¼   r½   r¿   r™  r¾   r   rÀ   r»   r<  rd  )r  r‚  Ú	dimensionrÍ   rÍ   rÎ   rÊ  ä  s6   ü
ýÿÿzExprParser.cast_data_typerò   c                 C   s¢   |   tj¡sdS g }|  tj¡ | |  tj¡¡ |r0|   tj¡r0|  tj¡ | |  tj¡¡ |  tj¡ t|ƒdkrDd|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   rp  )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  rV  r!  rU  r  rÈ  rW  r   rL  rÍ   rÍ   rÎ   Ústar_operator  s   zExprParser.star_operatorc                 C   sP  |   ¡ }|jtjtjfv r|  |¡S |jtjkr|  ¡ S |jtjkr&|  	¡ S |jtj
kr0|  ¡ S |jtjkrB|  ¡ }|  tj¡ |S |jtjtjfv rl|  ¡ }|jtjkrd|j|j | j| j _|  ¡ S t|j|  ¡ ƒS |jtjtjtjfv rt|j|  ¡ ƒS |jtjkrŒtt|jƒƒS |jtjkr—tt ƒ ƒS |jtjkr´d|jv r«tt!t"|jƒƒƒS tt#t$|jƒƒƒS |jtj%tj&fv rÇtt'|jtj%kƒƒS |jtj(krÑ|  )¡ S |jtj*krÛ|  +¡ S |jtj,kr| 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› ƒ‚)z<Parse an atomic expression and return a protobuf Expr objectrt  r
   r   r   zUnknown token type = z&  when expecting atomic expression at )4r¿  r  r   r¨   r«   rÇ  r®   rÅ  r{   rÃ  r°   rÛ   ry   r¢  rÀ  rz   r—   r˜   rÁ  rˆ   r  rb  rd  Úatomic_exprrY  rt   r   rž   r‡   rR  r4  r   r;  r:  r9  r8  r  r~   r€   r7  rŠ   rº  r™   rÍ  r†   rž  r‰   r˜  r«  re  r¾  r<  )r  r‚  r)  ÚpeekrÍ   rÍ   rÎ   rÎ  %  sr   


ÿ
ÿþý
ÿÿý
ÿÿzExprParser.atomic_exprÚinner_parserc                 C   s¾   |ƒ }| j t| jƒk r]| j| j  j|v r]tdƒ}tdƒ|d< tdƒ}t| j| j  j |d< | ¡ g|d< |  j d7  _ |d  	|ƒ  ¡ g¡ ||d< |}| j t| jƒk r]| j| j  j|v s|S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionr  rV  r!  rU  rS  rT  r
   rW  )
rd  rp  rb  r  r   r   Ú
_OPERATORSr  r,  rF  )r  rš  rÐ  Úlhsr2  rW  rÍ   rÍ   rÎ   Úparse_left_assoc_binary_op_expra  s   ""÷
z*ExprParser.parse_left_assoc_binary_op_exprc                 C   sè   |   ¡ }|  tjtj¡rr|  tj¡rr|  ¡ }tdƒ}|d  	| 
¡ g¡ |jtju r,dnd|d< |  tj¡ |d  	|  ¡  
¡ g¡ | jtŽ sOtd| j› ƒ‚t |  ¡  ¡ ¡}|d  	tt|ƒƒ 
¡ g¡ td|d}td	ƒ|d
< |S )NrU  rT  Zdate_addZdate_subrS  z#Expected interval type at position r  rÉ  rV  r!  )rÎ  r  r   r—   r˜   rž  rƒ   r¿  r   rF  r,  r  r   Úbit_exprÚ_INTERVAL_UNITSr<  rd  r  rE  rÂ  rq  rR  r5  r   )r  rÒ  r‚  rW  rÍ   rÍ   rÎ   Úadd_sub_intervalt  s,   ÿ
þÿ
ÿzExprParser.add_sub_intervalc                 C   ó   |   ttjtjtjgƒ| j¡S r  )rÓ  Úsetr   r™   rš   rª   rÖ  r  rÍ   rÍ   rÎ   Úmul_div_expr‘  ó   þzExprParser.mul_div_exprc                 C   ó   |   ttjtjgƒ| j¡S r  )rÓ  rØ  r   r—   r˜   rÙ  r  rÍ   rÍ   rÎ   Úadd_sub_expr—  ó   ÿzExprParser.add_sub_exprc                 C   rÛ  r  )rÓ  rØ  r   r•   r–   rÜ  r  rÍ   rÍ   rÎ   Ú
shift_exprœ  rÝ  zExprParser.shift_exprc                 C   r×  r  )rÓ  rØ  r   r’   r“   r”   rÞ  r  rÍ   rÍ   rÎ   rÔ  ¡  rÚ  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   sR  g }|   ¡ }d}|  tj¡rd}|  tj¡ | jt| jƒk r'| | 	¡ ¡ | j| j j
}|  tj¡rQ|  tj¡ |  tj¡rGd}|  tj¡ | |   ¡  	¡ ¡ n®|  tj¡rw|  tj¡ |  tj¡rk| |  ¡ ¡ n”d}| |   ¡  	¡ ¡ nˆ|  tj¡r|  tj¡ | |   ¡  	¡ ¡ nr|  tj¡r¸|  tj¡ | |   ¡  	¡ ¡ |  tj¡r·|  tj¡ | |   ¡  	¡ ¡ nG|  tj¡rÝ|  tj¡ | |   ¡  	¡ ¡ |  tj¡ | |   ¡  	¡ ¡ n"|  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 rU  rS  rT  r  rV  r!  rW  )rß  r™  r   rt   r   rd  rp  rb  r“  r,  r  rx   r   ry   rF  r¨  rÌ   r‚   r…   r}   ru   r„   r<  r   Ú	_NEGATIONr   )r  ÚparamsrÒ  r  Zop_namerW  r§  rÍ   rÍ   rÎ   Ú	ilri_expr¶  sf   €zExprParser.ilri_exprc                 C   rÛ  r  )rÓ  rØ  r   ru   r­   râ  r  rÍ   rÍ   rÎ   Úand_exprî  rÝ  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   rÛ  r  )rÓ  rØ  r   rv   r¬   rä  r  rÍ   rÍ   rÎ   Úor_exprö  rÝ  zExprParser.or_exprr  c                 C   s,   |rg | _ d| _i | _d| _|  ¡  |  ¡ S ra  )rb  rd  rf  rg  ri  rå  )r  r  rÍ   rÍ   rÎ   r¢  û  s   zExprParser._exprc                 C   sd   |   |¡}| j}|  t| jƒd tj¡r|d7 }|t| jƒk r0td| j| jd … › d| j› ƒ‚|S )Nr   zUnused token types z" found in expression at position: )r¢  rd  r˜  rp  rb  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s0| d¡| d¡ks0| d¡| d¡krW| ¡ › d|› }| d¡| d¡ks0| d¡| d¡ks0| d¡| d¡ks0| | ¡ ¡ |s|S )Nr  r  r  rŽ  r  r‹  rŒ  )rZ  Úsplitr»  r¥  Úcountr“  ro  )r  ÚfieldsÚtempÚfieldrÍ   rÍ   rÎ   Ú_table_fields  s   üø	zExprParser._table_fieldsc                 C   s    g }d}|   ¡ }| jt| jƒk rN|s|  tj¡ d}td|  ¡ d}|  	tj
¡r7|  tj
¡ |  tj¡|d< n|t|ƒ |d< | | ¡ ¡ | jt| jƒk s|S )NTFzMysqlx.Crud.Projection)ÚsourceÚalias)rí  rd  rp  rb  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 rR|s|  tj¡ d}td|  ¡ d}|  tj	¡r1t
dƒ|d< |  tj	¡ n|  tj¡rCt
dƒ|d< |  tj¡ | | ¡ ¡ | j t| jƒk s|S )NTFzMysqlx.Crud.Order)r)  zMysqlx.Crud.Order.Direction.ASCÚ	directionz Mysqlx.Crud.Order.Direction.DESC)rd  rp  rb  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   sR   g }d}| j t| jƒk r'|s|  tj¡ d}| |  ¡  ¡ ¡ | j t| jƒk s|S )NTF)	rd  rp  rb  r   r   r‹   r“  r¢  r,  )r  Z	expr_listrð  rÍ   rÍ   rÎ   Úparse_expr_listL  s   üzExprParser.parse_expr_list)T)r  N)F)Hrp   rq   rr   rs   r  r6  r  r  rh  r  rs  r  rx  rƒ  rˆ  ri  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   Ú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Å   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Ñ  rX  rà  r  r3  r0  r+  r/  r;  r9  r:  r  r8  rO  r4  r6  r7  rP  r5  rR  r  rY  r^  r(  rÍ   rÍ   rÍ   rÎ   Ú<module>   sâ  ( ^ìÿÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì8øÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß%û	ù	
