U Yzf_ؼ5@sdZddlmZmZmZddlmZddlmZddl m Z m Z Gddde Z ee je je je je je je je je je je je je je je je je je j e j!e j"gZ#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 je je je je je je je je je j7e j8e j9e j:e j;e je j?e j@e jAe jBe jCe je je je je je je je je j e j!e j"d4ZDe j:e j0e j=e j>e j?e j@e jd?ZNd@dAZOdBdCZPdDdEZQdFdGZRdHdIZSdJdKZTdLdMZUdNdOZVdPdQZWGdRdSdSe ZXdTS)UzExpression Parser.) STRING_TYPES BYTE_TYPES UNICODE_TYPES)get_item_or_attr)DbDocMessage mysqlxpb_enumc@speZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!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:Zd=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZS)[ TokenTyper  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYN)\__name__ __module__ __qualname__NOTANDORXORISLPARENRPAREN LSQBRACKET RSQBRACKETBETWEENTRUENULLFALSEINLIKEINTERVALREGEXPESCAPEIDENTLSTRINGLNUMDOTDOLLARCOMMAEQNEGTGELTLEBITANDBITORBITXORLSHIFTRSHIFTPLUSMINUSMULDIVHEXBINNEGBANG MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAREROTEME DOUBLESTARMODCOLONORORANDANDLCURLYRCURLYCASTDOTSTAR ORDERBY_ASC ORDERBY_DESCASARROWQUOTEBINARYDATETIMETIMECHARDATEDECIMALSIGNEDINTEGERUNSIGNEDJSONSECOND_MICROSECONDMINUTE_MICROSECOND MINUTE_SECONDHOUR_MICROSECOND HOUR_SECOND HOUR_MINUTEDAY_MICROSECOND DAY_SECOND DAY_MINUTEDAY_HOUR YEAR_MONTHOVERLAPSrrc/private/var/folders/n9/53xbvtmd7sjg1q1l55xmpg58n4mgng/T/pip-unpacked-wheel-47tvuv7y/mysqlx/expr.pyr &sr )4andorxorisnotlikeinoverlapsregexpbetweenintervalescapecastdivhexbintruefalsenullsecondminutehourdayweekmonthZquarteryear microsecondZascdescasbinarydatetimetimechardatedecimalsignedunsignedintegerjsonZsecond_microsecondZminute_microsecondZ minute_secondZhour_microsecondZ hour_secondZ hour_minuteZday_microsecondZ day_secondZ day_minuteZday_hourZ year_month)rrrrrrrr==&&r||rr^rrrr!=>>=<<=&|<<>>+-*/~%rcont_inr)!=rrrrrrrrrrrrr<>rrrrrrrrrrrrrrrrrrZ sign_plusZ sign_minus!)rrrrris_notZ not_betweenZ not_regexpZnot_likeZnot_inZ not_cont_inZ not_overlaps)rrrrrrrc@s&eZdZd ddZddZddZdS) TokenrcCs||_||_||_dSN) token_typevaluelength)selfrrrrrr__init__szToken.__init__cCs|Sr)__str__rrrr__repr__szToken.__repr__cCs@|jtjks$|jtjks$|jtjkr4d|j|jSd|jS)Nz{0}({1})z{0})rr rxrzryformatrrrrrrs   z Token.__str__N)r)rcrdrerr rrrrrrs rcCstd}t|tr|St|tr,|jddSt|ttfrXtd|d<t||d<nHt|t t frtd|d<t ||d<ntd |d<t ||d <|S) NMysqlx.Expr.ExprT)reparseMysqlx.Expr.Expr.Type.OBJECTtypeobjectMysqlx.Expr.Expr.Type.ARRAYarrayMysqlx.Expr.Expr.Type.LITERALliteral) r isinstance ExprParserexprdictrr build_object get_messagelisttuple build_array build_scalarrmsgrrr build_expr%s      r cCs~t|trt|St|tr$t|St|tr6t|St|trHt|St|t rZt |S|dkrht St d t|dS)NzUnsupported data type: {0}.)rrbuild_string_scalarrbuild_bytes_scalarboolbuild_bool_scalarintbuild_int_scalarfloatbuild_double_scalarbuild_null_scalar ValueErrorr rrrrrr7s     rcCsxt|trt|jStd}|D]N\}}td}t|trF|n||d<t| |d<|d | gq$|S)NMysqlx.Expr.ObjectMysqlx.Expr.Object.ObjectFieldkeyrfld) rrr__dict__ritemsrencoder rextend)objrr.rpairrrrrGs  rcCs$td}|ddd|D|S)NMysqlx.Expr.ArrayrcSsg|]}t|qSr)r r).0rrrr Vszbuild_array..)rr3)rrrrrrTsrcCstd}td|d<|S)NMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLrr)rrrrr)Zs r)cCs td}td|d<||d<|S)Nr9z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLErZv_doublerrrrrr(`s r(cCs td}td|d<||d<|S)Nr9z#Mysqlx.Datatypes.Scalar.Type.V_SINTrZ v_signed_intrrrrrr&gs r&cCs td}td|d<||d<|S)Nr9z#Mysqlx.Datatypes.Scalar.Type.V_UINTrZv_unsigned_intrrrrrbuild_unsigned_int_scalarms r:cCs@t|trtt|d}td}td|d<td|d|d<|S)Nzutf-8r9z%Mysqlx.Datatypes.Scalar.Type.V_STRINGrzMysqlx.Datatypes.Scalar.Stringr+Zv_string)rrbytes bytearrayrr rrrrr!ss   r!cCs td}td|d<||d<|S)Nr9z#Mysqlx.Datatypes.Scalar.Type.V_BOOLrZv_boolrrrrrr$|s r$cCs(td}td|d<td|d|d<|S)Nr9z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSrzMysqlx.Datatypes.Scalar.Octetsr+Zv_octetsrrrrrr"s r"cCs td}td|d<||d<|S)Nr rrrrrrrrbuild_literal_exprs r=cCsFtd}t||d<|g|d<td}td|d<||d<|S)NMysqlx.Expr.Operatornameparamr Mysqlx.Expr.Expr.Type.OPERATORroperator)r_UNARY_OPERATORSrr )r?r@rBrrrrbuild_unary_ops   rDcCs |ddS)N"z"")replace)stringrrrescape_literalsrHc@seZdZdpddZddZddZdd Zd d Zdqd dZddZ ddZ ddZ ddZ ddZ ddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Z d?d@Z!dAdBZ"drdCdDZ#dEdFZ$dGdHZ%dIdJZ&dKdLZ'dMdNZ(dOdPZ)dQdRZ*dSdTZ+dUdVZ,dWdXZ-dYdZZ.d[d\Z/d]d^Z0dsd_d`Z1dtdadbZ2dcddZ3dedfZ4dgdhZ5didjZ6dkdlZ7dmdnZ8doS)urTcCs>||_g|_g|_d|_||_i|_d|_||dSN) rGtokenspath_name_queuepos_allow_relational_columnsplaceholder_name_to_positionpositional_placeholder_countclean_expressionlex)rrGZallow_relationalrrrrszExprParser.__init__cCs d|jS)Nz)r rGrrrrrszExprParser.__str__cCst|jtst|j|_|jd|_t|jdkrR|jddkrR|jdd|_d|jddkrx|jdd|_d|jdd kr|jd d|_dS) 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;NZSELECTrZWHEREr)rrGrreprstriplenupperrrrrrQs  zExprParser.clean_expressioncCs$|dt|jko"|j|d|kSNr)rXrG)rr.rrrr next_char_isszExprParser.next_char_iscCs~|}d}|t|jkr^|j|s2|j|dkr^|j|dkrT|dkrPtdd}|d7}q|j||}ttj|t|S)NF.Tz"Invalid number. Found multiple '.'r)rXrGisdigitr*rr rz)rrMstartZ found_dotvalrrr lex_numbers  zExprParser.lex_numberFcCs|}|t|jkrJ|j|s@|j|dks@|j|rJ|rJ|d7}q|j||}z\|t|jkr|j|dkr|tkrttj|t|}ntt ||t|}Wn&t k rttj|t|}YnX|S)N_r() rXrGisalnumisspacelower%_SQL_FUNTION_RESERVED_WORDS_COLLISIONrr rx_RESERVED_WORDSKeyError)riZ allow_spacer^r_tokenrrr lex_alphas*      zExprParser.lex_alphacCs|j|}d}|d7}|}|t|jkr|j|}||krb|dt|jkrb|j|d|krbqnD||ksr|dkr|dt|jkrq|d7}||j|7}n||7}|d7}q|t|jks|j||krtd||dkrttj|t|dSttj|t|dS)Nr\z*Unterminated quoted string starting at {0}`r )rGrXr*r rr rxry)rr. quote_charr_r^rrrrlex_quoted_tokens0   zExprParser.lex_quoted_tokencCs d}d}d}|t|jkr|j|}|r<|d7}q n|rR||}n|sb|dkrr|||}n~|dkrttj |}nf|dkrttj |}nN|dkrttj |}n6|dkrttj |}n|d krttj |}n|d kr,||d r|sttjd d }d}n ttj|}n|dkrd||drTttjdd }n ttj|}n|dkr~ttj|}nr|dkrttj|}nX|dkrttj|}n>|dkr||drttjdd }nttjdd}n|dkr$||drttjdd }n ttj|}n|dkr>ttj|}n|dkrv||drfttjdd }n ttj|}nz|dkrttj|}n`|dkrttj|}nF|dkrttj|}n,|dkrttj|}n|dkrttj |}n|d krttj!|}n|d!krJ||dr:ttj"d"d }n ttj#|}n|d#kr||d rrttj"d$d }nH||d#rttj$d%d }n*||drttj%d&d }n ttj&|}n2|d kr||d rttj'd'd }n*||drttj(d(d }n ttj)|}n|d)kr|||dr:ttj*d*d }n@|dt|jkrn|j|drn||}n ttj+|}nt|d+ks|d,kr|rttj,|}|sd}nd}d}n8|d,ks|d+ks|d-kr|-|}nt.d./||j01|||j27}q dS)/NrJFrra?:{}rrrz->r Trz**r$rrrrrrrrrb)[]r,rrrrrrrrr\z.*'rErnzUnknown character at {0})3rXrGrdr]r`isalpharkrr rrrrrr[rrrrrr|rr~rrrrrrkrlrmrnrr}rrrrrrrrrr{rrpr*r rKappendr)rriZ arrow_lastZ inside_arrowrrjrrrrRs                    (    zExprParser.lexcCsX|jt|jkr"td||j|j|jj|krTtd||j|j|j|jdS)Nz5Expected token type {0} at pos {1} but no tokens leftzDExpected token type {0} at pos {1} but found type {2}, on tokens {3})rMrXrKr*r rrrrrrassert_cur_tokenns zExprParser.assert_cur_tokencCs||j|Srpos_token_type_isrMr}rrrcur_token_type_isxszExprParser.cur_token_type_iscGs"|jt|jko |j|jj|kSrrMrXrKrrtypesrrrcur_token_type_in{szExprParser.cur_token_type_incCs||jd|SrZrr}rrrnext_token_type_isszExprParser.next_token_type_iscGs&|jt|jko$|j|jdj|kSrZrrrrrnext_token_type_inszExprParser.next_token_type_incCs|t|jko|j|j|kSr)rXrKr)rrMrrrrrszExprParser.pos_token_type_iscCs*|||j|jj}|jd7_|SrZ)r~rKrMr)rrrrrr consume_tokens zExprParser.consume_tokencCsg}d}|tj|tjs|}t|drV|jj rV|j d|jj d}n8t|dsd|krd|dkr|j d|ddd}| ||tj r|jd7_| |q|tj|r|j |S)z{Parse a paren-bounded expression list for function arguments or IN list and return a list of Expr objects. F identifierrJTr?r)rr rkrrl_exprrhasattrrr?rLinsertr|r}rMpop)rexprsZpath_name_addedmsg_exprrrrparen_expr_lists.         zExprParser.paren_expr_listcCs`|tjtd}|tjr<|tj|d<|tj|j|jj |d<|jd7_|S)NzMysqlx.Expr.Identifier schema_namer?r) r~r rxrrr{rrKrMr)ridentrrrrs   zExprParser.identifiercCsDtd}||d<||d<td}td|d<||d<|S)NzMysqlx.Expr.FunctionCallr?r@r zMysqlx.Expr.Expr.Type.FUNC_CALLr function_call)rrrr r)rrrrrrrs    zExprParser.function_callcCs|tj|j|j}|jtjkr`|jdrL|j drLt d |j|tj|j}n0|jtj kr|tj |j}nt d |jt d}td|d<||d<|S)Nrnz-{0} is not a valid JSON/ECMAScript identifierzBExpected token type IDENT or LSTRING in JSON path at token pos {0}Mysqlx.Expr.DocumentPathItem(Mysqlx.Expr.DocumentPathItem.Type.MEMBERrr)rr r{rKrMrrxr startswithendswithr*r ryrr )rrj member_name doc_path_itemrrrdocpath_members*      zExprParser.docpath_membercCs|tj|tjrH|tj|tjtd}td|d<|S|tjrt |tj}|dkr|t d |j |tjtd}td|d<||d<|St d |j dS) Nrz6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKrrJz%Array index cannot be negative at {0}z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXindexzJException token type MUL or LNUM in JSON path array index at token pos {0})rr rmrrrnrr rzr% IndexErrorr rMr*)rrrrrrdocpath_array_locs2      zExprParser.docpath_array_loccCstd}|tjrLtd}td|d<|tj|d<|d|g|d||j rr|j d|d<td }td |d<||d <|S) NMysqlx.Expr.ColumnIdentifierrrrr document_pathrJr?r Mysqlx.Expr.Expr.Type.IDENTr) rrr rxr rr3rrrL)rcol_idrrrrrdocument_fields  zExprParser.document_fieldcCsg}|tjr$||q|tjr`|tjtd}t d|d<||q|tj r|| q|tj r|tj td}t d|d<||qqqt |}|dkrt||ddt dkrtd|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) rz1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKrz1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKrJrz$JSON path may not end in '**' at {0})rr r{r|rrrrrr rmrrrXrr*r rM)rZdoc_pathrr1rrrrs8      zExprParser.document_pathcCsg}||tj|tjrB|tj||tjqt|dkr^td|j | t d}t dt|D]D}|dkr|d|d<q||dkr|d|d<q||dkr||d|d <q|d }|tj rd }|tj ||d <nj|tjrZd }|tjd }|tjr0d }|tj|tj ||d <|rZ|tj|rt|d dkrt d }td|d<d|d<|d |gt d}td|d<||d<|S)Nr z#Too many parts to identifier at {0}rrJr?rZ table_namer rFTrrrrrlrr rr)r|rr rxrr{rXr*r rMreverserranger|rrrr r3r)rpartsrriZis_docZ is_quotedrrrrrcolumn_identifiersZ           zExprParser.column_identifiercCs6|jt|jkrtd|j|j}|jd7_|S)NzUnexpected end of token streamr)rMrXrKr*)rrjrrr next_tokenLs  zExprParser.next_tokencCs$|}|j|kr td|dS)NzExpected token type {0})rrr*r )rrrjrrr expect_tokenSs zExprParser.expect_tokencCs |j|jSr)rKrMrrrr peek_tokenXszExprParser.peek_tokencCs |j|jj}|jd7_|SrZ)rKrMr)rrrrrconsume_any_token[szExprParser.consume_any_tokencCstd}|jt|jkrX|tjsX|d| g|tj sJqX| tj q| tjtd}t d|d<| |d<|S)zH jsonArray ::= "[" [ expr ("," expr)* ] "]" r6rr rrr) rrMrXrKrr rnr3rrr}rr )rrrrrrparse_json_array`s     zExprParser.parse_json_arraycCstd}|jt|jkr|tjstd}|tj|d<|tj | |d<|d | g|tj szq|tj q|tjtd}td|d<| |d <|S) z jsonDoc ::= "{" [jsonKeyValue ("," jsonKeyValue)*] "}" jsonKeyValue ::= STRING_DQ ":" expr r,r-r.rr/r r rr)rrMrXrKrr rrryrrrr3r}r )rritemrrrrparse_json_docrs"      zExprParser.parse_json_doccCsd}|tjr|tj}nB|tjr8|tj}n(|jtjkrPt|j}nt d |j t d}t d|d<||jkr|j||d<n$|j|d<|j|j|<|jd7_|S)Nrlz)Invalid placeholder name at token pos {0}r z!Mysqlx.Expr.Expr.Type.PLACEHOLDERrpositionr)rr rzrrxrrstrrPr*r rMrr rO)rrjZplace_holder_namerrrrparse_place_holders(       zExprParser.parse_place_holdercCstddd}|tj|d|g|tjtt | }|dt |g|tj td|d}td|d<|S) z< cast ::= CAST LPAREN expr AS cast_data_type RPAREN r>rr?r@r rBrAr)rrr rkr3rrrr"rr2cast_data_typer=rlr )rrBZ type_scalarrrrrrs      zExprParser.castcCs|}|jtjtjtjtjfkrB|}|rrrrBr)rrrrr star_operators zExprParser.star_operatorcCs`|}|jtjtjfkr$||S|jtjkr8|S|jtjkrL| S|jtj kr`| S|jtj kr| }|tj|S|jtjtjfkr|}|jtjkr|j|j|j|j_|St|j|S|jtjtjtjfkrt|j|S|jtjkrtt|jS|jtjkr4tt S|jtjkrrd|jkr`tt!t"|jStt#t$|jS|jtj%tj&fkrtt'|jtj%kS|jtj(kr|)S|jtj*kr|+S|jtj,krH|jd|_|-tj s(|-tj.r0|/|jdtj,r0|/|jdtj r0|0S|j1s@|)S|2St3d4|j|jdS)zr?r@rrB) rMrXrKrrr _OPERATORSrrr3)rrZ inner_parserlhsrrBrrrparse_left_assoc_binary_op_expr s z*ExprParser.parse_left_assoc_binary_op_exprcCs|}|tjtjr|tjr|}td}|d | g|j tjkrXdnd|d<| tj|d | g|jtstd|jt|}|d tt| gtd|d}td |d <|S) Nr>r@Zdate_addZdate_subr?z&Expected interval type at position {0}r rrAr)rrr rrrrurrr3rrrbit_expr_INTERVAL_UNITSr*r rMrr2rrYr=r"r )rrrjrBrrradd_sub_interval2s.       zExprParser.add_sub_intervalcCs|ttjtjtjg|jSr)rsetr rrrrrrrr mul_div_exprMszExprParser.mul_div_exprcCs|ttjtjg|jSr)rrr rrrrrrr add_sub_exprRszExprParser.add_sub_exprcCs|ttjtjg|jSr)rrr rrrrrrr shift_exprVszExprParser.shift_exprcCs|ttjtjtjg|jSr)rrr rrrrrrrrrZszExprParser.bit_exprc Cs*|ttjtjtjtjtjtjg|j Sr) rrr rrrrr~rrrrrr comp_expr_szExprParser.comp_exprcCsbg}|}d}|tjr,d}|tj|jt|jkr^|| |j|jj }|tj r|tj |tjrd}|tj|| nj|tj r|tj |tj r||nd}|| n|tjr |tj|| n|tjrz|tj|| |tjr|tj|| n|tjr|tj|| |tj|| nH|tjr|tj|| n|r td|jd}|r^td}|r*t|n||d<||d<td}td |d <| |d <|}|S) NFTrz"Unknown token after NOT as pos {0}r>r?r@r rArrB)rrr rfrrMrXrKr|rrrjrsrkr3rrrtrwrorgrvr*r r _NEGATIONr )rparamsrrZop_namerBrrrr ilri_exprdsl                zExprParser.ilri_exprcCs|ttjtjg|jSr)rrr rgrrrrrrand_exprszExprParser.and_exprcCs|ttjg|jSr)rrr rirrrrrxor_exprs zExprParser.xor_exprcCs|ttjtjg|jSr)rrr rhrrrrrror_exprszExprParser.or_exprcCs,|r$g|_d|_i|_d|_||SrI)rKrMrOrPrRr)rr rrrrszExprParser._exprcCs`||}|j}|t|jdtjr0|d7}|t|jkr\td|j|jd|j|S)Nr z9Unused token types {} found in expression at position: {}) rrMrrXrKr rr*r )rr Z expressionZ used_tokensrrrrs zExprParser.exprcCstd|tjdS)NzMysqlx.Crud.Columnr)rrr rxrrrrparse_table_insert_fields z#ExprParser.parse_table_insert_fieldcCs |jSr)rrrrrrparse_table_update_fieldsz#ExprParser.parse_table_update_fieldcCsg}|jd}||r|}|d|dks`|d|dks`|d|dkrrd||}q$||q|S) Nryrbrvrwrxrsrtz{1},{0})rGsplitrrcountr r|rW)rfieldstempfieldrrr _table_fieldss zExprParser._table_fieldscCsg}d}|}|jt|jkr|s0|tjd}td|d}| tj rn|tj |tj |d<n|t||d<| | q|S)NTFzMysqlx.Crud.Projection)sourcealias)rrMrXrKrr r}rrrrrxr|r)rZ project_exprfirstrZ projectionrrrparse_table_select_projections   z(ExprParser.parse_table_select_projectioncCsg}d}|jt|jkr|s(|tjd}td|d}|tj rbt d|d<|tj n$|tj rt d|d<|tj | | q|S)NTFzMysqlx.Crud.Order)rzMysqlx.Crud.Order.Direction.ASC directionz Mysqlx.Crud.Order.Direction.DESC)rMrXrKrr r}rrrrr rr|r)rZ order_specsrorderrrrparse_order_specs&    zExprParser.parse_order_speccCsDg}d}|jt|jkr@|s(|tjd}||q|S)NTF) rMrXrKrr r}r|rr)rZ expr_listrrrrparse_expr_lists zExprParser.parse_expr_listN)T)F)F)F)F)9rcrdrerrrQr[r`rkrprRr~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsl  o    1 8:  rN)Y__doc__compatrrrZhelpersrZdbdocrZprotobufrr rr rrrrrrrrrrrrrrrrrrrrrrrgrhrirjrfrtrsrrvrorurwrrrrrprrrqrrrrrrrrrrrrrrgrfrrCrrr rrrr)r(r&r:r!r$r"r=rDrHrrrrrs2  \8 %