[tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview

Roman Khabibov roman.habibov at tarantool.org
Thu May 30 15:36:02 MSK 2019


Add "_vcollation" sysview to read it from net.box. This
sysview is always readable, exept when the user doesn't have
"public" role.

Needed for #3941
---
 src/box/bootstrap.snap             | Bin 4374 -> 4441 bytes
 src/box/lua/space.cc               |   2 +
 src/box/lua/upgrade.lua            |  25 ++++++++
 src/box/schema_def.h               |   2 +
 src/box/sysview.c                  |  13 ++++
 test/app-tap/tarantoolctl.test.lua |   4 +-
 test/box-py/bootstrap.result       |  13 +++-
 test/box/access_misc.result        |   4 ++
 test/box/access_sysview.result     |  92 ++++++++++++++++++++++++++---
 test/box/access_sysview.test.lua   |  30 ++++++++++
 test/box/alter.result              |   6 +-
 test/wal_off/alter.result          |   2 +-
 12 files changed, 180 insertions(+), 13 deletions(-)

diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
index 871a93f9856f97636ad55b7f5260e5c6957fef36..4e93a794a0608710a2bb93e96e9031451186bf01 100644
GIT binary patch
literal 4441
zcmV-f5vJ}_PC-x#FfK7O3RY!ub7^mGIv_GGGA=MJGC49WXEkDGHfA<7HZclGZgX^D
zZewLSAZ0UTWj8QoW-T}~Vl^!^G&40VVmLN4EjMOmV>UQqF=I6_VhUD6Y;R+0Iv{&}
z3JTS_3%bn^-T=-7f<eKh0000004TLD{Qyv{h5#CsSRqCbkk~l at 3;+xOdU at HTEDz~p
z+BX^(yPn0f4L~;l9QsnGq$X36ku4=DlgO!mdPKbrZ7!#tL!6h=TVNc<ruKgh$s0t8
z1Qr4a0`vj1od+O9S&WOac-O%P7?be;<1rmzoN_?s95)zqjv8=qj^`+516mv>4Q6pN
z5R+ at N@^vvz7$;E#lYuB=5JpTd0Hb$bFqrKuxIkwSxAXFa=GDc5EOPOZML5}OOP4Ha
z;gZD)wq!AjX%;P_h@}Eiyplx}Q!7~huX5%8CM*A^OjT%hC}^61DYX6j`^Ijbe-3T`
z-{-F#DilaC!M#(c+#7)e{4P!5S1AI1`GsKV-UpQKl>))NsRIwx{EjB2=65p(YCgo(
z{4R+`vx797*=ZojsVT{+$xaj`nirG?W?l?LAvyS+AC at cM4ZBFrYj<;Oe&6+a0>y?4
zFkr)@CpNU9(E>IFj%>CBjBGXp6z~Tm;JpC|cwfK)7EEOZSTHRrz=Bs6Or6MRT|`B*
zt|m^hbhlaQ8Y1!pH1U3bA at 79<*g*sAEr8J80R-I|kN~&#6Tq$A8WW(~ZOPB=ri97u
z=Cj26BuczT;^Y01B)uC!(tD93y%RA~mH-qf%OOO{(xyTHpamHcZVq0*H3K3<v{y;~
z6YZD&2x9AY=bEkuNSV8tmBG(V>_<-wHf8HJ|9-y~{^P#=do43<#8}yat2g9e-e*>|
zlKu4b#9&ip+KdU)^kqvGUA>!cESQz-rzZxR`cY$>XWuWHrKa}8U{hbU7v at jOmO3h#
zPldtq_?)?FLy8toQ><ue;zta2CjX~fbYZ_1T-cw*7WUhZg%&hAS7b4xV+9tdj}zXq
zbMf}?Lp_};uJE1;E4-hg3ZF_r1+6QJDP~<zNRjoem#_P-C!*-y2`IYH^F;UE_nd(8
zygX38i5`@P@=Wl&U!n=`m0-gAB$n_V2_?KgA_<=wfds7%o+D;;?ic~)(7)+m4!<w^
zIz`~go`^fy4^c$+*$Y9$^+61AJrF`%fBg?ZSZ at ai>+Aerz4cypc&Af`_c>m?^Dc*u
zHhq|*%^u`vQ=45rSd)hytQn`vn%0EFL+86Vou_a*@BGcK<XmaV-MlGz$+x()+;G3M
zws?Ny{7$E}b6I<1>GsCuYWoVSws*kQc5S!0`a10Je-3T_$3cgFLk_*$fJ5&!+ at RUm
zpfwFOXuXCFSz6IhwT3LoQjHagrl~@y)SxJuH2=>)mCArdU!^h3ur&-aZ2dwETW{?G
z3 at yAc+p*vRkJLC)?^bAmrUDB*GEHFx9+{$`0__A|3bQE`c$~!T&YZxbnVI5|Wq4<J
zqzPttB$<{_hPO!)OxWZmM<_v)B9NfT+X$M}q)h~pl)8~*8f7D|$P|^bPiK^U`lx-f
zPyY0|f1jbe&pw-d%p7XW+Z^+lOK!t at +b~($unj-y6KC?o`02za9y7)w#`umHr=f^3
zcrmVpIJMxtA=K{u?7bj_K-+!r1x0Mo&rKzA@@@F-Y7?Suujag_LEFWk1#`dK?{iXi
z=MvZNc>m5>=KUUv&Aunp_1{(<YO)6XvZ~O~w`J#|ZnRp={e5!q3-!$+*Usa<x;3A!
z1`!Z-GwN+V3;nn%&;X__asHbe%Yt0%Oxy2wNAcX1)#mwItvUF)sXsz^uC7_F&;9w#
zbx&>4oNZg&l<ktZap(TM?hI8KnA9(CnX~1^p#QR}Pwm;>ZSHFG{JHHlF1&lpexF*`
zw0*2Fe;2f-*Se+MSZC7IFn{LB`>16Gb~VQ&XmxGt{;O~Jg}3)B-tg15ozZVjt+lsC
z79_w=08D^Rd|UFPgo)3ROY;7G5+yV_NPK2;jwH#polQALkkGt}9GQ6$F|wN_(Pp*L
z3xFcDIYWrdgw$T`;Ts%_rHr}u%?UCD-+&0gw;w_94c~fz&|<Y$d$U at 5JvJMx_G*vz
z#j}$A)Lv9n+6S!mqEbG-XuCc7nC<l7!$#q3)Gm)bIEsfJ9K9nCj&jrvJTh9x9T}y=
zj*Mn>jyn1&2Oa&4V~&3I6An4f^Nl#p(+xPzw2e1tU2M29>sq4?-gz~iU23q=e;RA_
zkA at ok_kTtj|C at ov|7D!<e at ccK|Bq3||EU;cT%}=*fj<~x;QvJ!_~Y*d82 at +i#s6G*
z5no?lUwNFIpQ*>kxb!8cB=d;NHc=_0D-ap`sl8n7?Nii>)hd}%uD!3XuRKaP2zGtH
zXx^t*?ZsfVN~R?CYo0z=om?<$^LDP<6JE_b7MOMIG<7vrB}1ycoy*YXYOPTjMQqx<
zZt9W+d;*5djk10DNM at I)i((XrB#S*1(_(PTOuzob`u?6{uEMHhNVZ9g7hL7y&QbdH
zXOt*Xyyio#RWhRxYWPuwAZXPOoIK#tLDfP=%b3c<0n-Lc8Z3!fa-zDUiz#IQQwq~V
zl|~6n5(Y^ZBz-}$0Lcqdm)H at PdbH(8OU$T(YLo?y5f<4MnU$g{R7FiOBBn}20nr55
zTik at okOV_hh9VGJ5>gU^AQtpM4U!V%01ypm29#8((BO$7#i-ESsXq<;M1fJE!E;Zj
zyic8(d;7<N`P813tOyF1=AauJn&-Fq*5+Fn{I>L&Yu|3otx#tSviUpP{{80QM~dIB
zh75%F+kW>QKcC-lrGZnOp5&<Rx8Oee|F$ZZ1=5UT?*G%OT8>UEs_#z?ep;2u2+iGG
zQeeC~qq&<~R$I{Pw!RPEryA$Fm;Y`1n1$wUez~fYKvlo~OhN$v(^mEC&o5Vz4p0N`
zQ$#;qJu=|@*Q){dDSo+XRDc!wWmTE1TQiq&R#G?I`P0>+hFhrfv!@zDBO?F+01yZO
za~nty7-Mxw2NM9mLBfHdvN1dsi$pOD80#_1)Bq5G00jsT1OV!~u~wyM^ecNQEV{be
z773%OU+j at Ey52qF$=%s#6rdu;O*UQUW!e?KuIq)-#gogjCetoeLHs(Br3<^w5)gQ!
zb3Ia>p_Fki(6#qxbTfzO<_0{=mi81mItLZXJcgfPl(45D=qlE)S;16t1Mwi1k-lNK
znz@^yGKp~zqwZpVIK;3C!oJg|Nf=nsPr$9P+K<GSbi}vp4f at V5Spl*$3HwUbLa|YR
zC5mT-j+t#p4`nxtQea)J;x8R*zCdoEKYitt|92I-E)Pb*hG<<5oFW~io9He&x1)NK
z*5l^hZRaV4U{5hMAt`$=LRi8Qu8N3829<U2W9Se~jy$k$H=GTpQXYna4pFT<3<V9M
zH|Rb(rz2jM2d8LXwB)%42v)Q_pbZA@$L~#1HVu?a0lB3BP$<9Ih>{;d5w;9Adq7OA
zpS)>FycOSCH}@s at KvA04T&CxQ9wKdI1*le&9<L#MQDs_Mm*B^>@v>)6!4bKM)c<t;
zW3g3X1FWHoC1_QSXrV#~A5u5WqhY>#0b>?38TlDCn5ZFiVI6|8!1`@$6Os%uHl~Ri
z!*Vh9SLtICrZ?HTW6oARn>s9T2c1p2Ui4nC6rvl+(JUtSmdZB1PP2&@LRivb2~C^)
zfM{Ci$V-;|5P#@Bksa4snRao-xNh9;cyr(nvrFsF>9|%=3v6cl2EChEp0*i!oqHFZ
zSs$Nnci54)16hTvro$AmT#%8iKwd7<yikiuZ182tNnD~suy6rf^Y-mj at wtn#UZLqX
zP-U=P;HHS>#N||1fX&faS!^Smop3~X^xLxj8GvC9sAv4+^6MS76M(FoB}CFCtie`-
zH<D8T8XCfibx+VDDhpjAV^of}R1*+iU at 5}X3Je#jHjg)S<gx&C#cJqyH-19_Ky!3m
zLTc$uvBl#q3PdH~aG_#-rAORN$dNp9kY#nkwOILKu&jBNz<Rk6vQROyT;)3%bM4hQ
z#~Kljo9FqtY(pU^c--IF)h!j6_65o#8x2^&6Ix%|W)x)pkL_h!jH=l&JL!z?(Z7q#
z!n(8L;}8Hjch;+AfQ3$7`ssW7E2`_IMRV#VGF^;OVv3E8L~NnqIMhI-ss_|4lPRa@
z)9BsN2r(^4)7VWU!b8!7D8T7I(d*Doa8!$)`5L(4Jq<lruc`s!%4bRN)LH at YEI9z-
zMWhQrovTTaNBb~lqw5~L03maT6lI#38yI?H@=|<8q!6@*vtg7kE71hmD6*lm1X9ou
zVstN~=|+vgK=zc_f)>sQLx;x at 7cVx9TFtj12!?911^}UcPHz+ztN1ORS8Khk4Z@<z
z+}dKN65~mV#M0Tp&VV at KOP&o{=#q#&z(yzEGDt7ICH6#aK)CSb&ju}Nseo?5 at eE!I
z!paua$4BE~1((MUzd*#|C?qfUEKW!ZB#3-4o8>vS_!t*?+SiU!X=X{rUBXanFs23_
z(bP^EiHL;Kqz#EeQ~_h)5UT%lhAv1Pf}&Xi$WVWy8_0<&eV1pA_K+7<`D!ok3q4lz
zMC=&d8!+dD{qN}KqJc#?dI9)JL{FLT?gG#WC#I431@|D^dLvT<3*LlZ7MTI*ik5IN
zJfX`vyFeMFH$>>KAu3&~*n`d?qA?P_Mxl63<Q_r}5sZ=aH44S+BK1%?q%chCuOTQ~
zi`a$CA%$g9ehop{TFfp44k0X)_B9H{>mv71?qYL_Jx8dJPmWmt7KBu7r)+v{3_}CE
zz at U^ERMG-OFUF{;K|p7QKf{b#uwLozBBu3k@^=e3ssaK<68H(e^73XH at NpE<Q;K9m
zrt at F+Nn_}P<4=dC_2;CNLpkzOKZ7C9GdsYi5m2CzEkZW3Oiv92c60bL)`UPc<%?iK
zEtQZzDKQ+Ncg2|_C7LKkR><dhhvJ1CN9o}u0#ijk4U4|vD(dYA@?z&?)r3elD at i0t
zEbjwNm366Dk;gz58u}Cbi+tmKTm=}GuOF{}O05d-_z6)dx0=!Pk|7G?VI=|-%}m at R
z)C>S3OGcs-r^x6+a7i>z>GJ~(Fm$m at rHPD^ComQhqoLCL4I%QtSbv|NI}AQp21sJy
z=^YKr<jDvr|A-O@^z5_e-!3BooCPEiaQ+78VjEj5wlV?46%AwJ3=Bc+`f-2Fxc0yf
znaPNH-D6am6(b<${F68g24hKxG3 at 1FE-&LI*v2P2TbXQW&JZUYG2FK8Jp?a_b6wGl
z(8VW=2AI)l%v5Os8kwJ$pbs%gY(18$v&|+WldX(3!VWwMu=s1sfYUCg6&qn^eX=ld
zRbUmvcFT#V(|b=C%SWC at xI12RVt57DvQYcV7Na{(c1pa{_mF>#E!f6~ot7q>us;Bk
zGCDym^e;<|dhHx`^WGXXbf7notfL#5eBf}Rd}7b3I^B|$+Vi{#!TcXY4dT&eeiZ`_
z!E6&D2;-_XGT=46HjK|4l{q@(Cu_*_ at nWkCHB!cy=EF0wxrZ>KAT>ik0(xc?bS&wS
zX7XXMhe?jA{7gI{u&Hsxv!PTN=f6X8-#6kE2voqSF#vb^n?w&IXCtHJ1xh54vztDD
zt_}fKXQW|pg#mm9EWXo*0fj<I0S%^ca;5X9wGh~Wg&^^VZZr at -EUla^hahS5PZ}?U
z!*vbp5rS>48&SRF`Y2il{5 at _N{57}(055 at 7Z-ilB2^TQ-Vwg=4A?2?)FM|jA!pq^Q
zJ&6~zaz{-Tcc}Fv_Qif1d#Lmyw#ELmCBy5yUy4gJWXM#p455gP&W$^(!dmQeYsij1
f=nVfh1t1tqt$GN0oD<kXrdWQ9rdxg05UuSBSwB~z

literal 4374
zcmV+x5$WzzPC-x#FfK7O3RY!ub7^mGIv_GGGA=MJF)%PKXJlnFH8e6c3Q2BrbYX5|
zWjY{aWi&ElFf?W at Fl1yiEi^GRIW0J1HDWC>FgQ3jIXE~qG&V8{RzqxWV{1AfdwmKD
z)w&D1%@Cdd&a`e1h@}7k0000ewJ-euP_2XjT9fP`Mi7wLIRFd*3;=q0Nziu>7-QNu
z8W+2s#p7E5P7FBorA$dprX(X<N>V0~Q~&gcdL7za?!E)Y<UZ3H?vhm(vp*cYZQ213
z0s#W=0XQg&cOHO%ahVS=CgTCdX$NJ_kpnX4xIqW!c#dN at n8|6{Kqg0nF*&9yUl-+w
zX%fXS8i-;BV#E}KFnR|j1KI8Z40IN8yDwm7TwX57VwW#jjFY*zc*)|HE?KmIOBS=3
zYS|)+Su7AmELub{y^`gBD_H(#y7GUzWM$S>0TTsFq3z#aICk^=b7=ejK7YHaR4 at Sr
z_exOZ-Uue(S4jeXlOo`kUkH@$rIK{-6bSB3AD}|>yV(?)-^m`J`4C6*JEYmH>qsW+
zasa7`38{&xOUluVD~ba$t_Gx#9Q at 8N3zqMOTO{YSyE!($?{YzjVnYTRu%QtY8``jl
zf!YE_wVDD&wORrTcmx#i{(uC$Hvj<(rm+Jom=YOa!72-;PhzvJAtKq9lP6cY*RE^{
z4fz6`cu#<k_dx}0AOiLtAZTv^fG#b70WR%FfJ?iyCIQ%NOnz*(B~5HLA12-_S>k;X
zAMcSU>HSEO-i;vXy~vTW1i(mH5-C!aHXQ=MObC&1bMX2sS&$*3twQpjXulMQkXpAp
z({w#S%G}MX41RB5Kzd*=sam)B_xrK%ANTFwW1Vp`<_Z^Fy&(tlKCdcO?5C#(_L4H=
zhKv{{FkGzY>fL->y{KY8J+PNlPlauseZT0{n%V<<N#&`%Fn>|D)ZJn}_4UHzgXR{)
z4q~VnVZrnS5ZDV%-+nE)nAOQ*3t1g3v_QR_ at Rps6w|^h%>s*nA_f}xxeHB;ulnN_m
zTT at ga+meEct8c%2-ET!PMfXrh(LJ6hy6?UR#gpgZdGb&6p8S({g6Dk`Pk7IS6W%Y;
zg!f7?;e8TI_!J2xW_Io*A+vJ?5?~HJoDSyj`?9xV#GUMmI3jx at jL1IwA&R(O2qLZz
zVu<Un2SNzzyMnOZ4iMH`&(+0y9Xq_!;o_b5Id!!8108MpFh`r(-1@<qJ@{ZvIa}7W
zW}F^6-^uAbjnjGOaCRlvN=yC*PRUE2rG at o|`+b$g^Bd=PI;@?$+S^LEH!erpRaUgk
z1CF+7+fCKqfrtNfaPxl-J9Hd$=>3Kqdba at w-R1_ZYp_9UHf_j~s)i{xWJ#85s8CeR
z6na~OqG{CpPs1&pA&ss|WuRf}7-rZS1{t>A`h^%=fI+rv;RPP4aird{;KFQ$7I<W;
z0t-AcO<{!@3Op5LQYr8_iQAz;fj2uN#Ust|(D29;&hSVwHNgyTlO>$6$xV`Af+j~O
zL6bHTG^xqj2qYP0Bgqu1Mplt28fBeMDC_i5>tvn$>2v=+KY5>hHv5?Q)0nq8<}sJN
zhV`ytvaI16cG4%#<cYD<iBCLcj75y`9WhQr5o7RTObc;p!FxrZ-TT>lLl9xM1L2eH
zJ_rHI;!d1wdo|}Y4c0COEtvb=exHl7JD0eA$NP7_GVk|RZT3B%uK%*CkPy_(sIU1e
z^t-A-1$<j}F6u_B#oXT~2ft9?ENbmM?yF<-=_(KbrY&*)o7~ERT<gr*?{`D-Tou*k
z`CF|y_`Rt=L3ggES*_3g`K)zMZP8q9TbxwwlDKi_{=E*(&CDz6m$%H>@?y|`SJkKX
zZ0|OAwR!&B_8J%7J!Zd8tZUZ3RhYjETGM0Q(rzm>YHFB2^W=TRI`g`kV-mEQmUaKt
zH~hle`xS5a>DtcdN2k`>V-o`!;75Qa0i4*z<Y!3}A10UN{d*-#W^<DG$mSqXl50Dg
zbB-jLaT!4(<0^7wCqtUaXd at Q@MrL$~6p;<7z1qXJI2KPCGwq`zgb20;8G>y<gkT%C
z^#qy0YOnTWwf1^ywO8%c-YgG~D)v)*P*CX~uiAr3{m3)h_3?*n$A=#l3TL5qd-TCk
zJ^0{g9(!<<qj>0%(L3_Us2zA at G^2Ig(N8+;=;s`D^s}FG&~ct|%yFJ@$Z at 7`#4+1)
z0}k0%8*lK=s`1=n!;SveXrq5M*yz9iG}ibZ4K at BhBaQ!4Gtl_Ij5GdE$uOfT9it5V
z#UKO!Fvh?ie=x-O|BEpG_X3Rn(=NWSp9?SS-=Yf}Pk7x+JteG*Rw9v{jB*SQjWtMw
z{nTC#cI!SxELfe2CDmS at JbCa`5a at M%zi8ek77YmORi|P}wqNt~x%xx|Fl+O6t=jWl
z&ASztHSIKY6*d(+s=b}d(B^6dp~@&?v*tCE7cC%^Fl8=O4a`3>y+B<Qqd_29?4y_#
zgIQ<#^{3VM_Z)NeH5EJhfN9JZT;<}<Qu_6$6e&@h_Cu{xu_6y at SmqXz!KxiJanNOh
zx at F9krn;oTk{G2hN*O3&aMQt(z`T+!=((v$`hw&IsS6U9qb)}k9BDDiVuU4)(Ul at A
zMNDammSPp$ViXWnxe-k;B*9PwLrU0N>?BDD0wF3wQ-U4{ngz*VFd(FQOLIg8Is$T_
z)*mT9QC_z+ckcO=_o+K`Z~s;=pW35}5jCKtIrzqg=J{=&wRsi>zb$>%+P7OXE7Tc-
zZT`--f4 at 2Sk>a<jA(Zfb+wZ>P=QA8FHF0Va1G(G%7Tjn5Usmm6q-Gp*{~uP}Qgm9~
zzCShiVb!Gt(A-TW1;(p0n!A~0wFSK{>-*q!qH(Qz`QNsWS7`3$m#aw$O!ezeBn0q3
z?Nq=1{Brf^fHmMgMfB5EBLmKV{Tgte;+LyMF)H-CsxhK&&0NM&Mcr`cPgjYav_Zc&
zb!h0@@Y~gfN2v3|rxrpZBLDyZ5C{Ns8%PjXTV_cH699lgf`QSpF+3Iwq!<S5ddxC4
z00SUEL4YCvWy~f`oXx1Qiw@(OqJ_Cm(ZF0yGu at W{E`|K0L6wJ7)jsH-QJ_W_Q`;x&
zF8QjWU}GHOrdE4OU|-KA11Y*3hkE7)G|QILa5uUbPLuHfXTm6XkLv*Y=JosXyOr3u
zJdsr7jfTph^!yYNmnJ1Y%F=*+N_|01mmsT>=K$*gEt9%7sAxncQiVIaDvM0s0_Q7L
z2*E;8tGH%M4YO-v2hH}|;?R%v2VF4^#P`NPhr#_`+fOC5Qcf2ahGJdL7DtR?ip%5e
zF`gtiTW5LR`;QUBn*?XHi!!CdUOMvcnB`7Qc6tuh9;a5zansT$j4<<LeByVl)^s_0
zTycu&^7Odil+Wc!@|gF((iT5)VQHN{+ at 4elJ+PhPF79CJK|He&C?9MJOewg+0Owex
zela=XZE7nH|Hb!0bX2BV4w`V6J?4?sSw)BVTJkSla&Osg!jHqhW!3fsM-=BFm(%%g
zJ62^3z_(Vc;j7Ysg)#wTNPP~!x^r(fjLqGn6DOo#B8KpN%aDrwPcdT~nK+2CKHzK&
z&BfUMqm5yh-T>Ym)2iw at H$yyh(DR7)BAIr=9lDVoD`9ePi)`bEbQ|r)jinYgR<y|v
zaiygWkYq_5rVm3PvR6r`#?DY;oCqsA9vz^=Bcyftv at L`<<(=93W>sw<ex5n>HgqS@
zvOY4c=&&<yLsi9FO@|dwiGU*6pI#~sy+D5_HrT-NA=~NnwHO80bc1ecLEObrU!edu
z6lJhIv=lV4%ojMHHcA3MvQ5H|?&x-T-*m;Uo2ZGuQ+isc8%J<vklJ%vre+ at 4s3sGQ
zmH<j4QS{eQc@@)Qmn>DkTY{HD)rRqgj$9T4T|ogl-p6msMraP5OGqucvDm2HEih3D
z>=wfp0_q9f)RJP4+!EST`HCKYKt<7PB0{~PH(k2GiL*j>Cs)6~&b4cVZ{&D?Zhcb_
zJU-`fA9b$c%X)$G_^%OG^M-0NPiK at Y{;!shIfgmg<c`q{>6rP8YG&WHkuGJxlHM=R
zkOM3<>QW3J#=9bvU+S<>cSH}axkBYKg%Vj$(ZC^J!YXxBMlsBsLYqdBjJAkv-A+qG
zg5 at 5HZbqS<>WOW!c7n57bl<3nn at 6-zbMjG5XjMSWlujAs5nGa64_;7P0NC6eg)FaY
z{WZk!uMoHD8v=3^18W2%Mu7Ano)973OR15Fdm8|E%Apd at _Io+d)p##2ugONwL3DN+
zcxilZgt;KW5dR7`T*JUVB24sG<_4SdwglD{j!8J5FJNnRB$p$&DHGe`(=XIXN at J-@
z-^U`FiHbf(AN+BLsh7hgo$vSZxAf7+y$F-``P{(r+%ABvH=e{aAWUGt8tmvjKxXH7
z@?&xtMO at _N59kxx%G)Sv7GI`EC_ZkndHad2^j5TcJRc1uvo>ldjA(&D<q~nj;rby9
zVmGM9L$Cx$58??C(!G=#iMY1`aHkw9;cUO1@#|LB99>E~w9s8 at 7V*_|Z-L!y-Zzwf
z4iRwU=p2<!vPj7MYZicR*<%`khHM-`^W0K3-a-X<d|=N=P5$V_;OD+<NPVY~{8|-1
zqe%Wz<J53N016^vjevzP5FYFaDU!cBH3+$G0kEzqWcXdnuOWncg|VvG5P-+nSR)`Y
z3Zw_`gox>1NR33^+W@$WD&Qu??6p+L5Km$Nin^+HG&Z?0h<OKcE&YA&GvYI1g?S(`
z@^LRUq&~7>o22y|wx5}oKagwd-?N^gV-2u6ajri4Kg}Y9m+HUDw0FkPa6oQm%4F=3
zen;aO^))@OGr;%cg{FUE2x{(OKBN!#d}bi}-c~@pQ~@?AZsi(EB7$W5h;f_Vp@}R~
zu1YaDF7f9V?PO%>;ScArPIdS+TuDr-9~=+wPn|~z8F@!sl29ZUk&h5py3`~g77Zda
z1QOgA!yx;p>o<r&K3>&eS`~6h6T)k*w@&IX<0$k&NG!f}8(^6{8R2&xNdgY1e8s|b
zNi<HWB}xo2d_#{$L~mV}3yX=t&~I}_5yL5tzfSsa<1YL~L at d7dx?os58R1n9NkaI_
zIo3`NGaiON2#Lb_o)H$y3Hi11EYPmVR9H>$Pj_RE`gLbnZT1O#4h{8+Tv;cFuo3uA
zGVvPHZUT>4wu3BUnKI+ekUdK~lUH+%lx?#yukcP1>MahxY)gj5LoixFMkk)N0)%N~
zE-p-dAVAr&5G-T#-`cag8Ot5Re#*GG?>4dLFN=m729Yya7)h%h5u*T+C1OEsyl^RY
z9=&k!gVhJ{3ZZ2o!oK=O4aNeNuuO7*e_Ra{TVoQZed}kR*8wQB#FB>4L%p!ia4=$e
zYOuO=uXI%bH>&a%2UGEhi%6AqE-P;j9BOma-w;Ih`Yx at O3_ducSwe8ZIn+vQ2?-3=
z%|9yMPJ!n;klelKR<4>U<6rW-U47{x7*d#zsvrw0JEj}b^1vXuaN4jv$A2^-Zc)<K
zP at MU2;Kleeq#R$<iXQ?{@G39C0{$kmg+I+mNCY}1jz*t=_EuMcmc#XDGvBU41sMlx
z&(6N*l}yPX=uUz4e|kXz)Y#m?IJ~=~7!7Fp3|R~51m>qn^BoGAo*o-+n<;~iD;J7|
zQLrKBBIVi0?L%RO#>v{Vv)k7d4KXYOEKzvjJjy0iFhW+J&3wO~^YE6AxO(yzw(ydk
zxP5vTci75K+-tH!hy7wCv~j)#kA)dcT=i~!v)V9cG5(s%(U4@}&rtx^8Z at h$qsLi+
QJ>-q$w`eZc2h|X*?NOjQ=l}o!

diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc
index 100da0a79..fbfc2a64d 100644
--- a/src/box/lua/space.cc
+++ b/src/box/lua/space.cc
@@ -525,6 +525,8 @@ box_lua_space_init(struct lua_State *L)
 	lua_setfield(L, -2, "FUNC_ID");
 	lua_pushnumber(L, BOX_COLLATION_ID);
 	lua_setfield(L, -2, "COLLATION_ID");
+	lua_pushnumber(L, BOX_VCOLLATION_ID);
+	lua_setfield(L, -2, "VCOLLATION_ID");
 	lua_pushnumber(L, BOX_VFUNC_ID);
 	lua_setfield(L, -2, "VFUNC_ID");
 	lua_pushnumber(L, BOX_PRIV_ID);
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
index 89d6e3d52..f2a1be639 100644
--- a/src/box/lua/upgrade.lua
+++ b/src/box/lua/upgrade.lua
@@ -737,6 +737,30 @@ local function upgrade_to_2_1_3()
     end
 end
 
+local function create_vcollation_space()
+    local _collation = box.space._collation
+    local format = _collation:format()
+    create_sysview(box.schema.COLLATION_ID, box.schema.VCOLLATION_ID)
+    box.space[box.schema.VCOLLATION_ID]:format(format)
+end
+
+local function upgrade_to_2_1_4()
+    local _collation = box.space._collation
+    local _index = box.space._index
+
+    -- System space format usually is in order "id, owner, name...".
+    -- The fields "name", "owner" are swapped in "_collation" format,
+    -- due to the field "owner" was added after the "_collation" creation.
+    box.space._index:delete{276, 1}
+    log.info("update index name on _collation")
+    box.space._index:insert{_collation.id, 2, 'name', 'tree', {unique = true},
+                            {{1, 'string'}}}
+    log.info("create index owner on _collation")
+    box.space._index:insert{_collation.id, 1, 'owner', 'tree', {unique = false},
+                            {{2, 'unsigned'}}}
+    create_vcollation_space()
+end
+
 local function get_version()
     local version = box.space._schema:get{'version'}
     if version == nil then
@@ -768,6 +792,7 @@ local function upgrade(options)
         {version = mkversion(2, 1, 1), func = upgrade_to_2_1_1, auto = true},
         {version = mkversion(2, 1, 2), func = upgrade_to_2_1_2, auto = true},
         {version = mkversion(2, 1, 3), func = upgrade_to_2_1_3, auto = true},
+        {version = mkversion(2, 1, 4), func = upgrade_to_2_1_4, auto = true}
     }
 
     for _, handler in ipairs(handlers) do
diff --git a/src/box/schema_def.h b/src/box/schema_def.h
index eeeeb950b..77c004690 100644
--- a/src/box/schema_def.h
+++ b/src/box/schema_def.h
@@ -72,6 +72,8 @@ enum {
 	BOX_SCHEMA_ID = 272,
 	/** Space id of _collation. */
 	BOX_COLLATION_ID = 276,
+	/** Space id of _vcollation. */
+	BOX_VCOLLATION_ID = 277,
 	/** Space id of _space. */
 	BOX_SPACE_ID = 280,
 	/** Space id of _vspace view. */
diff --git a/src/box/sysview.c b/src/box/sysview.c
index 96c5e78ca..0d1259af0 100644
--- a/src/box/sysview.c
+++ b/src/box/sysview.c
@@ -402,6 +402,14 @@ vsequence_filter(struct space *source, struct tuple *tuple)
 	       ((PRIV_WRDA | PRIV_X) & effective);
 }
 
+static bool
+	vcollation_filter(struct space *source, struct tuple *tuple)
+	{
+		(void) source;
+		(void) tuple;
+		return true;
+	}
+
 static struct index *
 sysview_space_create_index(struct space *space, struct index_def *def)
 {
@@ -448,6 +456,11 @@ sysview_space_create_index(struct space *space, struct index_def *def)
 		source_index_id = def->iid;
 		filter = vsequence_filter;
 		break;
+	case BOX_VCOLLATION_ID:
+		source_space_id = BOX_COLLATION_ID;
+		source_index_id = def->iid;
+		filter = vcollation_filter;
+		break;
 	default:
 		diag_set(ClientError, ER_MODIFY_INDEX,
 			 def->name, space_name(space),
diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
index c1e1490ca..ac1efa0ba 100755
--- a/test/app-tap/tarantoolctl.test.lua
+++ b/test/app-tap/tarantoolctl.test.lua
@@ -405,8 +405,8 @@ do
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 1", "\n", 3)
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 1 --replica 2", "\n", 3)
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 2", "\n", 0)
-            check_ctlcat_snap(test_i, dir, "--space=280", "---\n", 21)
-            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 47)
+            check_ctlcat_snap(test_i, dir, "--space=280", "---\n", 22)
+            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 51)
         end)
     end)
 
diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index 379f6c51f..f37a28c80 100644
--- a/test/box-py/bootstrap.result
+++ b/test/box-py/bootstrap.result
@@ -4,7 +4,7 @@ box.internal.bootstrap()
 box.space._schema:select{}
 ---
 - - ['max_id', 511]
-  - ['version', 2, 1, 3]
+  - ['version', 2, 1, 4]
 ...
 box.space._cluster:select{}
 ---
@@ -21,6 +21,10 @@ box.space._space:select{}
         'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
       {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
         'name': 'opts', 'type': 'map'}]]
+  - [277, 1, '_vcollation', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
+      {'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'}, {
+        'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
+        'name': 'opts', 'type': 'map'}]]
   - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
         'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
         'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
@@ -83,7 +87,11 @@ box.space._index:select{}
 ---
 - - [272, 0, 'primary', 'tree', {'unique': true}, [[0, 'string']]]
   - [276, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
-  - [276, 1, 'name', 'tree', {'unique': true}, [[1, 'string']]]
+  - [276, 1, 'owner', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [276, 2, 'name', 'tree', {'unique': true}, [[1, 'string']]]
+  - [277, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
+  - [277, 1, 'owner', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [277, 2, 'name', 'tree', {'unique': true}, [[1, 'string']]]
   - [280, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [280, 1, 'owner', 'tree', {'unique': false}, [[1, 'unsigned']]]
   - [280, 2, 'name', 'tree', {'unique': true}, [[2, 'string']]]
@@ -150,6 +158,7 @@ box.space._priv:select{}
   - [1, 1, 'universe', 0, 4294967295]
   - [1, 2, 'function', 1, 4]
   - [1, 2, 'space', 276, 2]
+  - [1, 2, 'space', 277, 1]
   - [1, 2, 'space', 281, 1]
   - [1, 2, 'space', 286, 1]
   - [1, 2, 'space', 289, 1]
diff --git a/test/box/access_misc.result b/test/box/access_misc.result
index 36ebfae09..2b7ca4f97 100644
--- a/test/box/access_misc.result
+++ b/test/box/access_misc.result
@@ -761,6 +761,10 @@ box.space._space:select()
         'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
       {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
         'name': 'opts', 'type': 'map'}]]
+  - [277, 1, '_vcollation', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
+      {'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'}, {
+        'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
+        'name': 'opts', 'type': 'map'}]]
   - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
         'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
         'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index c6a2b22ed..96976babb 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -74,6 +74,10 @@ session.su('guest')
 ---
 - true
 ...
+#box.space._vspace.index[2]:select('_vcollation') ~= 0
+---
+- true
+...
 #box.space._vindex:select(box.space._vspace.id) > 0
 ---
 - true
@@ -94,6 +98,10 @@ session.su('guest')
 ---
 - true
 ...
+#box.space._vindex:select(box.space._vcollation.id) > 0
+---
+- true
+...
 box.session.su('admin')
 ---
 ...
@@ -127,6 +135,10 @@ box.session.su('guest')
 ---
 - error: Read access to space '_vsequence' is denied for user 'guest'
 ...
+#box.space._vcollation:select{}
+---
+- error: Read access to space '_vcollation' is denied for user 'guest'
+...
 box.session.su('admin')
 ---
 ...
@@ -138,11 +150,15 @@ box.session.su('guest')
 ...
 #box.space._vspace:select{}
 ---
-- 8
+- 9
 ...
 #box.space._vindex:select{}
 ---
-- 20
+- 24
+...
+#box.space._vcollation:select{}
+---
+- 277
 ...
 box.session.su('admin')
 ---
@@ -230,11 +246,11 @@ box.session.su('guest')
 ...
 #box.space._vspace:select{}
 ---
-- 22
+- 23
 ...
 #box.space._vindex:select{}
 ---
-- 48
+- 52
 ...
 #box.space._vuser:select{}
 ---
@@ -242,12 +258,16 @@ box.session.su('guest')
 ...
 #box.space._vpriv:select{}
 ---
-- 15
+- 16
 ...
 #box.space._vfunc:select{}
 ---
 - 1
 ...
+#box.space._vcollation:select{}
+---
+- 277
+...
 box.session.su('admin')
 ---
 ...
@@ -262,7 +282,7 @@ box.session.su('guest')
 ...
 #box.space._vindex:select{}
 ---
-- 48
+- 52
 ...
 #box.space._vuser:select{}
 ---
@@ -270,7 +290,7 @@ box.session.su('guest')
 ...
 #box.space._vpriv:select{}
 ---
-- 15
+- 16
 ...
 #box.space._vfunc:select{}
 ---
@@ -280,6 +300,10 @@ box.session.su('guest')
 ---
 - 0
 ...
+#box.space._vcollation:select{}
+---
+- 277
+...
 box.session.su('admin')
 ---
 ...
@@ -631,6 +655,60 @@ seq:drop()
 ---
 ...
 --
+-- _vcollation
+--
+box.session.su('admin')
+---
+...
+box.internal.collation.create('test', 'ICU', 'ru-RU')
+---
+...
+-- Only admin can create collation.
+coll_cnt = #box.space._collation:select{}
+---
+...
+box.schema.user.grant("guest", "read, write, alter, execute", "space", "_collation")
+---
+...
+box.session.su("guest")
+---
+...
+box.internal.collation.create('guest0', 'ICU', 'ru-RU')
+---
+- error: Create access to collation 'guest0' is denied for user 'guest'
+...
+box.space._vcollation:select{0}
+---
+- - [0, 'none', 1, 'BINARY', '', {}]
+...
+#box.space._vcollation:select{} == coll_cnt
+---
+- true
+...
+box.session.su('admin')
+---
+...
+-- _vcollation is readable anyway.
+box.schema.user.revoke("guest", "read", "space", "_collation")
+---
+...
+box.session.su("guest")
+---
+...
+#box.space._vcollation:select{}
+---
+- 278
+...
+session.su('admin')
+---
+...
+box.internal.collation.drop('test')
+---
+...
+box.internal.collation.drop('guest0')
+---
+...
+--
 -- view:alter() tests
 --
 box.space._vspace.index[1]:alter({parts = { 2, 'string' }})
diff --git a/test/box/access_sysview.test.lua b/test/box/access_sysview.test.lua
index c62458407..031df28aa 100644
--- a/test/box/access_sysview.test.lua
+++ b/test/box/access_sysview.test.lua
@@ -31,12 +31,14 @@ session.su('guest')
 #box.space._vspace.index[2]:select('_vuser') ~= 0
 #box.space._vspace.index[2]:select('_vfunc') ~= 0
 #box.space._vspace.index[2]:select('_vpriv') ~= 0
+#box.space._vspace.index[2]:select('_vcollation') ~= 0
 
 #box.space._vindex:select(box.space._vspace.id) > 0
 #box.space._vindex:select(box.space._vindex.id) > 0
 #box.space._vindex:select(box.space._vuser.id) > 0
 #box.space._vindex:select(box.space._vfunc.id) > 0
 #box.space._vindex:select(box.space._vpriv.id) > 0
+#box.space._vindex:select(box.space._vcollation.id) > 0
 
 box.session.su('admin')
 box.schema.user.revoke('guest', 'public')
@@ -48,6 +50,7 @@ box.session.su('guest')
 #box.space._vpriv:select{}
 #box.space._vfunc:select{}
 #box.space._vsequence:select{}
+#box.space._vcollation:select{}
 
 box.session.su('admin')
 box.schema.user.grant('guest', 'public')
@@ -55,6 +58,7 @@ box.session.su('guest')
 
 #box.space._vspace:select{}
 #box.space._vindex:select{}
+#box.space._vcollation:select{}
 
 box.session.su('admin')
 s = box.schema.space.create('test')
@@ -96,6 +100,7 @@ box.session.su('guest')
 #box.space._vuser:select{}
 #box.space._vpriv:select{}
 #box.space._vfunc:select{}
+#box.space._vcollation:select{}
 
 box.session.su('admin')
 box.schema.user.revoke('guest', 'read', 'universe')
@@ -107,6 +112,7 @@ box.session.su('guest')
 #box.space._vpriv:select{}
 #box.space._vfunc:select{}
 #box.space._vsequence:select{}
+#box.space._vcollation:select{}
 
 box.session.su('admin')
 box.schema.user.revoke('guest', 'write', 'universe')
@@ -264,6 +270,30 @@ box.session.su("guest")
 session.su('admin')
 seq:drop()
 
+--
+-- _vcollation
+--
+
+box.session.su('admin')
+box.internal.collation.create('test', 'ICU', 'ru-RU')
+
+-- Only admin can create collation.
+coll_cnt = #box.space._collation:select{}
+box.schema.user.grant("guest", "read, write, alter, execute", "space", "_collation")
+box.session.su("guest")
+box.internal.collation.create('guest0', 'ICU', 'ru-RU')
+box.space._vcollation:select{0}
+#box.space._vcollation:select{} == coll_cnt
+box.session.su('admin')
+
+-- _vcollation is readable anyway.
+box.schema.user.revoke("guest", "read", "space", "_collation")
+box.session.su("guest")
+#box.space._vcollation:select{}
+session.su('admin')
+box.internal.collation.drop('test')
+box.internal.collation.drop('guest0')
+
 --
 -- view:alter() tests
 --
diff --git a/test/box/alter.result b/test/box/alter.result
index c1b1de135..7fb09b4cd 100644
--- a/test/box/alter.result
+++ b/test/box/alter.result
@@ -183,7 +183,11 @@ _index:select{}
 ---
 - - [272, 0, 'primary', 'tree', {'unique': true}, [[0, 'string']]]
   - [276, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
-  - [276, 1, 'name', 'tree', {'unique': true}, [[1, 'string']]]
+  - [276, 1, 'owner', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [276, 2, 'name', 'tree', {'unique': true}, [[1, 'string']]]
+  - [277, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
+  - [277, 1, 'owner', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [277, 2, 'name', 'tree', {'unique': true}, [[1, 'string']]]
   - [280, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [280, 1, 'owner', 'tree', {'unique': false}, [[1, 'unsigned']]]
   - [280, 2, 'name', 'tree', {'unique': true}, [[2, 'string']]]
diff --git a/test/wal_off/alter.result b/test/wal_off/alter.result
index ee280fcbb..8040efa1a 100644
--- a/test/wal_off/alter.result
+++ b/test/wal_off/alter.result
@@ -28,7 +28,7 @@ end;
 ...
 #spaces;
 ---
-- 65505
+- 65504
 ...
 -- cleanup
 for k, v in pairs(spaces) do
-- 
2.20.1 (Apple Git-117)





More information about the Tarantool-patches mailing list