[tarantool-patches] [PATCH 1/3] Add value field to _schema space

Kirill Yukhin kyukhin at tarantool.org
Thu Mar 29 09:42:06 MSK 2018


_schema represented as key-value storage for various
values common for Tarantool, like next id for space creation.
SQL requires format to be fully specified for columns being
access. Unfortunatelly, _schema is inserted into _space
before _space's format is set and since DD triggers are
disabled during upgrade, format for _schema tuple in _space
stays the same. So, set value nullable field in upgrade,
regenerate initial snap, update tests.
Also, as far as _schema's tuple in _space is not updated:
relax fieldno check in sql.c
---
 src/box/bootstrap.snap       | Bin 1638 -> 1657 bytes
 src/box/lua/upgrade.lua      |  14 ++++++++++++--
 src/box/sql.c                |   5 ++---
 test/box-py/bootstrap.result |   3 ++-
 test/box/access_misc.result  |   3 ++-
 test/xlog/upgrade.result     |   3 ++-
 6 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
index cf481f9a708e29f680d074ddf755ef6659cdadd4..783aa88995318726e7a93a403a729210d18a39c9 100644
GIT binary patch
literal 1657
zcmV-<28Q`lPC-x#FfK7O3RY!ub7^mGIv_GGFfKGLF*h+SXE-x6Fl97j3Q2BrbYX5|
zWjY`>IbkwoGh;X{Ib}6rEi_|fVJ%{1Wi~A^V`MO5IAk?rF*r90RzqxWV{1Afdoem7
zFntON)w&D1%?14c&O{PINTmP(0000ewJ-euP^B*bnn6SkNYEHJ0f0S>Qi)TFUQI%s
z7R+K1LD)oM^Z*C#FSwWPm}t><N}AkEF-elXq={xia_vI#%;}aApx)dpLU&&k)k>C7
zOqR-&QqKUy0NenteZ=#74Q8&%*_W391!*z&8-^nGnADK~&C+tpho~Edr1p3odNRDM
zv!(B=Y`u`zudarHI`7V7Kejpy$Q(j{`s!EbUA+o(PgY$j5t5A*K(n-L?Yqi*l&LzX
ze|J73lCj6c0?;fihbYmZ0>-QUC*rJ0Sq<7onr3MUfI!t^=KEQ)BbudUQ6>7a_j6aV
zs##k8P3rqlpAAlpsVjXb)TxB?aWy5*raP55%yIbi;S5;zcTR>_W^OK((kd=MTCAkD
zWN~suhYA2ofdZ!nnx*A~A7)nGqmb9}2SJHL|6<p7gECg$qj%Phfone}ITy{+Qq{@p
z+RsVvtfmD=uqIP1FIHz1XqJ{_e|`jOGUc6BCPC1KVBhh~ub`j*boOF3=0Lxn=cH0F
zpjle#`=KbJLfm>4zWD6>c7Fa`oma2@;CG#6<97~AqMz(}?g>?x0zRKvyv1cKPgY+D
z+`aF4S6fWQz#FE{u1OJlU-&sSq%){LhUD=bxfiRX0h*=dcvmmpM-diYEQYbM)psh)
zA1P*)M~5e82gQpMHOE9wi4%#_h||f8*{-7<j%I18nMS%B&W5YuM3_RDIFo4x#0<?$
zN#=u$2hGy5h)joV#@u9LIG8aTRQ#$aXn at H8g8}Bk%k~oUV!>Kcg=!X&Qb`m at Ftv^*
zXqJ{E3Dhhy<;k9`$rzFU-C at +F5(RBBFPf$0zTw5=>hjnZ>Q~R}S5OTQQs=OrFTX-m
ze{ubG?u9+vV^V)a_`cu$`azH9CPPM^R2~SLrKQ;~*5vM<P~CZ;Sz3Z%-rbwk7bDHm
zk~F<p&2hlWdki=ohi$$NW%{tGbn}lY-4EB4uFaoH9TxE+?&&52mTGP}JuL9pk)!Fb
zJ3OZx9FCbAn~nNXL$kEBqe^sI8dZzAV@;-Jwz{@%Mp02wl}?6cX-T5b_p`DlXE7|T
zuC3eIKa%{c7GU5Uj=zVh_Tocv!*C8!<QS{gwV7P#y!!50YYWZN(gc`NjV&JP#Aty%
z-0<-}EgIc4#_)NTiWP;sDqb3|3JVe0&q-M4Pl9KquFb?kv$WLFA>&oWl+HB!IY~qF
zBch<x>e^&h1Tc*N34u7M;aFr43CsWhfB+}}0R~4Y$7~)FfWSD4!!V427=~j23}ORE
z03av`2Q)yn0GKQ-LyH^(01_wK?6!60k_bZZd=P>c1wJdax}iF?E8}Zhby9>ZB0_jr
zpa(z(?z+Uv4eXngMojh=6Rk@!DJseVR^KdRX+y#@$0xYw?Py>*l?O75dms48Q=b-4
zQJEVw!KaX=ZHUuHA&*q^{1P#SUiKF<kQI>Z_Ltd8{U>=~P?BFqrWcP>g#i(%SNpZE
z|L0*G54n<zMrPD-r4&rzK)A at 29e9?GxkKA59dn1aS?TDqx1Ku`seIZ3A_&e=(_l-2
z6TvtII??WIxT(LJSV#)u0&I{J#0A(GF+{YfwBv!^3h=@$4!zevHt(^1!VLodpQgq8
zG~P!&ziy~!TFPiq`u1R0Tt3_I)e`=K#)hfv7Hp+ao09d1GyQKWI+``7$4rb||Bv>;
zlX*zA$hzggJU=3x8Z!jFkc94>pbX0^Yk6XQnEEJmhijo|lF*KWp;@46hiDAd!CYXN
zPDZUHN7{jIMLeGX at xZR$9(<wYp-6C-uH_HP42e`nK`!(X5qCR^hK4^X3(P%IJ32%1
zAU17-(lK4jvqapes2QLX!Y&D#7Q?ZQ`w>9<@Ba`Rit7Ym1n~z$@a?4jY+MK*VE|W_
z3}c#kIEVtm!vN}}uxUzfrQeo;U*t8u>JNBMzDIVj_ywgC;YluBB|jv4Jhdb0&#~rG
zl;O!dl=%u43}<_wKnrSzdIrn5Vml~ywJOlFj{c2WClwJ6%c_nbz*l5FNwBya)ex=i
D_yrEc

literal 1638
zcmV-s2ATO&PC-x#FfK7O3RY!ub7^mGIv_DFI4(0SGcq|XXJRvDWH>NoWH<^*ZgX^D
zZewLSAT?t+Fk&`lW-T*gIc6<1WjHu3Ib$_8Eihp;VmC2mVmLB4H40WkY;R+0Iv{&}
z3JTS_3%bn(>;TRrd}U9i0000004TLD{QyuMF92#l7!F6^*th|3gfPY!V+g{|Vd9WO
z<bH2NiNe7cmm8S;mG~QIWy(Y;$+~PQx$>-uIW^+64IUcKZAzsJYwU7Yoz$-)G?Nii
zN-50%!vNO+1Msb9nOiacOHwxGj~r*^>vzp>$Q0CE+ at 6~?a5Kr-;pF~#9LcY1VnG75
zkeF^|E))6g-_LaU`m!9IAr<GhbSup*&H8*tvn|#K$rcKLZ#`c<w{|aStS at rizpoM5
zU)SUUz_*@5l;}_aBW5*7ew&*#yR(5XzV!q^z;bf?u3fYv_}25s`hdH`$*q~ix1Ojl
z#i>+Y49J;OCD03VNoNmLQl(TON--!e6{<v}GGOWYdvp9~=+<IuwbGK4rN==L9!svw
zQ~_{nPF>B)IB at M=t{UK5Pc7<kyLK;my8r1Q9@(Qc`FZXl&9!^krIup=>)M;A7JTc;
z`euf8?aeN=rUgenZicRIW=RV0t*805Kk{)i>{2^Qu(KiPxlDI#2S<Z^cQgBP0N;9=
zV|JzJ&tUh&QZRsTJ$cq6NqXb=(yT9k>F at db6esiDighjO&o`~q-^-G4ZQ5wx at mQAv
zH+sAL%hOyP&58)*-gBB;oeXDU9>er=ll(ex)I03qTjY9%M1Q&T-OPpp0Z=1ARG>dn
z)NIX6jSLNn7bmQY37HZr5~~rb6*{{dS2-2F^~9(VE_I4Ip-v)9AxtNei3EZKLn at 6v
zj6C35Pn}VRjf8Ha7Y^vl2A0n(3L0E8xL|O(AlgJPA`AD1Dp*u!iVaZ+xmXLDfNwoP
z5-O at gMVmI8n=>L>_b;n0)@NsX5#d|Up2z%^t?Xyu$YVB|$97OaLf^}9z#SXCA3Od0
zeK*?pu8I8-0n|Tt&9&J1?WD&D6k7uU-+H1yf86Z9<FPak at U5pP?*6-)eF4I^o+cVG
zst}x~Pbv?UO{G-Kw<>X*MwP<VC!!RFDbK`xF&VH}bd%{}fyWLRtmD$uta6-ikZx=?
ztf&UQ^}HbKlU^E at lly<%3~SfIHg3kx&yN*O2EO$SRqeZWZEn_L+-hMPN7Hp_`qWy0
z@$IqHy~pAgdL+B-+oNZeGkam1$pzmnFsIhGz_*?z#E at 0K{5TV%#pmIM4}J5Z at l9on
z8|`Abq?|I#m&(lgc!+fEP1*O_6jNJan~4R!^_<ZmBWB5vZ<wyV2?K*edQq%}ZKD+d
zfi<Y%RAi76m;nF)0Z;((1xG38Y#tJTz&MKIFpPm1hGPH>;sQqiATS6Chyc|Bm at I2T
zFV+AyjGK5Fx+20r^o_mIH~Pv253pN{QKuG<n%E=c*c>ZFVhs#*0*FB0by&fH<x`S~
zOCNZmby+y0BJsrRC5E3i)IW3F&mC=_IL)b4BdXHj;LpnXa{#{`+)y^&KQ9deLQfO9
zYN%?GNSo>FzM!F50Ksn8J6k3g0s9y3)N9W6qSCA|h$3~gU)$%r^Nr&jSMzAhMQxNo
zA155((@dqaReqgO>9G7dqtam+FS<BcA2)POKH&-(4&fru;B at jOCo2Vpq8(@$K<F;|
zE+5XQY*>DsQR#RhBZamXb~e!4oT at U{)Y}cj?p{PERKofHxPkB4_!j^Cx}narG|`Ip
z?VDZvKik&Tx$cbK4r<s98%mQzpY<<i`X5r{$>p3Lo){Va-}yrUkKyQ%b<Tl#|9BZS
z{u25i3DsO<5!N`?lFRsn`d~DKYiVqfq=7*=?MqFcY7Esh=V{n1M!6*C%pu&1c%K;k
z)vey1eWB&_NZ>AQd{bqz*piMCE;kba40;qA3~*E{Kj=~82}9x$c-qDqWjfY`U0hOZ
z4nVnvT`LqH4 at U?0Ta5N!oFW^fXN?1pTkxqOKUo$)Qkc)LBx{;xIj5m|cxX+XFxRc<
zbwTYi at DzF7q%zH;8T}Cq7IBg2Cp?J?SM7&nziI7U6)>wALgIhU54CWu6!m6b3(#7P
k&cB;FNloBtT%ms(>pViJVcFJ^Gx&N^Pm;nd2h|X*?Mu=RQ2+n{

diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
index a514d12..7c8f38b 100644
--- a/src/box/lua/upgrade.lua
+++ b/src/box/lua/upgrade.lua
@@ -479,10 +479,11 @@ local function upgrade_to_1_8_4()
                       {name='nlt', type='string'},
                       {name='ndlt', type='string'},
                       {name='sample', type='scalar'}}
+    local MAP = setmap({})
 
     log.info("create space _sql_stat1")
     _space:insert{box.schema.SQL_STAT1_ID, ADMIN, '_sql_stat1', 'memtx', 0,
-                  setmap({}), stat1_ft}
+                  MAP, stat1_ft}
 
     log.info("create index primary on _sql_stat1")
     _index:insert{box.schema.SQL_STAT1_ID, 0, 'primary', 'tree',
@@ -490,12 +491,21 @@ local function upgrade_to_1_8_4()
 
     log.info("create space _sql_stat4")
     _space:insert{box.schema.SQL_STAT4_ID, ADMIN, '_sql_stat4', 'memtx', 0,
-                  setmap({}), stat4_ft}
+                  MAP, stat4_ft}
 
     log.info("create index primary on _sql_stat4")
     _index:insert{box.schema.SQL_STAT4_ID, 0, 'primary', 'tree',
                   {unique = true}, {{0, 'string'}, {1, 'string'},
                   {5, 'scalar'}}}
+
+    -- Nullability wasn't skipable. This was fixed in 1-7.
+    -- Now, abscent field means NULL, so we can safely set second
+    -- field in format, marking it nullable.
+    log.info("Add nullable value field to space _schema")
+    local format = {}
+    format[1] = {type='string', name='key'}
+    format[2] = {type='any', name='value', is_nullable=true}
+    box.space._schema:format(format)
 end
 
 --------------------------------------------------------------------------------
diff --git a/src/box/sql.c b/src/box/sql.c
index a13f2f8..6d8ef9a 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -220,9 +220,8 @@ tarantoolSqlite3TupleColumnFast(BtCursor *pCur, u32 fieldno, u32 *field_size)
 	assert(c != NULL);
 	assert(c->tuple_last != NULL);
 	struct tuple_format *format = tuple_format(c->tuple_last);
-	assert(format->exact_field_count == 0
-	       || fieldno < format->exact_field_count);
-	if (format->fields[fieldno].offset_slot == TUPLE_OFFSET_SLOT_NIL)
+	if (fieldno < format->field_count
+	    || format->fields[fieldno].offset_slot == TUPLE_OFFSET_SLOT_NIL)
 		return NULL;
 	const char *field = tuple_field(c->tuple_last, fieldno);
 	const char *end = field;
diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index f310326..e6c01fe 100644
--- a/test/box-py/bootstrap.result
+++ b/test/box-py/bootstrap.result
@@ -13,7 +13,8 @@ box.space._cluster:select{}
 ...
 box.space._space:select{}
 ---
-- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}]]
+- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
+        'name': 'value', 'is_nullable': true}]]
   - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
         'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
       {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
diff --git a/test/box/access_misc.result b/test/box/access_misc.result
index 1bbc8a3..9b3c5c0 100644
--- a/test/box/access_misc.result
+++ b/test/box/access_misc.result
@@ -732,7 +732,8 @@ box.space._user:select()
 ...
 box.space._space:select()
 ---
-- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}]]
+- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
+        'name': 'value', 'is_nullable': true}]]
   - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
         'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
       {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
diff --git a/test/xlog/upgrade.result b/test/xlog/upgrade.result
index 710ca40..5a6bd05 100644
--- a/test/xlog/upgrade.result
+++ b/test/xlog/upgrade.result
@@ -40,7 +40,8 @@ box.space._schema:select()
 ...
 box.space._space:select()
 ---
-- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}]]
+- - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
+        'name': 'value', 'is_nullable': true}]]
   - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
         'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
       {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
-- 
2.11.0





More information about the Tarantool-patches mailing list