g dZddlmZddlZddlZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddl"m#Z#ddl"m$Z$dd lm%Z%dd!lm&Z&dd"l'm(Z(er6dd#l)m*Z*dd$l)m+Z+dd%lm,Z,dd&lm-Z-dd'lm.Z.dd(lm/Z/dd)lm0Z0dd*lm1Z1dd+lm2Z2e&jfd,d-Z4dRd0Z5ed.e6eee6d1fe e6fZ7ed2e6e6e e6fZ8ed/e6d1e e6fZ9e e7Z:Gd3d4e Z; dSd5Z dYd:Z?d;Z@d<ZAd=ZBd>ZCd?ZDd@ZEdAZF dZdBZGdCZHe d[ d\dDZIe d]dEZI d^ d_dFZIe d[ d\dGZJe d]dHZJ d^ d_dIZJGdJdKej^eZK d`dLZLdMZM dadNZNdOZOdPZPdQZQy)bziFunctions used by compiler.py to determine the parameters rendered within INSERT and UPDATE statements. ) annotationsN)Any)Callable)cast)Dict)Iterable)List)MutableMapping) NamedTuple)Optional)overload)Sequence)Set)Tuple) TYPE_CHECKING)Union) coercions)dml)elements)roles)_DefaultDescriptionTuple)isinsert) ColumnClause)default_is_clause_element)default_is_sequence)Select) TableClause)exc)util)Literal)_BindNameForColProtocol) SQLCompiler)_DMLColumnElement)DMLState) ValuesBase) ColumnElement)KeyedColumnElement)_SQLExprDefault)ColumnREQUIREDa8 Placeholder for the value within a :class:`.BindParameter` which is required to be present when the statement is passed to :meth:`_engine.Connection.execute`. This symbol is typically used when a :func:`_expression.insert` or :func:`_expression.update` statement is compiled without parameter values present. ColumnElement[Any]ColumnClause[Any]cVt|tstjd||S)Nz5Can't create DML statement against column expression ) isinstancerr CompileError)cs D/opt/hc_python/lib64/python3.12/site-packages/sqlalchemy/sql/crud.py_as_dml_columnr4Js0 a &CA5 I   Hr*KeyedColumnElement[Any]cLeZdZUded<ded<dZded<dZded<d Zd ed <y ) _CrudParams_CrudParamSequence single_params$List[Sequence[_CrudParamElementStr]]all_multi_paramsFboolis_default_metavalue_onlyuse_insertmanyvaluesNzOptional[Sequence[Column[Any]]]use_sentinel_columns)__name__ __module__ __qualname____annotations__r>r?r@r5r3r8r8js0%%::&+t+!&$&<@9@r5r8c \ g|_g|_g|_g|_|j dd}||j ddd|vsJdt |||\}}||_|jr!|jrtjd|jr!t|||d||dd|| tggS|j{|j rot|j"j$Dcgc]E}|j&s7||j(j+|t-||dd|j.ffGc}gSt1|rP|j2rD|j4} | J| d } t7| j9} | D chc] } |  } } n|j:r2|j<} |j:} | J| D chc] } |  } } nM|j<r;|j<} t7| j9} | D chc] } |  } } ndx} x} } |ji}nS| r-| J|jD cic]} | | vr | t>}} n$|jD cic]} | t>}} g}| tA|||| ||i}tCjD|r|jFrtI|||| ||||| t1|r4|jJr(|j2rJtM|||||||||| d }d}ntO|||||||||| \}}|rd| rbtQ|jSfd | DjU|}|r.tjd d jWd|Dzd }t1|rJ|j2r>|jJrJtY|||t[d|t[d|}t||S|s|j\r|j^j`rmtc|j"j$d |j(j+|j"j$d |j^jddfg}d}t|g|||Scc}wcc} wcc} wcc} wcc} wcc} w)aQcreate a set of tuples representing column/string pairs for use in an INSERT or UPDATE statement. Also generates the Compiled object's postfetch, prefetch, and returning column collections, used for default handling and ultimately populating the CursorResult's prefetch_cols() and postfetch_cols() collections. visiting_cteNaccumulate_bind_namesz;Don't know how to handle insert within insert without a CTEzVCan't compile statement that includes returning() and return_defaults() simultaneouslyrET)requiredrFc34K|]\}}|ywNrE).0kv_column_as_keys r3 z#_get_crud_params..KsN8M1.+8MszUnconsumed column names: %s, c3"K|]}| ywrKrE)rLr2s r3rPz#_get_crud_params..Qs8%QQ[%s Sequence[_CrudParamElementStr]Callable[..., str])r>r?r@)3 postfetchinsert_prefetchupdate_prefetchimplicit_returninggetpop_key_getters_for_crud_column_get_bind_name_for_col _returning_return_defaultsr r1isdelete_setup_delete_return_defaultsr8 column_keys_no_parameterstablecolumns_omit_from_statementspreparer format_column_create_bind_paramkey_compile_state_isinsert_has_multi_parameters_multi_parameterslistitems_ordered_values_dict_parametersr,!_get_stmt_parameter_tuples_paramsrisupdate is_multitable_get_update_multitable_params _select_names_scan_insert_from_select_cols _scan_colsset intersection differencejoin_extend_values_for_multiparamsrfor_executemanydialectsupports_default_metavaluer4default_metavalue_token)compilerstmt compile_statetoplevelkwrG_getattr_col_key_col_bind_namer2mpspdstmt_parameter_tuplesri spd_str_key parametersvalues check_columnsr?r@checkr>multi_extended_valuesrOs @r3_get_crud_paramsrrswPH!H!H"$H66.$/L &-r)EDE) %Xt]C '5H# 400 /  %            2r""# (D(D++ ,A.. %%33A6&xD4HUUH  ,    ( .  / /  , ,~~e $SYY[ 169:cs~c*c :  & &,, - = =69:cs~c*c :  ' ',, $SYY[ 169:cs~c*c :4888k# &&& ++ ++% 3  )+  6>5I5I 5IcN3  )5I  ')F()    !    35M ||M"}'B'B%    !      }-$2D2D!6666%             %#5?            6 22+  O \N8MN N Z &  ""-998%88:  !& .  / /%%%% >    0  %~ 6  ! 6#899   $ $    7 7tzz11!45!!// 0B0B10EF  88   %)!  ";11  Y 4; ;;  s%6A RRRRR$:R)c yrKrE)rcolvalueprocessrInamers r3rhrhs r5c yrKrE)rrrrs r3rhrh r5c | |j}tj|||j|}d|_|r|j |fi|S|S)N)type_rIT)rir BindParametertype_is_crud_compiler_dispatch)rrrrrIrr bindparams r3rhrhsZ |ww&& e388hII+y++H;;;r5c ,d|v}|sK|jr?t|jtjr||j d|jf<|j jr|j|j }|j|fi|S)NrGr) uniquer0rir_truncated_labeltruncated_namesr_isnull_with_binary_element_typer)rrrrris_ctes r3_handle_values_anonymous_paramrs(r !F  LL uyy(";"; <=A  +uyy!9: zz//9 #5 # #H 3 33r5ctj|ro|jrct|jt j t jtj dfd } dfd }dfd }nIt j t jtj}tjdx}}|||fS)Nric||}t|dr&|jvr|jj|fS|S)Nrc)hasattrrcr)ristr_key_et c_key_roles r3rOz4_key_getters_for_crud_column.._column_as_keys;!oGsG$c)9 00r5c||jvr"|jj|jfS|jSrK)rcrrirrs r3rz6_key_getters_for_crud_column.._getattr_col_keys1yyC 00wwr5c|jvrGtrt|jtsJ|jjd|j S|j S)N_)rcrr0rrrirs r3rz4_key_getters_for_crud_column.._col_bind_namesFyyC %cii==="%))..#''::wwr5)rizUnion[ColumnClause[Any], str]returnUnion[str, Tuple[str, str]])rr.rr)rr.rstr) rrr _extra_fromsrx functoolspartialr expect_as_keyr DMLColumnRoleoperator attrgetter)rrrrOrrrrs @@r3r[r[s ||M"}'A'A-,,-&&  # #U%8%8  .  (  "  (  #**  # #U%8%8 -5,?,?,FF> +^ ;;r5c |jD cgc]!} |jj|| #} } |jdd|usJ|j|jdd<g} |j r`t | }|jjD]<}||vs|js|jjr,| j|>| D]a}||}||vrD||vr@|j||j||jj|ddfSt|||| | c| r|j| |jdd}t!|t"s/t%j&ddj)d| Dd|j+}t-|j.| Dcgc] \}}}}| c}}z|_||jdd<yycc} wcc}}w) N selectableinsert_from_selectrEz_Can't extend statement for INSERT..FROM SELECT to include additional default-holding column(s) rQc3<K|]\}}}}t|ywrK)repr)rLrris r3rPz0_scan_insert_from_select_cols..BsLOLAsAqd3iOsz~. Convert the selectable to a subquery() first, or pass include_defaults=False to Insert.from_select() to skip these columns.)rurcr2stackselect#include_insert_from_select_defaultsrxrddefault is_sentinelappendrZrfrg&_append_param_insert_select_hasdefaultextendr0rr r1r{ _generaterm _raw_columns)rrrrrrOrrrrrrcolsadd_select_colscol_setrr2col_keyins_from_selectrexprs r3rvrv s<@;M;M N;M4DJJLL- .;MD N >>" l +t 33 3/3{{HNN2+,68O //d)::%%C7"KK // C & "1% j WM%A NN7 # MM1h//==a@$K L 2$?B   o&"..,-AB/62""8IILOLL  *335'+O,H,H'I&5M &5]Q4DoM ( $4Cr/0%G OdM s &G7 G<c t|||| \} } } }}}|js|jsJ|jr|jDcgc] }|| }}t |}|Dcgc]C}t |t r1||jjvr|jj|Ec}|jjDcgc]}|j|vs|c}z}n|jj}t|}|r9|js-|jj}|jj}ndx}}|j rt |j }n t }|j"}|D]p}||}||vr||vrt%|||||||| | ||||| n&|r|j&r%| r#| rt)||||| nt+||||| n|j,)|j,j.r|t1|||| || n|j2@| r|| vr|j5|n|j&s|j6j5|nq| r|| vr|j5|nY|j&rM||jjur5|j8s)t;|n|jrt=||||| || ||vsZ||vs`|j5|s|r5|j?||jAfd|j D||fScc}wcc}wcc}w)Nc3*K|] }|vr| ywrKrE)rLr2remaining_supplementals r3rPz_scan_cols..s"+ 1** 1s)!_get_returning_modifiersrrr_parameter_orderingrxr0rrcr2rirdrjrk_autoincrement_columnr~#insert_null_pk_still_autoincrements_supplemental_returningrX_append_param_parameter primary_key!_append_param_insert_pk_returning$_append_param_insert_pk_no_returningrr_append_param_insert_hasdefaultserver_defaultrrUnullable"_warn_pk_with_no_anticipated_value_append_param_updaterzr)rrrrrrOrrrrrneed_pksrXimplicit_return_defaultspostfetch_lastrowidr?r@riparameter_ordering ordered_keysr2rrautoincrement_colrsupplemental_returningcompiler_implicit_returningrrs @r3rwrwOs~( !4I   ! !]%;%;; ;((+8+L+L +LCN3 +L  -. * )#s#tzz||(; JJLL )  B 1\(AQ B Czz!!&}5H ;;!JJ<<    @ @ ,CGF? ##!$T%A%A!B!$"*"="= #1% j WM%A $"(#!3 (}} & 6 $629 $62&yy,,(43 $+CVR!!-,5M0M/66q9&&--a0)a3K.K+2215 TZZ=== 215  # # !(  ' '44 ' . .q 1SV"8!B!B '"  $**+ 11+  & !"6 77Q   Cs L4+AL9 L>!L>c  t|||| ^} } } } | sy|jr|jj| |jrDt |j |jj fd|jDyy)Nc3,K|] }|vs| ywrKrE)rLr2ir_sets r3rPz0_setup_delete_return_defaults..,s+ 3!qA3s )r_return_defaults_columnsrXrrrx)rrrrrrOrrrrrrrrs @r3r`r`s,D$ x,(Q #a $ $$##**+CD ##X001##**+ 33+  $r5c|j|}|jj||j}t }t j |r{| r7|jr+|| ur'| rd|_n|r|jj|t|||f|tut|r |js||n d||z|d| }n|jr| rW|j K|jr?|| ur;|r|jj|n|j"jrd|_t%|||ft|r |js||n d||z|d| }n|j&|j)fd|i| }|j*r>|r ||vr|jj|n|j,j|n|jr<|r|jj|n[|j"jrEd|_n=|r ||vr|jj|n|j,j|| j||||fy)N use_tableTz%s_m0)rIrrH)rrHrH)rZrfrginclude_table_with_column_exprsrxr _is_literalrrrXrrhr,rjrk_is_bind_parameterrr~rr self_grouprrrU)rrrr2rrrrXrrrrrrr col_valueaccumulated_bind_namess r3rr1s} NN7 #E!!// ]BB0I(+uU# / && #/3,#++2215"    h&/}=$::q!~a00"8      ! ! / # &&"++2215!!55/3,.    /}=$::q!~a00"8    !      "8    ! !'A1I,I++2215""))!,}}%//66q9%%9937H0)q4L/L++2215""))!, MM1i(>?@r5c (|j|jjr|jjr|jjr|jj sUt }|j||jj||j|jfd|i||f|jj|y|jjrt }|j||jj||j|jjjfd|i||f|jj|y|j||jj|t||fi||j ffy||j"j$us |j&|jj|y|j(s t+|yy)zCreate a primary key expression in the INSERT statement where we want to populate result.inserted_primary_key and RETURNING is available. NrH)r is_sequencer~supports_sequencesoptionalsequences_optionalrxrrfrgrrXis_clause_elementargr"_create_insert_prefetch_bind_paramrircrrrr)rrr2rrrs r3rrs  yy 99 22II&&''::365&  ))77:(((II2H! /    ' ' . .q 1 YY ( (%(U " MM%%33A6$H$$ 002.D +    ' ' . .q 1 MM%%33A66xIbIUUH   djj.. .!2B2B2N##**1- ZZ +1-r5c 2|jX|jjr|jjr,|jjr|jj r||j jur|jjs|j,|jjr|jjs"|j[|jjrE|j||jj|t||fi||jffy|j<|j0|j s$||j jur t#|y|jjrd|_yy)aoCreate a primary key expression in the INSERT statement where we want to populate result.inserted_primary_key and we cannot use RETURNING. Depending on the kind of default here we may create a bound parameter in the INSERT statement and pre-execute a default generation function, or we may use cursor.lastrowid if supported by the dialect. NT)rrr~rrrrcrr"preexecute_autoincrement_sequencesrrfrgrrirrrrrr2rrs r3rrsK  %%  33 **#++>> TZZ - --  44II) -- ((;;II% ((KK  !!//228QE"E       $ TZZ55 5 +1-    - - (,$ .r5c |jjr|jjr|jjr|jj st }|j||jj||j|jfd|i||f|r ||vr|jj|y|js|jj|yyyy|jjrt }|j||jj||j|jjj!fd|i||f|r ||vr|jj|y|js|jj|yy|j||jj|t#||fi||j$ffy)NrH)rrr~rrrrxrrfrgrrXrrUrrrrri)rrr2rrrrs r3rr.s yy    . . ""(*:*:*M*M/2u " MM%%33A6$H$$ .D +  (A1I,I++2215]]""))!,##+N /(  $ $!$ !!//2   IIMM,,.*@ '   $-E(E  ' ' . .q 1    % %a (  !!//228QE"E   r5c t|jr|jjrt|jjr|jj sG|j ||jj||jjdfyyyt|jrQ|j ||jj||jjjdfy|j ||jj|t||fddi||jffy)NrErF)rrr~rrrrrfrg next_valuerrrrrirs r3rres199%    . . ""(*:*:*M*M MM%%33A6II((*  +N / #199 - !!//2 ((*     !!//22a).24   r5c j|j}|j|jjs|jjr|j ||j j |||j|jjjfi|df|r ||vr|jj |y|jj |y|j ||j j ||t||fi||jffy|j>|r ||vr|jj |y|jj |y|r:|js |j s!||vr|jj |yyyy)NrrE)ronupdaterrrrfrgrrrrXrU"_create_update_prefetch_bind_paramriserver_onupdaterr^)rrrr2rrr include_tables r3rrs"AAMzzajj&<&< :: ' ' MM%%33"/4%H$$QZZ^^%>%>%@GBG (A1I,I++2215""))!, MM%%33"/47xIbIUUH    & #-E(E  ' ' . .q 1    % %a (  * *$2G2G ) )##**1- *3H !r5c yrKrErr2rrs r3rrrr5c yrKrEr s r3rr #&r5c ^t||df||d|}|jj||SN)rr)rhrVrrr2rrrparams r3rrB !T #* 9; E ##A& Lr5c yrKrEr s r3rrrr5c yrKrEr s r3rrrr5c ^t||df||d|}|jj||Sr)rhrWrrs r3rrrr5cteZdZdZdZdZdZdZejd dZ ejd dZ y) _multiparam_columnTc||_d|j|dzfz|_||_|j|_|j|_y)N%s_m%dr)indexrioriginalrr)selfrrs r3__init__z_multiparam_column.__init__sA x||UQY77  '' MM r5c trKNotImplementedError)rotherrs r3comparez_multiparam_column.compare !##r5c trKr )rrs r3_copy_internalsz"_multiparam_column._copy_internals r$r5ct|txr4|j|jk(xr|j|jk(SrK)r0rrir)rr"s r3__eq__z_multiparam_column.__eq__ s< u0 1 0 TXX% 0$--/ r5c@tj|jSz1used by default.py -> _process_execute_defaults())r_from_column_defaultrrs r3_default_description_tuplez-_multiparam_column._default_description_tuples(<|j j#| |j|j%fi|}d}|j#| |||f | D]6}|jD]#} | | vr | j&| j&j(s| j&j*ru|j#| |j| | |j| j&j,j%fi|df|j j#| |j#| |j| | t/|| fd|| i|| jff| j0 |j j#| &9ycc} } w)NrEr )rIrr)rexpectrrrrxrr2addrrrhr,rirrrUrrrrrrrr )rrrrrrrrrr2rnormalized_paramsr affected_tablestrrrcbns r3rtrtAs.333HAu ,,a0%73 "AAMeO  ' 'A%%##A&56 .q12)!,$,,Qm,L ((/. "'(!2+A.   E>?UUH*--(+C: !U148:E/2V*&&--a0,H,,U-=-=-?F2FE-/* q)U4JKL7(>A%%' 0F0F:://MM$,,Qm,L,H,, !  9 9 ;?A  &&--a0MM$,,Qm,L> (!2@2CGIUUH  "".""))!,9Os/J'c :|}|g}|j}|Jt|ddD]\} } g} | jD cic]\} } || | } } } |D]\}}}}|j| vro|j} t j | | r&t ||| | fdd|j| dzfzi|}n4|j| | jfi|}nt|||| |}| j||||f|j| |Scc} } w)Nrrr) rl enumeraternrirrrhrrr4r)rrrinitial_valuesrOrvalues_0rrirow extensionrirNrcol_exprraccumulated_names new_params r3r|r|sTH F  ( (B >>BqrF#302 47IIK@K&#q~c"A%K@7? 3C5"3ww#~gg((S2 2 C!&!a%(88 !  !I!1 0 0S1D1D1F M" MI<dCB    c8Y8IJ K'8@*  i 5$8 M3AsDc|D]\}}||} | |j| |#|j||j} tj|r4|jt j d||jfi|}n^|jr1|jjr|j|j}|j|jfi|}|j|| |dfy)Nr6)rrE) setdefaultrrrrrrrrrrrr) rrrrrOrrrMrNcolkeyrDs r3rqrqs&1"    ! !&! , ''!N!N(H$$Q'$H$$**4!&&AEG''AFFNN33AFF;A$H$$Q\\^:r: MM1h2. /=&r5c0|j}|xrct|xrV|j xrG|j xs|jxr |j xr|j xr |j }|xr&|jxr|jjdu}|xra|jxrS|jjxr;|jxr-| xs |jxs|jxs |j }|rd}t|r|xr |j }|xs|j xs |j } |xr,|jxr|j"xr| xs |j$} d} | r| r|j&r|j)|j} n|j*rE|j xr2|jjxr|jxr |j,}d} d} nW|j.rE|j xr2|jjxr|jxr |j0}d} d} nd}d} d} |rB|j2s t5|jj6} nt5|j2} nd} ||xs|| || | fS)zdetermines RETURNING strategy, if any, for the statement. This is where it's determined what we need to fetch from the INSERT or UPDATE statement after it's invoked. NF)r~rj_inliner}insert_executemany_returningr^r]rkrrcrinsert_returning_primary_tablerX_supports_implicit_returningfavor_returning_over_lastrowidrr?!use_insertmanyvalues_wo_returning_sort_by_parameter_order_get_sentinel_column_for_tablerrupdate_returningr_delete_returningrrxr2) rrrrr~rrrXshould_implicit_return_defaultsexplicit_returningr?r@rs r3rrsG  4 #M 2 4  4(( ( P44N9N9N 4  433 3  9  ' ' 9 JJ , ,D 8    $ $  ( ( ; ;    6 6 $% $ N(N(N %22 %$$-2#}-  84#8#8 ( , , ,++   (( ,, #Og&O&O  $ "--#+#J#J $      ! ! ),,?? ):: )(( ( %#     ! ! ),,?? ):: )(( ( %#*/'$#&,,(+4::<<'8 $'*4+H+H'I $#'  ==   r5cd|jjd|jd|jjd}t|jjdkDr|dz }t j |y)NzColumn '.z6' is marked as a member of the primary key for table 'z', but has no Python-side or server-side default generator indicated, nor does it indicate 'autoincrement=True' or 'nullable=True', and no explicit value is passed. Primary key columns typically may not store NULL.ra0 Note that as of SQLAlchemy 1.1, 'autoincrement=True' must be indicated explicitly for composite (e.g. multicolumn) primary keys if AUTO_INCREMENT/SERIAL/IDENTITY behavior is expected for one of the columns in the primary key. CREATE TABLE statements are impacted by this change as well on most backends.)rcfullnamerlenrr!warn)r2msgs r3rrrsb 77  QVVQWW%5%5  7 177  !#    IIcNr5)r2r-rr.) rr$rr'rr&rr=rrrr8).FN)rr$rr-rrr Literal[True]rIr=r Optional[str]rrrr) rr$rr-rrrrrr)TFN)rr$rr-rrrr=rIr=rr_rrrz'Union[str, elements.BindParameter[Any]])rr$rr'rr&rzTuple[Callable[[Union[str, ColumnClause[Any]]], Union[str, Tuple[str, str]]], Callable[[ColumnClause[Any]], Union[str, Tuple[str, str]]], _BindNameForColProtocol]) rr$rr'r2r.rzList[_CrudParamElementSQLExpr]rDict[str, Any]rNone).) rr$r2r-rr^rrrr) rr$r2r-rzLiteral[False]rrrzelements.BindParameter[Any])TN) rr$r2r-rr=rr_rrrz'Union[elements.BindParameter[Any], str]) rr$rr'r2r6rintrr`rr)rr$rr'rr&r?rSrOrTrr`rr;)R__doc__ __future__rrrtypingrrrrrr r r r r rrrrrrrrrbaserrrjrschemarrrrrr r! util.typingr"rr#r$r%r&r'r(r)r*r+symbolr,r4r_CrudParamElement_CrudParamElementStr_CrudParamElementSQLExprr9r8rrhrr[rvrwr`rrrrrrrrrr4rtr|rqrrrEr5r3rns#! *4"-'#!1%&',' 4;;     c$$% SM  SM ! SM+,A*AOO OO O  O  Od !                            -*#4L3<3