From afdcd868334e00ba094ad49d02d602c94953dc5e Mon Sep 17 00:00:00 2001 From: Priec Date: Tue, 15 Sep 2026 22:40:54 +0200 Subject: [PATCH] physical columns --- client-gui2 | 2 +- common/proto/table_definition.proto | 25 ++++++++++++ common/src/proto/descriptor.bin | Bin 280436 -> 282426 bytes common/src/proto/komp_ac.table_definition.rs | 36 ++++++++++++++++++ server | 2 +- web/src/pages/admin/table_definition/logic.rs | 1 + 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/client-gui2 b/client-gui2 index aa345299..140708f7 160000 --- a/client-gui2 +++ b/client-gui2 @@ -1 +1 @@ -Subproject commit aa345299911882a251cd5628087f1243a28ac194 +Subproject commit 140708f7574f9f1a1efae229dd031699485290b0 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 68513738..cb3b3264 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -387,6 +387,31 @@ message PutTableDefinitionRequest { // Required physical/catalog name. Use table_name to keep the current name. string new_table_name = 8; + + // Complete desired definition of an empty table, in catalog ordinal order. + // Aliases remain attached to their column IDs. Retained physical columns + // are not rebuilt or renamed; new columns use the existing append operation. + // Cannot be combined with remove_column_ids or add_columns. add_indexes and + // generated_aliases apply to the new columns in this definition. + optional EmptyTableDefinition replacement = 9; +} + +message EmptyTableDefinition { + // Omitted existing columns are removed, subject to dependency checks. + // Retained generated companions follow their parent automatically. + repeated EmptyTableColumn columns = 1; +} + +message EmptyTableColumn { + oneof column { + // Retains identity, configuration and dependencies. Generated companions + // must be retained through their parent, not listed separately. + int64 existing_column_id = 1; + + // Same input as table creation. To change an existing column's type, + // omit its ID and supply a new definition; removal guards still apply. + ColumnDefinition new_column = 2; + } } message PutTableDefinitionResponse { diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index d9a24ec1ceaf8dc07e8fec6665bc257965a750e3..d8e28487a061cc02006d6101c3e34674da3a0e53 100644 GIT binary patch delta 19236 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 delta 17252 zcmai*d6ZSvmH*$p_ndoQy#ka6QbjR6kilXUCYJc__>S20y|LU*$ytDWB z?6c3l=iGbld&}-=dFa-blb;IKR7SgxL`&CI1{;r8k4Cw+>8Q(swrQ_3gV9UBtqv{- zbeA;9RmrEV({cTR0ZR|}4vMGd?${pYlDrNw*DwA3uY)H?22+;~cqsTHDmKf7s!cwg z9%XKcf?RnnQf-2~njU4lZT}cm1~~ULfT;L5!;)hq=m;wuw~x4(l{du zTe`*oS1{|*v=+;ndB%4}blmaIH_WSN8w4% zHc|$29#OhEDnH&~F+%F*sO5>i**JIafmEo&e0*z^nPc;!Lo9ENv>BWZB`>q0uuA-d zXarC2Ncgj&%C-^_tu)S#!Va!6uxQ3sA*~qCj@q@)oz7fTJGT-MD#CCpE*4zvPWFYgS<6GwLEjO;TKD+d+CxiKV zU_~fX@odRe0(v$ov+1N2*JmZ2BaJ7~El*oN7YxHOjDaXT&UGRKTOJ*6XNguEm&-tY zV;rFu(kagc6A6~QsTZQq)(wc`3sKU>=|o~0wXMoM92ifgY*pHIS@0lTDm+(}VpVvq zipp$J(TeA)sPzfCpBYDNUrE1R7MxF)TAh{ds#)85c!5Ew8aJ@v>_@lIL`#3 z4N>Pl9ue9Qo!nn)O;zUOO;P4OcMVozxhcwa$X&>=DrMd`r{h-y=MCY1hPBz}1H^K3 zRMy&Pf@p4zDk^j58Alr5jly?xnYJyFmL{bm3G0I>>?vIf(Fk_)NZou8omA~?Y1|rxU2@GYHOA5>Y%ht( zTmoC8LT6`;>xahJ*h-aw-ZnI?*q%k&+UDaOQD%1(R1HaQjl(u+yBC5Ut=i(TBg%Hd zM5(qC=g#z!7lJbe@;~X@>8k?7a;IOwK*qjP7BDHNw$kyg^tBf#C;rEAmroifZIN5O zKpc0;>h%+Xs>;WoMVSZEb6*TbR8(R3S(I&Orm`x^5~g`?lxv-< z&czCpVE0Gq4=)B?h8v{Y{gKM$j>{#s9f$o<`3a>D=z71bHID^O0*ixD`m2|Mg~LQb zB0qSngv5R@DsR&yA<-X{DeuLwtC;2Z>nNO^j$9dZB}6g*I>Pu|qaR3!-$dzutPDn@ z52F7~q{^HeAK>s!#9Z2#`2hWIBs-@%1q_Zx>9;F`0YgPWB0O4(kPnPO`EgAO65&y~ zT>rxu$1Ar5e(yz3#W+0wDgtL!5A}0MM%?>YTaZn zOW8DaLZ{LP2uxF5PRyO*1n6=`dhyG_Fq3Cl&}Jx=ZL*goZH6i*xHraT#(kU33`mK3NxrJP;NB_(ORI&^Jb|8QCgr{ zweyJ10@bloZjCJKRWj21)A!c|t1sYx#&y4P3nnOSs;s^9l-j&sbt+Ksp=y_pA5@u# zl)aZ~hvkDR+c7r=&2|#p!gSBt;KCyR6Wl@{97q=nRk_{QKpYpUd`Hs-NEZuLXSpW} zRr`FrNM#;zU9`t?kz%cr+qL%6#bOnnZ2TZP0quSSl7Yplylbvn?&e^87prc)yfwWn zR(<=iRE4TTK7L$fo=87_EjYJT2Mixq*+On8opg{+mZT%r1%qq&pTL*++<;gvQDx>v zNGy?DqF9{HN3vr+eoAGQri<4FXBRtS_>{_;C0}(E$)}aQof1M6v^x}t?bBWqMD%G9 zl_7VOnR-Ua*20(|h78&vgADl@#aicDjd4YXT$N*_o>6QjvTk?E$IDda`E=&`U_`MK zmdjMu>~*S>#J609osA4ce4vdF#CEwa2oTZbwjdO)H2$UJDzyZ9SE;4Hlw75j{vxiI z$k;l`Ubn)J4PtDd9UF+$3SToIQY%#6?33b()Cw6|e}-1b$1kbOE9u>@2fd303|~@g zNzz9_hPG0vUj}*$m1J<(k(+j!vcG?g; zQsjT8X}zB&5TW&cnm{r2(*z>4UZzPd?JoIvgUY<)!s~+N29@n@!s{a8ZB(IMbs$th z8y<-5MpagkD@tL*$ZnK%T$0^I!h2JNb~%CY1--9C^rk9nYl@pzT;G%x)w(iIn|yh6 zG4ll4WP`YFQd#=|2uArL?CPV7Ow?Pxd?C68y{}BvTZ)@p8?j8(TQ(6AF*)3 z;RekQ@;#L`x3KC&$^ZNQI)+dMZ4NVI9hvY|FTb5n3) zkv96E(e?r2xlQgBqz{ljw#hy$bKF(J+wKzv;R(9w^9&0Y`3B6mXH6cGJkVJ>xSiDRko*zsGAJ!6CV+TENB-c5Zg~wVy6&9 z^%EaaH|estONF+aL3}|Q5lHhc`wWXafYX-Q#xz5ZOJx zkh;s@_WDACa0R`qjBRhzB0w{~d;KENT?V($UyTsHp!XH!eX7h}jkMyr&o4_o^6?ic zbHoj%2bN#>WvPb@=1admK&XDHif*c4jKB2z2Z-#Ketqa6eID@p2ZS$ZBLYpU+dn{D z56J!@Gu1-|bI|Vr5U!xT#(RWCQ9kH50h;kWsLUoHzR)3`Lf z^1fE~5t#VpHXih@auffx;+ROTZCYg!{#tPkLnUgJkN>VR-`ly<65-#KHc8Y<=I&b+ zb`?h<8o^E;N%6PxI6}f{rSWK~Q6>kp=U+5pdsKDk=xmGNcO_%-1--G%-FMbFR43)* z$vQJ#+Z*PSu$-(};AE0dlK8II?yeAG*r2Ts5ZmjuyVV5A*!9}p6&CTO^#&bQo1{QY z9B40P5UCrqI|c-eaZ8g3aYgC|-Qy$|1>sK7HZ3$t34mTnDsM_jNxGe)i!IGq#Tuz8 z+9n2sZq)8J5@K3GyN-eQ-l+3-hX;+Zd9ILL(Ct+1Hblsxk3tG@s&9;)hmJVR&Zxyh==a)x$~9@R2g zGqpV%9IQZOVOyji#xr%+1`HxQQ#Ws6Qd})ryIF_r(w1)r9g242=0j|5*6ymUma4hM z=MExwpv@hK!Yw{`Ag;G)m%D1AKlnO=hzzs?266p^uOqN%tli^9wdDO)9ojQI2w%{T zO7eWG=2luRJz85h_84y8LvO68nJXnTT*ZaGR|(My#hHMb;H zj?`S8w~GYUNX^wf?A>8?*etK^)M0N|2+fcJy;3uj?kp)aL+MVPw87V#p7Z@R0HF$6 zRS?_x?iwg67}@!5F$HN|phJ7712H(z4i2PL7wB^P01g`C6MLFWfG91{efmm(TmkXD zI`bzRpq4A(UajTUTk#Tw0PoYBAIs(`NGohEJV7r1`}B!sX8>uu-_?MSMYD1WVtc>4 z`a$S{l90H9rnaQfv~tOwO9Ff4L~4;XZ?j|o&|>WlN+6U#uOxfXV$Hd-tYowX+(azaZS4IZ zY@E$wsz~Ach`(?ki(X3B$VYs&(@Ic}=)8F`Ag(AqqV0p5)ic32&7y;3+(1&3n33K(gdL?ROzs@qAiWR^>jjo~(Jx(uN(umVv!OS>l$JqLn3XnRais zXvK4x&bQ88YPw{JTagw&4lW+u%Pep!N>eWD+ltaW$@;cJ=j|OR#^|ij?K|eav=Okt ztxVhO4E7a!g|fV@ED1Fu^DA|^_mt&rrLM9o0LBQd)P4FfX(96)zpOLwxD`O==w+?V z6{cgk!d`LnDMTY^CQy(I;T4%cxh`N@U-c^hWYMkwAjYry6(E*tXiZ62TtP2vTWw{a zOSEg+3SzrX zcQr>*APHTsL-VFk2wU(ZsVW`waE0-D-K)1;1~gO4ue+^B2xG8^H4YPOU)Q{qu(s6h z8>N7yTtOdj7TY&U0aL9TN)bwdg7$=ie#$W3P)accy3yUQ&?q$tnu-v_cB9mi4T73{ zvy@_~JJ3%@Iks==g8BXdu9V%TQovGLMc6*F(2DUUw+Um+&iPg;2-zw@A4GF(-zo*s zf-|F%Pz!89KhG_&-K;y?XP-Dcjx(aB=_rQBVGR2eABXYVx~EJ>sCsjRq%%9*9^4zt z_q6*mMQEurem36aiR zpH_YrT-3TRhM#Fp4t{}TUkPWgPJjPdaPbfT&AmPv5YxRnvB&BlntL_JBC(3pozC17T!^P6{D7}B5YGeJ z9aVyO9?%?)Tx2|T8PPh)*Pl=Mn7=Z9zPbXgu$gy{WGRc~qyZ_62tlved-UQm0ZAM|EOPM`*?MsOE6w zKdmb(?c{XFzTp1Rea%zWWL7J)dxO#zyPGQzp~-Q3`)&X(mij59OS zm-lmV^uzGRIBUNK)lVjKDql@7q7c!6wqikSr^aqzAfi)aa~iEwKgssA*uCh0a0Tr( z51Ll@y$ul8X)#aB=Dx9?T=dgp_uLBM3wmEso*tLk`$k&vogTaA)_y`a#qLZO!WHzc zGKn|E?j)I3W9&|n`^lw!`i$5;ZG!lM-dCn^M(mz8X~lO&%){oCfE=F8*RA5rZRvwBnk^tm?mD8&&;f zhUdlZ=@laNpeKH818S{Fg=vx+@MlSDl~si^2ivwgW+@ zVt+I7d~8bJ%%5U=iZ=kuyJPp{IY82LkDmjGF@kn20B>OC?Criuqh*!RZn4I_jvX!8S_R(C=S;(KrGPKXCcdhYY-fk+Q%(*u&8`+Ryp zl(2BMFXJ<+L3|SKJ1GIMD<}`Gy^5rMZRbtTtV+DNm=BJhE`k` zH5JW3$;x7%6^N{WHY*@fi(_|;2qLvOc28~~Qi~-ivhNKPdQ^($|Jb5w`&G~`{r*4@ z7x~oI3^ph{>T3oxKCWhJ^6{VJ%u}vrYOwsXzocp;J4<}cK*R;wngOw0;%f#(b&1rB zToyIq7+Rn3L##2U6`&m=h}08)h@dfcLj;j}LWU??QjH|*NfIr)>7k%=dcog=UW51) z2|l)C1d({sR{)5_lala7QUQbV@v|}CDfq+J!Gpy?SUwx`+EM}?Bx8KeR{(@6Xr~dx z_BmexAgaK%3^F7p)t;RM9$)J|U?p-iM1%Ng^AX3YHdO)O> z$L^UBL~41=t6@pcAfXjf0cT4E)TG0|2`Y zPQmiU*qtYzBI$X_mjHw+XiEUZ_9b5eAgV7(37Dnv6bXB!A0xyVK|4kesg-_=pfPr1 z1d&?l$9RflYxO^rK#@<8;A1;R5Q){k1VAKKOUC7aU~oQuHO_2sV;qd-t1;iCkrEgz zV_f4)074bC^9W+Q#+Lwy>KZA5Gp#SJYkdt2HiH7auMBFfuK`-|T`LjEr8`&#wJsh0 zZE#VM|LJs{9}0-$I=`KQIIi>C>0qJt{>}ix6|{2#;<`R|2N9q#=FULA{4`kV>lZNsGT^>t~Bquemjh!U+fpCC$a_?iJxdLwoK0`;IR!T=02ECi4+lVNT7*AH(rwnRW|x5n=72SjzNUqw%qpg%0RN;W|6D%tq3 zh6_j#`j};2`Y7(Owdk0w-COdO)rS=PG9mMt~+IJZ;>a2(*$>=um2F- zROElEc$Z&EK<*-T`6mPrp;Iu(cWDR#q_h-eJyCHWOR?8C?VVkZ$++t7WLr{@9&pL*xati!(?{_xqHB zDD8JCEh^YJyPOV{oPO?W0wM~~M9VT=#@Dg}`}=&N*?jQo&~2*MY%IR#CtD^d{GL%v9dNlFj>h_A}w`S{y7b31z9>Odk2bBt z!zF{?`KpBQ1#JdF)9R`c#P>U2l*1*1-}?+gxPmr=Ag|;(2|-+C7q``}BM~ zHObtPw$|a$R;Ob)HQ|Z(Cup878JwP8p~I0i{Ey`H#N`0Qa(d#PC_yBrC)^j@DC^bf zGR&LPcXT)zPs!fRB~QuT&55f&TJgMDg6T^zBl7XABr`Xi8Hd%aMqoHA;k~xJL>M8# z%t>E~!;1&!n?2?rPXAICd;f63b*1s{#66^rGUEhoM4)NC z)D0BI_ij5->6VhcCvitS5Z!{dWI=rINjMgi<1`T0dlHU#&gV@^l8+xqGLNKNvf+7^ z41{Zo+oZeR! z9w{s?8ObY@#bWeeMC#7S$4@2vdhpp?cyCZ~1|Cl(+^Nfn;TiIymS>Xinvum5@bZZNe8Ny@V_iYZLAyx+$UD^cjuns>QST*XrP0W1)c0gG7dZi5Mr}!7XceAs z#vrd!w;U@VZ>P2-WgVL$kk_eO65h(J^JCx@)wcBP*5S(|WYF?Tb=$FJA@8iVC49}x zk3n9mZj*~|m<>Tn_v1wEPtx;F2nV!B#1!wxNwapjyMkO+W({G=_mlLGCxo~C#4#Ox zlElsUB}|z&p{q}l<}Hu?h|WHd>A$>52%}Gvw7yOF&rV4y`O_aONiBbx@Y|)5xU3nU zCY-ZRYEq({_a$krBK+6UHYTa)eMy`<#!YH^UsB%w*pE=!m+&aHB65?!i@PJq(xnyQ zGr@T%h4OuxBZ>PhmHB`|Ig&JQ-;_joxpyS#(6{sfqDPYc1I_R4&X8;!P10xEhNDIU z$Q@1G?H!2N(Zqet07U9&(#C#w1Vrd)!jH1dt@jxc|KxO7Rd`bk|06Ux+ax53o1Aq= zRkVs}HgDe=fe1}rdZa4+a76Tdms~otF6^-M@Grv^Vc8!$Es zyb|SjUE`#}*uo_9;k6C5R~4=r+c>sx-Pj4& z*7h!3SzkA4{G`V5byv&RuYWzhcEVMYa)sZH8-L}v!o;!H6dLQ(&nJde#lkstg-P`j zYYP*`)?Iz=*sE(N^=|4YSC}~d>T!*QD{2dquD#}(`i4e2x#D+pS~s?F{B^aZK*0LC zzJ;^u8w$1mHg@7Q6Nq4ZU9K?c%7*dRm>`b7siZ^?V;L5{ z^;i6B?UjvvWwR(;Roggr{Des|l*Vym8%yS<e|L}wG9k+eB(GA zY75si)Hl}qK@@&XnDQwxU1G-EHi3;t1CjGHn~q{ha@mg6r{lu9&!UmBds zmLpeWRFk&2Ivm=sh8Gph*dF-|i<%SUCl7`qi0x}NZ=dBRY`fIP4P-{htO{!ci82dgX;L-f(&#H2*M59?-tZJB#&iwDHl)u!tAGLL4 z#lhB#N<3#aiLzNnXBJWIX<~)WR+Uv9ejMu+_4N~KnSme6vae#Cb~c}M+!nEx zi)V~(k*ng4&|F@Zq!TBG?TeR$%_R5o8KrRvKjOVXPMz3({w4FPpz6B9<>#{i9y^TR zHjKUIn%V}Ii~4KpSZ5@Bn>MpP%Ib2RTuhVb`F~#zQ0{w-vCwON zM0^_65XvQXS^ECOa9FR)*d?T1_>76UjQ!sc_LsG^bx#}fa@q8eb>Y&Hb, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EmptyTableDefinition { + /// Omitted existing columns are removed, subject to dependency checks. + /// Retained generated companions follow their parent automatically. + #[prost(message, repeated, tag = "1")] + pub columns: ::prost::alloc::vec::Vec, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct EmptyTableColumn { + #[prost(oneof = "empty_table_column::Column", tags = "1, 2")] + pub column: ::core::option::Option, +} +/// Nested message and enum types in `EmptyTableColumn`. +pub mod empty_table_column { + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Column { + /// Retains identity, configuration and dependencies. Generated companions + /// must be retained through their parent, not listed separately. + #[prost(int64, tag = "1")] + ExistingColumnId(i64), + /// Same input as table creation. To change an existing column's type, + /// omit its ID and supply a new definition; removal guards still apply. + #[prost(message, tag = "2")] + NewColumn(super::ColumnDefinition), + } } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] diff --git a/server b/server index 5f677fb3..cc11a00a 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 5f677fb39281688ac0617cd41d08b2e46a6f5d3b +Subproject commit cc11a00a69975c6e505a0349c882c61ea327394c diff --git a/web/src/pages/admin/table_definition/logic.rs b/web/src/pages/admin/table_definition/logic.rs index 4c5746ef..7b9db2bb 100644 --- a/web/src/pages/admin/table_definition/logic.rs +++ b/web/src/pages/admin/table_definition/logic.rs @@ -331,6 +331,7 @@ pub(crate) async fn add_columns( generated_aliases: Vec::new(), expected_row_version: form.expected_row_version, new_table_name: requested_table_name.clone(), + replacement: None, }; let Ok(request) = authenticated_request(&headers, request) else { return Redirect::to("/login").into_response();