<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Now, patch looks way better. Keep fixing minor remarks.<div class="">Also, it is better to push your changes, so that I can check</div><div class="">Travis status (i.e. make sure that all tests have passed).</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 4 Apr 2018, at 18:46, Hollow111 <<a href="mailto:hollow653@gmail.com" class="">hollow653@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">ср, 4 апр. 2018 г. в 17:06, n.pettik <<a href="mailto:korablev@tarantool.org" class="">korablev@tarantool.org</a>>:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Please, don’t hurry when working on patch.<br class="">
Consider carefully each fix and comment: there is no any deadline.<br class="">
<br class="">
You don’t have to send second patch version.<br class="">
This patch is pretty small, so you can answer to this letter and<br class="">
pin your changes. For example: you won’t change tests (since they are OK),<br class="">
so don’t include them in provided diff.<br class="">
<br class="">
> On 4 Apr 2018, at 00:37, N.Tatunov <<a href="mailto:hollow653@gmail.com" target="_blank" class="">hollow653@gmail.com</a>> wrote:<br class="">
><br class="">
> Currently dropping an index leads to removal of<br class="">
> all the entries containing the certain index name<br class="">
> in "_sql_statN" tables. Thus far analyze routine was fixed<br class="">
> so it seems that the indexes from the different tables but<br class="">
> with the same names should work more properly.<br class="">
><br class="">
> Closes: #3264<br class="">
> ---<br class="">
><br class="">
> Branch: <a href="https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-3264-stat-table-entries-removal" rel="noreferrer" target="_blank" class="">https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-3264-stat-table-entries-removal</a><br class="">
> Issue: <a href="https://github.com/tarantool/tarantool/issues/3264" rel="noreferrer" target="_blank" class="">https://github.com/tarantool/tarantool/issues/3264</a><br class="">
><br class="">
> src/box/sql/build.c                    |  41 ++++++-----<br class="">
> test/sql/sql-statN-index-drop.result   | 127 +++++++++++++++++++++++++++++++++<br class="">
> test/sql/sql-statN-index-drop.test.lua |  54 ++++++++++++++<br class="">
> 3 files changed, 206 insertions(+), 16 deletions(-)<br class="">
> create mode 100644 test/sql/sql-statN-index-drop.result<br class="">
> create mode 100644 test/sql/sql-statN-index-drop.test.lua<br class="">
><br class="">
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c<br class="">
> index 5e3ed0f..44d7548 100644<br class="">
> --- a/src/box/sql/build.c<br class="">
> +++ b/src/box/sql/build.c<br class="">
> @@ -2207,25 +2207,34 @@ sqliteViewResetAll(sqlite3 * db)<br class="">
> #endif                                /* SQLITE_OMIT_VIEW */<br class="">
><br class="">
> /*<br class="">
> - * Remove entries from the sqlite_statN tables (for N in (1,2,3))<br class="">
> + * Remove entries from the _sql_statN tables (for N in (1, 4))<br class="">
>  * after a DROP INDEX or DROP TABLE command.<br class="">
>  */<br class="">
<br class="">
Comment prior to function starts from /**.<br class="">
Your provide short description (it is already there),<br class="">
describe arguments and return value with @param and @retval tags.<br class="">
You can find more information by searching ‘doxygen comments’.<br class="">
<br class="">
> static void<br class="">
> -sqlite3ClearStatTables(Parse * pParse,       /* The parsing context */<br class="">
> -                    const char *zType,       /* "idx" or "tbl" */<br class="">
> -                    const char *zName        /* Name of index or table */<br class="">
> +sql_clear_stat_tables(Parse * pParse,        /* The parsing context */<br class="">
<br class="">
pParse and zType are examples of Hungarian notation:<br class="">
you don’t need ‘p’ and ‘z’ prefixes. Moreover, you can remove comment<br class="">
right after arguments, since args will be described above within oxygen comment.<br class="">
<br class="">
> +                    const char *zType,           /* "idx" or "tbl" */<br class="">
> +               const char *table_name,  /* Name of the table*/<br class="">
> +                    const char *idx_name     /* Name of the index*/<br class="">
>     )<br class="">
> {<br class="">
> -     int i;<br class="">
> -     for (i = 1; i <= 4; i++) {<br class="">
> -             char zTab[24];<br class="">
> -             sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i);<br class="">
> -             if (sqlite3FindTable(pParse->db, zTab)) {<br class="">
> -                     sqlite3NestedParse(pParse,<br class="">
> -                                        "DELETE FROM \"%s\" WHERE \"%s\"=%Q",<br class="">
> -                                        zTab, zType, zName);<br class="">
> -             }<br class="">
> -     }<br class="">
> +    int i, j;<br class="">
<br class="">
You don’t need to declare vars beforehand:<br class="">
it is is required in obsolete C standards (such as KR or C89).<br class="">
However, we are using *modern* C99:<br class="">
for (int i = 0; …)  - is OK.<br class="">
<br class="">
> +    if(strcmp(zType, "idx") == 0)<br class="">
<br class="">
As you suggest, you can get rid of this ’type’. Instead, just<br class="">
check index name on nullability.<br class="">
<br class="">
> +        for(i = 1, j = 1; i <= 2; i++, j++) {<br class="">
<br class="">
This cycle-for is completely unreadable. Don’t make things to be complicated:<br class="">
it is better to use *less* beautiful, but more obvious and clear approach.<br class="">
Don’t be afraid of changing code: this function is declared as static,<br class="">
so it is not available for public usage.<br class="">
<br class="">
I would like to suggest you to get rid of cycle and snprintf,<br class="">
but add two almost the same calls of sqlite3NestedParse().<br class="">
It will result in plain and readable code:<br class="">
sqlite3NestedParse(…, ” … WHERE tbl = stat1”);<br class="">
sqlite3NestedParse(…, ” … WHERE tbl = stat4”);<br class="">
<br class="">
> +            char zTab[24];<br class="">
> +            sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i * j);<br class="">
> +            sqlite3NestedParse(pParse,<br class="">
> +                        "DELETE FROM \"%s\" WHERE (\"idx\"=%Q AND "<br class="">
> +                        "\"tbl\"=%Q)",<br class="">
> +                        zTab, idx_name, table_name);<br class="">
> +        }<br class="">
> +    else<br class="">
> +        for(i = 1, j = 1; i <= 2; i++, j++) {<br class="">
> +            char zTab[24];<br class="">
> +            sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i * j);<br class="">
> +            sqlite3NestedParse(pParse,<br class="">
> +                        "DELETE FROM \"%s\" WHERE \"tbl\"=%Q",<br class="">
> +                        zTab, table_name);<br class="">
> +        }<br class="">
> }<br class="">
><br class="">
> /*<br class="">
> @@ -2415,7 +2424,7 @@ sqlite3DropTable(Parse * pParse, SrcList * pName, int isView, int noErr)<br class="">
>        */<br class="">
><br class="">
>       sqlite3BeginWriteOperation(pParse, 1);<br class="">
> -     sqlite3ClearStatTables(pParse, "tbl", pTab->zName);<br class="">
> +    sql_clear_stat_tables(pParse, "tbl", pTab->zName, NULL);<br class="">
>       sqlite3FkDropTable(pParse, pName, pTab);<br class="">
>       sqlite3CodeDropTable(pParse, pTab, isView);<br class="">
><br class="">
> @@ -3417,7 +3426,7 @@ sqlite3DropIndex(Parse * pParse, SrcList * pName, Token * pName2, int ifExists)<br class="">
>        * But firstly, delete statistics since schema<br class="">
>        * changes after DDL.<br class="">
>        */<br class="">
> -     sqlite3ClearStatTables(pParse, "idx", pIndex->zName);<br class="">
> +    sql_clear_stat_tables(pParse, "idx", pIndex->pTable->zName, pIndex->zName);<br class="">
>       int record_reg = ++pParse->nMem;<br class="">
>       int space_id_reg = ++pParse->nMem;<br class="">
>       sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_PAGENO_TO_SPACEID(pIndex->tnum),<br class="">
> diff --git a/test/sql/sql-statN-index-drop.result b/test/sql/sql-statN-index-drop.result<br class="">
> new file mode 100644<br class="">
> index 0000000..c7e476f<br class="">
> --- /dev/null<br class="">
> +++ b/test/sql/sql-statN-index-drop.result<br class="">
> @@ -0,0 +1,127 @@<br class="">
> +test_run = require('test_run').new()<br class="">
> +---<br class="">
> +...<br class="">
> +-- Initializing some things.<br class="">
> +box.sql.execute("CREATE TABLE t1(id PRIMARY KEY, a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE TABLE t2(id PRIMARY KEY, a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t1(a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t2(a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("INSERT INTO t1 VALUES(1, 2);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("INSERT INTO t2 VALUES(1, 2);")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Analyze.<br class="">
> +box.sql.execute("ANALYZE;")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Checking the data.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br class="">
> +  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br class="">
> +...<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1 1']<br class="">
> +  - ['T1', 'T1', '1 1']<br class="">
> +  - ['T2', 'I1', '1 1']<br class="">
> +  - ['T2', 'T2', '1 1']<br class="">
> +...<br class="">
> +-- Dropping an index.<br class="">
> +box.sql.execute("DROP INDEX i1 ON t1;")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Checking the DROP INDEX results.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +---<br class="">
> +- - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br class="">
> +  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br class="">
> +...<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +---<br class="">
> +- - ['T1', 'T1', '1 1']<br class="">
> +  - ['T2', 'I1', '1 1']<br class="">
> +  - ['T2', 'T2', '1 1']<br class="">
> +...<br class="">
> +--Cleaning up.<br class="">
> +box.sql.execute("DROP TABLE t1;")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("DROP TABLE t2;")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Same test but dropping an INDEX ON t2.<br class="">
> +box.sql.execute("CREATE TABLE t1(id PRIMARY KEY, a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE TABLE t2(id PRIMARY KEY, a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t1(a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t2(a);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("INSERT INTO t1 VALUES(1, 2);")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("INSERT INTO t2 VALUES(1, 2);")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Analyze.<br class="">
> +box.sql.execute("ANALYZE;")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Checking the data.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br class="">
> +  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br class="">
> +...<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1 1']<br class="">
> +  - ['T1', 'T1', '1 1']<br class="">
> +  - ['T2', 'I1', '1 1']<br class="">
> +  - ['T2', 'T2', '1 1']<br class="">
> +...<br class="">
> +-- Dropping an index.<br class="">
> +box.sql.execute("DROP INDEX i1 ON t2;")<br class="">
> +---<br class="">
> +...<br class="">
> +-- Checking the DROP INDEX results.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br class="">
> +  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br class="">
> +  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br class="">
> +...<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +---<br class="">
> +- - ['T1', 'I1', '1 1']<br class="">
> +  - ['T1', 'T1', '1 1']<br class="">
> +  - ['T2', 'T2', '1 1']<br class="">
> +...<br class="">
> +--Cleaning up.<br class="">
> +box.sql.execute("DROP TABLE t1;")<br class="">
> +---<br class="">
> +...<br class="">
> +box.sql.execute("DROP TABLE t2;")<br class="">
> +---<br class="">
> +...<br class="">
> diff --git a/test/sql/sql-statN-index-drop.test.lua b/test/sql/sql-statN-index-drop.test.lua<br class="">
> new file mode 100644<br class="">
> index 0000000..bf4a752<br class="">
> --- /dev/null<br class="">
> +++ b/test/sql/sql-statN-index-drop.test.lua<br class="">
> @@ -0,0 +1,54 @@<br class="">
> +test_run = require('test_run').new()<br class="">
> +<br class="">
> +-- Initializing some things.<br class="">
> +box.sql.execute("CREATE TABLE t1(id PRIMARY KEY, a);")<br class="">
> +box.sql.execute("CREATE TABLE t2(id PRIMARY KEY, a);")<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t1(a);")<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t2(a);")<br class="">
> +box.sql.execute("INSERT INTO t1 VALUES(1, 2);")<br class="">
> +box.sql.execute("INSERT INTO t2 VALUES(1, 2);")<br class="">
> +<br class="">
> +-- Analyze.<br class="">
> +box.sql.execute("ANALYZE;")<br class="">
> +<br class="">
> +-- Checking the data.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +<br class="">
> +-- Dropping an index.<br class="">
> +box.sql.execute("DROP INDEX i1 ON t1;")<br class="">
> +<br class="">
> +-- Checking the DROP INDEX results.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +<br class="">
> +--Cleaning up.<br class="">
> +box.sql.execute("DROP TABLE t1;")<br class="">
> +box.sql.execute("DROP TABLE t2;")<br class="">
> +<br class="">
> +-- Same test but dropping an INDEX ON t2.<br class="">
> +<br class="">
> +box.sql.execute("CREATE TABLE t1(id PRIMARY KEY, a);")<br class="">
> +box.sql.execute("CREATE TABLE t2(id PRIMARY KEY, a);")<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t1(a);")<br class="">
> +box.sql.execute("CREATE INDEX i1 ON t2(a);")<br class="">
> +box.sql.execute("INSERT INTO t1 VALUES(1, 2);")<br class="">
> +box.sql.execute("INSERT INTO t2 VALUES(1, 2);")<br class="">
> +<br class="">
> +-- Analyze.<br class="">
> +box.sql.execute("ANALYZE;")<br class="">
> +<br class="">
> +-- Checking the data.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +<br class="">
> +-- Dropping an index.<br class="">
> +box.sql.execute("DROP INDEX i1 ON t2;")<br class="">
> +<br class="">
> +-- Checking the DROP INDEX results.<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br class="">
> +box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br class="">
> +<br class="">
> +--Cleaning up.<br class="">
> +box.sql.execute("DROP TABLE t1;")<br class="">
> +box.sql.execute("DROP TABLE t2;")<br class="">
> --<br class="">
> 2.7.4<br class="">
><br class="">
><br class="">
<br class=""></blockquote><div class="">Suggested changes were applied so this is diff:<br class=""><br class=""><div class=""> </div><div class="">diff --git a/src/box/sql/build.c b/src/box/sql/build.c</div><div class="">index 44d7548..16ae042 100644</div><div class="">--- a/src/box/sql/build.c</div><div class="">+++ b/src/box/sql/build.c</div><div class="">@@ -2206,34 +2206,35 @@ sqliteViewResetAll(sqlite3 * db)</div><div class=""> #define sqliteViewResetAll(A,B)</div><div class=""> #endif<span style="white-space:pre" class="">                                </span>/* SQLITE_OMIT_VIEW */</div><div class=""> </div><div class="">-/*</div><div class="">+/**</div><div class="">  * Remove entries from the _sql_statN tables (for N in (1, 4))</div><div class="">  * after a DROP INDEX or DROP TABLE command.</div><div class="">+ * </div><div class="">+ * @param table_name table to be dropped or</div><div class="">+ *                   the table that contains index to be dropped</div><div class="">+ * @param idx_name index to be dropped</div></div></div></div></div></blockquote><div><br class=""></div><div>Nitpicking: put dot at the end of comments and</div><div>start sentences from capital letter.</div><div>(This is just advice. You may skip most ’nitpicking’ comments.)</div><div><br class=""></div><div>Moreover, you forget to describe first arg:</div><div>even despite the fact that it is obviously ’The parsing context'. </div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><div class="">  */</div><div class=""> static void</div><div class="">-sql_clear_stat_tables(Parse * pParse,<span style="white-space:pre" class="">    </span>/* The parsing context */</div><div class="">-<span style="white-space:pre" class="">              </span>       const char *zType,<span style="white-space:pre" class="">     </span>    /* "idx" or "tbl" */</div><div class="">-               const char *table_name,  /* Name of the table*/</div><div class="">-<span style="white-space:pre" class="">           </span>       const char *idx_name<span style="white-space:pre" class="">   </span>/* Name of the index*/</div><div class="">-    )</div><div class="">+sql_clear_stat_tables(Parse *parse,</div><div class="">+               const char *table_name,</div><div class="">+<span style="white-space:pre" class="">                </span>       const char *idx_name)</div></div></div></div></div></blockquote><div><br class=""></div><div>You don’t need to place each arg at new line.</div><div>The only restriction is 80 chars per line.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><div class=""> {</div><div class="">-    int i, j;</div><div class="">-    if(strcmp(zType, "idx") == 0)</div><div class="">-        for(i = 1, j = 1; i <= 2; i++, j++) {</div><div class="">-            char zTab[24];</div><div class="">-            sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i * j);</div><div class="">-            sqlite3NestedParse(pParse,</div><div class="">-                        "DELETE FROM \"%s\" WHERE (\"idx\"=%Q AND "</div><div class="">-                        "\"tbl\"=%Q)",</div><div class="">-                        zTab, idx_name, table_name);</div><div class="">-        }</div><div class="">-    else</div><div class="">-        for(i = 1, j = 1; i <= 2; i++, j++) {</div><div class="">-            char zTab[24];</div><div class="">-            sqlite3_snprintf(sizeof(zTab), zTab, "_sql_stat%d", i * j);</div><div class="">-            sqlite3NestedParse(pParse,</div><div class="">-                        "DELETE FROM \"%s\" WHERE \"tbl\"=%Q",</div><div class="">-                        zTab, table_name);</div><div class="">+    if(idx_name) {</div></div></div></div></div></blockquote><div><br class=""></div><div>It is better to use explicit == NULL check.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><div class="">+        sqlite3NestedParse(parse,</div><div class="">+                    "DELETE FROM \"_sql_stat1\" WHERE (\"idx\"=%Q AND "</div><div class="">+                    "\"tbl\"=%Q)",</div><div class="">+                    idx_name, table_name);</div><div class="">+        sqlite3NestedParse(parse,</div><div class="">+                    "DELETE FROM \"_sql_stat4\" WHERE (\"idx\"=%Q AND "</div><div class="">+                    "\"tbl\"=%Q)",</div><div class="">+                    idx_name, table_name);</div><div class="">+    } else {</div><div class="">+        sqlite3NestedParse(parse,</div><div class="">+                    "DELETE FROM \"_sql_stat1\" WHERE \"tbl\"=%Q",</div><div class="">+                    table_name);</div><div class="">+        sqlite3NestedParse(parse,</div><div class="">+                    "DELETE FROM \"_sql_stat4\" WHERE \"tbl\"=%Q",</div><div class="">+                    table_name);</div><div class="">         }</div><div class=""> }</div><div class=""> </div><div class="">@@ -2424,7 +2425,7 @@ sqlite3DropTable(Parse * pParse, SrcList * pName, int isView, int noErr)</div><div class=""> <span style="white-space:pre" class="">     </span> */</div><div class=""> </div><div class=""> <span style="white-space:pre" class="">       </span>sqlite3BeginWriteOperation(pParse, 1);</div><div class="">-    sql_clear_stat_tables(pParse, "tbl", pTab->zName, NULL);</div><div class="">+    sql_clear_stat_tables(pParse, pTab->zName, NULL);</div><div class=""> <span style="white-space:pre" class=""> </span>sqlite3FkDropTable(pParse, pName, pTab);</div><div class=""> <span style="white-space:pre" class="">  </span>sqlite3CodeDropTable(pParse, pTab, isView);</div><div class=""> </div><div class="">@@ -3426,7 +3427,7 @@ sqlite3DropIndex(Parse * pParse, SrcList * pName, Token * pName2, int ifExists)</div><div class=""> <span style="white-space:pre" class="">        </span> * But firstly, delete statistics since schema</div><div class=""> <span style="white-space:pre" class="">    </span> * changes after DDL.</div><div class=""> <span style="white-space:pre" class="">     </span> */</div><div class="">-    sql_clear_stat_tables(pParse, "idx", pIndex->pTable->zName, pIndex->zName);</div><div class="">+    sql_clear_stat_tables(pParse, pIndex->pTable->zName, pIndex->zName);</div><div class=""> <span style="white-space:pre" class="">  </span>int record_reg = ++pParse->nMem;</div><div class=""> <span style="white-space:pre" class="">       </span>int space_id_reg = ++pParse->nMem;</div><div class=""> <span style="white-space:pre" class="">     </span>sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_PAGENO_TO_SPACEID(pIndex->tnum),</div><div class="">diff --git a/test/xlog/checkpoint_daemon.result b/test/xlog/checkpoint_daemon.result</div><div class="">index d5ed666..1c28336 100644</div><div class="">--- a/test/xlog/checkpoint_daemon.result</div><div class="">+++ b/test/xlog/checkpoint_daemon.result</div><div class="">@@ -96,11 +96,11 @@ fiber.sleep(3 * PERIOD)</div><div class=""> -- check that it's not first snapshot</div><div class=""> test_run:grep_log("default", "saving snapshot", 400) == nil</div><div class=""> ---</div><div class="">-- true</div><div class="">+- false</div><div class=""> ...</div><div class=""> test_run:grep_log("default", "making snapshot", 400) ~= nil</div><div class=""> ---</div><div class="">-- true</div><div class="">+- false</div></div></div></div></div></blockquote><div><br class=""></div><div>I guess, this diff doesn’t belong to the patch.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><div class=""> ...</div><div class=""> -- restore default options</div><div class=""> box.cfg{checkpoint_interval = 3600 * 4, checkpoint_count = 4 }</div> </div></div></div>
</div></blockquote></div><br class=""></div></body></html>