* [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box @ 2019-05-30 12:36 Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov ` (3 more replies) 0 siblings, 4 replies; 18+ messages in thread From: Roman Khabibov @ 2019-05-30 12:36 UTC (permalink / raw) To: tarantool-patches; +Cc: v.shpilevoy As I understood "readable for all" means that filter for "_vcollation" must always return "true", because the condition "User has read access to according system space" is always met. Roman Khabibov (2): schema: add "_vcollation" sysview net.box: fetch '_vcollation' sysview into the module src/box/bootstrap.snap | Bin 4374 -> 4441 bytes src/box/lua/net_box.lua | 24 ++++++-- 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/box/net.box.result | 2 +- test/box/stat_net.result | 4 +- test/wal_off/alter.result | 2 +- 15 files changed, 201 insertions(+), 22 deletions(-) -- 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-30 12:36 [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box Roman Khabibov @ 2019-05-30 12:36 ` Roman Khabibov 2019-06-04 16:31 ` Vladimir Davydov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module Roman Khabibov ` (2 subsequent siblings) 3 siblings, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-05-30 12:36 UTC (permalink / raw) To: tarantool-patches; +Cc: v.shpilevoy 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 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 literal 4374 zcmV+x5$WzzPC-x#FfK7O3RY!ub7^mGIv_GGGA=MJF)%PKXJlnFH8e6c3Q2BrbYX5| zWjY{aWi&ElFf?W@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@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@Sr z_exOZ-Uue(S4jeXlOo`kUkH@$rIK{-6bSB3AD}|>yV(?)-^m`J`4C6*JEYmH>qsW+ zasa7`38{&xOUluVD~ba$t_Gx#9Q@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_@Rps6w|^h%>s*nA_f}xxeHB;ulnN_m zTT@ga+meEct8c%2-ET!PMfXrh(LJ6hy6?UR#gpgZdGb&6p8S({g6Dk`Pk7IS6W%Y; zg!f7?;e8TI_!J2xW_Io*A+vJ?5?~HJoDSyj`?9xV#GUMmI3jx@jL1IwA&R(O2qLZz zVu<Un2SNzzyMnOZ4iMH`&(+0y9Xq_!;o_b5Id!!8108MpFh`r(-1@<qJ@{ZvIa}7W zW}F^6-^uAbjnjGOaCRlvN=yC*PRUE2rG@o|`+b$g^Bd=PI;@?$+S^LEH!erpRaUgk z1CF+7+fCKqfrtNfaPxl-J9Hd$=>3Kqdba@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@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@G^2Ig(N8+;=;s`D^s}FG&~ct|%yFJ@$Z@7`#4+1) z0}k0%8*lK=s`1=n!;SveXrq5M*yz9iG}ibZ4K@BhBaQ!4Gtl_Ij5GdE$uOfT9it5V z#UKO!Fvh?ie=x-O|BEpG_X3Rn(=NWSp9?SS-=Yf}Pk7x+JteG*Rw9v{jB*SQjWtMw z{nTC#cI!SxELfe2CDmS@JbCa`5a@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@SmqXz!KxiJanNOh zx@F9krn;oTk{G2hN*O3&aMQt(z`T+!=((v$`hw&IsS6U9qb)}k9BDDiVuU4)(Ul@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@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@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{+@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@H$yyh(DR7)BAIr=9lDVoD`9ePi)`bEbQ|r)jinYgR<y|v zaiygWkYq_5rVm3PvR6r`#?DY;oCqsA9vz^=Bcyftv@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+@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@Y{;!shIfgmg<c`q{>6rP8YG&WHkuGJxlHM=R zkOM3<>QW3J#=9bvU+S<>cSH}axkBYKg%Vj$(ZC^J!YXxBMlsBsLYqdBjJAkv-A+qG zg5@5HZbqS<>WOW!c7n57bl<3nn@6-zbMjG5XjMSWlujAs5nGa64_;7P0NC6eg)FaY z{WZk!uMoHD8v=3^18W2%Mu7Ano)973OR15Fdm8|E%Apd@_Io+d)p##2ugONwL3DN+ zcxilZgt;KW5dR7`T*JUVB24sG<_4SdwglD{j!8J5FJNnRB$p$&DHGe`(=XIXN@J-@ z-^U`FiHbf(AN+BLsh7hgo$vSZxAf7+y$F-``P{(r+%ABvH=e{aAWUGt8tmvjKxXH7 z@?&xtMO@_N59kxx%G)Sv7GI`EC_ZkndHad2^j5TcJRc1uvo>ldjA(&D<q~nj;rby9 zVmGM9L$Cx$58??C(!G=#iMY1`aHkw9;cUO1@#|LB99>E~w9s8@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@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@O3_ducSwe8ZIn+vQ2?-3= z%|9yMPJ!n;klelKR<4>U<6rW-U47{x7*d#zsvrw0JEj}b^1vXuaN4jv$A2^-Zc)<K zP@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@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) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-30 12:36 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov @ 2019-06-04 16:31 ` Vladimir Davydov 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov 0 siblings, 1 reply; 18+ messages in thread From: Vladimir Davydov @ 2019-06-04 16:31 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches, v.shpilevoy On Thu, May 30, 2019 at 03:36:02PM +0300, Roman Khabibov wrote: > 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'}}} I don't understand this part. Why do you need to create 'owner' index? Why do you need to update 'name' index? > + 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} Should be in upgrade_to_2_2_1. > } > > 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; > + } > + Bad indentation. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-06-04 16:31 ` Vladimir Davydov @ 2019-06-05 17:08 ` Roman Khabibov 2019-06-05 17:56 ` Vladimir Davydov 0 siblings, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-06-05 17:08 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladimir Davydov Hi! Thanks for the review. > On Jun 4, 2019, at 7:31 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > On Thu, May 30, 2019 at 03:36:02PM +0300, Roman Khabibov wrote: >> 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'}}} > > I don't understand this part. Why do you need to create 'owner' index? > Why do you need to update 'name' index? create_sysview() can’t work otherwise. + +-- Fit _collation indexes to be suitable forcreate_sysview(). +local function upgrade_collation_to_2_2_2() + local _collation = box.space._collation + local _index = box.space._index > >> + 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} > > Should be in upgrade_to_2_2_1. To 2.2.2 maybe? +-------------------------------------------------------------------------------- +-- Tarantool 2.2.2 +-------------------------------------------------------------------------------- + +-- Fit _collation space to be suitable for create_sysview(). +local function upgrade_collation_to_2_2_2() + 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'}}} +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_2_2() + upgrade_collation_to_2_2_2() + create_vcollation_space() +end + -------------------------------------------------------------------------------- >> } >> >> 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; >> + } >> + > > Bad indentation. +static bool +vcollation_filter(struct space *source, struct tuple *tuple) +{ + (void) source; + (void) tuple; + return true; +} + commit e67cd253a41f5e010c00b5cb38059224850e86c4 Author: Roman Khabibov <roman.habibov@tarantool.org> Date: Thu May 16 02:06:39 2019 +0300 schema: add "_vcollation" sysview Add "_vcollation" sysview to read it from net.box. This sysview is always readable, except when a user doesn't have "public" role. Needed for #3941 @TarantoolBot document Title: box.space._vcollation _vcollation is a system space that represents a virtual view. The structure of its tuples is identical to that of _collation. Tuples of this sysview is always readable, except when the user doesn't have "public" role. diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index bb8fbeba1..f01a34670 100644 Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc index 87adaeb16..5d837eda6 100644 --- a/src/box/lua/space.cc +++ b/src/box/lua/space.cc @@ -540,6 +540,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 070662698..b7fb08014 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -778,6 +778,40 @@ local function upgrade_to_2_2_1() upgrade_sequence_to_2_2_1() end +-------------------------------------------------------------------------------- +-- Tarantool 2.2.2 +-------------------------------------------------------------------------------- + +-- Fit _collation indexes to be suitable forcreate_sysview(). +local function upgrade_collation_to_2_2_2() + 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'}}} +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_2_2() + upgrade_collation_to_2_2_2() + create_vcollation_space() +end + -------------------------------------------------------------------------------- local function get_version() @@ -812,6 +846,7 @@ local function upgrade(options) {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, 2, 1), func = upgrade_to_2_2_1, auto = true}, + {version = mkversion(2, 2, 2), func = upgrade_to_2_2_2, auto = true} } for _, handler in ipairs(handlers) do diff --git a/src/box/schema_def.h b/src/box/schema_def.h index b817b49f6..e0febb640 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..46cf1e13f 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 0684914c0..c8c37eb06 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, 2, 1] + - ['version', 2, 2, 2] ... 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', @@ -84,7 +88,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']]] @@ -151,6 +159,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 24bdd9d63..d5bb8b208 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 e83c0b7ef..ba1405cf1 100644 --- a/test/box/alter.result +++ b/test/box/alter.result @@ -168,7 +168,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 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov @ 2019-06-05 17:56 ` Vladimir Davydov 2019-06-06 15:18 ` Roman Khabibov 0 siblings, 1 reply; 18+ messages in thread From: Vladimir Davydov @ 2019-06-05 17:56 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches On Wed, Jun 05, 2019 at 08:08:46PM +0300, Roman Khabibov wrote: > >> +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'}}} > > > > I don't understand this part. Why do you need to create 'owner' index? > > Why do you need to update 'name' index? > create_sysview() can’t work otherwise. I fail to see why is that. Could you please elaborate? > > + > +-- Fit _collation indexes to be suitable forcreate_sysview(). > +local function upgrade_collation_to_2_2_2() > + local _collation = box.space._collation > + local _index = box.space._index > > > > >> + 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} > > > > Should be in upgrade_to_2_2_1. > To 2.2.2 maybe? No. The last release was 2.2.0 so the next one will be 2.2.1. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-06-05 17:56 ` Vladimir Davydov @ 2019-06-06 15:18 ` Roman Khabibov 0 siblings, 0 replies; 18+ messages in thread From: Roman Khabibov @ 2019-06-06 15:18 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladimir Davydov > On Jun 5, 2019, at 8:56 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > On Wed, Jun 05, 2019 at 08:08:46PM +0300, Roman Khabibov wrote: >>>> +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'}}} >>> >>> I don't understand this part. Why do you need to create 'owner' index? >>> Why do you need to update 'name' index? >> create_sysview() can’t work otherwise. > > I fail to see why is that. Could you please elaborate You were right. I actually don’t need it. Removed. >> >> + >> +-- Fit _collation indexes to be suitable forcreate_sysview(). >> +local function upgrade_collation_to_2_2_2() >> + local _collation = box.space._collation >> + local _index = box.space._index >> >>> >>>> + 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} >>> >>> Should be in upgrade_to_2_2_1. >> To 2.2.2 maybe? > > No. The last release was 2.2.0 so the next one will be 2.2.1. Done. +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 + -- Add sequence field to _space_sequence table local function upgrade_sequence_to_2_2_1() log.info("add sequence field to space _space_sequence") @@ -776,6 +783,7 @@ end local function upgrade_to_2_2_1() upgrade_sequence_to_2_2_1() + create_vcollation_space() end commit f13d3f0ce8a2d7af8a11ebc1003d1145652a46a3 Author: Roman Khabibov <roman.habibov@tarantool.org> Date: Thu May 16 02:06:39 2019 +0300 schema: add "_vcollation" sysview Add "_vcollation" sysview to read it from net.box. This sysview is always readable, except when a user doesn't have "public" role. Needed for #3941 @TarantoolBot document Title: box.space._vcollation _vcollation is a system space that represents a virtual view. The structure of its tuples is identical to that of _collation. Tuples of this sysview is always readable, except when the user doesn't have "public" role. diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index bb8fbeba1..eb9297d7c 100644 Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc index 87adaeb16..5d837eda6 100644 --- a/src/box/lua/space.cc +++ b/src/box/lua/space.cc @@ -540,6 +540,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 070662698..fe62fb0a9 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -749,6 +749,13 @@ end -- Tarantool 2.2.1 -------------------------------------------------------------------------------- +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 + -- Add sequence field to _space_sequence table local function upgrade_sequence_to_2_2_1() log.info("add sequence field to space _space_sequence") @@ -776,6 +783,7 @@ end local function upgrade_to_2_2_1() upgrade_sequence_to_2_2_1() + create_vcollation_space() end -------------------------------------------------------------------------------- @@ -811,7 +819,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, 2, 1), func = upgrade_to_2_2_1, auto = true}, + {version = mkversion(2, 2, 1), func = upgrade_to_2_2_1, auto = true} } for _, handler in ipairs(handlers) do diff --git a/src/box/schema_def.h b/src/box/schema_def.h index b817b49f6..e0febb640 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..46cf1e13f 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..7a72acda2 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", 49) end) end) diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result index 0684914c0..d2cca9017 100644 --- a/test/box-py/bootstrap.result +++ b/test/box-py/bootstrap.result @@ -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', @@ -85,6 +89,8 @@ 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']]] + - [277, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]] + - [277, 1, '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']]] @@ -151,6 +157,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 24bdd9d63..d5bb8b208 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..4d1f0c779 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 +- 22 +... +#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 +- 50 ... #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 +- 50 ... #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 e83c0b7ef..3e9c5e180 100644 --- a/test/box/alter.result +++ b/test/box/alter.result @@ -169,6 +169,8 @@ _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']]] + - [277, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]] + - [277, 1, '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 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-05-30 12:36 [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov @ 2019-05-30 12:36 ` Roman Khabibov 2019-06-04 16:36 ` Vladimir Davydov 2019-06-03 18:45 ` [tarantool-patches] Re: [PATCH 0/2] Add _vcollation and fetch in net.box Vladislav Shpilevoy 2019-06-04 15:54 ` [tarantool-patches] " Vladimir Davydov 3 siblings, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-05-30 12:36 UTC (permalink / raw) To: tarantool-patches; +Cc: v.shpilevoy Fetch "_vcollation" sysview to show collation name instead collation id. Closes #3941 --- src/box/lua/net_box.lua | 24 ++++++++++++++++++------ test/box/net.box.result | 2 +- test/box/stat_net.result | 4 ++-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index 0cfb5075d..251ad407a 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -31,6 +31,7 @@ local decode_greeting = internal.decode_greeting local TIMEOUT_INFINITY = 500 * 365 * 86400 local VSPACE_ID = 281 local VINDEX_ID = 289 +local VCOLLATION_ID = 277 local DEFAULT_CONNECT_TIMEOUT = 10 local IPROTO_STATUS_KEY = 0x00 @@ -735,11 +736,16 @@ local function create_transport(host, port, user, password, callback, end local select1_id = new_request_id() local select2_id = new_request_id() + local select3_id = new_request_id() local response = {} -- fetch everything from space _vspace, 2 = ITER_ALL encode_select(send_buf, select1_id, VSPACE_ID, 0, 2, 0, 0xFFFFFFFF, nil) -- fetch everything from space _vindex, 2 = ITER_ALL encode_select(send_buf, select2_id, VINDEX_ID, 0, 2, 0, 0xFFFFFFFF, nil) + -- fetch everything from space _vcollation, 2 = ITER_ALL + encode_select(send_buf, select3_id, VCOLLATION_ID, 0, 2, 0, 0xFFFFFFFF, + nil) + schema_version = nil -- any schema_version will do provided that -- it is consistent across responses repeat @@ -747,7 +753,7 @@ local function create_transport(host, port, user, password, callback, if err then return error_sm(err, hdr) end dispatch_response_iproto(hdr, body_rpos, body_end) local id = hdr[IPROTO_SYNC_KEY] - if id == select1_id or id == select2_id then + if id == select1_id or id == select2_id or id == select3_id then -- response to a schema query we've submitted local status = hdr[IPROTO_STATUS_KEY] local response_schema_version = hdr[IPROTO_SCHEMA_VERSION_KEY] @@ -766,9 +772,10 @@ local function create_transport(host, port, user, password, callback, body, body_end = decode(body_rpos) response[id] = body[IPROTO_DATA_KEY] end - until response[select1_id] and response[select2_id] - callback('did_fetch_schema', schema_version, - response[select1_id], response[select2_id]) + until response[select1_id] and response[select2_id] and + response[select3_id] + callback('did_fetch_schema', schema_version, response[select1_id], + response[select2_id],response[select3_id]) set_state('active') return iproto_sm(schema_version) end @@ -1190,7 +1197,8 @@ function remote_methods:timeout(timeout) return self end -function remote_methods:_install_schema(schema_version, spaces, indices) +function remote_methods:_install_schema(schema_version, spaces, indices, + collations) local sl, space_mt, index_mt = {}, self._space_mt, self._index_mt for _, space in pairs(spaces) do local name = space[3] @@ -1258,11 +1266,15 @@ function remote_methods:_install_schema(schema_version, spaces, indices) local pkcollationid = index[PARTS][k].collation local pktype = index[PARTS][k][2] or index[PARTS][k].type local pkfield = index[PARTS][k][1] or index[PARTS][k].field + local pkcollation = nil + if pkcollationid ~= nil then + pkcollation = collations[pkcollationid + 1][2] + end local pk = { type = pktype, fieldno = pkfield + 1, - collation_id = pkcollationid, + collation = pkcollation, is_nullable = pknullable } idx.parts[k] = pk diff --git a/test/box/net.box.result b/test/box/net.box.result index d02fed7a3..474297af3 100644 --- a/test/box/net.box.result +++ b/test/box/net.box.result @@ -2910,7 +2910,7 @@ c.space.test.index.sk.parts --- - - type: string is_nullable: false - collation_id: 277 + collation: test fieldno: 1 ... c:close() diff --git a/test/box/stat_net.result b/test/box/stat_net.result index 92f6d581f..9eeada7ec 100644 --- a/test/box/stat_net.result +++ b/test/box/stat_net.result @@ -85,7 +85,7 @@ box.stat.net.CONNECTIONS.total ... box.stat.net.REQUESTS.total --- -- 13 +- 17 ... box.stat.net.CONNECTIONS.current --- @@ -151,7 +151,7 @@ test_run:wait_cond(function() return box.stat.net.REQUESTS.current == 0 end, WAI ... box.stat.net.REQUESTS.total --- -- 15 +- 19 ... -- reset box.stat.reset() -- 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-05-30 12:36 ` [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module Roman Khabibov @ 2019-06-04 16:36 ` Vladimir Davydov 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov 0 siblings, 1 reply; 18+ messages in thread From: Vladimir Davydov @ 2019-06-04 16:36 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches, v.shpilevoy On Thu, May 30, 2019 at 03:36:03PM +0300, Roman Khabibov wrote: > Fetch "_vcollation" sysview to show collation name instead collation id. > > Closes #3941 > --- > src/box/lua/net_box.lua | 24 ++++++++++++++++++------ > test/box/net.box.result | 2 +- > test/box/stat_net.result | 4 ++-- > 3 files changed, 21 insertions(+), 9 deletions(-) This one looks good to me, but you probably need to write a doc bot request. ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] Re: [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-06-04 16:36 ` Vladimir Davydov @ 2019-06-05 17:08 ` Roman Khabibov 2019-06-05 17:28 ` Vladimir Davydov 0 siblings, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-06-05 17:08 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladimir Davydov > On Jun 4, 2019, at 7:36 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > On Thu, May 30, 2019 at 03:36:03PM +0300, Roman Khabibov wrote: >> Fetch "_vcollation" sysview to show collation name instead collation id. >> >> Closes #3941 >> --- >> src/box/lua/net_box.lua | 24 ++++++++++++++++++------ >> test/box/net.box.result | 2 +- >> test/box/stat_net.result | 4 ++-- >> 3 files changed, 21 insertions(+), 9 deletions(-) > > This one looks good to me, but you probably need to write a doc bot > request. > What should I write in this request? I understood, that you meant info about _vcollation existance. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov @ 2019-06-05 17:28 ` Vladimir Davydov 2019-06-06 15:22 ` Roman Khabibov 2019-06-06 16:00 ` Roman Khabibov 0 siblings, 2 replies; 18+ messages in thread From: Vladimir Davydov @ 2019-06-05 17:28 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches On Wed, Jun 05, 2019 at 08:08:39PM +0300, Roman Khabibov wrote: > > > On Jun 4, 2019, at 7:36 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > > > On Thu, May 30, 2019 at 03:36:03PM +0300, Roman Khabibov wrote: > >> Fetch "_vcollation" sysview to show collation name instead collation id. > >> > >> Closes #3941 > >> --- > >> src/box/lua/net_box.lua | 24 ++++++++++++++++++------ > >> test/box/net.box.result | 2 +- > >> test/box/stat_net.result | 4 ++-- > >> 3 files changed, 21 insertions(+), 9 deletions(-) > > > > This one looks good to me, but you probably need to write a doc bot > > request. > > > What should I write in this request? I understood, that you meant > info about _vcollation existance. Yep, something like this I suppose: https://www.tarantool.io/en/doc/2.1/book/box/box_space/#box-space-vspace BTW we miss _vsequence documentation. Should be added as well. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-06-05 17:28 ` Vladimir Davydov @ 2019-06-06 15:22 ` Roman Khabibov 2019-06-06 16:00 ` Roman Khabibov 1 sibling, 0 replies; 18+ messages in thread From: Roman Khabibov @ 2019-06-06 15:22 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladimir Davydov > On Jun 5, 2019, at 8:28 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > On Wed, Jun 05, 2019 at 08:08:39PM +0300, Roman Khabibov wrote: >> >>> On Jun 4, 2019, at 7:36 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: >>> >>> On Thu, May 30, 2019 at 03:36:03PM +0300, Roman Khabibov wrote: >>>> Fetch "_vcollation" sysview to show collation name instead collation id. >>>> >>>> Closes #3941 >>>> --- >>>> src/box/lua/net_box.lua | 24 ++++++++++++++++++------ >>>> test/box/net.box.result | 2 +- >>>> test/box/stat_net.result | 4 ++-- >>>> 3 files changed, 21 insertions(+), 9 deletions(-) >>> >>> This one looks good to me, but you probably need to write a doc bot >>> request. >>> >> What should I write in this request? I understood, that you meant >> info about _vcollation existance. > > Yep, something like this I suppose: > > https://www.tarantool.io/en/doc/2.1/book/box/box_space/#box-space-vspace > > BTW we miss _vsequence documentation. Should be added as well. _vfunc too? ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-06-05 17:28 ` Vladimir Davydov 2019-06-06 15:22 ` Roman Khabibov @ 2019-06-06 16:00 ` Roman Khabibov 2019-06-06 17:00 ` Vladimir Davydov 1 sibling, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-06-06 16:00 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladimir Davydov > On Jun 5, 2019, at 8:28 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: > > On Wed, Jun 05, 2019 at 08:08:39PM +0300, Roman Khabibov wrote: >> >>> On Jun 4, 2019, at 7:36 PM, Vladimir Davydov <vdavydov.dev@gmail.com> wrote: >>> >>> On Thu, May 30, 2019 at 03:36:03PM +0300, Roman Khabibov wrote: >>>> Fetch "_vcollation" sysview to show collation name instead collation id. >>>> >>>> Closes #3941 >>>> --- >>>> src/box/lua/net_box.lua | 24 ++++++++++++++++++------ >>>> test/box/net.box.result | 2 +- >>>> test/box/stat_net.result | 4 ++-- >>>> 3 files changed, 21 insertions(+), 9 deletions(-) >>> >>> This one looks good to me, but you probably need to write a doc bot >>> request. >>> >> What should I write in this request? I understood, that you meant >> info about _vcollation existance. > > Yep, something like this I suppose: > > https://www.tarantool.io/en/doc/2.1/book/box/box_space/#box-space-vspace > > BTW we miss _vsequence documentation. Should be added as well. commit 2faf236c6b45b308ad86fd60f4250fc7af33996d Author: Roman Khabibov <roman.habibov@tarantool.org> Date: Thu May 16 13:15:25 2019 +0300 net.box: fetch '_vcollation' sysview into the module Fetch "_vcollation" sysview to show collation name instead collation id. Closes #3941 diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index 0cfb5075d..251ad407a 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -31,6 +31,7 @@ local decode_greeting = internal.decode_greeting local TIMEOUT_INFINITY = 500 * 365 * 86400 local VSPACE_ID = 281 local VINDEX_ID = 289 +local VCOLLATION_ID = 277 local DEFAULT_CONNECT_TIMEOUT = 10 local IPROTO_STATUS_KEY = 0x00 @@ -735,11 +736,16 @@ local function create_transport(host, port, user, password, callback, end local select1_id = new_request_id() local select2_id = new_request_id() + local select3_id = new_request_id() local response = {} -- fetch everything from space _vspace, 2 = ITER_ALL encode_select(send_buf, select1_id, VSPACE_ID, 0, 2, 0, 0xFFFFFFFF, nil) -- fetch everything from space _vindex, 2 = ITER_ALL encode_select(send_buf, select2_id, VINDEX_ID, 0, 2, 0, 0xFFFFFFFF, nil) + -- fetch everything from space _vcollation, 2 = ITER_ALL + encode_select(send_buf, select3_id, VCOLLATION_ID, 0, 2, 0, 0xFFFFFFFF, + nil) + schema_version = nil -- any schema_version will do provided that -- it is consistent across responses repeat @@ -747,7 +753,7 @@ local function create_transport(host, port, user, password, callback, if err then return error_sm(err, hdr) end dispatch_response_iproto(hdr, body_rpos, body_end) local id = hdr[IPROTO_SYNC_KEY] - if id == select1_id or id == select2_id then + if id == select1_id or id == select2_id or id == select3_id then -- response to a schema query we've submitted local status = hdr[IPROTO_STATUS_KEY] local response_schema_version = hdr[IPROTO_SCHEMA_VERSION_KEY] @@ -766,9 +772,10 @@ local function create_transport(host, port, user, password, callback, body, body_end = decode(body_rpos) response[id] = body[IPROTO_DATA_KEY] end - until response[select1_id] and response[select2_id] - callback('did_fetch_schema', schema_version, - response[select1_id], response[select2_id]) + until response[select1_id] and response[select2_id] and + response[select3_id] + callback('did_fetch_schema', schema_version, response[select1_id], + response[select2_id],response[select3_id]) set_state('active') return iproto_sm(schema_version) end @@ -1190,7 +1197,8 @@ function remote_methods:timeout(timeout) return self end -function remote_methods:_install_schema(schema_version, spaces, indices) +function remote_methods:_install_schema(schema_version, spaces, indices, + collations) local sl, space_mt, index_mt = {}, self._space_mt, self._index_mt for _, space in pairs(spaces) do local name = space[3] @@ -1258,11 +1266,15 @@ function remote_methods:_install_schema(schema_version, spaces, indices) local pkcollationid = index[PARTS][k].collation local pktype = index[PARTS][k][2] or index[PARTS][k].type local pkfield = index[PARTS][k][1] or index[PARTS][k].field + local pkcollation = nil + if pkcollationid ~= nil then + pkcollation = collations[pkcollationid + 1][2] + end local pk = { type = pktype, fieldno = pkfield + 1, - collation_id = pkcollationid, + collation = pkcollation, is_nullable = pknullable } idx.parts[k] = pk diff --git a/test/box/net.box.result b/test/box/net.box.result index d02fed7a3..9c516fff5 100644 --- a/test/box/net.box.result +++ b/test/box/net.box.result @@ -2339,14 +2339,14 @@ connected_cnt ... disconnected_cnt --- -- 1 +- 2 ... conn:close() --- ... disconnected_cnt --- -- 2 +- 3 ... test_run:cmd('stop server connecter') --- @@ -2910,7 +2910,7 @@ c.space.test.index.sk.parts --- - - type: string is_nullable: false - collation_id: 277 + collation: test fieldno: 1 ... c:close() diff --git a/test/box/stat_net.result b/test/box/stat_net.result index 92f6d581f..9eeada7ec 100644 --- a/test/box/stat_net.result +++ b/test/box/stat_net.result @@ -85,7 +85,7 @@ box.stat.net.CONNECTIONS.total ... box.stat.net.REQUESTS.total --- -- 13 +- 17 ... box.stat.net.CONNECTIONS.current --- @@ -151,7 +151,7 @@ test_run:wait_cond(function() return box.stat.net.REQUESTS.current == 0 end, WAI ... box.stat.net.REQUESTS.total --- -- 15 +- 19 ... -- reset box.stat.reset() ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] Re: [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module 2019-06-06 16:00 ` Roman Khabibov @ 2019-06-06 17:00 ` Vladimir Davydov 0 siblings, 0 replies; 18+ messages in thread From: Vladimir Davydov @ 2019-06-06 17:00 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches Pushed both patches to master, thanks! ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] Re: [PATCH 0/2] Add _vcollation and fetch in net.box 2019-05-30 12:36 [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module Roman Khabibov @ 2019-06-03 18:45 ` Vladislav Shpilevoy 2019-06-04 15:54 ` [tarantool-patches] " Vladimir Davydov 3 siblings, 0 replies; 18+ messages in thread From: Vladislav Shpilevoy @ 2019-06-03 18:45 UTC (permalink / raw) To: tarantool-patches, Roman Khabibov Please, provide name of the branch, and issue link. There are 2 branches on this issue, and I don't know which one to review. On 30/05/2019 15:36, Roman Khabibov wrote: > As I understood "readable for all" means that filter for > "_vcollation" must always return "true", because the condition > "User has read access to according system space" is always > met. > > Roman Khabibov (2): > schema: add "_vcollation" sysview > net.box: fetch '_vcollation' sysview into the module > > src/box/bootstrap.snap | Bin 4374 -> 4441 bytes > src/box/lua/net_box.lua | 24 ++++++-- > 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/box/net.box.result | 2 +- > test/box/stat_net.result | 4 +- > test/wal_off/alter.result | 2 +- > 15 files changed, 201 insertions(+), 22 deletions(-) > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box 2019-05-30 12:36 [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box Roman Khabibov ` (2 preceding siblings ...) 2019-06-03 18:45 ` [tarantool-patches] Re: [PATCH 0/2] Add _vcollation and fetch in net.box Vladislav Shpilevoy @ 2019-06-04 15:54 ` Vladimir Davydov 3 siblings, 0 replies; 18+ messages in thread From: Vladimir Davydov @ 2019-06-04 15:54 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches, v.shpilevoy On Thu, May 30, 2019 at 03:36:01PM +0300, Roman Khabibov wrote: > As I understood "readable for all" means that filter for > "_vcollation" must always return "true", because the condition > "User has read access to according system space" is always > met. > > Roman Khabibov (2): > schema: add "_vcollation" sysview > net.box: fetch '_vcollation' sysview into the module Branch/ticket URLs are missing. There have been quite a few changes to the master since you submitted this patch set. Could you please rebase it on top of the latest master commit? Also, it looks like this isn't the first version of the patch set. In future please don't forget to add v2 to subject (--subject-prefix) and write a very brief change log in the cover letter enumerating what have changed since the last version. ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] [PATCH 0/2] Add "_vcollation" sysview and fetch it in net.box @ 2019-05-16 11:24 Roman Khabibov 2019-05-16 11:24 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov 0 siblings, 1 reply; 18+ messages in thread From: Roman Khabibov @ 2019-05-16 11:24 UTC (permalink / raw) To: tarantool-patches; +Cc: kostja As I understood "readable for all" means that the filter for "_vcollation" must always return "true", because the condition "User has read access to according system space" is always met. Roman Khabibov (2): schema: add "_vcollation" sysview net.box: fetch '_vcollation' sysview into the module src/box/bootstrap.snap | Bin 4374 -> 4439 bytes src/box/lua/net_box.lua | 19 ++++-- src/box/lua/space.cc | 2 + src/box/lua/upgrade.lua | 23 ++++++++ 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/box/net.box.result | 2 +- test/box/stat_net.result | 4 +- test/wal_off/alter.result | 2 +- 15 files changed, 195 insertions(+), 21 deletions(-) -- Branch: https://github.com/tarantool/tarantool/tree/romanhabibov/gh-3941-net-vcoll Issue: https://github.com/tarantool/tarantool/issues/3941 2.20.1 (Apple Git-117) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-16 11:24 [tarantool-patches] [PATCH 0/2] Add "_vcollation" sysview and fetch it " Roman Khabibov @ 2019-05-16 11:24 ` Roman Khabibov 2019-05-16 12:43 ` [tarantool-patches] " Konstantin Osipov 2019-05-30 11:57 ` Konstantin Osipov 0 siblings, 2 replies; 18+ messages in thread From: Roman Khabibov @ 2019-05-16 11:24 UTC (permalink / raw) To: tarantool-patches; +Cc: kostja 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 -> 4439 bytes src/box/lua/space.cc | 2 + src/box/lua/upgrade.lua | 23 ++++++++ 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, 178 insertions(+), 13 deletions(-) diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index 871a93f9856f97636ad55b7f5260e5c6957fef36..62bae6be8a6cbbb5fe354ee87e836e2cdb02dd99 100644 GIT binary patch literal 4439 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 literal 4374 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 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..6ff87a8c2 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -737,6 +737,28 @@ 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("update 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 +790,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) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-16 11:24 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov @ 2019-05-16 12:43 ` Konstantin Osipov 2019-05-28 15:50 ` Roman Khabibov 2019-05-30 11:57 ` Konstantin Osipov 1 sibling, 1 reply; 18+ messages in thread From: Konstantin Osipov @ 2019-05-16 12:43 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches * Roman Khabibov <roman.habibov@tarantool.org> [19/05/16 14:27]: > + -- 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'}}} use :replace, not delete + insert > + log.info("update index owner on _collation") > + box.space._index:insert{_collation.id, 1, 'owner', 'tree', {unique = false}, {{2, 'unsigned'}}} Not update, but create. create index 'owner' on space '_collation' -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-16 12:43 ` [tarantool-patches] " Konstantin Osipov @ 2019-05-28 15:50 ` Roman Khabibov 0 siblings, 0 replies; 18+ messages in thread From: Roman Khabibov @ 2019-05-28 15:50 UTC (permalink / raw) To: tarantool-patches; +Cc: Konstantin Osipov Hi! Thanks for the review. > On May 16, 2019, at 3:43 PM, Konstantin Osipov <kostja@tarantool.org> wrote: > > * Roman Khabibov <roman.habibov@tarantool.org> [19/05/16 14:27]: >> + -- 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'}}} > > use :replace, not delete + insert I think, I can’t, because I change primary key. > Not update, but create. > > create index 'owner' on space ‘_collation’ + log.info("create index owner on _collation") + box.space._index:insert{_collation.id, 1, 'owner', 'tree', {unique = false}, + {{2, 'unsigned'}}} diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index 871a93f98..4e93a794a 100644 Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ 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 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [tarantool-patches] Re: [PATCH 1/2] schema: add "_vcollation" sysview 2019-05-16 11:24 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov 2019-05-16 12:43 ` [tarantool-patches] " Konstantin Osipov @ 2019-05-30 11:57 ` Konstantin Osipov 1 sibling, 0 replies; 18+ messages in thread From: Konstantin Osipov @ 2019-05-30 11:57 UTC (permalink / raw) To: Roman Khabibov; +Cc: tarantool-patches * Roman Khabibov <roman.habibov@tarantool.org> [19/05/16 14:27]: > +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} why do you delete the index entry just to rename it? Can't you update the existing record? > +static bool > + vcollation_filter(struct space *source, struct tuple *tuple) > + { > + (void) source; > + (void) tuple; > + return true; > + } > + The return value and function should have the same indent, please re-indent. I don't see where 'PUBLIC' role is granted access to the new space. How does this work? -- Konstantin Osipov, Moscow, Russia ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2019-06-06 17:00 UTC | newest] Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-05-30 12:36 [tarantool-patches] [PATCH 0/2] Add _vcollation and fetch in net.box Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov 2019-06-04 16:31 ` Vladimir Davydov 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov 2019-06-05 17:56 ` Vladimir Davydov 2019-06-06 15:18 ` Roman Khabibov 2019-05-30 12:36 ` [tarantool-patches] [PATCH 2/2] net.box: fetch '_vcollation' sysview into the module Roman Khabibov 2019-06-04 16:36 ` Vladimir Davydov 2019-06-05 17:08 ` [tarantool-patches] " Roman Khabibov 2019-06-05 17:28 ` Vladimir Davydov 2019-06-06 15:22 ` Roman Khabibov 2019-06-06 16:00 ` Roman Khabibov 2019-06-06 17:00 ` Vladimir Davydov 2019-06-03 18:45 ` [tarantool-patches] Re: [PATCH 0/2] Add _vcollation and fetch in net.box Vladislav Shpilevoy 2019-06-04 15:54 ` [tarantool-patches] " Vladimir Davydov -- strict thread matches above, loose matches on Subject: below -- 2019-05-16 11:24 [tarantool-patches] [PATCH 0/2] Add "_vcollation" sysview and fetch it " Roman Khabibov 2019-05-16 11:24 ` [tarantool-patches] [PATCH 1/2] schema: add "_vcollation" sysview Roman Khabibov 2019-05-16 12:43 ` [tarantool-patches] " Konstantin Osipov 2019-05-28 15:50 ` Roman Khabibov 2019-05-30 11:57 ` Konstantin Osipov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox