[tarantool-patches] Re: [PATCH v1 1/1] sql: ban ANALYZE statement

Mergen Imeev imeevma at tarantool.org
Sat Mar 23 15:58:42 MSK 2019


Hi! Thank ypu for review! Diff and new version below.

On Fri, Mar 22, 2019 at 07:58:13PM +0300, n.pettik wrote:
> 
> > /////////////////////////////////// ANALYZE ///////////////////////////////////
> > -cmd ::= ANALYZE.                {sqlAnalyze(pParse, 0);}
> > -cmd ::= ANALYZE nm(X).          {sqlAnalyze(pParse, &X);}
> > +cmd ::= ANALYZE.                {}
> > +cmd ::= ANALYZE nm(X).          {(void)X;}
> 
> Could you remove this statement from parser?
> Since it does nothing, it may turn out to be confusing.
> 
Fixed.

Diff:

diff --git a/extra/addopcodes.sh b/extra/addopcodes.sh
index 0304259..c25f1e4 100755
--- a/extra/addopcodes.sh
+++ b/extra/addopcodes.sh
@@ -49,6 +49,7 @@ extras="            \
     SELECT_COLUMN   \
     ASTERISK        \
     SPAN            \
+    ANALYZE         \
     SPACE           \
     ILLEGAL         \
 "
diff --git a/extra/mkkeywordhash.c b/extra/mkkeywordhash.c
index fbd56fa..be7bd55 100644
--- a/extra/mkkeywordhash.c
+++ b/extra/mkkeywordhash.c
@@ -101,7 +101,7 @@ static Keyword aKeywordTable[] = {
   { "AFTER",                  "TK_AFTER",       TRIGGER,          false },
   { "ALL",                    "TK_ALL",         ALWAYS,           true  },
   { "ALTER",                  "TK_ALTER",       ALTER,            true  },
-  { "ANALYZE",                "TK_ANALYZE",     ALWAYS,           true  },
+  { "ANALYZE",                "TK_STANDARD",    RESERVED,         true  },
   { "AND",                    "TK_AND",         ALWAYS,           true  },
   { "AS",                     "TK_AS",          ALWAYS,           true  },
   { "ASC",                    "TK_ASC",         ALWAYS,           true  },
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 03787d9..dfbb006 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1447,10 +1447,6 @@ cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
   sql_drop_trigger(pParse,X,NOERR);
 }
 
-/////////////////////////////////// ANALYZE ///////////////////////////////////
-cmd ::= ANALYZE.                {}
-cmd ::= ANALYZE nm(X).          {(void)X;}
-
 //////////////////////// ALTER TABLE table ... ////////////////////////////////
 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
   sql_alter_table_rename(pParse,X,&Z);
diff --git a/test/sql-tap/gh-3350-skip-scan.test.lua b/test/sql-tap/gh-3350-skip-scan.test.lua
index 4cecfe0..c326f7c 100755
--- a/test/sql-tap/gh-3350-skip-scan.test.lua
+++ b/test/sql-tap/gh-3350-skip-scan.test.lua
@@ -32,7 +32,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t1 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t1 WHERE a < 'aaad';
             DROP TABLE t1;
         ]], {
@@ -49,7 +49,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t2 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t2 WHERE f < 500;
             DROP TABLE t2;
         ]], {
@@ -68,7 +68,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t3 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t3 WHERE f < 500;
             DROP INDEX i31 on t3;
             DROP TABLE t3;
@@ -93,11 +93,11 @@ test:do_execsql_test(
             INSERT INTO t1 VALUES(5, 'def',567,8,9);
             INSERT INTO t1 VALUES(6, 'def',345,9,10);
             INSERT INTO t1 VALUES(7, 'bcd',100,6,11);
-            ANALYZE;
+            -- ANALYZE;
             DELETE FROM "_sql_stat1";
             DELETE FROM "_sql_stat4";
             INSERT INTO "_sql_stat1" VALUES('T1','T1ABC','10000 5000 2000 10');
-            ANALYZE t2;
+            -- ANALYZE t2;
             SELECT a,b,c,d FROM t1 WHERE b=345;
         ]], {
             "abc", 345, 7, 8, "def", 345, 9, 10
diff --git a/test/sql-tap/whereG.test.lua b/test/sql-tap/whereG.test.lua
index bb9cf39..2d7592b 100755
--- a/test/sql-tap/whereG.test.lua
+++ b/test/sql-tap/whereG.test.lua
@@ -449,7 +449,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "7.3",
     [[
-        ANALYZE;
+        -- ANALYZE;
         EXPLAIN QUERY PLAN SELECT name FROM people WHERE height>=180;
     ]],
     -- {0,0,0,"SEARCH TABLE PEOPLE USING COVERING INDEX PEOPLE_IDX1" ..
diff --git a/test/sql/row-count.result b/test/sql/row-count.result
index b75298f..58374e6 100644
--- a/test/sql/row-count.result
+++ b/test/sql/row-count.result
@@ -179,9 +179,7 @@ box.sql.execute("SELECT ROW_COUNT();")
 ---
 - - [0]
 ...
-box.sql.execute("ANALYZE;")
----
-...
+-- box.sql.execute("ANALYZE;")
 box.sql.execute("SELECT ROW_COUNT();")
 ---
 - - [0]
diff --git a/test/sql/row-count.test.lua b/test/sql/row-count.test.lua
index 89476c7..5cf6348 100644
--- a/test/sql/row-count.test.lua
+++ b/test/sql/row-count.test.lua
@@ -61,7 +61,7 @@ box.sql.execute("COMMIT;")
 box.sql.execute("SELECT ROW_COUNT();")
 box.sql.execute("COMMIT;")
 box.sql.execute("SELECT ROW_COUNT();")
-box.sql.execute("ANALYZE;")
+-- box.sql.execute("ANALYZE;")
 box.sql.execute("SELECT ROW_COUNT();")
 box.sql.execute("EXPLAIN QUERY PLAN INSERT INTO t1 VALUES ('b'), ('c'), ('d');")
 box.sql.execute("SELECT ROW_COUNT();")
diff --git a/test/sql/triggers.result b/test/sql/triggers.result
index 826e998..7fa8611 100644
--- a/test/sql/triggers.result
+++ b/test/sql/triggers.result
@@ -275,10 +275,8 @@ box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 ---
 - error: A multi-statement transaction can not use multiple storage engines
 ...
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE m;")
----
-...
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE m;")
 box.sql.execute("DROP TABLE m;")
 ---
 ...
@@ -311,10 +309,8 @@ box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 ---
 - error: A multi-statement transaction can not use multiple storage engines
 ...
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE n;")
----
-...
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE n;")
 box.sql.execute("DROP TABLE m;")
 ---
 ...
diff --git a/test/sql/triggers.test.lua b/test/sql/triggers.test.lua
index b22b4f9..6618a41 100644
--- a/test/sql/triggers.test.lua
+++ b/test/sql/triggers.test.lua
@@ -109,8 +109,8 @@ box.sql.execute("INSERT INTO m VALUES (0, '0');")
 box.sql.execute("INSERT INTO n VALUES (0, '',null);")
 box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE m;")
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE m;")
 box.sql.execute("DROP TABLE m;")
 box.sql.execute("DROP TABLE n;")
 
@@ -125,8 +125,8 @@ box.sql.execute("INSERT INTO m VALUES (0, '0');")
 box.sql.execute("INSERT INTO n VALUES (0, '',null);")
 box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE n;")
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE n;")
 box.sql.execute("DROP TABLE m;")
 box.sql.execute("DROP TABLE n;")
 

New version:

commit 50a9e64f2cd9c28893f113504b0e399f35a11151
Author: Mergen Imeev <imeevma at gmail.com>
Date:   Fri Mar 22 19:08:53 2019 +0300

    sql: ban ANALYZE statement
    
    At this point, an ANALYZE statement can lead to many problems. It
    was decided to temporarily ban this statement.
    
    Closes #4069

diff --git a/extra/addopcodes.sh b/extra/addopcodes.sh
index 0304259..c25f1e4 100755
--- a/extra/addopcodes.sh
+++ b/extra/addopcodes.sh
@@ -49,6 +49,7 @@ extras="            \
     SELECT_COLUMN   \
     ASTERISK        \
     SPAN            \
+    ANALYZE         \
     SPACE           \
     ILLEGAL         \
 "
diff --git a/extra/mkkeywordhash.c b/extra/mkkeywordhash.c
index fbd56fa..be7bd55 100644
--- a/extra/mkkeywordhash.c
+++ b/extra/mkkeywordhash.c
@@ -101,7 +101,7 @@ static Keyword aKeywordTable[] = {
   { "AFTER",                  "TK_AFTER",       TRIGGER,          false },
   { "ALL",                    "TK_ALL",         ALWAYS,           true  },
   { "ALTER",                  "TK_ALTER",       ALTER,            true  },
-  { "ANALYZE",                "TK_ANALYZE",     ALWAYS,           true  },
+  { "ANALYZE",                "TK_STANDARD",    RESERVED,         true  },
   { "AND",                    "TK_AND",         ALWAYS,           true  },
   { "AS",                     "TK_AS",          ALWAYS,           true  },
   { "ASC",                    "TK_ASC",         ALWAYS,           true  },
diff --git a/src/box/box.cc b/src/box/box.cc
index f7ce33a..7d89055 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -2139,8 +2139,6 @@ box_cfg_xc(void)
 	/* Follow replica */
 	replicaset_follow();
 
-	sql_load_schema();
-
 	fiber_gc();
 	is_box_configured = true;
 
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index b27651c..dfbb006 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1447,10 +1447,6 @@ cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
   sql_drop_trigger(pParse,X,NOERR);
 }
 
-/////////////////////////////////// ANALYZE ///////////////////////////////////
-cmd ::= ANALYZE.                {sqlAnalyze(pParse, 0);}
-cmd ::= ANALYZE nm(X).          {sqlAnalyze(pParse, &X);}
-
 //////////////////////// ALTER TABLE table ... ////////////////////////////////
 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
   sql_alter_table_rename(pParse,X,&Z);
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 8967ea3..aebd131 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -4492,7 +4492,6 @@ char* rename_trigger(sql *, char const *, char const *, bool *);
  */
 struct coll *
 sql_get_coll_seq(Parse *parser, const char *name, uint32_t *coll_id);
-void sqlAnalyze(Parse *, Token *);
 
 /**
  * This function returns average size of tuple in given index.
diff --git a/test/sql-tap/gh-3350-skip-scan.test.lua b/test/sql-tap/gh-3350-skip-scan.test.lua
index 4cecfe0..c326f7c 100755
--- a/test/sql-tap/gh-3350-skip-scan.test.lua
+++ b/test/sql-tap/gh-3350-skip-scan.test.lua
@@ -32,7 +32,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t1 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t1 WHERE a < 'aaad';
             DROP TABLE t1;
         ]], {
@@ -49,7 +49,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t2 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t2 WHERE f < 500;
             DROP TABLE t2;
         ]], {
@@ -68,7 +68,7 @@ test:do_execsql_test(
             (SELECT int_to_char(0), 'xyz', 'zyx', '*', 0, 0 UNION ALL
             SELECT int_to_char(f+1), b, c, d, (e+1) % 2, f+1 FROM data WHERE f<1024)
             INSERT INTO t3 SELECT a, b, c, d, e, f FROM data;
-            ANALYZE;
+            -- ANALYZE;
             SELECT COUNT(*) FROM t3 WHERE f < 500;
             DROP INDEX i31 on t3;
             DROP TABLE t3;
@@ -93,11 +93,11 @@ test:do_execsql_test(
             INSERT INTO t1 VALUES(5, 'def',567,8,9);
             INSERT INTO t1 VALUES(6, 'def',345,9,10);
             INSERT INTO t1 VALUES(7, 'bcd',100,6,11);
-            ANALYZE;
+            -- ANALYZE;
             DELETE FROM "_sql_stat1";
             DELETE FROM "_sql_stat4";
             INSERT INTO "_sql_stat1" VALUES('T1','T1ABC','10000 5000 2000 10');
-            ANALYZE t2;
+            -- ANALYZE t2;
             SELECT a,b,c,d FROM t1 WHERE b=345;
         ]], {
             "abc", 345, 7, 8, "def", 345, 9, 10
diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini
index bb49289..95207f4 100644
--- a/test/sql-tap/suite.ini
+++ b/test/sql-tap/suite.ini
@@ -8,6 +8,18 @@ disabled = selectA.test.lua ;
            date.test.lua ;
            tkt-bd484a090c.test.lua ;
            tkt3791.test.lua ;
+           analyze1.test.lua ;
+           analyze3.test.lua ;
+           analyze4.test.lua ;
+           analyze5.test.lua ;
+           analyze6.test.lua ;
+           analyze7.test.lua ;
+           analyze8.test.lua ;
+           analyze9.test.lua ;
+           analyzeC.test.lua ;
+           analyzeD.test.lua ;
+           analyzeE.test.lua ;
+           analyzeF.test.lua ;
 
 lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua
 is_parallel = True
diff --git a/test/sql-tap/whereG.test.lua b/test/sql-tap/whereG.test.lua
index 155c906..2d7592b 100755
--- a/test/sql-tap/whereG.test.lua
+++ b/test/sql-tap/whereG.test.lua
@@ -449,10 +449,12 @@ test:do_execsql_test(
 test:do_execsql_test(
     "7.3",
     [[
-        ANALYZE;
+        -- ANALYZE;
         EXPLAIN QUERY PLAN SELECT name FROM people WHERE height>=180;
     ]],
-    {0,0,0,"SEARCH TABLE PEOPLE USING COVERING INDEX PEOPLE_IDX1" ..
-        " (ANY(ROLE) AND HEIGHT>?)"})
+    -- {0,0,0,"SEARCH TABLE PEOPLE USING COVERING INDEX PEOPLE_IDX1" ..
+    --     " (ANY(ROLE) AND HEIGHT>?)"}
+    {0,0,0,"SCAN TABLE PEOPLE" }
+    )
 
 test:finish_test()
diff --git a/test/sql/row-count.result b/test/sql/row-count.result
index b75298f..58374e6 100644
--- a/test/sql/row-count.result
+++ b/test/sql/row-count.result
@@ -179,9 +179,7 @@ box.sql.execute("SELECT ROW_COUNT();")
 ---
 - - [0]
 ...
-box.sql.execute("ANALYZE;")
----
-...
+-- box.sql.execute("ANALYZE;")
 box.sql.execute("SELECT ROW_COUNT();")
 ---
 - - [0]
diff --git a/test/sql/row-count.test.lua b/test/sql/row-count.test.lua
index 89476c7..5cf6348 100644
--- a/test/sql/row-count.test.lua
+++ b/test/sql/row-count.test.lua
@@ -61,7 +61,7 @@ box.sql.execute("COMMIT;")
 box.sql.execute("SELECT ROW_COUNT();")
 box.sql.execute("COMMIT;")
 box.sql.execute("SELECT ROW_COUNT();")
-box.sql.execute("ANALYZE;")
+-- box.sql.execute("ANALYZE;")
 box.sql.execute("SELECT ROW_COUNT();")
 box.sql.execute("EXPLAIN QUERY PLAN INSERT INTO t1 VALUES ('b'), ('c'), ('d');")
 box.sql.execute("SELECT ROW_COUNT();")
diff --git a/test/sql/suite.ini b/test/sql/suite.ini
index ce6ccb7..bfe0fa0 100644
--- a/test/sql/suite.ini
+++ b/test/sql/suite.ini
@@ -7,3 +7,4 @@ config = engine.cfg
 is_parallel = True
 lua_libs = lua/sql_tokenizer.lua
 release_disabled = errinj.test.lua view_delayed_wal.test.lua sql-debug.test.lua
+disabled = sql-statN-index-drop.test.lua
diff --git a/test/sql/triggers.result b/test/sql/triggers.result
index 826e998..7fa8611 100644
--- a/test/sql/triggers.result
+++ b/test/sql/triggers.result
@@ -275,10 +275,8 @@ box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 ---
 - error: A multi-statement transaction can not use multiple storage engines
 ...
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE m;")
----
-...
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE m;")
 box.sql.execute("DROP TABLE m;")
 ---
 ...
@@ -311,10 +309,8 @@ box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 ---
 - error: A multi-statement transaction can not use multiple storage engines
 ...
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE n;")
----
-...
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE n;")
 box.sql.execute("DROP TABLE m;")
 ---
 ...
diff --git a/test/sql/triggers.test.lua b/test/sql/triggers.test.lua
index b22b4f9..6618a41 100644
--- a/test/sql/triggers.test.lua
+++ b/test/sql/triggers.test.lua
@@ -109,8 +109,8 @@ box.sql.execute("INSERT INTO m VALUES (0, '0');")
 box.sql.execute("INSERT INTO n VALUES (0, '',null);")
 box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE m;")
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE m;")
 box.sql.execute("DROP TABLE m;")
 box.sql.execute("DROP TABLE n;")
 
@@ -125,8 +125,8 @@ box.sql.execute("INSERT INTO m VALUES (0, '0');")
 box.sql.execute("INSERT INTO n VALUES (0, '',null);")
 box.sql.execute("UPDATE m SET s1 = 'The Rain In Spain';")
 
--- ANALYZE operates with _sql_stat{1,4} tables should work
-box.sql.execute("ANALYZE n;")
+-- ANALYZE banned in gh-4069
+-- box.sql.execute("ANALYZE n;")
 box.sql.execute("DROP TABLE m;")
 box.sql.execute("DROP TABLE n;")
 





More information about the Tarantool-patches mailing list