3
S^              5   @   s  d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZ G dd deZeejejejejejejejejejejejejejejejejejej ej!ej"gZ#ej$ej%ej&ej'ej(ej)ej*ej+ej,ej-ej.ej/ej0ej1ej2ej3ej4ej5ej6ejejejejejejejejejej7ej8ej9ej:ej;ej<ej=ej>ej?ej@ejAejBejCejejejejejejejejej ej!ej"d4ZDej:ej0ej=ej>ej?ej@ej<ejAd	ZEd
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'!ZFd(d)d"dd*d+ZGd,d-d.d/d0d1d2d3ZHG d4d5 d5eZId6d7 ZJd8d9 ZKd:d; ZLd<d= ZMd>d? ZNd@dA ZOdBdC ZPdDdE ZQdFdG ZRdHdI ZSdJdK ZTdLdM ZUdNdO ZVdPdQ ZWG dRdS dSeZXdTS )UzExpression Parser.   )STRING_TYPES
BYTE_TYPESUNICODE_TYPES)get_item_or_attr)DbDoc)Messagemysqlxpb_enumc               @   sp  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZS )[	TokenTyper                        	   
                                                                      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   N)\__name__
__module____qualname__NOTANDORXORISLPARENRPAREN
LSQBRACKET
RSQBRACKETBETWEENTRUENULLFALSEINLIKEINTERVALREGEXPESCAPEIDENTLSTRINGLNUMDOTDOLLARCOMMAEQNEGTGELTLEBITANDBITORBITXORLSHIFTRSHIFTPLUSMINUSMULDIVHEXBINNEGBANGMICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAREROTEME
DOUBLESTARMODCOLONORORANDANDLCURLYRCURLYCASTDOTSTARORDERBY_ASCORDERBY_DESCASARROWQUOTEBINARYDATETIMETIMECHARDATEDECIMALSIGNEDINTEGERUNSIGNEDJSONSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECONDHOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECOND
DAY_SECOND
DAY_MINUTEDAY_HOUR
YEAR_MONTHOVERLAPS r   r   =/tmp/pip-build-8app2_gc/mysql-connector-python/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   z==z&&r   z||r   r   ^r   r   r   r   z!=>z>=<z<=&|z<<z>>+-*/~%r   cont_inr   )!=z==r   r   z||r   r   r   r   r   r   r   r   z!=z<>r   z>=r   z<=r   z&&r   z<<z>>r   r   r   r   r   r   r   r   r   Z	sign_plusZ
sign_minus!)r   r   r   r   r   is_notZnot_betweenZ
not_regexpZnot_likeZnot_inZnot_cont_inZnot_overlaps)r   r   r   r   r   r   r   c               @   s&   e Zd Zd	ddZdd Zdd ZdS )
Tokenr   c             C   s   || _ || _|| _d S )N)
token_typevaluelength)selfr   r   r   r   r   r   __init__  s    zToken.__init__c             C   s   | j  S )N)__str__)r   r   r   r   __repr__  s    zToken.__repr__c             C   s@   | j tjks$| j tjks$| j tjkr4dj| j | jS dj| j S )Nz{0}({1})z{0})r   r	   rw   ry   rx   formatr   )r   r   r   r   r     s
    zToken.__str__N)r   )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| j |d< nHt| t	t
frtd|d< t| j |d< ntd	|d< t| j |d
< |S )NzMysqlx.Expr.ExprT)reparsezMysqlx.Expr.Expr.Type.OBJECTtypeobjectzMysqlx.Expr.Expr.Type.ARRAYarrayz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jt| d S )NzUnsupported data type: {0}.)r  r   build_string_scalarr   build_bytes_scalarboolbuild_bool_scalarintbuild_int_scalarfloatbuild_double_scalarbuild_null_scalar
ValueErrorr   r   )r   r   r   r   r  7  s    




r  c             C   s|   t | trt| jS td}xZ| j D ]N\}}td}t |trH|j n||d< t|j	 |d< |d j
|j	 g q&W |S )NzMysqlx.Expr.ObjectzMysqlx.Expr.Object.ObjectFieldkeyr   fld)r  r   r  __dict__r   itemsr   encoder  r	  extend)objr  r  r   pairr   r   r   r  G  s    

r  c             C   s$   t d}|d jdd | D  |S )NzMysqlx.Expr.Arrayr   c             S   s   g | ]}t |j qS r   )r  r	  ).0r   r   r   r   
<listcomp>V  s    zbuild_array.<locals>.<listcomp>)r   r  )r  r  r   r   r   r  T  s    r  c              C   s   t d} td| d< | S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr   )r   r   )r  r   r   r   r  Z  s    r  c             C   s    t d}td|d< | |d< |S )NzMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr   Zv_double)r   r   )r   r  r   r   r   r  `  s    r  c             C   s    t d}td|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_SINTr   Zv_signed_int)r   r   )r   r  r   r   r   r  g  s    r  c             C   s    t d}td|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_UINTr   Zv_unsigned_int)r   r   )r   r  r   r   r   build_unsigned_int_scalarm  s    r$  c             C   s@   t | trtt| d} td}td|d< td| d|d< |S )Nzutf-8zMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_STRINGr   zMysqlx.Datatypes.Scalar.String)r   Zv_string)r  r   bytes	bytearrayr   r   )r   r  r   r   r   r  s  s    
r  c             C   s    t d}td|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_BOOLr   Zv_bool)r   r   )r   r  r   r   r   r  |  s    r  c             C   s(   t d}td|d< t d| d|d< |S )NzMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr   zMysqlx.Datatypes.Scalar.Octets)r   Zv_octets)r   r   )r   r  r   r   r   r    s    r  c             C   s    t d}td|d< | |d< |S )NzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.LITERALr   r  )r   r   )r   r  r   r   r   build_literal_expr  s    r'  c             C   sF   t d}t|  |d< |j g|d< t d}td|d< |j |d< |S )NzMysqlx.Expr.OperatornameparamzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr   operator)r   _UNARY_OPERATORSr	  r   )r(  r)  r*  r  r   r   r   build_unary_op  s    r,  c             C   s   | j ddS )N"z"")replace)stringr   r   r   escape_literal  s    r0  c               @   s  e Zd ZdoddZdd Zdd Zdd	 Zd
d ZdpddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dqdBdCZ#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0drd^d_Z1dsd`daZ2dbdc Z3ddde Z4dfdg Z5dhdi Z6djdk Z7dldm Z8dnS )tr  Fc             C   s8   || _ g | _d| _|| _i | _d| _| j  | j  d S )N    )r/  tokenspos_allow_relational_columnsplaceholder_name_to_positionpositional_placeholder_countclean_expressionlex)r   r/  Zallow_relationalr   r   r   r     s    zExprParser.__init__c             C   s   dj | jS )Nz<mysqlx.ExprParser '{}'>)r   r/  )r   r   r   r   r     s    zExprParser.__str__c             C   s   t | jtst| j| _| jjd| _t| jdkrR| jd	 dkrR| jdd
 | _d| jdd j krx| jdd | _d| jdd j kr| jdd | _dS )zRemoves 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;  )r  r/  r   reprstriplenupper)r   r   r   r   r7    s    zExprParser.clean_expressionc             C   s$   |d t | jk o"| j|d  |kS )Nr   )r>  r/  )r   r  r   r   r   r   next_char_is  s    zExprParser.next_char_isc             C   s   |}d}xX|t | jk r`| j| j s4| j| dkr`| j| dkrV|dkrRtdd}|d7 }q
W | j|| }ttj|t |S )NF.Tz"Invalid number. Found multiple '.'r   )r>  r/  isdigitr  r   r	   ry   )r   r3  startZ	found_dotvalr   r   r   
lex_number  s    zExprParser.lex_numberc             C   s   |}xH|t | jk rL| j| j sB| j| dksB| j| j rL|rL|d7 }qW | j|| }y\|t | jk r| j| dkr|j tkrttj|t |}ntt	|j  |j t |}W n& t
k
r   ttj|t |}Y nX |S )N_r   ()r>  r/  isalnumisspacelower%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr   r	   rw   _RESERVED_WORDSKeyError)r   iZallow_spacerC  rD  tokenr   r   r   	lex_alpha  s     zExprParser.lex_alphac             C   s  | j | }d}|d7 }|}x|t| j k r| j | }||krd|d t| j k rd| j |d  |krdP nD||kst|dkr|d t| j krP |d7 }|| j | 7 }n||7 }|d7 }qW |t| j ks| j | |krtdj||dkrttj|t|d S ttj|t|d S )N r   \z*Unterminated quoted string starting at {0}`r
   )r/  r>  r  r   r   r	   rw   rx   )r   r  
quote_charrD  rC  r   r   r   r   lex_quoted_token  s,    

zExprParser.lex_quoted_tokenc             C   s  d}d}d}x |t | jk r| j| }|j r@|d7 }qn|j rV| j|}n|j sf|dkrv| j||}n|dkrttj	|}nh|dkrttj
|}nP|dkrttj|}n8|dkrttj|}n |d	krttj|}n|d
kr2| j|dr"| r"ttjdd}d}nttj|}n|dkrj| j|drZttjdd}nttj|}n|dkrttj|}nr|dkrttj|}nX|dkrttj|}n>|dkr| j|drttjdd}nttjdd}n|dkr*| j|drttjdd}nttj|}n|dkrDttj|}n|dkr|| j|drlttjdd}nttj|}nz|dkrttj|}n`|dkrttj|}nF|dkrttj|}n,|dkrttj|}n|dkrttj |}n|d krttj!|}n|d!krP| j|dr@ttj"d"d}nttj#|}n|d#kr| j|drxttj"d$d}nH| j|d#rttj$d%d}n*| j|drttj%d&d}nttj&|}n2|dkr| j|drttj'd'd}n*| j|dr
ttj(d(d}nttj)|}n|d)kr| j|dr@ttj*d*d}n@|d t | jk rt| j|d  j rt| j|}nttj+|}nt|d+ks|d,kr|rttj,|}|sd}nd}d}n8|d,ks|d+ks|d-kr| j-|}nt.d.j/|| j0j1| ||j27 }qW d S )/Nr1  Fr   rF  ?:{}r   r   r   z->r
   Tr   z**r   $r   r   z==r   z&&r   r   z||rG  )[]r   ,r   z!=r   z<>z<<z<=z>>z>=rA  z.*'r-  rS  zUnknown character at {0})3r>  r/  rI  rB  rE  isalpharP  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   rU  r  r   r2  appendr   )r   rN  Z
arrow_lastZinside_arrowr   rO  r   r   r   r8    s    



















(zExprParser.lexc             C   sT   | j t| jkr"tdj|| j | j| j  j|krPtdj|| j | j| j  d S )Nz5Expected token type {0} at pos {1} but no tokens leftz5Expected token type {0} at pos {1} but found type {2})r3  r>  r2  r  r   r   )r   r   r   r   r   assert_cur_tokenm  s    zExprParser.assert_cur_tokenc             C   s   | j | j|S )N)pos_token_type_isr3  )r   r   r   r   r   cur_token_type_isv  s    zExprParser.cur_token_type_isc             G   s"   | j t| jk o | j| j  j|kS )N)r3  r>  r2  r   )r   typesr   r   r   cur_token_type_iny  s    zExprParser.cur_token_type_inc             C   s   | j | jd |S )Nr   )rc  r3  )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 )Nr   )r3  r>  r2  r   )r   re  r   r   r   next_token_type_in  s    zExprParser.next_token_type_inc             C   s   |t | jk o| j| j|kS )N)r>  r2  r   )r   r3  r   r   r   r   rc    s    zExprParser.pos_token_type_isc             C   s*   | j | | j| j j}|  jd7  _|S )Nr   )rb  r2  r3  r   )r   r   r   r   r   r   consume_token  s    
zExprParser.consume_tokenc             C   sp   g }| j tj | jtjs`|j| j j  x0| jtjr^|  j	d7  _	|j| j j  q0W | j tj |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        r   )
ri  r	   rj   rd  rk   ra  _exprr	  r|   r3  )r   exprsr   r   r   paren_expr_list  s    zExprParser.paren_expr_listc             C   s`   | j tj td}| jtjr<| jtj|d< | jtj | j| j j	|d< |  jd7  _|S )NzMysqlx.Expr.Identifierschema_namer(  r   )
rb  r	   rw   r   rg  rz   ri  r2  r3  r   )r   identr   r   r   
identifier  s    zExprParser.identifierc             C   sD   t d}| j |d< | j |d< t d}td|d< |j |d< |S )NzMysqlx.Expr.FunctionCallr(  r)  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.FUNC_CALLr   function_call)r   ro  rl  r   r	  )r   rp  msg_exprr   r   r   rp    s    zExprParser.function_callc             C   s   | j tj | j| j }|jtjkr`|jjdrL|jj	drLt
dj|j| j tj |j}n0|jtjkr| j tj |j}nt
dj| jtd}td|d< ||d< |S )NrS  z-{0} is not a valid JSON/ECMAScript identifierzBExpected token type IDENT or LSTRING in JSON path at token pos {0}zMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr   r   )ri  r	   rz   r2  r3  r   rw   r   
startswithendswithr  r   rx   r   r   )r   rO  member_namedoc_path_itemr   r   r   docpath_member  s$    


zExprParser.docpath_memberc             C   s   | j tj | jtjrH| j tj | j tj td}td|d< |S | jtjrt	| j tj}|dk r|t
dj| j| j tj td}td|d< ||d< |S tdj| jd S )	NzMysqlx.Expr.DocumentPathItemz6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKr   r1  z%Array index cannot be negative at {0}z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXindexzJException token type MUL or LNUM in JSON path array index at token pos {0})ri  r	   rl   rd  r   rm   r   r   ry   r  
IndexErrorr   r3  r  )r   ru  r   r   r   r   docpath_array_loc  s*    


zExprParser.docpath_array_locc             C   s~   t d}| jtjrLt d}td|d< | jtj|d< |d j|j g |d j| j  t d}td|d< ||d	< |S )
NzMysqlx.Expr.ColumnIdentifierzMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr   r   document_pathzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTro  )	r   rd  r	   rw   r   ri  r  r	  rz  )r   col_idru  r  r   r   r   document_field  s    
zExprParser.document_fieldc             C   s  g }x| j tjr&|j| j j  q| j tjrb| jtj td}t	d|d< |j|j  q| j tj
r|j| j j  q| j tjr| jtj td}t	d|d< |j|j  qP qW t|}|dkrt||d  dt	dkrtdj| j|S )zParse 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)
        zMysqlx.Expr.DocumentPathItemz1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKr   z1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKr1  r   z$JSON path may not end in '**' at {0})rd  r	   rz   ra  rv  r	  r   ri  r   r   rl   ry  r   r>  r   r  r   r3  )r   Zdoc_pathru  r  r   r   r   rz    s2    



zExprParser.document_pathc             C   s  g }|j | jtj x.| jtjrD| jtj |j | jtj qW t|dkrbtdj| j	|j
  td}xVtdt|D ]D}|dkr|d |d< q|dkr|d |d< q|dkr|d |d	< qW d
}| jtjrd}| jtj | j |d< nj| jtjrbd}| jtj d
}| jtjr8d}| jtj | jtj | j |d< |rb| jtj |rt|d dkrtd}td|d< d|d< |d j|j g td}td|d< ||d< |S )Nr   z#Too many parts to identifier at {0}zMysqlx.Expr.ColumnIdentifierr1  r(  r   Z
table_namer
   rm  FTrz  zMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr   rQ  r   zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTro  )ra  ri  r	   rw   rd  rz   r>  r  r   r3  reverser   ranger{   rz  r   r   r   r  r	  )r   partsr{  rN  Zis_docZ	is_quotedru  rq  r   r   r   column_identifier  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   )r3  r>  r2  r  )r   rO  r   r   r   
next_token=  s
    zExprParser.next_tokenc             C   s$   | j  }|j|kr tdj|d S )NzExpected token type {0})r  r   r  r   )r   r   rO  r   r   r   expect_tokenD  s    
zExprParser.expect_tokenc             C   s   | j | j S )N)r2  r3  )r   r   r   r   
peek_tokenI  s    zExprParser.peek_tokenc             C   s    | j | j j}|  jd7  _|S )Nr   )r2  r3  r   )r   r   r   r   r   consume_any_tokenL  s    zExprParser.consume_any_tokenc             C   s   t d}xT| jt| jk r\| jtj r\|d j| j j	 g | jtj
sNP | jtj
 q
W | jtj t d}td|d< |j	 |d< |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        zMysqlx.Expr.Arrayr   zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.ARRAYr   r  )r   r3  r>  r2  rd  r	   rm   r  rj  r	  r|   ri  r   )r   r  r  r   r   r   parse_json_arrayQ  s    zExprParser.parse_json_arrayc             C   s   t d}x| jt| jk r| jtj rt d}| jtj|d< | jtj	 | j
 j |d< |d j|j g | jtjs~P | jtj q
W | jtj t d}td|d< |j |d	< |S )
z
        jsonDoc              ::=  "{" [jsonKeyValue ("," jsonKeyValue)*] "}"
        jsonKeyValue         ::=  STRING_DQ ":" expr
        zMysqlx.Expr.ObjectzMysqlx.Expr.Object.ObjectFieldr  r   r  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OBJECTr   r  )r   r3  r>  r2  rd  r	   r   ri  rx   r   rj  r	  r  r|   r   )r   r  itemr  r   r   r   parse_json_docc  s     zExprParser.parse_json_docc             C   s   d}| j tjr| jtj}nB| j tjr8| jtj}n(|jtjkrPt| j}nt	dj
| jtd}td|d< || jkr| j| |d< n$| j|d< | j| j|< |  jd7  _|S )NrQ  z)Invalid placeholder name at token pos {0}zMysqlx.Expr.Exprz!Mysqlx.Expr.Expr.Type.PLACEHOLDERr   positionr   )rd  r	   ry   ri  rw   r   r   strr6  r  r   r3  r   r   r5  )r   rO  Zplace_holder_namerq  r   r   r   parse_place_holderz  s"    


zExprParser.parse_place_holderc             C   s   t ddd}| jtj |d j| j j g | jtj tt	j
| j }|d jt|j g | jtj t d|j d}td|d< |S )	z< cast ::= CAST LPAREN expr AS cast_data_type RPAREN
        zMysqlx.Expr.Operatorr   )r(  r)  zMysqlx.Expr.Expr)r*  zMysqlx.Expr.Expr.Type.OPERATORr   )r   ri  r	   rj   r  rj  r	  r   r  r  r  cast_data_typer'  rk   r   )r   r*  Ztype_scalarr  r   r   r   r     s    zExprParser.castc             C   s   | j  }|jtjtjtjtjfkrB| j }|r<dj|j	|S |j	S |jtj
krp| jd}|rjdj|j	|S |j	S |jtjtjfkr| jtjr| jtj |j	S |jtjtjtjfkr|j	S tdj|j| j|j	dS )a   cast_data_type ::= ( BINARY dimension? ) |
                               ( CHAR dimension? ) |
                               ( DATE ) |
                               ( DATETIME dimension? ) |
                               ( TIME dimension? ) |
                               ( DECIMAL dimension? ) |
                               ( SIGNED INTEGER? ) |
                               ( UNSIGNED INTEGER? ) |
                               JSON
        z{0}{1}Tz,Unknown token type {0} at position {1} ({2})N)r  r   r	   r   r   r   r   cast_data_type_dimensionr   r   r   r   r   rd  r   ri  r   r   r  r3  )r   rO  	dimensionr   r   r   r    s"    

zExprParser.cast_data_typec             C   s   | j tjsdS g }| jtj |j| jtj |r`| j tjr`| jtj |j| jtj | jtj t|dkrdj	|d S dj	| S )z4 dimension ::= LPAREN LNUM (, LNUM)? RPAREN
        Nr   z({0})r1  z	({0},{1}))
rd  r	   rj   ri  ra  ry   r|   rk   r>  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 )NzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr   zMysqlx.Expr.Operatorr   )r(  r*  )r   r   )r   r  r   r   r   star_operator  s    zExprParser.star_operatorc             C   s`  | j  }|jtjtjgkr$| j|S |jtjkr8| j S |jtjkrL| j	 S |jtj
kr`| j S |jtjkr| j }| jtj |S |jtjtjgkr| j }|jtjkr|j|j | j| j _| j S t|j| j S |jtjtjtjgkr t|j| j S |jtjkrtt|jS |jtjkr4tt  S |jtjkrrd|jkr`tt!t"|jS tt#t$|jS |jtj%tj&gkrtt'|jtj%kS |jtj(kr| j) S |jtj*kr| j+ S |jtj,krH| jd | _| j-tjs(| j-tj.r0| j/| jd tj,r0| j/| jd tjr0| j0 S | j1s@| j) S | j2 S t3dj4|j| jdS )z<Parse an atomic expression and return a protobuf Expr objectrA  r   r
   r   zAUnknown token type = {0}  when expecting atomic expression at {1}N)5r  r   r	   r   r   r  r   r  rl   r  r   r   rj   rj  r  rk   r   r   r  ry   r   r2  r3  atomic_exprr,  re   r   r   rx   r'  r  rp   r  r  r  r  r  ro   rq   r  r{   r|  r   r  rw   rg  rz   rc  rp  r4  r  r  r   )r   rO  r  peekr   r   r   r    s`    

zExprParser.atomic_exprc             C   s   | }x| j t| jk r| j| j  j|krtd}td|d< td}t| j| j  j |d< |j g|d< |  j d7  _ |d j	| j g ||d< |}qW |S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr   zMysqlx.Expr.Operatorr(  r)  r   r*  )
r3  r>  r2  r   r   r   
_OPERATORSr   r	  r  )r   re  Zinner_parserlhsr  r*  r   r   r   parse_left_assoc_binary_op_expr  s    z*ExprParser.parse_left_assoc_binary_op_exprc             C   s   | j  }| jtjtjr| jtjr| j }td}|d j	|j
 g |jtjkrXdnd|d< | jtj |d j	| j j
 g | jt stdj| jtj| j j }|d j	tt|j
 g td|d}td	|d
< |S )NzMysqlx.Expr.Operatorr)  Zdate_addZdate_subr(  z&Expected interval type at position {0}zMysqlx.Expr.Expr)r*  zMysqlx.Expr.Expr.Type.OPERATORr   )r  rf  r	   r   r   rg  rt   r  r   r  r	  r   ri  bit_expr_INTERVAL_UNITSr  r   r3  r  r  r  r?  r'  r  r   )r   r  rO  r*  r   r   r   add_sub_interval#  s&    


zExprParser.add_sub_intervalc             C   s   | j ttjtjtjg| jS )N)r  setr	   r   r   r   r  )r   r   r   r   mul_div_expr>  s    zExprParser.mul_div_exprc             C   s   | j ttjtjg| jS )N)r  r  r	   r   r   r  )r   r   r   r   add_sub_exprC  s    zExprParser.add_sub_exprc             C   s   | j ttjtjg| jS )N)r  r  r	   r   r   r  )r   r   r   r   
shift_exprG  s    zExprParser.shift_exprc             C   s   | j ttjtjtjg| jS )N)r  r  r	   r   r   r   r  )r   r   r   r   r  K  s    zExprParser.bit_exprc             C   s*   | j ttjtjtjtjtjtjg| j	S )N)
r  r  r	   r   r   r   r   r}   r~   r  )r   r   r   r   	comp_exprP  s    zExprParser.comp_exprc             C   sb  g }| j  }d}| jtjr,d}| jtj | jt| jk r^|j|j	  | j| j j
}| jtjr| jtj | jtjrd}| jtj |j| j  j	  nj| jtjr| jtj | jtjr|j| j  nd}|j| j  j	  n| jtjr | jtj |j| j  j	  n| jtjrz| jtj |j| j  j	  | jtjr| jtj |j| j  j	  n| jtjr| jtj |j| j  j	  | jtj |j| j  j	  nH| jtjr| jtj |j| j  j	  n|r
tdj| jd }|r^td}|r*t| n||d< ||d< td}td	|d
< |j	 |d< |}|S )NFTr   z"Unknown token after NOT as pos {0}zMysqlx.Expr.Operatorr(  r)  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr   r*  )r  rd  r	   re   ri  r3  r>  r2  ra  r	  r   ri   rr   rj   r  rl  r   rs   rv   rn   rf   ru   r  r   r   	_NEGATIONr   )r   paramsr  r   Zop_namer*  rq  r   r   r   	ilri_exprU  sh    

zExprParser.ilri_exprc             C   s   | j ttjtjg| jS )N)r  r  r	   rf   r   r  )r   r   r   r   and_expr  s    zExprParser.and_exprc             C   s   | j ttjg| jS )N)r  r  r	   rh   r  )r   r   r   r   xor_expr  s    zExprParser.xor_exprc             C   s   | j ttjtjg| jS )N)r  r  r	   rg   r   r  )r   r   r   r   or_expr  s    zExprParser.or_exprc             C   s,   |r$g | _ d| _i | _d| _| j  | j S )Nr1  )r2  r3  r5  r6  r8  r  )r   r   r   r   r   rj    s    zExprParser._exprc             C   s`   | j |}| j}| jt| jd tjr0|d7 }|t| jk r\tdj| j| jd  | j|S )Nr
   z9Unused token types {} found in expression at position: {})	rj  r3  rc  r>  r2  r	   r   r  r   )r   r   Z
expressionZused_tokensr   r   r   r    s    

zExprParser.exprc             C   s   t d| jtjdS )NzMysqlx.Crud.Column)r(  )r   ri  r	   rw   )r   r   r   r   parse_table_insert_field  s    z#ExprParser.parse_table_insert_fieldc             C   s
   | j  jS )N)r  ro  )r   r   r   r   parse_table_update_field  s    z#ExprParser.parse_table_update_fieldc             C   s   g }| j jd}|j  xp|r|j }xP|jd|jdksd|jd|jdksd|jd|jdkrvdj|j |}q(W |j|j  qW |S )	Nr^  rG  r[  r\  r]  rX  rY  z{1},{0})r/  splitr}  popcountr   ra  r=  )r   fieldstempfieldr   r   r   _table_fields  s    zExprParser._table_fieldsc             C   s   g }d}| j  }x| jt| jk r|s2| jtj d}td| j d}| j	tj
rp| jtj
 | jtj|d< n|t| |d< |j|j  qW |S )NTFzMysqlx.Crud.Projection)sourcealias)r  r3  r>  r2  ri  r	   r|   r   rj  rd  r   rw   ra  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}x| j t| jk r|s*| jtj d}td| j d}| jtj	rdt
d|d< | jtj	 n$| jtjrt
d|d< | jtj |j|j  q
W |S )NTFzMysqlx.Crud.Order)r  zMysqlx.Crud.Order.Direction.ASC	directionz Mysqlx.Crud.Order.Direction.DESC)r3  r>  r2  ri  r	   r|   r   rj  rd  r   r   r   ra  r	  )r   Zorder_specsr  orderr   r   r   parse_order_spec  s"    

zExprParser.parse_order_specc             C   sH   g }d}x:| j t| jk rB|s*| jtj d}|j| j j  q
W |S )NTF)	r3  r>  r2  ri  r	   r|   ra  rj  r	  )r   Z	expr_listr  r   r   r   parse_expr_list  s    zExprParser.parse_expr_listN)F)F)F)F)F)9rb   rc   rd   r   r   r7  r@  rE  rP  rU  r8  rb  rd  rf  rg  rh  rc  ri  rl  ro  rp  rv  ry  r|  rz  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rj  r  r  r  r  r  r  r  r   r   r   r   r    sl   


o	
	 1 
8:
	
r  N)Y__doc__compatr   r   r   helpersr   Zdbdocr   Zprotobufr   r   r  r	   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  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   rL  rK  r  r+  r  r   r  r  r  r  r  r  r  r$  r  r  r  r'  r,  r0  r  r   r   r   r   <module>   s&  \


	
