U ê üeäxã@svddlmZmZddlmZddlmZmZmZddl m Z m Z m Z erLe ZGdd„dƒZeejejejejejejejejejg ƒZejejejejejej ej!ej"ej#ej$ej%ej&ej'ej(ej)ej*ej+ej,ejejejejejejejejejej-ej.ej/dœZ0Gdd „d ƒZ1d d „Z2d d „Z3dd„Z4dd„Z5dd„Z6dd„Z7dd„Z8dd„Z9Gdd„dƒZ:d"dd„Z;dd „Zd=Z?d>Z@d?ZAd@ZBdAZCdBS)CÚ TokenTyperéééééééé é é é é ééééééééééééééééééé é!é"é#é$é%é&é'é(é)é*é+é,é-é.é/é0é1é2é3é4é5é6é7é8é9é:é;é<é=é>é?é@éAN)DÚ__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©rrú`/opt/hc_python/lib64/python3.8/site-packages/../../../lib/python3.8/site-packages/mysqlx/expr.pyr "s‚r )ÚandÚorÚxorÚisÚnotÚlikeÚinÚregexpZbetweenÚintervalÚescapeÚcastÚdivÚhexÚbinÚtrueÚfalseÚnullÚsecondÚminuteÚhourÚdayÚweekÚmonthZquarterÚyearÚ microsecondÚascÚdescÚasc@s&eZdZd dd„Zdd„Zdd„ZdS) ÚTokenrcCs||_||_||_dS©N)ÚtypeÚvalÚlen)Úselfr°r±r²rrr‘Ú__init__”szToken.__init__cCs| ¡Sr¯)Ú__str__©r³rrr‘Ú__repr__™szToken.__repr__cCsJ|jtjks$|jtjks$|jtjkr„Z!d?d@„Z"dAdB„Z#dCdD„Z$dEdF„Z%dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOS)PÚ ExprParsercCs0||_g|_d|_||_i|_d|_| ¡dS)Né)r×ÚtokensÚposÚ_allowRelationalColumnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚlex)r³r×ÚallowRelationalrrr‘r´ÓszExprParser.__init__cCs$|dt|jƒko"|j|d|kS©Nr)r²r×)r³r¿Úcrrr‘Ú next_char_isÝszExprParser.next_char_iscCs‚|}d}|t|jƒkr^|j| ¡s2|j|dkr^|j|dkrT|dkrPtdƒ‚d}|d}q|j||…}ttj|t|ƒƒ}|S)NFÚ.Tz"Invalid number. Found multiple '.'r)r²r×ÚisdigitÚ ValueErrorr®r rc)r³rÜÚstartZ found_dotr±Útrrr‘Ú lex_numberàs ÿ zExprParser.lex_numbercCs’|}|t|jƒkr8|j| ¡s.|j|dkr8|d}q|j||…}z tt| ¡| ¡t|ƒƒ}Wn&tk rŒttj |t|ƒƒ}YnX|S)NÚ_r) r²r×Úisalnumr®Ú reservedWordsÚlowerÚupperÚKeyErrorr ra)r³r¿rèr±Útokenrrr‘Ú lex_alphañs ÿ  zExprParser.lex_alphacCs|j|}d}|d7}|}|t|jƒkr°|j|}||krb|dt|jƒkrb|j|d|krbq°nD||ksr|dkrž|dt|jƒkr†q°|d}||j|}n||}|d}q|t|jƒksÌ|j||krÚtd |¡ƒ‚|dkrøttj|t|ƒdƒSttj|t|ƒdƒSdS)NÚrú\z*Unterminated quoted string starting at {0}ú`r )r×r²rçÚformatr®r rarb)r³r¿Ú quote_charr±rèrãrrr‘Úlex_quoted_tokenýs0  ÿ ÿzExprParser.lex_quoted_tokencCsPd}|t|jƒkrL|j|}| ¡r4|d7}qn| ¡rJ| |¡}nê| ¡sZ|dkrh| |¡}nÌ|dkr€ttj |ƒ}n´|dkr˜ttj |ƒ}nœ|dkr°ttj |ƒ}n„|dkrÈttj |ƒ}nl|dkràttj |ƒ}nT|d krøttj|ƒn<|d kr.| |d ¡rttjd ƒ}n ttj|ƒ}n|d krHttj|ƒ}nì|d krbttj|ƒ}nÒ|dkr|ttj|ƒ}n¸|dkr¶| |d¡r¤ttjddƒ}nttjddƒ}n~|dkrì| |d¡rÜttj|ƒ}n ttj|ƒ}nH|dkr"| |d¡rttjdƒ}n ttj|ƒ}n|dkrz>>z>=råz.*rÕú'rõzUnknown character at {0})/r²r×ÚisspacerærêÚisalpharòr®r rƒr†r‰rŠrrrsrär„rtrurer…rgrˆrmr‡rnrTrUrVrWrxrfrhryrprlrkrqrjrirŒrdrørçrörÛÚappend)r³r¿rãrñrrr‘ràs¦                  (   zExprParser.lexcCsT|jt|jƒkr"td ||j¡ƒ‚|j|jj|krPtd ||j|j|j¡ƒ‚dS)Nz5Expected token type {0} at pos {1} but no tokens leftz5Expected token type {0} at pos {1} but found type {2})rÜr²rÛrçrör°©r³r°rrr‘Úassert_cur_tokenwsÿ þzExprParser.assert_cur_tokencCs| |j|¡Sr¯©Úpos_token_type_isrÜrrrr‘Úcur_token_type_is€szExprParser.cur_token_type_iscCs| |jd|¡Srârrrrr‘Únext_token_type_isƒszExprParser.next_token_type_iscCs|t|jƒko|j|j|kSr¯)r²rÛr°)r³rÜr°rrr‘r†szExprParser.pos_token_type_iscCs(| |¡|j|jj}|jd|_|Srâ)rrÛrÜr±)r³r°Úvrrr‘Ú consume_token‰s  zExprParser.consume_tokencCsbg}| tj¡| tj¡sR| | ¡¡| tj¡rR|jd|_| | ¡¡q*| tj¡|S)z{Parse a paren-bounded expression list for function arguments or IN list and return a list of Expr objects. r) rr rTrrUrÚexprrfrÜ)r³Úexprsrrr‘Úparen_expr_lists     zExprParser.paren_expr_listcCsX| tj¡tƒ}| tj¡r8| tj¡|_| tj¡|j|j j |_ |j d|_ |Srâ) rr raZ IdentifierrrdrÚ schema_namerÛrÜr±rÑ)r³Úidrrr‘Ú identifiers    zExprParser.identifiercCs6tƒ}tj|_|jj | ¡¡|jj |  ¡¡|Sr¯) rZ FUNC_CALLr°Ú function_callrÑrÌrrÒÚextendr)r³rÍrrr‘r§s zExprParser.function_callcCs¤| tj¡|j|j}|jtjkr`|j d¡rL|j  d¡rLt d  |j ¡ƒ‚| tj¡|j}n2|j jtjkr‚| tj¡|j}nt d  |j¡ƒ‚ttj|d}|S)Nrõz-{0} is not a valid JSON/ECMAScript identifierzBExpected token type IDENT or LSTRING in JSON path at token pos {0}©r°rÁ)rr rdrÛrÜr°rar±Ú startswithÚendswithrçrörÁrñrbrÚMEMBER)r³rñZ memberNameÚitemrrr‘Údocpath_member®s"   ÿ  ÿzExprParser.docpath_membercCs’| tj¡| tj¡r0| tj¡ttjdS| tj¡r~t | tj¡ƒ}|dkrdt d  |j ¡ƒ‚| tj¡ttj |dStd  |j ¡ƒ‚dS)Nr»rÚz%Array index cannot be negative at {0})r°ÚindexzJException token type MUL or LNUM in JSON path array index at token pos {0})rr rVrrtrWrZARRAY_INDEX_ASTERISKrcÚintÚ IndexErrorrörÜZ ARRAY_INDEXrç)r³rrrr‘Údocpath_array_locÁs     ÿ þzExprParser.docpath_array_loccCsPtƒ}| tj¡r2|j ttj| tj¡dg¡|j | ¡¡t t j|dS)Nr!)r°r) rrr raÚ document_pathr rr$rr)r³Úcolrrr‘Údocument_fieldÒs  ÿÿzExprParser.document_fieldcCsÐg}| tj¡r | | ¡¡q| tj¡rL| tj¡| ttjd¡q| tj ¡rh| |  ¡¡q| tj ¡r˜| tj ¡| ttj d¡qq˜qt |ƒ}|dkrÌ||djtj krÌtd |j¡ƒ‚|S)z°Parse a JSON-style document path, like WL#7909, but prefix by @. instead of $. We parse this as a string because the protocol doesn't support it. (yet) r»rÚrz$JSON path may not end in '**' at {0})rr rdrr&rŒrrZMEMBER_ASTERISKrVr*r„ZDOUBLE_ASTERISKr²r°rçrörÜ)r³ZdocpathÚitemsrrr‘r+Ûs0   ÿ    ÿ ÿÿzExprParser.document_pathcCsúg}| | tj¡¡| tj¡rB| tj¡| | tj¡¡qt|ƒdkr^td |j ¡ƒ‚|  ¡t ƒ}t dt|ƒƒD]>}|dkr’|d|_ qz|dkr¦|d|_qz|dkrz|d|_qz| tj¡rÜ| tj¡| ¡|_tƒ}tj|_|j |¡|S)Nr z#Too many parts to identifier at {0}rÚrr )rrr rarrdr²rçrörÜÚreverserÚxrangerÑZ table_namerrer+rr°rrÌ)r³ÚpartsZcolidr¿rÍrrr‘Úcolumn_identifier÷s2   ÿ       zExprParser.column_identifiercCs6|jt|jƒkrtdƒ‚|j|j}|jd7_|S)NzUnexpected end of token streamr)rÜr²rÛrç)r³rérrr‘Ú next_tokens  zExprParser.next_tokencCs$| ¡}|j|kr td |¡ƒ‚dS)NzExpected token type {0})r3r°rçrö)r³Ú token_typerérrr‘Ú expect_tokens zExprParser.expect_tokencCs tƒ}dSr¯)ZObject)r³Úorrr‘Úparse_json_docszExprParser.parse_json_doccCs²d}| tj¡r| tj¡}nB| tj¡r8| tj¡}n(|jtjkrPt|j ƒ}nt d  |j ¡ƒ‚|  ¡}ttjd}||jkrŒ|j||_n"|j |_|j |j|<|j d7_ |S)Nróz)Invalid placeholder name at token pos {0}r»r)rr rcrZLNUM_INTrar°rƒrºrßrçrörÜrîrZ PLACEHOLDERrÞÚposition)r³rñZplace_holder_namerrrr‘Úparse_place_holder!s(    ÿ  ÿÿzExprParser.parse_place_holdercCs`| ¡}|jtjtjfkr$| |¡S|jtjkr8| ¡S|jtjkrHn|jtj krl|  ¡}|  tj ¡|S|jtj tjfkr‚nÆ|jtj tjfkrÖ| ¡}|jtjkrÆ|j|j|j|j_| ¡St|j| ¡ƒS|jtjtjtjfkrþt|j| ¡ƒS|jtjkrtt|jƒƒS|jtjkr2ttƒƒS|jtjkrrd|jkr^ttt|jƒƒƒStt t!|jƒƒƒSnÖ|jtj"tj#fkrštt$|jtj"kƒƒS|jtj%kr°| &¡S|jtj'krÆ| (¡S|jtj)krH|jd|_| *tj ¡s(| *tj+¡r0| ,|jdtj)¡r0| ,|jdtj ¡r0| -¡S|j.s@| &¡S| /¡St0d 1|j|j¡ƒ‚dS)zÚis_notÚparamsZop_namerÍrrr‘Ú ilri_expr©sZ             ÿ zExprParser.ilri_exprcCs| ttjtjgƒ|j¡Sr¯)r?r@r rPrˆrHr¶rrr‘Úand_exprÚsÿzExprParser.and_exprcCs| ttjtjgƒ|j¡Sr¯)r?r@r rQr‡rIr¶rrr‘Úor_exprÞsÿzExprParser.or_exprcCs| ¡Sr¯)rJr¶rrr‘râszExprParser.exprcCst| tj¡dS)N)rÑ)rrr rar¶rrr‘Úparse_table_insert_fieldåsz#ExprParser.parse_table_insert_fieldcCs | ¡jSr¯)r2rr¶rrr‘Úparse_table_update_fieldèsz#ExprParser.parse_table_update_fieldcCsŽg}d}|jt|jƒkrŠ|s(| tj¡d}t| ¡d}| tj ¡rb| tj ¡| tj ¡|_ n|jd8_| tj ¡|_ |  |¡q|S)NTF)Úsourcer) rÜr²rÛrr rfr rrrraÚaliasr)r³Z project_exprÚfirstZ projectionrrr‘Úparse_table_select_projectionës    z(ExprParser.parse_table_select_projectioncCsŒg}d}|jt|jƒkrˆ|s(| tj¡d}t| ¡d}| tj ¡r\tj |_ | tj ¡n | tj ¡r|tj |_ | tj ¡| |¡q|S)NTF)r)rÜr²rÛrr rfr rrrÚASCÚ directionrŽZDESCr)r³Z order_specsrOÚorderrrr‘Úparse_order_specüs     zExprParser.parse_order_speccCs@g}d}|jt|jƒkr<|s(| tj¡d}| | ¡¡q|S)NTF)rÜr²rÛrr rfrr)r³Z expr_listrOrrr‘Úparse_expr_list s zExprParser.parse_expr_listN)*rLrMrNr´rärêròrøràrrrrrrrrr&r*r-r+r2r3r5r7r9r:r?rArBrCrDrErHrIrJrrKrLrPrTrUrrrr‘rÙÒsN  ^   I1rÙTcCs6td |¡ƒt||ƒ}t|jƒ| ¡}t|ƒdS)Nz>>>>>>> parsing: {0})ÚprintrörÙrÛr)Z expr_stringráÚprÍrrr‘ÚparseAndPrintExprs   rXcCs tdƒdS)+Nzname like :namez10+1z (abc == 1)z (func(abc)=1)z(abc = "jess")z(abc = "with \"")z (abc != .10)z(abc != "xyz")z a + b * c + dz(a + b) * c + dz'(field not in ('a',func('b', 2.0),'c'))zjess.age between 30 and deathzx > 10 and Y >= -20zEa is true and b is null and C + 1 > 40 and (time = now() or hungry())za + b + -c > 2znow () + b + c > 2znow () + @b + c > 2zJnow () - interval +2 day > some_other_time() or something_else IS NOT NULLz"two quotes to one"""z'two quotes to one'''z'different quote "'z"different quote '"z`ident`z `ident```z `ident"'`znow () - interval -2 dayz? > x and func(?, ?, ?)z#a > now() + interval (2 + x) MiNuTeza between 1 and 2za not between 1 and 2za in (1,2,a.b(3),4,5,x)za not in (1,2,3,4,5,@x)za like b escape cza not like b escape cz(1 + 3) in (3, 4, 5)z0`a crazy "function"``'name'`(1 + 3) in (3, 4, 5)za@.bFz$a@.b[0][0].c**.d."a weird\"key name"za@.*za@[0].*z a@**[0].*)rXrrrr‘Úx_test sXrYN)T)=ÚcompatrrZprotobuf.mysqlx_datatypes_pb2rZprotobuf.mysqlx_expr_pb2rrrZprotobuf.mysqlx_crud_pb2rr r Úranger0r r@rzr{r|r}r~rr€rr‚Zinterval_unitsrPrQrRrSrOr]r\r_rXr^r`r‹rurvrwrYr[rZrrŽrrír®r¼r¾rÀrÇrÉrÎrÔrØrÙrXrYrrrr‘Ús€ C÷ â"J