[patches] [PATCH] sql: make _sql_stat[14] to be a system spaces

AKhatskevich avkhatskevich at tarantool.org
Mon Feb 5 20:02:30 MSK 2018


From: khatskevich <avkhatskevich at gmail.com>

  Making `stat[14]` a system spaces enables us to allow users to create
spaces which starts with `_`, because it cannot affect internal state
anymore.
  Since now the only constraints on table names is:
    - consists of printable symbols only
    - length < 65k

Closes #2126
---
 src/box/bootstrap.snap             | Bin 1531 -> 1661 bytes
 src/box/lua/space.cc               |   4 +++
 src/box/lua/upgrade.lua            |  31 +++++++++++++++++++
 src/box/schema_def.h               |   3 ++
 src/box/sql.c                      |  29 ++++++++++++++++--
 src/box/sql/analyze.c              |  61 +++++++++++++------------------------
 src/box/sql/tarantoolInt.h         |   2 ++
 test/app-tap/tarantoolctl.test.lua |   4 +--
 test/box-py/bootstrap.result       |  11 ++++++-
 test/box/access_misc.result        |   6 ++++
 test/box/access_sysview.result     |   6 ++--
 test/box/alter.result              |   7 +++--
 test/sql-tap/analyze1.test.lua     |  22 +------------
 test/sql-tap/analyze9.test.lua     |  20 ++----------
 test/wal_off/alter.result          |   2 +-
 test/xlog/upgrade.result           |  11 ++++++-
 16 files changed, 127 insertions(+), 92 deletions(-)

diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
index be43e72b620eff1937d1bdeb4e4bbc9d664ea561..64fc57b13a1f55e8190c086df6db8e09b5282165 100644
GIT binary patch
delta 1655
zcmV--28j9l3;hg`8GkZ1H7#d2W;J9mH92E53Q2BrbYX5|WjY`+Wi at 6pG&yE1WH&iB
zEi^bbIW0IgWH2o<F*7qVG&eP6GGR3eRzqxWV{1Afdoem7F*q}Q3JTS_3%bn({Q%D4
z_<R+m0000004TLD{Qyv<F92FWNDfKR7I6XqUp&AU4^j0%8h>311ITLhXp^M^7m!O?
z<lgopnIe%XsdAI~S!uspww%CFPj$v_Yymd_Gir()SvySyvSH>}Pt~1L3eNz=0NDUu
zYC{9ITTK$XWW1B(OvK+PrX;NI*E%B#z78|jWev<qczpDjI~K+9^Oo2a0S`p>F05yv
z&b#yUNm!rp^nV1YJKgmz6uZ9lagSzMY)}y{6kxm6gl+7~o20dRsDF1}6Oun~$px_8
zY6eMy1BDBjeQ^A;E@{?>YuUD2O#lR}9y8znq7m6{HLutpFnc at LmD=rA6O=)HS31#j
z7<D3{R2?Rz at G3=Ofu<+PeBTQ7ESd~f_IF;2AMNB=Y=5m(Sa at hwj!1BTq>9ZH0Jri4
zEn2o)&GPhWw#LCLZ&KA at yVd;g#r(>f{PFttKUO2q|JXI&A?=kn>7lk`5Zlj76U%n1
z+3F>Z?dPS3+R_3dpDtN1FSRfVwp-1zKPU3(lI5Xxl)#5WurY~dna|FHI(w;oIk4So
zmLh(kXMe|_*ThmVu-$5E{NgyS#1HnZ4}WOixN~#|>+F*455Mb7Bfs;R5&dP(bMMEx
z6wvwn;xJBoc{D2`fcM5IcI}ashFD~wU6<qMf#PQtkj|n0w8(#$<N-cVoIOs|ERGFM
z&5el`C2S3enh`1yst_vGncl9e9nE&Dxt&A08Gn<EDP=;HP9;;R1Ooyl28J~HF!He7
zYW9pea4;t~df{-sY-n-ZqM*Sgg9`?i3nEVRBC>FAsDeFvqSz3Hkc+hwwp+~>3H9ue
z@?}oeWh&%<_gQ7JK|b7zh;(6|f_m0PDKD<DD3;pe87Swq>67vi+HN&B7V*c^&SyJd
zmVb$>E;Du9xhLjuZ;9;@0sM~l>kmDinE(xOVsRjBx0+|ipDuUze(cSI?N&1k^X^{F
z1~T~cGBl|Z3S~NxO5jXKQq6QJ(u|4*B(YSf6HDez8LZfotJz^eM~<2e$GyQ(-7wjJ
zslm~(q8Zz*=54V-=#^phnER(oR_)pt*MG&ha^(t at 4#sw?8LH3szp^fCFK)FluDjV!
zmK?PfTzpw1e*@XA#f#&feOX+UWNL4WE3weo1!C0N72B;QiICMIVO+F%vEuVkgU9Q@
zWb_jGLg!zt7Zek2aT1AJ-;a>}yqtCZWr*4u<4P*FTTL4rFl2UQ=^V44moYIr<A3Uj
zwJ~m#BEUH$fj6k(RAi76m;nGl0Z;((1xG38Y#tI|z&MKIFpOas24nyXA_GSNATWSv
zK!d0S0GKRGLJN)n_Kll#61wuv*X11hn^V$6cYeUMT2$q1an#t3A>oFs6+-A?ptB<^
z8ggPG2BMEj;x2ojN#G@*7?sG2+JAQmnyH}{&2g_dz6J3#r}9R~n#I(g<?C+&VpF-H
z`SAWgZVo1TM&#E+R)$3OP7n44Ma=>Tox5#qG1^-2eK&YsGv14vn!->YsS7aNDT+I8
z9QU}&k47u%!L8L8!h!S8Am0)DK+7w$)nOOT*t%kfF8b?pfdH-_Zjh(|6 at Qin+e<#;
zJfuKmv;z$jc<$f<dsyWYv#X&WW@^^WFw*v%ogEfD56YPB=)Dhy1_I0lM<+Je%zyha
zT9c~;Ic}5Knde5?-7>fXMLcg9pmtad*!D8rCa-{fUK%ALS^q!N|B#|j2<P<h#K`df
z+#fDThU1K^a}Lbg$NQ);mVeL(Nr>iJd011umL$L@&<CywuI0Q*s<sS5YhU^{sxd^z
z98+P>Sm2wS3x^Ob;{9RtSGRim^M#VdBXPU5DH$d6VzW7_y4*~}x7AT-z~HE&{Ai=b
zp@&3!l4;w^i|JGoZgE#<KLBMJcA=m+csL5&FE-kLGE8g`o#h2UqHy4Yh5QUIz>YA9
z-;=C}&KR9rCE%fHIu)*U(Q9JcW#FOl+Hhr>MKdf$Fi^xLqMz_2DxhjVB>Senb5y{X
zW(bLYG?UZ{Xep>Se=S36G&=WgAtp10t8rfccCIrBZNsv+BiE|+q at E;&dk)nQt?kO0
B8%zKI

delta 1524
zcmV<Q1q=H94Eqa^8Gku5EoV76V=`khH#Q1MZgX^DZewLSATu*&WjQ!GIW1&mFk~$>
zWMMTeI50J2Ej49gH!?IbI5lKrWeQe9Y;R+0Iv{&}3JTS_3%bn(g8<Hu{TEcF00000
z04TLD{QywaD*(3q)Jo7)aRLBeJir$Z*$`I7Q@^-{!lFRylz)<92apq9YE6vbrpZ*E
zltjTaNv~ZJ;x&)9h356O0QlH2Qqhw!*lV05LEH-o=4+&sQosPV0LcLO8^szK>-#m%
zc!ICP%yoGK^N$@LJ?4%@ar`_W6(zvm`1u#sv{2{WdF{zqr|t0MpgH~ZuM at xC^>NQu
zPpZ%kP6XguYJbKye&tQtTs_pkJHP4V&jVsjuBB!UA2Uj*_^A($U)H6q`fw=sT58$>
zRganPhuM0rrRGo-0<)KcU$uHIHCwC>t5m903j9*0E``D-)C%Us^wOQMsio at hs}&5Z
zWy$`|OYyVGxRXk0l9Qbpr;Hk54<#~4Of20AH)GKM*nc(Np$(Qd>7BJ(Fx$^d)XBBf
zboCO?_Vdy^>q$Y+r^^=1tJPA1YpGfG=RKb;Ti#ho2z<B$8<S`L at yU5mXRlUS3|vdi
zQpB)R)-mV_sVW7orKZL&j^mB^#oqPd at 9Z0Qe&%4EUqAc9?>gJa at 0`X%e~II{2UJrC
z;CzPh7=O3HJX;+Nz<c8pzxLRwg;;EzU6<qMf#T;@kj|n0+K&G)$-P<?3AmP;B!2zy
zPL4D&&r27VobiT8tuu}kbE`HZY(&t6m;q5^KE!xnu~;1oMpm<32imQ!rRJ6C=w47N
zR0 at SUolYE1E+tcGLrDWE1F3W^HF-!R4ug!lz<**v#?s>A*rie-g+dCK!ZKPJO&F<I
zD at v&{9wSvGK at _3Z(Y4e>5m6b>kuPy%UDkB|cc;;lD&)hlKmfnv{rW?X=O95khE$se
z*HTl~@u$n(J)lbC;96>iVcy-l)ftp)saeXrTa9S|%bR2|xR#n9zL;TolR#eo-bVj{
ztA8%_l7hMUl?hy(I at 1b+FDCHxpozumSl?2qT9#B97h|&`qsEB2Ff7drmJ3vi5({oc
z9o3*zq0`b-J?8%DvURg{#&s%&hK7>VnQN&jqR;okvMz5auBE1lrFF)2DE5;jKkLeg
zFN@^wpn6TbIBwdP#ha3>RXgKOC3Jp)_<yXG#I at 865w=`pjEgcgC_W7^Xgp4=ML&@>
zI1h8dilDHIn at H^XfOPirlGgc`;aTa7JIP#2O_>=he(KoL*<}ZT9H`+`WRMb=0RR92
zPyitYM=54D4-$aTIEte%3Sk%qWC%Ej4HyA{z#t?b0;mN5S_XDO%NKaGumfh*nSUlz
zb5)WH9@)&*rsH%Ke>zn%VtZ78Q7$nF1>%8_2t(D6%(s;gwtV3d&Z?!1%AyeUm04=q
zP-V8SclSgcGmINL5l<3;$U~tkjVx1G14-n?)v~@oqFDf8NjID=?nQ#jW+U!3YkQHQ
zRw!4IdTwdtyQbjAArWW!(I<<#1Al=}G911rU=0u}*TAxPE7d?*w4Gn0E0Fc%K#w5c
znGj--Hv}|fJYj=EN`azi0~#_A+6(NmA}m9;vKErX`-Ij5ZJO9I;B36u1?s6Ay_FE4
zT!K0Bi<IoYR|F>9hr^7XoX+V46EoNUIsZsJ8D=oDKIg#DKYB+EIes4``F}Kr5rpL*
zYawEMzCJi5;QBN+i7Ue(pY2N`=^8^d1!6R87rzwA!FCY$BK{|||GL#X=P$H9Fw)$m
zO$nwlL)@Svm+P8|h at T#10}PHV${%*r55<tYxSlrP51Fn-!7dI1Vgpd3VHYR#qKEf`
z`w>R_F=%9C=!wq(>MeM<B5fB_7C=%Mz)>V`nkJs&&{25EqfWQmt>~rybs0E|yq8~@
zAfp-bNIWdQNOZ+KsR~!=4+)=j?T#wIuX$Z!W<C!Ux7rgG&)y<XLyd61A36yK;c6h#
a|DkmsdDO6^>c|AX&exNqFv<bd5UuSXsMW>*

diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc
index c38a4ea43..0e5bf1f6c 100644
--- a/src/box/lua/space.cc
+++ b/src/box/lua/space.cc
@@ -426,6 +426,10 @@ box_lua_space_init(struct lua_State *L)
 	lua_setfield(L, -2, "CLUSTER_ID");
 	lua_pushnumber(L, BOX_TRIGGER_ID);
 	lua_setfield(L, -2, "TRIGGER_ID");
+	lua_pushnumber(L, BOX_SQL_STAT1_ID);
+	lua_setfield(L, -2, "SQL_STAT1_ID");
+	lua_pushnumber(L, BOX_SQL_STAT4_ID);
+	lua_setfield(L, -2, "SQL_STAT4_ID");
 	lua_pushnumber(L, BOX_TRUNCATE_ID);
 	lua_setfield(L, -2, "TRUNCATE_ID");
 	lua_pushnumber(L, BOX_SEQUENCE_ID);
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
index 80acfa1e6..84eec73b3 100644
--- a/src/box/lua/upgrade.lua
+++ b/src/box/lua/upgrade.lua
@@ -464,6 +464,36 @@ local function upgrade_to_1_8_2()
 end
 
 --------------------------------------------------------------------------------
+-- Tarantool 1.8.4
+--------------------------------------------------------------------------------
+
+local function upgrade_to_1_8_4()
+    local _space = box.space[box.schema.SPACE_ID]
+    local _index = box.space[box.schema.INDEX_ID]
+    local stat1_ft = {{name='tbl', type='string'},
+                      {name='idx', type='string'},
+	              {name='stat', type='scalar'}}
+    local stat4_ft = {{name='tbl', type='string'},
+                      {name='idx', type='string'},
+                      {name='neq', type='string', is_nullable=true},
+                      {name='nlt', type='string', is_nullable=true},
+                      {name='ndlt', type='string', is_nullable=true},
+                      {name='sample', type='scalar'}}
+
+    log.info("create space _sql_stat1")
+    _space:insert{box.schema.SQL_STAT1_ID, ADMIN, '_sql_stat1', 'memtx', 0, setmap({}), stat1_ft}
+    log.info("create index primary on _stat1")
+    _index:insert{box.schema.SQL_STAT1_ID, 0, 'primary', 'tree', { unique = true },
+        {{0, 'string'}, {1, 'string'}}}
+    log.info("create space _sql_stat4")
+    _space:insert{box.schema.SQL_STAT4_ID, ADMIN, '_sql_stat4', 'memtx', 0, setmap({}), stat4_ft}
+    log.info("create index primary on _stat4")
+    _index:insert{box.schema.SQL_STAT4_ID, 0, 'primary', 'tree', { unique = true },
+        {{0, 'string'}, {1, 'string'}, {5, 'scalar'}}}
+end
+
+--------------------------------------------------------------------------------
+
 
 local function get_version()
     local version = box.space._schema:get{'version'}
@@ -491,6 +521,7 @@ local function upgrade(options)
         {version = mkversion(1, 7, 6), func = upgrade_to_1_7_6, auto = true},
         {version = mkversion(1, 7, 7), func = upgrade_to_1_7_7, auto = true},
         {version = mkversion(1, 8, 2), func = upgrade_to_1_8_2, auto = true},
+        {version = mkversion(1, 8, 4), func = upgrade_to_1_8_4, auto = true},
     }
 
     for _, handler in ipairs(handlers) do
diff --git a/src/box/schema_def.h b/src/box/schema_def.h
index 7e471b382..f5a5344f4 100644
--- a/src/box/schema_def.h
+++ b/src/box/schema_def.h
@@ -102,6 +102,9 @@ enum {
 	BOX_TRUNCATE_ID = 330,
 	/** Space id of _space_sequence. */
 	BOX_SPACE_SEQUENCE_ID = 340,
+	/** Space ids for SQL statictics. */
+	BOX_SQL_STAT1_ID = 348,
+	BOX_SQL_STAT4_ID = 349,
 	/** End of the reserved range of system spaces. */
 	BOX_SYSTEM_ID_MAX = 511,
 	BOX_ID_NIL = 2147483647
diff --git a/src/box/sql.c b/src/box/sql.c
index 82cdcadef..0d9282001 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -660,14 +660,20 @@ int tarantoolSqlite3EphemeralClearTable(BtCursor *pCur)
 }
 
 /*
- * Removes all instances from table. If there is no active transaction,
- * then truncate is used. Otherwise, manually deletes one-by-one all tuples.
+ * Removes all instances from table.
  */
 int tarantoolSqlite3ClearTable(int iTable)
 {
 	int space_id = SQLITE_PAGENO_TO_SPACEID(iTable);
 
-	if (box_txn()) {
+	/*
+	 *  There are two cases when we have to delete tuples one by one:
+	 *  1. When we are inside of another transaction, we can not use
+	 *  truncate, because it is a ddl. (prohibited in transactions)
+	 *  2. Truncate on system spaces is disallowed. (because of triggers)
+	 *   (main usecase is _sql_stat4 table editing)
+	 */
+	if (box_txn() || space_id < BOX_SYSTEM_ID_MAX) {
 		int primary_index_id = 0;
 		char *key;
 		uint32_t key_size;
@@ -1444,6 +1450,23 @@ void tarantoolSqlite3LoadSchema(InitData *init)
 		       "CREATE TABLE \""TARANTOOL_SYS_SPACE_SEQUENCE_NAME
 		       "\" (\"space_id\" INT PRIMARY KEY, \"sequence_id\" INT, \"flag\" INT)");
 
+	sql_schema_put(init, TARANTOOL_SYS_SQL_STAT1_NAME, BOX_SQL_STAT1_ID, 0,
+		       "CREATE TABLE \""TARANTOOL_SYS_SQL_STAT1_NAME
+			       "\"(\"tbl\" text,"
+			       "\"idx\" text,"
+			       "\"stat\" not null,"
+			       "PRIMARY KEY(\"tbl\", \"idx\"))");
+
+	sql_schema_put(init, TARANTOOL_SYS_SQL_STAT4_NAME, BOX_SQL_STAT4_ID, 0,
+		       "CREATE TABLE \""TARANTOOL_SYS_SQL_STAT4_NAME
+			       "\"(\"tbl\" text,"
+			       "\"idx\" text,"
+			       "\"neq\" text,"
+			       "\"nlt\" text,"
+			       "\"ndlt\" text,"
+			       "\"sample\","
+			       "PRIMARY KEY(\"tbl\", \"idx\", \"sample\"))");
+
 	/* Read _space */
 	if (space_foreach(space_foreach_put_cb, init) != 0) {
 		init->rc = SQLITE_TARANTOOL_ERROR;
diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c
index 8d442c5a8..1303fcc2a 100644
--- a/src/box/sql/analyze.c
+++ b/src/box/sql/analyze.c
@@ -135,15 +135,10 @@ openStatTable(Parse * pParse,	/* Parsing context */
 	      const char *zWhereType	/* Either "tbl" or "idx" */
     )
 {
-	static const struct {
-		const char *zName;
-		const char *zCols;
-	} aTable[] = {
-		{
-		"_sql_stat1", "\"tbl\",\"idx\",\"stat\", PRIMARY KEY(\"tbl\", \"idx\")"},
-		{
-		"_sql_stat4", "\"tbl\",\"idx\",\"neq\",\"nlt\",\"ndlt\",\"sample\", PRIMARY KEY(\"tbl\", \"idx\", \"sample\")"}
-	};
+	const char *aTable[] = {
+		"_sql_stat1",
+		"_sql_stat4",
+		NULL};
 	int i;
 	sqlite3 *db = pParse->db;
 	Vdbe *v = sqlite3GetVdbe(pParse);
@@ -157,42 +152,28 @@ openStatTable(Parse * pParse,	/* Parsing context */
 	/* Create new statistic tables if they do not exist, or clear them
 	 * if they do already exist.
 	 */
-	for (i = 0; i < ArraySize(aTable); i++) {
-		const char *zTab = aTable[i].zName;
+	for (i = 0; aTable[i]; i++) {
+		const char *zTab = aTable[i];
 		Table *pStat;
-		if ((pStat = sqlite3FindTable(db, zTab)) == 0) {
-			if (aTable[i].zCols) {
-				/* The sql_statN table does not exist. Create it. Note that a
-				 * side-effect of the CREATE TABLE statement is to leave the rootpage
-				 * of the new table in register pParse->regRoot. This is important
-				 * because the OpenWrite opcode below will be needing it.
-				 */
-				sqlite3NestedParse(pParse,
-						   "CREATE TABLE \"%s\"(%s)", zTab,
-						   aTable[i].zCols);
-				aRoot[i] = pParse->regRoot;
-				aCreateTbl[i] = OPFLAG_P2ISREG;
-			}
+		/* The table already exists, because it is a system space */
+		pStat = sqlite3FindTable(db, zTab);
+		aRoot[i] = pStat->tnum;
+		aCreateTbl[i] = 0;
+		if (zWhere) {
+			sqlite3NestedParse(pParse,
+					   "DELETE FROM \"%s\" WHERE \"%s\"=%Q",
+					   zTab, zWhereType, zWhere);
 		} else {
-			/* The table already exists. If zWhere is not NULL, delete all entries
-			 * associated with the table zWhere. If zWhere is NULL, delete the
-			 * entire contents of the table.
+			/*
+			 * The sql_stat[134] table already exists.
+			 * Delete all rows.
 			 */
-			aRoot[i] = pStat->tnum;
-			aCreateTbl[i] = 0;
-			if (zWhere) {
-				sqlite3NestedParse(pParse,
-						   "DELETE FROM \"%s\" WHERE \"%s\"=%Q",
-						   zTab, zWhereType, zWhere);
-			} else {
-				/* The sql_stat[14] table already exists.  Delete all rows. */
-				sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], 0);
-			}
+			sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], 0);
 		}
 	}
 
-	/* Open the sql_stat[14] tables for writing. */
-	for (i = 0; i < ArraySize(aTable); i++) {
+	/* Open the sql_stat[134] tables for writing. */
+	for (i = 0; aTable[i]; i++) {
 		int addr;
 		addr =
 		    sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur + i, aRoot[i],
@@ -200,7 +181,7 @@ openStatTable(Parse * pParse,	/* Parsing context */
 		v->aOp[addr].p4.pKeyInfo = 0;
 		v->aOp[addr].p4type = P4_KEYINFO;
 		sqlite3VdbeChangeP5(v, aCreateTbl[i]);
-		VdbeComment((v, aTable[i].zName));
+		VdbeComment((v, aTable[i]));
 	}
 }
 
diff --git a/src/box/sql/tarantoolInt.h b/src/box/sql/tarantoolInt.h
index 4781bf574..e8b864c1b 100644
--- a/src/box/sql/tarantoolInt.h
+++ b/src/box/sql/tarantoolInt.h
@@ -18,6 +18,8 @@
 #define TARANTOOL_SYS_INDEX_NAME   "_index"
 #define TARANTOOL_SYS_TRIGGER_NAME "_trigger"
 #define TARANTOOL_SYS_TRUNCATE_NAME "_truncate"
+#define TARANTOOL_SYS_SQL_STAT1_NAME "_sql_stat1"
+#define TARANTOOL_SYS_SQL_STAT4_NAME "_sql_stat4"
 
 /* Max space id seen so far. */
 #define TARANTOOL_SYS_SCHEMA_MAXID_KEY "max_id"
diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
index 2e1c97a2f..20bbe7556 100755
--- a/test/app-tap/tarantoolctl.test.lua
+++ b/test/app-tap/tarantoolctl.test.lua
@@ -338,8 +338,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", 18)
-            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 41)
+            check_ctlcat_snap(test_i, dir, "--space=280", "---\n", 20)
+            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 43)
         end)
     end)
 
diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index 2625000d3..4819eea6d 100644
--- a/test/box-py/bootstrap.result
+++ b/test/box-py/bootstrap.result
@@ -5,7 +5,7 @@ box.space._schema:select{}
 ---
 - - ['cluster', '<cluster uuid>']
   - ['max_id', 511]
-  - ['version', 1, 8, 2]
+  - ['version', 1, 8, 4]
 ...
 box.space._cluster:select{}
 ---
@@ -65,6 +65,12 @@ box.space._space:select{}
         'type': 'unsigned'}]]
   - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
       {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
+  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'name': 'stat', 'type': 'scalar'}]]
+  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'type': 'string', 'name': 'neq', 'is_nullable': true},
+      {'type': 'string', 'name': 'nlt', 'is_nullable': true}, {'type': 'string', 'name': 'ndlt',
+        'is_nullable': true}, {'name': 'sample', 'type': 'scalar'}]]
 ...
 box.space._index:select{}
 ---
@@ -111,6 +117,9 @@ box.space._index:select{}
   - [330, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 1, 'sequence', 'tree', {'unique': false}, [[1, 'unsigned']]]
+  - [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string']]]
+  - [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string'], [
+        5, 'scalar']]]
 ...
 box.space._user:select{}
 ---
diff --git a/test/box/access_misc.result b/test/box/access_misc.result
index 097b7135d..824b5b51f 100644
--- a/test/box/access_misc.result
+++ b/test/box/access_misc.result
@@ -785,6 +785,12 @@ box.space._space:select()
         'type': 'unsigned'}]]
   - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
       {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
+  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'name': 'stat', 'type': 'scalar'}]]
+  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'type': 'string', 'name': 'neq', 'is_nullable': true},
+      {'type': 'string', 'name': 'nlt', 'is_nullable': true}, {'type': 'string', 'name': 'ndlt',
+        'is_nullable': true}, {'name': 'sample', 'type': 'scalar'}]]
 ...
 box.space._func:select()
 ---
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index 58b2681c2..4635c76d4 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -226,11 +226,11 @@ box.session.su('guest')
 ...
 #box.space._vspace:select{}
 ---
-- 19
+- 21
 ...
 #box.space._vindex:select{}
 ---
-- 42
+- 44
 ...
 #box.space._vuser:select{}
 ---
@@ -258,7 +258,7 @@ box.session.su('guest')
 ...
 #box.space._vindex:select{}
 ---
-- 42
+- 44
 ...
 #box.space._vuser:select{}
 ---
diff --git a/test/box/alter.result b/test/box/alter.result
index 926a756e4..83b220b38 100644
--- a/test/box/alter.result
+++ b/test/box/alter.result
@@ -107,7 +107,7 @@ space = box.space[t[1]]
 ...
 space.id
 ---
-- 341
+- 350
 ...
 space.field_count
 ---
@@ -152,7 +152,7 @@ space_deleted
 ...
 space:replace{0}
 ---
-- error: Space '341' does not exist
+- error: Space '350' does not exist
 ...
 _index:insert{_space.id, 0, 'primary', 'tree', {unique=true}, {{0, 'unsigned'}}}
 ---
@@ -224,6 +224,9 @@ _index:select{}
   - [330, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 1, 'sequence', 'tree', {'unique': false}, [[1, 'unsigned']]]
+  - [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string']]]
+  - [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string'], [
+        5, 'scalar']]]
 ...
 -- modify indexes of a system space
 _index:delete{_index.id, 0}
diff --git a/test/sql-tap/analyze1.test.lua b/test/sql-tap/analyze1.test.lua
index b11f44400..5d91d963f 100755
--- a/test/sql-tap/analyze1.test.lua
+++ b/test/sql-tap/analyze1.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(36)
+test:plan(34)
 
 --!./tcltestrunner.lua
 -- 2005 July 22
@@ -30,26 +30,6 @@ test:do_catchsql_test(
         -- </analyze-1.1>
     })
 
-test:do_execsql_test(
-    "analyze-1.2",
-    [[
-        SELECT count(*) FROM "_space" WHERE "name"='_sql_stat1'
-    ]], {
-        -- <analyze-1.2>
-        0
-        -- </analyze-1.2>
-    })
-
-test:do_catchsql_test(
-    "analyze-1.5.1",
-    [[
-        ANALYZE
-    ]], {
-        -- <analyze-1.5.1>
-        0
-        -- </analyze-1.5.1>
-    })
-
 test:do_execsql_test(
     "analyze-1.6",
     [[
diff --git a/test/sql-tap/analyze9.test.lua b/test/sql-tap/analyze9.test.lua
index 30d5505b4..61cc4433a 100755
--- a/test/sql-tap/analyze9.test.lua
+++ b/test/sql-tap/analyze9.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(127)
+test:plan(125)
 
 testprefix = "analyze9"
 
@@ -1036,7 +1036,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     15.3,
     [[
-        INSERT INTO "_sql_stat4" VALUES(42, 42, 42, 42, 42, 42);
+        INSERT INTO "_sql_stat4" VALUES('42', '42', '42', '42', '42', 42);
     ]])
 
 test:do_execsql_test(
@@ -1049,22 +1049,6 @@ test:do_execsql_test(
         -- </15.4>
     })
 
-test:do_execsql_test(
-    15.5,
-    [[
-        UPDATE "_sql_stat1" SET "stat" = NULL;
-    ]])
-
-test:do_execsql_test(
-    15.6,
-    [[
-        SELECT * FROM x1;
-    ]], {
-        -- <15.6>
-        1, 2, 3, 4, 5, 6
-        -- </15.6>
-    })
-
 test:do_execsql_test(
     15.7,
     [[
diff --git a/test/wal_off/alter.result b/test/wal_off/alter.result
index 3f15874be..4ae6c05a3 100644
--- a/test/wal_off/alter.result
+++ b/test/wal_off/alter.result
@@ -28,7 +28,7 @@ end;
 ...
 #spaces;
 ---
-- 65514
+- 65512
 ...
 -- cleanup
 for k, v in pairs(spaces) do
diff --git a/test/xlog/upgrade.result b/test/xlog/upgrade.result
index bb5fba93c..408c142e7 100644
--- a/test/xlog/upgrade.result
+++ b/test/xlog/upgrade.result
@@ -36,7 +36,7 @@ box.space._schema:select()
 ---
 - - ['cluster', '<server_uuid>']
   - ['max_id', 513]
-  - ['version', 1, 8, 2]
+  - ['version', 1, 8, 4]
 ...
 box.space._space:select()
 ---
@@ -92,6 +92,12 @@ box.space._space:select()
         'type': 'unsigned'}]]
   - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
       {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
+  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'name': 'stat', 'type': 'scalar'}]]
+  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl', 'type': 'string'}, {'name': 'idx',
+        'type': 'string'}, {'type': 'string', 'name': 'neq', 'is_nullable': true},
+      {'type': 'string', 'name': 'nlt', 'is_nullable': true}, {'type': 'string', 'name': 'ndlt',
+        'is_nullable': true}, {'name': 'sample', 'type': 'scalar'}]]
   - [512, 1, 'distro', 'memtx', 0, {}, [{'name': 'os', 'type': 'str'}, {'name': 'dist',
         'type': 'str'}, {'name': 'version', 'type': 'num'}, {'name': 'time', 'type': 'num'}]]
   - [513, 1, 'temporary', 'memtx', 0, {'temporary': true}, []]
@@ -141,6 +147,9 @@ box.space._index:select()
   - [330, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned']]]
   - [340, 1, 'sequence', 'tree', {'unique': false}, [[1, 'unsigned']]]
+  - [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string']]]
+  - [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'], [1, 'string'], [
+        5, 'scalar']]]
   - [512, 0, 'primary', 'hash', {'unique': true}, [[0, 'string'], [1, 'string'], [
         2, 'unsigned']]]
   - [512, 1, 'codename', 'hash', {'unique': true}, [[1, 'string']]]
-- 
2.14.1




More information about the Tarantool-patches mailing list