zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
U
¸ý°dßßã @s\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(erîdd#l)m*Z*dd$l)m+Z+dd%lm,Z,dd&lm-Z-dd'lm.Z.dd(lm/Z/dd)lm0Z0dd*lm1Z1dd+lm2Z2e& 3d,d-¡Z4d.d/d0œd1d2„Z5ed.e6eee6d3fe
e6fZ7ed4e6e6e
e6fZ8ed/e6d3e
e6fZ9e e7Z:Gd5d6„d6e ƒZ;d7d8d9d:d;d6d<œd=d>„Z<ed‰d7d.d;dAd:dBd;dCdDœdEdF„ƒZ=ed7d.d;d;dCdGœdHdF„ƒZ=dŠd7d.d;d:d:dBd;dJdDœdKdF„Z=dLdM„Z>d7d8d9dNdOœdPdQ„Z?dRdS„Z@dTdU„ZAdVdW„ZBdXdY„ZCdZd[„ZDd\d]„ZEd^d_„ZFd7d8d/d`dadbdcœddde„ZGdfdg„ZHed‹d7d.dAd;dCdhœdidj„ƒZIed7d.dkd;dldhœdmdj„ƒZIdŒd7d.d:dBd;dndoœdpdj„ZIedd7d.dAd;dCdhœdqdr„ƒZJed7d.dkd;dldhœdsdr„ƒZJdŽd7d.d:dBd;dndoœdtdr„ZJGdudv„dvej/eƒZKd7d8d4dwdadCdxœdydz„ZLd{d|„ZMd7d8d9d}d~dadd€œdd‚„ZNdƒd„„ZOd…d†„ZPd‡dˆ„ZQdS)ziFunctions 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)ÚColumnÚREQUIREDa8
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.
 
zColumnElement[Any]úColumnClause[Any])ÚcÚreturncCst|tƒst d|›¡‚|S)Nz5Can't create DML statement against column expression )Ú
isinstancerrÚ CompileError)r-©r1úJd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/sql/crud.pyÚ_as_dml_columnJs
 
ÿr3r)zKeyedColumnElement[Any]c@sBeZdZUded<ded<dZded<dZded<d    Zd
ed <d    S) Ú _CrudParamsÚ_CrudParamSequenceZ single_paramsú$List[Sequence[_CrudParamElementStr]]Zall_multi_paramsFÚboolÚis_default_metavalue_onlyÚuse_insertmanyvaluesNzOptional[Sequence[Column[Any]]]Úuse_sentinel_columns)Ú__name__Ú
__module__Ú __qualname__Ú__annotations__r8r9r:r1r1r1r2r4js
 
  r4r#r&r%r7r)ÚcompilerÚstmtÚ compile_stateÚtoplevelÚkwr.c sŠgˆ_gˆ_gˆ_gˆ_| dd¡}|dk    r8| dd¡d|ksHtdƒ‚tˆ||ƒ\‰}}|ˆ_|j    rv|j
rvt   d¡‚|j r¢tˆ||d|ˆ|dd||ƒ tggƒSˆjdkrÎ|jrÎt‡fdd„|jjDƒgƒSt|ƒr|jr|j}|dk    sòt‚|d    }    t|     ¡ƒ}
‡fd
d „|    Dƒ‰np|jrP|j}    |j}
|    dk    s<t‚‡fd d „|    Dƒ‰n:|jr~|j}    t|     ¡ƒ}
‡fd d „|    Dƒ‰n d}
}    ‰ˆjdkrœi} n@|
rȈdk    s°t‚‡‡fdd„ˆjDƒ} n‡fdd„ˆjDƒ} g} |
dk    rþtˆ|| |
ˆ| |ƒi} t |¡r.|jr.tˆ|||
| ||| |ƒ    t|ƒrr|j rr|jrLt‚t!ˆ||| |ˆ|| | ||ƒ d}d}n t"ˆ||| |ˆ|| | ||ƒ \}}| rä|
rät#| ƒ $‡fdd„|
Dƒ¡ %| ¡}|rät   dd &dd„|Dƒ¡¡‚d}t|ƒr.|jr.|j rt‚t'ˆ||t(d| ƒt(dˆƒ|ƒ}t| |ƒS| sxˆj)rxˆj*j+rxt,|jjd    ƒˆj- .|jjd    ¡ˆj*j/dfg} d}t| g|||dS)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_cteNÚaccumulate_bind_namesz;Don't know how to handle insert within insert without a CTEzVCan't compile statement that includes returning() and return_defaults() simultaneouslyr1c
s6g|].}|js|ˆj |¡tˆ|ddd|jff‘qS)NT)Úrequired)Z_omit_from_statementsÚpreparerÚ format_columnÚ_create_bind_paramÚkey©Ú.0r-)r?r1r2Ú
<listcomp>Ïsú
üz$_get_crud_params.<locals>.<listcomp>rcsh|] }ˆ|ƒ’qSr1r1©rLrJ©Ú_column_as_keyr1r2Ú    <setcomp>ész#_get_crud_params.<locals>.<setcomp>csh|] }ˆ|ƒ’qSr1r1rNrOr1r2rQîscsh|] }ˆ|ƒ’qSr1r1rNrOr1r2rQòscsi|]}|ˆkrˆ|ƒt“qSr1©r+rN)rPÚ spd_str_keyr1r2Ú
<dictcomp>üsþz$_get_crud_params.<locals>.<dictcomp>csi|]}ˆ|ƒt“qSr1rRrNrOr1r2rTsFc3s|]\}}ˆ|ƒVqdS©Nr1)rLÚkÚvrOr1r2Ú    <genexpr>Ksz#_get_crud_params.<locals>.<genexpr>zUnconsumed column names: %sú, css|]}d|fVqdS)z%sNr1rKr1r1r2rXQsúSequence[_CrudParamElementStr]úCallable[..., str]T)r8r9r:)0Ú    postfetchÚinsert_prefetchÚupdate_prefetchÚimplicit_returningÚgetÚpopÚAssertionErrorÚ_key_getters_for_crud_columnZ_get_bind_name_for_colÚ
_returningÚ_return_defaultsrr0ÚisdeleteÚ_setup_delete_return_defaultsr4Z column_keysZ_no_parametersÚtableÚcolumnsÚ_compile_state_isinsertÚ_has_multi_parametersÚ_multi_parametersÚlistÚitemsZ_ordered_valuesZ_dict_parametersÚ!_get_stmt_parameter_tuples_paramsrÚisupdateZ is_multitableÚ_get_update_multitable_paramsÚ _select_namesÚ_scan_insert_from_select_colsÚ
_scan_colsÚsetÚ intersectionÚ
differenceÚjoinÚ_extend_values_for_multiparamsrÚfor_executemanyÚdialectZsupports_default_metavaluer3rGrHZdefault_metavalue_token)r?r@rArBrCrDÚ_getattr_col_keyÚ_col_bind_nameÚmpZspdÚstmt_parameter_tuplesÚ
parametersÚvaluesÚ check_columnsr9r:Úcheckr8Zmulti_extended_valuesr1)rPr?rSr2Ú_get_crud_paramsrsb(  ÿþ
ü ÿõ
 
ù
õÿþ      þ
ÿ
ù
÷  õ õ ÿþÿÿÿÿþ þ÷
ÿþý üÿûr„.Fz Literal[True]z Optional[str]Ústr)r?ÚcolÚvalueÚprocessrFÚnamerCr.cKsdSrUr1)r?r†r‡rˆrFr‰rCr1r1r2rI„s
rI)r?r†r‡rCr.cKsdSrUr1)r?r†r‡rCr1r1r2rI‘sTz'Union[str, elements.BindParameter[Any]]cKsB|dkr|j}tj|||j|d}d|_|r:|j|f|ŽS|SdS)N)Útype_rFT)rJrÚ BindParameterÚtypeZ_is_crudÚ_compiler_dispatch)r?r†r‡rˆrFr‰rCÚ    bindparamr1r1r2rI›s    ÿcKsRd|k}|s0|jr0t|jtjƒr0||jd|jf<|jjrD| |j¡}|j    |f|ŽS)NrDrŽ)
Úuniquer/rJrZ_truncated_labelZtruncated_namesrŒÚ_isnullÚ_with_binary_element_typer)r?r†r‡r‰rCZis_cter1r1r2Ú_handle_values_anonymous_param°sÿþ ý r’z¢Tuple[Callable[[Union[str, ColumnClause[Any]]], Union[str, Tuple[str, str]]], Callable[[ColumnClause[Any]], Union[str, Tuple[str, str]]], _BindNameForColProtocol])r?r@rAr.cs’t |¡rj|jrjt|jƒ‰t tjtj    ¡‰dddœ‡‡fdd„ }dddœ‡fdd    „ }dd
dœ‡fd d „ }nt tjtj    ¡}t
  d ¡}}|||fS)NzUnion[ColumnClause[Any], str]zUnion[str, Tuple[str, str]])rJr.cs0ˆ|ƒ}t|dƒr(|jˆkr(|jj|fS|SdS)Nrh)Úhasattrrhr‰)rJZstr_key©Ú_etZ
c_key_roler1r2rPês z4_key_getters_for_crud_column.<locals>._column_as_keyr,)r†r.cs"|jˆkr|jj|jfS|jSdSrU)rhr‰rJ©r†©r•r1r2r|ós
z6_key_getters_for_crud_column.<locals>._getattr_col_keyr…cs:|jˆkr0trt|jtƒst‚d|jj|jfS|jSdS)Nz%s_%s)rhrr/rrbr‰rJr–r—r1r2r}ûs
 
z4_key_getters_for_crud_column.<locals>._col_bind_namerJ) rrpÚ _extra_fromsruÚ    functoolsÚpartialrZ expect_as_keyrÚ DMLColumnRoleÚoperatorÚ
attrgetter)r?r@rArPr|r}r1r”r2rcÖs
ÿ        ÿrcc sT‡‡fdd„ˆjDƒ} |jddˆks,t‚ˆj|jdd<g} ˆjr|t| ƒ} ˆjjD]$}|| krV|jrV|jj    sV|  
|¡qV| D]R}||ƒ}||krÂ||krÂ|  |¡| 
||j   |¡ddf¡q€t|ˆ|| |
ƒq€| rP| | ¡|jdd}t|tƒs t dd d    d
„| Dƒ¡›d ¡‚| ¡}t|jƒd d„| Dƒ|_||jdd<dS) Ncsg|]}ˆjjˆ|ƒ‘qSr1)rhr-)rLr‰©rPr@r1r2rMsz1_scan_insert_from_select_cols.<locals>.<listcomp>éÿÿÿÿÚ
selectableZinsert_from_selectr1z_Can't extend statement for INSERT..FROM SELECT to include additional default-holding column(s) rYcss|]\}}}}t|ƒVqdSrU)Úrepr)rLÚ_rJr1r1r2rXCs
z0_scan_insert_from_select_cols.<locals>.<genexpr>z~.  Convert the selectable to a subquery() first, or pass include_defaults=False to Insert.from_select() to skip these columns.cSsg|]\}}}}|‘qSr1r1)rLr¢Úexprr1r1r2rMLs
)rrÚstackrbÚselectZ#include_insert_from_select_defaultsrurhriÚdefaultÚ is_sentinelÚappendrarGrHÚ&_append_param_insert_select_hasdefaultÚextendr/rrr0rxZ    _generatermZ _raw_columns)r?r@rAr€r|rPr}r‚rrBrCÚcolsZadd_select_colsZcol_setr†r-Úcol_keyZins_from_selectr1ržr2rs sP
ÿþý 
ÿ
 ÿÿ    ÿ
rsc srt|ˆ||    ƒ\} } } }}}|js*|js*t‚|jrv‡fdd„|jDƒ}t|ƒ‰‡fdd„|Dƒ‡fdd„ˆjjDƒ}nˆjj}t    |ƒ}|r¢|j
s¢ˆjj }|j j }nd}}ˆjr¼tˆjƒ}ntƒ}|j}|D]p}||ƒ}||kr||krt|ˆ|||||| | |||||
ƒn|r|jrR| rR| r@t|ˆ|||
ƒnt|ˆ|||
ƒn´|jdk    r†|jjrr|dk    rt|ˆ|| ||
ƒn€|jdk    rÄ| r®|| kr®| |¡n|js|j |¡nB| rà|| krà| |¡n&|jr$|ˆjj k    r$|js$t|ƒn|jr$t||ˆ|| ||
ƒ||krÌ||krÌ| |¡qÌ|rj| |¡‰| ‡fdd„ˆjDƒ¡||fS)Ncsg|] }ˆ|ƒ‘qSr1r1rNrOr1r2rMksz_scan_cols.<locals>.<listcomp>cs.g|]&}t|tƒr|ˆjjkrˆjj|‘qSr1)r/r…rhr-rN)r@r1r2rMos
þcsg|]}|jˆkr|‘qSr1)rJrK)Ú ordered_keysr1r2rMss
c3s|]}|ˆkr|VqdSrUr1rK)Úremaining_supplementalr1r2rXúsþz_scan_cols.<locals>.<genexpr>)Ú_get_returning_modifiersrprrbZ_parameter_orderingrurhr-rirjrkÚ_autoincrement_columnr{Ú#insert_null_pk_still_autoincrementsÚ_supplemental_returningr_Ú_append_param_parameterÚ primary_keyÚ!_append_param_insert_pk_returningÚ$_append_param_insert_pk_no_returningr¦r§Ú_append_param_insert_hasdefaultÚserver_defaultr¨r\ÚnullableÚ"_warn_pk_with_no_anticipated_valueÚ_append_param_updaterwrª)r?r@rAr€r|rPr}r‚rrBrCÚneed_pksr_Úimplicit_return_defaultsÚpostfetch_lastrowidr9r:Zparameter_orderingr«rÚautoincrement_colr±Zsupplemental_returningZcompiler_implicit_returningr-r¬r1)rPr­r®r@r2rtRsæ ù
ÿ
þü
ÿ 
òÿ ÿ 
ÿÿ   ÿ
þý
ùÿþ ÿþrtc s`t||||    ƒ^} } } } | sdS|jr0|j | ¡|jr\t|jƒ‰|j ‡fdd„|jDƒ¡dS)Nc3s|]}|ˆkr|VqdSrUr1rK©Zir_setr1r2rXsz0_setup_delete_return_defaults.<locals>.<genexpr>)r¯Ú_return_defaults_columnsr_rªr²ru) r?r@rAr€r|rPr}r‚rrBrCr¢r½r1rÀr2rgs ÿ  
ÿrgcCsØ| |¡}|jj||jd}tƒ}t |¡rœ| rZ|jrZ|| krZ|    rJd|_n|rZ|j     
|¡t |||f|t kt |ƒrx|js€||ƒn
d||ƒ|dœ| —Ž}n&|jr| rà|jdkrà|jrà|| krà|rÒ|j     
|¡n|jjràd|_t|||ft |ƒrú|js||ƒn
d||ƒ|dœ| —Ž}n¦|j| ¡fd|i| —Ž}|jrj|r\||kr\|j     
|¡n |j 
|¡nX|jr˜|r†|j     
|¡n|jjrÂd|_n*|r¶||kr¶|j     
|¡n |j 
|¡|
 
||||f¡dS)N©Z    use_tableTz%s_m0)rFr‰rE)r‰rErE)rarGrHÚinclude_table_with_column_exprsrurÚ _is_literalr´r¾r_r¨rIr+rjrkÚ_is_bind_parameterr‡r{r’rˆÚ
self_grouprpr\)r?r@rAr-r¬r€r}r_r½r¾rr¿r±rCr‡Ú    col_valueÚaccumulated_bind_namesr1r1r2r³!sž
ÿ
ÿþý ýÿþ
 
÷
ÿþýüýÿþ 
ø    ÷ ÿþý
     r³cCs |jdk    ræ|jjrl|jjr^|jjr*|jjs^tƒ}| ||j     |¡|j
|jfd|i|—Ž|f¡|j  |¡nx|jj r¼tƒ}| ||j     |¡|j
|jj  ¡fd|i|—Ž|f¡|j  |¡n(| ||j     |¡t||f|Ž|jff¡n6||jjksþ|jdk    r |j  |¡n|jst|ƒdS)z—Create a primary key expression in the INSERT statement where
    we want to populate result.inserted_primary_key and RETURNING
    is available.
 
    NrE)r¦Ú is_sequencer{Úsupports_sequencesÚoptionalÚsequences_optionalrur¨rGrHrˆr_Úis_clause_elementÚargrÆÚ"_create_insert_prefetch_bind_paramrJrhr°r¸r¹rº)r?r@r-rrCrÈr1r1r2rµ’sb
ÿþ
ÿþýøÿ 
 
ÿþýøÿ 
 üÿrµcCsÖ|jdk    r*|jjrj|jjr*|jjrj|jjrj||jjkr”|jjs”|jdk    rX|jjrX|jjsj|jdkr”|jj    r”| 
||j   |¡t ||f|Ž|jff¡n>|jdkrÄ|jdkrÄ|jsÄ||jjk    rÄt|ƒn|jjrÒd|_dS)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)r¦rÉr{rÊrËrÌrhr°r¾Z"preexecute_autoincrement_sequencesr¨rGrHrÏrJr¸r¹rº©r?r@r-rrCr1r1r2r¶ÏsTþúø
ö õ
ïìèçæ!ß"Þ(
 üÿ    ÿþý
ü
r¶cCs|jjr‚|jjr€|jjr |jjs€tƒ}| ||j     |¡|j
|jfd|i|—Ž|f¡|rn||krn|j  |¡n|j s€|j  |¡n˜|jjròtƒ}| ||j     |¡|j
|jj ¡fd|i|—Ž|f¡|rÞ||krÞ|j  |¡n|j sð|j  |¡n(| ||j     |¡t||f|Ž|jff¡dS)NrE)r¦rÉr{rÊrËrÌrur¨rGrHrˆr_r´r\rÍrÎrÆrÏrJ)r?r@r-r½rrCrÈr1r1r2r·sdÿÿ
ÿþýøÿ 
 
ÿþýøÿ 
 üÿr·zList[_CrudParamElementSQLExpr]zDict[str, Any]ÚNone)r?r@r-rrCr.cCs¦t|jƒrD|jjr¢|jjr"|jjs¢| ||j |¡|j     ¡df¡n^t
|jƒrr| ||j |¡|jj   ¡df¡n0| ||j |¡t ||fddi|—Ž|jff¡dS)Nr1rˆF)rr¦r{rÊrËrÌr¨rGrHZ
next_valuerrÎrÆrÏrJrÐr1r1r2r©SsF
ÿÿ
üÿ
 
 
üÿ    
ÿÿÿúÿr©cCs|j}|jdk    r¦|jjs¦|jjrx| ||jj||d|j|jj     ¡f|Ždf¡|rj||krj|j
 |¡q¤|j  |¡qü| ||jj||dt ||f|Ž|j ff¡nV|jdk    rØ|rÊ||krÊ|j
 |¡qü|j  |¡n$|rü|jsè|jsü||krü|j
 |¡dS)NrÂr1)rÃÚonupdaterÉrÍr¨rGrHrˆrÎrÆr_r\Ú"_create_update_prefetch_bind_paramrJÚserver_onupdaterÁre)r?rAr@r-r½rrCÚ include_tabler1r1r2r»}sNþùÿ þ ùÿ
 ÿþþýr»)r?r-rˆrCr.cKsdSrUr1©r?r-rˆrCr1r1r2rϬsrÏzLiteral[False]zelements.BindParameter[Any]cKsdSrUr1rÖr1r1r2r϶sz'Union[elements.BindParameter[Any], str])r?r-rˆr‰rCr.cKs*t||df||dœ|—Ž}|j |¡|S©N)rˆr‰)rIr]r¨©r?r-rˆr‰rCÚparamr1r1r2rÏÀsÿÿÿ cKsdSrUr1rÖr1r1r2rÓÏsrÓcKsdSrUr1rÖr1r1r2rÓÙscKs*t||df||dœ|—Ž}|j |¡|Sr×)rIr^r¨rØr1r1r2rÓãsÿÿÿ c@sXeZdZdZdd„Zdd„Zdd„Zdd    „Zej    d
d œd d „ƒZ
ej    d
d œdd„ƒZ dS)Ú_multiparam_columnTcCs4||_d|j|df|_||_|j|_|j|_dS)Nú%s_m%dr)ÚindexrJÚoriginalr¦rŒ)ÚselfrÝrÜr1r1r2Ú__init__ôs
z_multiparam_column.__init__cKs
tƒ‚dSrU©ÚNotImplementedError©rÞÚotherrCr1r1r2Úcompareûsz_multiparam_column.comparecKs
tƒ‚dSrUràrâr1r1r2Ú_copy_internalsþsz"_multiparam_column._copy_internalscCs"t|tƒo |j|jko |j|jkSrU)r/rÚrJrÝ)rÞrãr1r1r2Ú__eq__s
 
 
ÿ
ýz_multiparam_column.__eq__r)r.cCs t |j¡S©z1used by default.py -> _process_execute_defaults())rÚ_from_column_defaultr¦©rÞr1r1r2Ú_default_description_tuplesz-_multiparam_column._default_description_tuplecCs t |j¡Srç)rrèrÒrér1r1r2Ú_onupdate_description_tuplesz._multiparam_column._onupdate_description_tupleN) r;r<r=Z_is_multiparam_columnrßrärårær Zmemoized_propertyrêrër1r1r1r2rÚñsrÚÚint)r?r@r-rÜrCr.cCs‚|jst d|¡‚nht|jƒr6|j|jj ¡f|ŽS|jjrN|j|jf|ŽSt||ƒ}t    |t
j ƒsht ‚t ||fddi|—ŽSdS)NzINSERT value for column %s is explicitly rendered as a boundparameter in the VALUES clause; a Python-side value or SQL expression is requiredrˆT)r¦rr0rrˆrÎrÆrÉrÚr/rZInsertrbrÏ)r?r@r-rÜrCr†r1r1r2Ú _process_multiparam_default_binds(þÿ
    
ÿÿÿríc     CsÜdd„|p dDƒ}    |j}
tƒ} |jD]Ü} | jD]Ð} | |    kr.|  | ¡| ||| ƒ<|    | }|j| |
d}t |¡rœt|| |f|t    k|| ƒdœ|—Ž}| j
f}nP|j rÊ|| ƒ}t || |fd|i|—Ž}|f}n"|j  | ¡|j| ¡f|Ž}d}| | |||f¡q.q$| D]Ð} | jD]Â} | |    kr$qn¬| jdk    r¸| jjs¸| jjr€| | |j| |
d|j| jj ¡f|Ždf¡|j  | ¡n6| | |j| |
dt|| fd|| ƒi|—Ž| j
ff¡n| jdk    r|j  | ¡qqdS)NcSs i|]\}}t tj|¡|“qSr1)rÚexpectrr›)rLr-rÙr1r1r2rTAsÿ z1_get_update_multitable_params.<locals>.<dictcomp>r1©rÕ)rFr‰r‰)rÃrur˜r-ÚaddrˆrrÄrIr+rJrÅr’r\r¨rÆrÒrÉrÍrÎrÓrÔ)r?r@rArr‚r}r|rrCZnormalized_paramsrÕZaffected_tablesÚtr-r‡rÇrÈZcbnr1r1r2rq6s” þ
 
 
 
ýûú
ÿÿÿ 
 
 
 
ÿÿúÿ
 ÿÿÿúÿ
rqrZr[r6)r?r@rAÚinitial_valuesrPrCr.c    sô|}|g}|j}|dk    st‚t|dd…ƒD]Â\}    }
g} ‡fdd„|
 ¡Dƒ}
|D]\} } }}| j|
krÀ| j}t |
|¡r¨t|| |
|fdd| j|    dfi|—Ž}qÐ|j|
|     ¡f|Ž}nt
||| |    |ƒ}|   | | ||f¡qR|  | ¡q,|S)Nrcsi|]\}}ˆ|ƒ|“qSr1r1)rLrJrWrOr1r2rT˜sz2_extend_values_for_multiparams.<locals>.<dictcomp>r‰rÛ) rlrbÚ    enumeraternrJrrÄrIrˆrÆrír¨)r?r@rAròrPrCZvalues_0rr~ÚiÚrowÚ    extensionr†Úcol_exprrÙZaccumulated_namesrJÚ    new_paramr1rOr2ryˆs> 
ýüûÿ ryc Cs¦|D]œ\}}||ƒ}    |    dk    r*| |    |¡q|j||jd}
t |¡rb|jtjd||jdf|Ž}n,|jr||jj    r|| 
|j¡}|j|  ¡f|Ž}|  ||
|df¡qdS)Nrï)rŠr1) Ú
setdefaultrˆrÃrrÄrr‹rŒrÅrr‘rÆr¨) r?rAr€rrPrrCrVrWZcolkeyr÷r1r1r2ro´s$
    ÿ
ÿÿ roc Cs”|j}|o<t|ƒo<|j o<|j s.|jo<|jo<|j o<|j }|oR|joR|j    j
dk    }|o‚|j o‚|j j o‚|jo‚| p‚|jp‚|jp‚|j}|rŒd}t|ƒrâ|oœ|j}|p¦|j}    |oÀ|joÀ|joÀ|    pÀ|j}
d} |
rà|    rà|jrà| |j    ¡} np|jr|jo|j j o|jo|j}d}
d} n>|jrF|jo:|j j o:|jo:|j}d}
d} n d}d}
d} |rz|jsnt|j    jƒ} n
t|jƒ} nd} ||pˆ|| ||
| fS)z´determines 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{rjZ_inlinerzZinsert_executemany_returningrerdrkr¾rhr°Zinsert_returningZ_primary_tabler_Z_supports_implicit_returningZfavor_returning_over_lastrowidr9Z!use_insertmanyvalues_wo_returningZ_sort_by_parameter_orderZ_get_sentinel_column_for_tablerpZupdate_returningrfZdelete_returningrÁrur-) r?r@rArBr{r¼r¾r_Zshould_implicit_return_defaultsZexplicit_returningr9r:r½r1r1r2r¯ßs°ÿþ
ûù    öÿ
ý ýû    ÷ ÿêÿ
ÿþû    ÿþýÿÿþüÿþü úr¯cCs>d|jj|j|jjf}t|jjƒdkr0|d7}t |¡dS)NaColumn '%s.%s' is marked as a member of the primary key for table '%s', 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.)rhÚfullnamer‰Úlenr´r Úwarn)r-Úmsgr1r1r2rºdsúÿ    ÿrº).FN)TFN).)TN).)TN)RÚ__doc__Ú
__future__rr™rœÚtypingrrrrrrr    r
r r r rrrrÚrrrrÚbaserrrjrZschemarrr rrrr Z util.typingr!r?r"r#r$r%r&r'r(r)r*Úsymbolr+r3r…Z_CrudParamElementZ_CrudParamElementStrZ_CrudParamElementSQLExprr5r4r„rIr’rcrsrtrgr³rµr¶r·r©r»rÏrÓrÚrírqryror¯rºr1r1r1r2Ú<module>    sô                                       þ
ÿûÿýÿýÿú   ú&6F2q=M7*/ý     üý     ü$!R,+