3
(hؼ              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-install-q3hcpn_q/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dpddZdd Zdd Zdd	 Zd
d Zdqd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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z d?d@ Z!dAdB Z"drdCdDZ#dEdF Z$dGdH Z%dIdJ Z&dKdL Z'dMdN Z(dOdP Z)dQdR Z*dSdT Z+dUdV Z,dWdX Z-dYdZ Z.d[d\ Z/d]d^ Z0dsd_d`Z1dtdadbZ2dcdd Z3dedf Z4dgdh Z5didj Z6dkdl Z7dmdn Z8doS )ur  Tc             C   s>   || _ g | _g | _d| _|| _i | _d| _| j  | j  d S )N    )	r/  tokenspath_name_queue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   r8    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   r4  startZ	found_dotvalr   r   r   
lex_number  s    zExprParser.lex_numberFc             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_spacerD  rE  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_charrE  rD  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   rG  ?:{}r   r   r   z->r
   Tr   z**r   $r   r   z==r   z&&r   r   z||rH  )[]r   ,r   z!=r   z<>z<<z<=z>>z>=rB  z.*'r-  rT  zUnknown character at {0})3r?  r/  rJ  rC  rF  isalpharQ  r   r	   r   r   r   r   r   rA  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   rV  r  r   r2  appendr   )r   rO  Z
arrow_lastZinside_arrowr   rP  r   r   r   r9    s    



















(zExprParser.lexc             C   sX   | j t| jkr"tdj|| j | j| j  j|krTtdj|| j | j| j  | jd S )Nz5Expected token type {0} at pos {1} but no tokens leftzDExpected token type {0} at pos {1} but found type {2}, on tokens {3})r4  r?  r2  r  r   r   )r   r   r   r   r   assert_cur_tokenn  s    zExprParser.assert_cur_tokenc             C   s   | j | j|S )N)pos_token_type_isr4  )r   r   r   r   r   cur_token_type_isx  s    zExprParser.cur_token_type_isc             G   s"   | j t| jk o | j| j  j|kS )N)r4  r?  r2  r   )r   typesr   r   r   cur_token_type_in{  s    zExprParser.cur_token_type_inc             C   s   | j | jd |S )Nr   )rd  r4  )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   )r4  r?  r2  r   )r   rf  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   r4  r   r   r   r   rd    s    zExprParser.pos_token_type_isc             C   s*   | j | | j| j j}|  jd7  _|S )Nr   )rc  r2  r4  r   )r   r   r   r   r   r   consume_token  s    
zExprParser.consume_tokenc             C   s   g }d}| j tj | jtjs| j j }t|drV|jj	rV| j
jd|jj	 d}n:t|d rd|krd|d kr| j
jd|d d  d}|j| x0| jtjr|  jd7  _|j| j j  qW | j tj |r| j
j  |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        F
identifierr1  Tr(  r   )rj  r	   rj   re  rk   _exprr	  hasattrrk  r(  r3  insertrb  r|   r4  pop)r   exprsZpath_name_addedmsg_exprr   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   )
rc  r	   rw   r   rh  rz   rj  r2  r4  r   )r   identr   r   r   rk    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   rk  rr  r   r	  )r   ru  rq  r   r   r   ru    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 )NrT  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   )rj  r	   rz   r2  r4  r   rw   r   
startswithendswithr  r   rx   r   r   )r   rP  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})rj  r	   rl   re  r   rm   r   r   ry   r  
IndexErrorr   r4  r  )r   ry  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  | j	rr| j	d |d< t d	}td
|d< ||d< |S )NzMysqlx.Expr.ColumnIdentifierzMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr   r   document_pathr1  r(  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTrk  )
r   re  r	   rw   r   rj  r  r	  r~  r3  )r   col_idry  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})re  r	   rz   rb  rz  r	  r   rj  r   r   rl   r}  r   r?  r   r  r   r4  )r   Zdoc_pathry  r  r   r   r   r~    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
   rs  FTr~  zMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr   rR  r   zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTrk  )rb  rj  r	   rw   re  rz   r?  r  r   r4  reverser   ranger{   r~  r   r   r   r  r	  )r   partsr  rO  Zis_docZ	is_quotedry  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   )r4  r?  r2  r  )r   rP  r   r   r   
next_tokenL  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   rP  r   r   r   expect_tokenS  s    
zExprParser.expect_tokenc             C   s   | j | j S )N)r2  r4  )r   r   r   r   
peek_tokenX  s    zExprParser.peek_tokenc             C   s    | j | j j}|  jd7  _|S )Nr   )r2  r4  r   )r   r   r   r   r   consume_any_token[  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   r4  r?  r2  re  r	   rm   r  rl  r	  r|   rj  r   )r   r  r  r   r   r   parse_json_array`  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   r4  r?  r2  re  r	   r   rj  rx   r   rl  r	  r  r|   r   )r   r  itemr  r   r   r   parse_json_docr  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 )NrR  z)Invalid placeholder name at token pos {0}zMysqlx.Expr.Exprz!Mysqlx.Expr.Expr.Type.PLACEHOLDERr   positionr   )re  r	   ry   rj  rw   r   r   strr7  r  r   r4  r   r   r6  )r   rP  Zplace_holder_namerq  r   r   r   parse_place_holder  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   rj  r	   rj   r  rl  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   re  r   rj  r   r   r  r4  )r   rP  	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}))
re  r	   rj   rj  rb  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 objectrB  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   rl  r  rk   r   r   r  ry   r   r2  r4  atomic_exprr,  re   r   r   rx   r'  r  rp   r  r  r  r  r  ro   rq   r  r{   r  r   r  rw   rh  rz   rd  ru  r5  r  r  r   )r   rP  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*  )
r4  r?  r2  r   r   r   
_OPERATORSr   r	  r  )r   rf  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  rg  r	   r   r   rh  rt   r  r   r  r	  r   rj  bit_expr_INTERVAL_UNITSr  r   r4  r  r  r  r@  r'  r  r   )r   r  rP  r*  r   r   r   add_sub_interval2  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_exprM  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_exprR  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_exprV  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  Z  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_expr_  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  re  r	   re   rj  r4  r?  r2  rb  r	  r   ri   rr   rj   r  rr  r   rs   rv   rn   rf   ru   r  r   r   	_NEGATIONr   )r   paramsr  r   Zop_namer*  rq  r   r   r   	ilri_exprd  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  r4  r6  r7  r9  r  )r   r   r   r   r   rl    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: {})	rl  r4  rd  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   rj  r	   rw   )r   r   r   r   parse_table_insert_field  s    z#ExprParser.parse_table_insert_fieldc             C   s
   | j  jS )N)r  rk  )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_  rH  r\  r]  r^  rY  rZ  z{1},{0})r/  splitr  ro  countr   rb  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  r4  r?  r2  rj  r	   r|   r   rl  re  r   rw   rb  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)r4  r?  r2  rj  r	   r|   r   rl  re  r   r   r   rb  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)	r4  r?  r2  rj  r	   r|   rb  rl  r	  )r   Z	expr_listr  r   r   r   parse_expr_list  s    zExprParser.parse_expr_listN)T)F)F)F)F)9rb   rc   rd   r   r   r8  rA  rF  rQ  rV  r9  rc  re  rg  rh  ri  rd  rj  rr  rk  ru  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  r  r  r  rl  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   rM  rL  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&  \


	
