<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi! Thank you for review! New version and my answers below.<br>
    </p>
    <div class="moz-cite-prefix">On 11/19/18 1:27 PM, Vladislav
      Shpilevoy wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">Hi!
      Thanks for the rebase! See 4 comments below.
      <br>
      <br>
      <blockquote type="cite">commit
        b9792dfc183d7d0851f3492c8ba9e2f7c46fe385
        <br>
        Author: Mergen Imeev <a class="moz-txt-link-rfc2396E" href="mailto:imeevma@gmail.com"><imeevma@gmail.com></a>
        <br>
        Date:   Fri Aug 31 12:37:48 2018 +0300
        <br>
        <br>
             sql: hold in stat tables space/index id instead of name
        <br>
        <br>
             To avoid problems with table and index renaming it is good
        idea
        <br>
             to save ids of tables and indexes instead of their names.
        Ids of
        <br>
             tables and indexes are fixed values.
        <br>
        <br>
             Closes #3242
        <br>
             Closes #2962
        <br>
        <br>
        diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
        <br>
        index b7789d6..538e635 100644
        <br>
        Binary files a/src/box/bootstrap.snap and
        b/src/box/bootstrap.snap differ
        <br>
        diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
        <br>
        index 3d9acc9..3ce586b 100644
        <br>
        --- a/src/box/lua/upgrade.lua
        <br>
        +++ b/src/box/lua/upgrade.lua
        <br>
        @@ -550,11 +550,11 @@ local function upgrade_to_2_1_0()
        <br>
              _index:insert{_trigger.id, 1, 'space_id', 'tree', { unique
        = false },
        <br>
                            {{1, 'unsigned'}}}
        <br>
        <br>
        -    local stat1_ft = {{name='tbl', type='string'},
        <br>
        -                      {name='idx', type='string'},
        <br>
        +    local stat1_ft = {{name='space_id', type='unsigned'},
        <br>
        +                      {name='index_id', type='unsigned'},
        <br>
                                {name='stat', type='string'}}
        <br>
        -    local stat4_ft = {{name='tbl', type='string'},
        <br>
        -                      {name='idx', type='string'},
        <br>
        +    local stat4_ft = {{name='space_id', type='unsigned'},
        <br>
        +                      {name='index_id', type='unsigned'},
        <br>
                                {name='neq', type='string'},
        <br>
                                {name='nlt', type='string'},
        <br>
                                {name='ndlt', type='string'}
        <br>
      </blockquote>
      <br>
      1. Unfortunately, as I said earlier, you can not change the
      <br>
      past. 2.1.0 is already released, so you should create
      upgrade_to_2_2_0()
      <br>
      function and here update stat spaces format.
      <br>
    </blockquote>
    Done.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">diff --git a/src/box/sql/analyze.c
        b/src/box/sql/analyze.c
        <br>
        index e786c90..aa5d349 100644
        <br>
        --- a/src/box/sql/analyze.c
        <br>
        +++ b/src/box/sql/analyze.c
        <br>
        @@ -800,13 +800,13 @@ vdbe_emit_analyze_space(struct Parse
        *parse, struct space *space)
        <br>
              assert(space->index_count != 0);
        <br>
              struct Vdbe *v = sqlite3GetVdbe(parse);
        <br>
              assert(v != NULL);
        <br>
        -    const char *tab_name = space_name(space);
        <br>
        +    MAYBE_UNUSED const char *tab_name = space_name(space);
        <br>
      </blockquote>
      <br>
      2. Why unused?
      <br>
    </blockquote>
    It is used only in VdbeComment, so it will not be used in<br>
    RelWithDebInfoWError build.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">      sqlite3VdbeAddOp4(v,
        OP_IteratorOpen, tab_cursor, 0, 0, (void *) space,
        <br>
                        P4_SPACEPTR);
        <br>
        -    sqlite3VdbeLoadString(v, tab_name_reg,
        space->def->name);
        <br>
        +    sqlite3VdbeAddOp2(v, OP_Integer, space->def->id,
        space_id_reg);
        <br>
              for (uint32_t j = 0; j < space->index_count; ++j) {
        <br>
                  struct index *idx = space->index[j];
        <br>
        -        const char *idx_name;
        <br>
        +        MAYBE_UNUSED const char *idx_name;
        <br>
      </blockquote>
      <br>
      3. Why?
      <br>
    </blockquote>
    Same as previous.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">          /*
        <br>
                   * Primary indexes feature automatically generated
        <br>
                   * names. Thus, for the sake of clarity, use
        <br>
        @@ -1225,23 +1224,14 @@ analysis_loader(void *data, int argc,
        char **argv, char **unused)
        <br>
              struct analysis_index_info *info = (struct
        analysis_index_info *) data;
        <br>
              assert(info->stats != NULL);
        <br>
              struct index_stat *stat =
        &info->stats[info->index_count++];
        <br>
        -    struct space *space = space_by_name(argv[0]);
        <br>
        -    if (space == NULL)
        <br>
        +    uint32_t space_id = atoll(argv[0]);
        <br>
        +    if (space_id == 0)
        <br>
                  return -1;
        <br>
        +    struct space *space = space_by_id(space_id);
        <br>
        +    assert(space != NULL);
        <br>
              struct index *index;
        <br>
        -    uint32_t iid = box_index_id_by_name(space->def->id,
        argv[1],
        <br>
        -                        strlen(argv[1]));
        <br>
        -    /*
        <br>
        -     * Convention is if index's name matches with space's
        <br>
        -     * one, then it is primary index.
        <br>
        -     */
        <br>
        -    if (iid != BOX_ID_NIL) {
        <br>
        -        index = space_index(space, iid);
        <br>
        -    } else {
        <br>
        -        if (sqlite3_stricmp(argv[0], argv[1]) != 0)
        <br>
        -            return -1;
        <br>
        -        index = space_index(space, 0);
        <br>
        -    }
        <br>
        +    uint32_t iid = atoll(argv[1]);
        <br>
        +    index = space_index(space, iid);
        <br>
      </blockquote>
      <br>
      4.1. Why in some places d oyou check result of
      <br>
      atoll and sqlite3_column_int, but in others do not?
      <br>
    </blockquote>
    Fixed. Added all checks.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">      assert(index != NULL);
        <br>
              /*
        <br>
               * Additional field is used to describe total
        <br>
        @@ -1387,24 +1381,14 @@ load_stat_from_space(struct sqlite3 *db,
        const char *sql_select_prepare,
        <br>
                  goto finalize;
        <br>
              uint32_t current_idx_count = 0;
        <br>
              while (sqlite3_step(stmt) == SQLITE_ROW) {
        <br>
        -        const char *space_name = (char
        *)sqlite3_column_text(stmt, 0);
        <br>
        -        if (space_name == NULL)
        <br>
        -            continue;
        <br>
        -        const char *index_name = (char
        *)sqlite3_column_text(stmt, 1);
        <br>
        -        if (index_name == NULL)
        <br>
        -            continue;
        <br>
        -        uint32_t sample_count = sqlite3_column_int(stmt, 2);
        <br>
        -        struct space *space = space_by_name(space_name);
        <br>
        +        uint32_t space_id = sqlite3_column_int(stmt, 0);
        <br>
        +        assert(space_id != 0);
        <br>
        +        struct space *space = space_by_id(space_id);
        <br>
      </blockquote>
      <br>
      4.2. Here you do not check, but ...
      <br>
    </blockquote>
    Fixed.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">          assert(space != NULL);
        <br>
        -        struct index *index;
        <br>
        @@ -1537,24 +1509,13 @@ load_stat_to_index(struct sqlite3 *db,
        const char *sql_select_load,
        <br>
                  return -1;
        <br>
              uint32_t current_idx_count = 0;
        <br>
              while (sqlite3_step(stmt) == SQLITE_ROW) {
        <br>
        -        const char *space_name = (char
        *)sqlite3_column_text(stmt, 0);
        <br>
        -        if (space_name == NULL)
        <br>
        -            continue;
        <br>
        -        const char *index_name = (char
        *)sqlite3_column_text(stmt, 1);
        <br>
        -        if (index_name == NULL)
        <br>
        -            continue;
        <br>
        -        struct space *space = space_by_name(space_name);
        <br>
        +        uint32_t space_id = sqlite3_column_int(stmt, 0);
        <br>
        +        if (space_id == 0)
        <br>
        +            return -1;
        <br>
      </blockquote>
      <br>
      4.3. ... here you check again.
      <br>
    </blockquote>
    Fixed.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">+        struct space *space =
        space_by_id(space_id);
        <br>
                  assert(space != NULL);
        <br>
        -        struct index *index;
        <br>
        -        uint32_t iid =
        box_index_id_by_name(space->def->id, index_name,
        <br>
        -                            strlen(index_name));
        <br>
        -        if (iid != BOX_ID_NIL) {
        <br>
        -            index = space_index(space, iid);
        <br>
        -        } else {
        <br>
        -            if (sqlite3_stricmp(space_name, index_name) != 0)
        <br>
        -                return -1;
        <br>
        -            index = space_index(space, 0);
        <br>
        -        }
        <br>
        +        uint32_t iid = sqlite3_column_int(stmt, 1);
        <br>
      </blockquote>
      <br>
      4.4. And here you don't ...
      <br>
    </blockquote>
    Fixed.<br>
    <blockquote type="cite"
      cite="mid:2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org">
      <br>
      <blockquote type="cite">+        struct index *index =
        space_index(space, iid);
        <br>
                  assert(index != NULL);
        <br>
                  free(index->def->opts.stat);
        <br>
                  index->def->opts.stat =
        stats[current_idx_count++];
        <br>
      </blockquote>
    </blockquote>
    <p><br>
    </p>
    <p><b>New version:</b></p>
    <p>commit 5e1eb513b33ee8ab31901e8e0bf8d8f5a9442b9f<br>
      Author: Mergen Imeev <a class="moz-txt-link-rfc2396E" href="mailto:imeevma@gmail.com"><imeevma@gmail.com></a><br>
      Date:   Sun Dec 2 17:57:19 2018 +0300<br>
      <br>
          sql: hold in stat tables space/index id instead of name<br>
          <br>
          To avoid problems with table and index renaming it is good
      idea<br>
          to save ids of tables and indexes instead of their names. Ids
      of<br>
          tables and indexes are fixed values.<br>
          <br>
          Closes #3242<br>
          Closes #2962<br>
      <br>
      diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap<br>
      index d6cc821..22208c6 100644<br>
      Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap
      differ<br>
      diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua<br>
      index 3d9acc9..2767f9b 100644<br>
      --- a/src/box/lua/upgrade.lua<br>
      +++ b/src/box/lua/upgrade.lua<br>
      @@ -613,6 +613,31 @@ local function upgrade_to_2_1_0()<br>
           upgrade_priv_to_2_1_0()<br>
       end<br>
       <br>
+--------------------------------------------------------------------------------<br>
      +-- Tarantool 2.1.1<br>
+--------------------------------------------------------------------------------<br>
      +<br>
      +local function upgrade_sql_stat_to_2_1_1(space_id, parts)<br>
      +    local _sql_stat = box.space[space_id]<br>
      +<br>
      +    local stats = _sql_stat:select()<br>
      +    for _, v in pairs(stats) do _sql_stat:delete{v.tbl, v.idx}
      end<br>
      +<br>
      +    local format = _sql_stat:format()<br>
      +    format[1].name = 'space_id'<br>
      +    format[1].type = 'unsigned'<br>
      +    format[2].name = 'index_id'<br>
      +    format[2].type = 'unsigned'<br>
      +    _sql_stat.index.primary:alter{parts={3, 'string'}}<br>
      +    _sql_stat:format(format)<br>
      +    _sql_stat.index.primary:alter{parts=parts}<br>
      +end<br>
      +<br>
      +local function upgrade_to_2_1_1()<br>
      +    upgrade_sql_stat_to_2_1_1(box.schema.SQL_STAT1_ID, {1,
      'unsigned', 2, 'unsigned'})<br>
      +    upgrade_sql_stat_to_2_1_1(box.schema.SQL_STAT4_ID, {1,
      'unsigned', 2, 'unsigned', 6, 'scalar'})<br>
      +end<br>
      +<br>
       local function get_version()<br>
           local version = box.space._schema:get{'version'}<br>
           if version == nil then<br>
      @@ -640,7 +665,8 @@ local function upgrade(options)<br>
               {version = mkversion(1, 7, 7), func = upgrade_to_1_7_7,
      auto = true},<br>
               {version = mkversion(1, 10, 0), func = upgrade_to_1_10_0,
      auto = true},<br>
               {version = mkversion(1, 10, 2), func = upgrade_to_1_10_2,
      auto = true},<br>
      -        {version = mkversion(2, 1, 0), func = upgrade_to_2_1_0,
      auto = true}<br>
      +        {version = mkversion(2, 1, 0), func = upgrade_to_2_1_0,
      auto = true},<br>
      +        {version = mkversion(2, 1, 1), func = upgrade_to_2_1_1,
      auto = true}<br>
           }<br>
       <br>
           for _, handler in ipairs(handlers) do<br>
      diff --git a/src/box/schema.cc b/src/box/schema.cc<br>
      index 8625d92..844b6c3 100644<br>
      --- a/src/box/schema.cc<br>
      +++ b/src/box/schema.cc<br>
      @@ -444,21 +444,19 @@ schema_init()<br>
           sc_space_new(BOX_INDEX_ID, "_index", key_parts, 2,<br>
                    &alter_space_on_replace_index,
      &on_stmt_begin_index);<br>
       <br>
      -    /* _sql_stat1 - a simpler statistics on space, seen in SQL.
      */<br>
      -    key_parts[0].fieldno = 0; /* space name */<br>
      +    /*<br>
      +     *_sql_stat1 - a simpler statistics on space, seen in SQL.<br>
      +     * The real index is defined in the snapshot.<br>
      +     */<br>
      +    key_parts[0].fieldno = 2;<br>
           key_parts[0].type = FIELD_TYPE_STRING;<br>
      -    key_parts[1].fieldno = 1; /* index name */<br>
      -    key_parts[1].type = FIELD_TYPE_STRING;<br>
      -    sc_space_new(BOX_SQL_STAT1_ID, "_sql_stat1", key_parts, 2,
      NULL, NULL);<br>
      +    sc_space_new(BOX_SQL_STAT1_ID, "_sql_stat1", key_parts, 1,
      NULL, NULL);<br>
       <br>
      -    /* _sql_stat4 - extensive statistics on space, seen in SQL.
      */<br>
      -    key_parts[0].fieldno = 0; /* space name */<br>
      -    key_parts[0].type = FIELD_TYPE_STRING;<br>
      -    key_parts[1].fieldno = 1; /* index name */<br>
      -    key_parts[1].type = FIELD_TYPE_STRING;<br>
      -    key_parts[2].fieldno = 5; /* sample */<br>
      -    key_parts[2].type = FIELD_TYPE_SCALAR;<br>
      -    sc_space_new(BOX_SQL_STAT4_ID, "_sql_stat4", key_parts, 3,
      NULL, NULL);<br>
      +    /*<br>
      +     * _sql_stat4 - extensive statistics on space, seen in SQL.<br>
      +     * The real index is defined in the snapshot.<br>
      +     */<br>
      +    sc_space_new(BOX_SQL_STAT4_ID, "_sql_stat4", key_parts, 1,
      NULL, NULL);<br>
       <br>
           /* _fk_сonstraint - foreign keys constraints. */<br>
           key_parts[0].fieldno = 0; /* constraint name */<br>
      diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c<br>
      index 3f49280..426fe73 100644<br>
      --- a/src/box/sql/analyze.c<br>
      +++ b/src/box/sql/analyze.c<br>
      @@ -38,8 +38,8 @@<br>
        *<br>
        * The following system tables are or have been supported:<br>
        *<br>
      - *    CREATE TABLE _sql_stat1(tbl, idx, stat);<br>
      - *    CREATE TABLE _sql_stat4(tbl, idx, nEq, nLt, nDLt, sample);<br>
      + *    CREATE TABLE _sql_stat1(space_id, index_id, stat);<br>
      + *    CREATE TABLE _sql_stat4(space_id, index_id, nEq, nLt, nDLt,
      sample);<br>
        *<br>
        * For most applications, _sql_stat1 provides all the statistics
      required<br>
        * for the query planner to make good choices.<br>
      @@ -47,7 +47,7 @@<br>
        * Format of _sql_stat1:<br>
        *<br>
        * There is normally one row per index, with the index identified
      by the<br>
      - * name in the idx column.  The tbl column is the name of the
      table to<br>
      + * id in the index_id column.  The space_id column is the id of
      the space to<br>
        * which the index belongs.  In each such row, the stat column
      will be<br>
        * a string consisting of a list of integers.  The first integer
      in this<br>
        * list is the number of rows in the index.  (This is the same as
      the<br>
      @@ -66,9 +66,9 @@<br>
        * "unordered" keyword is present, then the query planner assumes
      that<br>
        * the index is unordered and will not use the index for a range
      query.<br>
        *<br>
      - * If the _sql_stat1.idx column is NULL, then the _sql_stat1.stat<br>
      + * If the _sql_stat1.index_id column is NULL, then the
      _sql_stat1.stat<br>
        * column contains a single integer which is the (estimated)
      number of<br>
      - * rows in the table identified by _sql_stat1.tbl.<br>
      + * rows in the table identified by _sql_stat1.space_id.<br>
        *<br>
        * Format for _sql_stat4:<br>
        *<br>
      @@ -78,9 +78,9 @@<br>
        * queries.<br>
        *<br>
        * The _sql_stat4 table contains multiple entries for each index.<br>
      - * The idx column names the index and the tbl column is the table
      of the<br>
      - * index.  If the idx and tbl columns are the same, then the
      sample is<br>
      - * of the INTEGER PRIMARY KEY.  The sample column is a blob which
      is the<br>
      + * The index_id column names the index and the space_id column is
      the space of<br>
      + * the index. If the index_id is equal to 0, then the sample<br>
      + * is of the INTEGER PRIMARY KEY.  The sample column is a blob
      which is the<br>
        * binary encoding of a key from the index.  The nEq column is a<br>
        * list of integers.  The first integer is the approximate number<br>
        * of entries in the index whose left-most column exactly matches<br>
      @@ -122,10 +122,11 @@<br>
        * created.<br>
        *<br>
        * @param parse Parsing context.<br>
      - * @param table_name Delete records of this table if specified.<br>
      + * @param space_id Delete records of this table if id is not<br>
      + *        BOX_ID_NIL.<br>
        */<br>
       static void<br>
      -vdbe_emit_stat_space_open(struct Parse *parse, const char
      *table_name)<br>
      +vdbe_emit_stat_space_open(struct Parse *parse, uint32_t space_id)<br>
       {<br>
           const char *stat_names[] = {"_sql_stat1", "_sql_stat4"};<br>
           const uint32_t stat_ids[] = {BOX_SQL_STAT1_ID,
      BOX_SQL_STAT4_ID};<br>
      @@ -133,10 +134,9 @@ vdbe_emit_stat_space_open(struct Parse
      *parse, const char *table_name)<br>
           assert(v != NULL);<br>
           assert(sqlite3VdbeDb(v) == parse->db);<br>
           for (uint i = 0; i < lengthof(stat_names); ++i) {<br>
      -        const char *space_name = stat_names[i];<br>
      -        if (table_name != NULL) {<br>
      -            vdbe_emit_stat_space_clear(parse, space_name, NULL,<br>
      -                           table_name);<br>
      +        if (space_id != BOX_ID_NIL) {<br>
      +            vdbe_emit_stat_space_clear(parse, stat_names[i],<br>
      +                           space_id, BOX_ID_NIL);<br>
               } else {<br>
                   sqlite3VdbeAddOp1(v, OP_Clear, stat_ids[i]);<br>
               }<br>
      @@ -780,10 +780,10 @@ vdbe_emit_analyze_space(struct Parse *parse,
      struct space *space)<br>
           int key_reg = ++parse->nMem;<br>
           /* Temporary use register. */<br>
           int tmp_reg = ++parse->nMem;<br>
      -    /* Register containing table name. */<br>
      -    int tab_name_reg = ++parse->nMem;<br>
      -    /* Register containing index name. */<br>
      -    int idx_name_reg = ++parse->nMem;<br>
      +    /* Register containing space id. */<br>
      +    int space_id_reg = ++parse->nMem;<br>
      +    /* Register containing index id. */<br>
      +    int index_id_reg = ++parse->nMem;<br>
           /* Value for the stat column of _sql_stat1. */<br>
           int stat1_reg = ++parse->nMem;<br>
           /* MUST BE LAST (see below). */<br>
      @@ -800,13 +800,13 @@ vdbe_emit_analyze_space(struct Parse *parse,
      struct space *space)<br>
           assert(space->index_count != 0);<br>
           struct Vdbe *v = sqlite3GetVdbe(parse);<br>
           assert(v != NULL);<br>
      -    const char *tab_name = space_name(space);<br>
      +    MAYBE_UNUSED const char *tab_name = space_name(space);<br>
           sqlite3VdbeAddOp4(v, OP_IteratorOpen, tab_cursor, 0, 0, (void
      *) space,<br>
                     P4_SPACEPTR);<br>
      -    sqlite3VdbeLoadString(v, tab_name_reg,
      space->def->name);<br>
      +    sqlite3VdbeAddOp2(v, OP_Integer, space->def->id,
      space_id_reg);<br>
           for (uint32_t j = 0; j < space->index_count; ++j) {<br>
               struct index *idx = space->index[j];<br>
      -        const char *idx_name;<br>
      +        MAYBE_UNUSED const char *idx_name;<br>
               /*<br>
                * Primary indexes feature automatically generated<br>
                * names. Thus, for the sake of clarity, use<br>
      @@ -817,8 +817,8 @@ vdbe_emit_analyze_space(struct Parse *parse,
      struct space *space)<br>
               else<br>
                   idx_name = idx->def->name;<br>
               int part_count = idx->def->key_def->part_count;<br>
      -        /* Populate the register containing the index name. */<br>
      -        sqlite3VdbeLoadString(v, idx_name_reg, idx_name);<br>
      +        /* Populate the register containing the index id. */<br>
      +        sqlite3VdbeAddOp2(v, OP_Integer, idx->def->iid,
      index_id_reg);<br>
               VdbeComment((v, "Analysis for %s.%s", tab_name,
      idx_name));<br>
               /*<br>
                * Pseudo-code for loop that calls stat_push():<br>
      @@ -993,9 +993,8 @@ vdbe_emit_analyze_space(struct Parse *parse,
      struct space *space)<br>
               sqlite3VdbeAddOp2(v, OP_Next, idx_cursor, next_row_addr);<br>
               /* Add the entry to the stat1 table. */<br>
               callStatGet(v, stat4_reg, STAT_GET_STAT1, stat1_reg);<br>
      -        assert("BBB"[0] == AFFINITY_TEXT);<br>
      -        sqlite3VdbeAddOp4(v, OP_MakeRecord, tab_name_reg, 3,
      tmp_reg,<br>
      -                  "BBB", 0);<br>
      +        sqlite3VdbeAddOp4(v, OP_MakeRecord, space_id_reg, 3,
      tmp_reg,<br>
      +                  "DDB", 0);<br>
               sqlite3VdbeAddOp4(v, OP_IdxInsert, tmp_reg, 0, 0,<br>
                         (char *)stat1, P4_SPACEPTR);<br>
               /* Add the entries to the stat4 table. */<br>
      @@ -1029,7 +1028,7 @@ vdbe_emit_analyze_space(struct Parse *parse,
      struct space *space)<br>
               }<br>
               sqlite3VdbeAddOp3(v, OP_MakeRecord, col_reg, part_count,<br>
                         sample_reg);<br>
      -        sqlite3VdbeAddOp3(v, OP_MakeRecord, tab_name_reg, 6,
      tmp_reg);<br>
      +        sqlite3VdbeAddOp3(v, OP_MakeRecord, space_id_reg, 6,
      tmp_reg);<br>
               sqlite3VdbeAddOp4(v, OP_IdxReplace, tmp_reg, 0, 0,<br>
                         (char *)stat4, P4_SPACEPTR);<br>
               /* P1==1 for end-of-loop. */<br>
      @@ -1070,7 +1069,7 @@ static void<br>
       sql_analyze_database(struct Parse *parser)<br>
       {<br>
           sql_set_multi_write(parser, false);<br>
      -    vdbe_emit_stat_space_open(parser, NULL);<br>
      +    vdbe_emit_stat_space_open(parser, BOX_ID_NIL);<br>
           space_foreach(sql_space_foreach_analyze, (void *)parser);<br>
           loadAnalysis(parser);<br>
       }<br>
      @@ -1091,7 +1090,7 @@ vdbe_emit_analyze_table(struct Parse *parse,
      struct space *space)<br>
            * There are two system spaces for statistics: _sql_stat1<br>
            * and _sql_stat4.<br>
            */<br>
      -    vdbe_emit_stat_space_open(parse, space->def->name);<br>
      +    vdbe_emit_stat_space_open(parse, space->def->id);<br>
           vdbe_emit_analyze_space(parse, space);<br>
           loadAnalysis(parse);<br>
       }<br>
      @@ -1225,24 +1224,17 @@ analysis_loader(void *data, int argc, char
      **argv, char **unused)<br>
           struct analysis_index_info *info = (struct
      analysis_index_info *) data;<br>
           assert(info->stats != NULL);<br>
           struct index_stat *stat =
      &info->stats[info->index_count++];<br>
      -    struct space *space = space_by_name(argv[0]);<br>
      +    uint32_t space_id = atoll(argv[0]);<br>
      +    if (space_id == 0)<br>
      +        return -1;<br>
      +    struct space *space = space_by_id(space_id);<br>
           if (space == NULL)<br>
               return -1;<br>
           struct index *index;<br>
      -    uint32_t iid = box_index_id_by_name(space->def->id,
      argv[1],<br>
      -                        strlen(argv[1]));<br>
      -    /*<br>
      -     * Convention is if index's name matches with space's<br>
      -     * one, then it is primary index.<br>
      -     */<br>
      -    if (iid != BOX_ID_NIL) {<br>
      -        index = space_index(space, iid);<br>
      -    } else {<br>
      -        if (sqlite3_stricmp(argv[0], argv[1]) != 0)<br>
      -            return -1;<br>
      -        index = space_index(space, 0);<br>
      -    }<br>
      -    assert(index != NULL);<br>
      +    uint32_t iid = atoll(argv[1]);<br>
      +    index = space_index(space, iid);<br>
      +    if (index == NULL)<br>
      +        return -1;<br>
           /*<br>
            * Additional field is used to describe total<br>
            * count of tuples in index. Although now all<br>
      @@ -1354,8 +1346,12 @@ sample_compare(const void *a, const void
      *b, void *arg)<br>
        * Arguments must point to SQL statements that return<br>
        * data equivalent to the following:<br>
        *<br>
      - *    prepare: SELECT tbl,idx,count(*) FROM _sql_stat4 GROUP BY
      tbl,idx;<br>
      - *    load: SELECT tbl,idx,neq,nlt,ndlt,sample FROM _sql_stat4;<br>
      + * prepare:<br>
      + *     SELECT space_id,index_id,count(*) FROM _sql_stat4<br>
      + *     GROUP BY space_id,index_id;<br>
      + * load:<br>
      + *     SELECT space_id,index_id,neq,nlt,ndlt,sample<br>
      + *     FROM _sql_stat4;<br>
        *<br>
        * 'prepare' statement is used to allocate enough memory for<br>
        * statistics (i.e. arrays lt, dt, dlt and avg_eq). 'load' query<br>
      @@ -1387,24 +1383,17 @@ load_stat_from_space(struct sqlite3 *db,
      const char *sql_select_prepare,<br>
               goto finalize;<br>
           uint32_t current_idx_count = 0;<br>
           while (sqlite3_step(stmt) == SQLITE_ROW) {<br>
      -        const char *space_name = (char
      *)sqlite3_column_text(stmt, 0);<br>
      -        if (space_name == NULL)<br>
      +        uint32_t space_id = sqlite3_column_int(stmt, 0);<br>
      +        if (space_id == 0)<br>
                   continue;<br>
      -        const char *index_name = (char
      *)sqlite3_column_text(stmt, 1);<br>
      -        if (index_name == NULL)<br>
      +        struct space *space = space_by_id(space_id);<br>
      +        if (space == NULL)<br>
      +            continue;<br>
      +        uint32_t iid = sqlite3_column_int(stmt, 1);<br>
      +        struct index *index = space_index(space, iid);<br>
      +        if (index == NULL)<br>
                   continue;<br>
               uint32_t sample_count = sqlite3_column_int(stmt, 2);<br>
      -        struct space *space = space_by_name(space_name);<br>
      -        assert(space != NULL);<br>
      -        struct index *index;<br>
      -        uint32_t iid = box_index_id_by_name(space->def->id,
      index_name,<br>
      -                            strlen(index_name));<br>
      -        if (sqlite3_stricmp(space_name, index_name) == 0
      &&<br>
      -            iid == BOX_ID_NIL)<br>
      -            index = space_index(space, 0);<br>
      -        else<br>
      -            index = space_index(space, iid);<br>
      -        assert(index != NULL);<br>
               uint32_t column_count =
      index->def->key_def->part_count;<br>
               struct index_stat *stat = &stats[current_idx_count];<br>
               stat->sample_field_count = column_count;<br>
      @@ -1456,25 +1445,16 @@ load_stat_from_space(struct sqlite3 *db,
      const char *sql_select_prepare,<br>
           struct index *prev_index = NULL;<br>
           current_idx_count = 0;<br>
           while (sqlite3_step(stmt) == SQLITE_ROW) {<br>
      -        const char *space_name = (char
      *)sqlite3_column_text(stmt, 0);<br>
      -        if (space_name == NULL)<br>
      +        uint32_t space_id = sqlite3_column_int(stmt, 0);<br>
      +        if (space_id == 0)<br>
                   continue;<br>
      -        const char *index_name = (char
      *)sqlite3_column_text(stmt, 1);<br>
      -        if (index_name == NULL)<br>
      +        struct space *space = space_by_id(space_id);<br>
      +        if (space == NULL)<br>
      +            continue;<br>
      +        uint32_t iid = sqlite3_column_int(stmt, 1);<br>
      +        struct index *index = space_index(space, iid);<br>
      +        if (index == NULL)<br>
                   continue;<br>
      -        struct space *space = space_by_name(space_name);<br>
      -        assert(space != NULL);<br>
      -        struct index *index;<br>
      -        uint32_t iid = box_index_id_by_name(space->def->id,
      index_name,<br>
      -                            strlen(index_name));<br>
      -        if (iid != BOX_ID_NIL) {<br>
      -            index = space_index(space, iid);<br>
      -        } else {<br>
      -            if (sqlite3_stricmp(space_name, index_name) != 0)<br>
      -                return -1;<br>
      -            index = space_index(space, 0);<br>
      -        }<br>
      -        assert(index != NULL);<br>
               uint32_t column_count =
      index->def->key_def->part_count;<br>
               if (index != prev_index) {<br>
                   if (prev_index != NULL) {<br>
      @@ -1537,25 +1517,16 @@ load_stat_to_index(struct sqlite3 *db,
      const char *sql_select_load,<br>
               return -1;<br>
           uint32_t current_idx_count = 0;<br>
           while (sqlite3_step(stmt) == SQLITE_ROW) {<br>
      -        const char *space_name = (char
      *)sqlite3_column_text(stmt, 0);<br>
      -        if (space_name == NULL)<br>
      +        uint32_t space_id = sqlite3_column_int(stmt, 0);<br>
      +        if (space_id == 0)<br>
                   continue;<br>
      -        const char *index_name = (char
      *)sqlite3_column_text(stmt, 1);<br>
      -        if (index_name == NULL)<br>
      +        struct space *space = space_by_id(space_id);<br>
      +        if (space == NULL)<br>
      +            continue;<br>
      +        uint32_t iid = sqlite3_column_int(stmt, 1);<br>
      +        struct index *index = space_index(space, iid);<br>
      +        if (index == NULL)<br>
                   continue;<br>
      -        struct space *space = space_by_name(space_name);<br>
      -        assert(space != NULL);<br>
      -        struct index *index;<br>
      -        uint32_t iid = box_index_id_by_name(space->def->id,
      index_name,<br>
      -                            strlen(index_name));<br>
      -        if (iid != BOX_ID_NIL) {<br>
      -            index = space_index(space, iid);<br>
      -        } else {<br>
      -            if (sqlite3_stricmp(space_name, index_name) != 0)<br>
      -                return -1;<br>
      -            index = space_index(space, 0);<br>
      -        }<br>
      -        assert(index != NULL);<br>
               free(index->def->opts.stat);<br>
               index->def->opts.stat = stats[current_idx_count++];<br>
           }<br>
      @@ -1699,7 +1670,7 @@ sql_analysis_load(struct sqlite3 *db)<br>
           info.stats = stats;<br>
           info.index_count = 0;<br>
           const char *load_stat1 =<br>
      -        "SELECT \"tbl\",\"idx\",\"stat\" FROM \"_sql_stat1\"";<br>
      +        "SELECT \"space_id\",\"index_id\",\"stat\" FROM
      \"_sql_stat1\"";<br>
           /* Load new statistics out of the _sql_stat1 table. */<br>
           if (sqlite3_exec(db, load_stat1, analysis_loader, &info,
      0) != 0)<br>
               goto fail;<br>
      @@ -1712,10 +1683,10 @@ sql_analysis_load(struct sqlite3 *db)<br>
            * statistics. Result rows are given in a form:<br>
            * <table name>, <index name>, <count of
      samples><br>
            */<br>
      -    const char *init_query = "SELECT \"tbl\",\"idx\",count(*)
      FROM "<br>
      -                 "\"_sql_stat4\" GROUP BY \"tbl\",\"idx\"";<br>
      +    const char *init_query = "SELECT
      \"space_id\",\"index_id\",count(*) FROM "<br>
      +                 "\"_sql_stat4\" GROUP BY
      \"space_id\",\"index_id\"";<br>
           /* Query for loading statistics into in-memory structs. */<br>
      -    const char *load_query = "SELECT
      \"tbl\",\"idx\",\"neq\",\"nlt\","<br>
      +    const char *load_query = "SELECT
      \"space_id\",\"index_id\",\"neq\",\"nlt\","<br>
                        "\"ndlt\",\"sample\" FROM \"_sql_stat4\"";<br>
           /* Load the statistics from the _sql_stat4 table. */<br>
           if (load_stat_from_space(db, init_query, load_query, stats)
      != 0)<br>
      @@ -1759,8 +1730,8 @@ sql_analysis_load(struct sqlite3 *db)<br>
            * Ordered query is needed to be sure that indexes come<br>
            * in the same order as in previous SELECTs.<br>
            */<br>
      -    const char *order_query = "SELECT \"tbl\",\"idx\" FROM "<br>
      -                  "\"_sql_stat4\" GROUP BY \"tbl\",\"idx\"";<br>
      +    const char *order_query = "SELECT \"space_id\",\"index_id\"
      FROM "<br>
      +                  "\"_sql_stat4\" GROUP BY
      \"space_id\",\"index_id\"";<br>
           if (load_stat_to_index(db, order_query, heap_stats) != 0)<br>
               goto fail;<br>
           if (box_txn_commit() != 0)<br>
      diff --git a/src/box/sql/build.c b/src/box/sql/build.c<br>
      index 52f0bde..67d9627 100644<br>
      --- a/src/box/sql/build.c<br>
      +++ b/src/box/sql/build.c<br>
      @@ -1707,75 +1707,43 @@ sql_store_select(struct Parse
      *parse_context, struct Select *select)<br>
           parse_context->parsed_ast.select = select_copy;<br>
       }<br>
       <br>
      -/**<br>
      - * Create expression record "@col_name = '@col_value'".<br>
      - *<br>
      - * @param parse The parsing context.<br>
      - * @param col_name Name of column.<br>
      - * @param col_value Name of row.<br>
      - * @retval not NULL on success.<br>
      - * @retval NULL on failure.<br>
      - */<br>
      -static struct Expr *<br>
      -sql_id_eq_str_expr(struct Parse *parse, const char *col_name,<br>
      -           const char *col_value)<br>
      -{<br>
      -    struct sqlite3 *db = parse->db;<br>
      -<br>
      -    struct Expr *col_name_expr = sqlite3Expr(db, TK_ID,
      col_name);<br>
      -    if (col_name_expr == NULL)<br>
      -        return NULL;<br>
      -    struct Expr *col_value_expr = sqlite3Expr(db, TK_STRING,
      col_value);<br>
      -    if (col_value_expr == NULL) {<br>
      -        sql_expr_delete(db, col_name_expr, false);<br>
      -        return NULL;<br>
      -    }<br>
      -    return sqlite3PExpr(parse, TK_EQ, col_name_expr,
      col_value_expr);<br>
      -}<br>
      -<br>
       void<br>
       vdbe_emit_stat_space_clear(struct Parse *parse, const char
      *stat_table_name,<br>
      -               const char *idx_name, const char *table_name)<br>
      +               uint32_t space_id, uint32_t index_id)<br>
       {<br>
      -    assert(idx_name != NULL || table_name != NULL);<br>
           struct sqlite3 *db = parse->db;<br>
           assert(!db->mallocFailed);<br>
           struct SrcList *src_list = sql_alloc_src_list(db);<br>
           if (src_list != NULL)<br>
               src_list->a[0].zName = sqlite3DbStrDup(db,
      stat_table_name);<br>
      -    struct Expr *where = NULL;<br>
      -    if (idx_name != NULL) {<br>
      -        struct Expr *expr = sql_id_eq_str_expr(parse, "idx",
      idx_name);<br>
      -        if (expr != NULL)<br>
      -            where = sqlite3ExprAnd(db, expr, where);<br>
      -    }<br>
      -    if (table_name != NULL) {<br>
      -        struct Expr *expr = sql_id_eq_str_expr(parse, "tbl",
      table_name);<br>
      -        if (expr != NULL)<br>
      -            where = sqlite3ExprAnd(db, expr, where);<br>
      -    }<br>
      -    /**<br>
      -     * On memory allocation error sql_table delete_from<br>
      -     * releases memory for its own.<br>
      -     */<br>
      -    sql_table_delete_from(parse, src_list, where);<br>
      +    struct Expr *expr = NULL;<br>
      +    struct Expr *col = sqlite3Expr(db, TK_ID, "space_id");<br>
      +    struct Expr *val = sqlite3ExprInteger(db, space_id);<br>
      +    if (col != NULL && val != NULL)<br>
      +        expr = sqlite3PExpr(parse, TK_EQ, col, val);<br>
      +    if (index_id != BOX_ID_NIL && expr != NULL) {<br>
      +        col = sqlite3Expr(db, TK_ID, "index_id");<br>
      +        val = sqlite3ExprInteger(db, index_id);<br>
      +        expr = sqlite3ExprAnd(db, sqlite3PExpr(parse, TK_EQ, col,
      val),<br>
      +                      expr);<br>
      +    }<br>
      +    sql_table_delete_from(parse, src_list, expr);<br>
       }<br>
       <br>
       /**<br>
        * Remove entries from the _sql_stat1 and _sql_stat4<br>
        * system spaces after a DROP INDEX or DROP TABLE command.<br>
        *<br>
      - * @param parse      The parsing context.<br>
      - * @param table_name The table to be dropped or<br>
      - *                   the table that contains index to be dropped.<br>
      - * @param idx_name   Index to be dropped.<br>
      + * @param parse The parsing context.<br>
      + * @param space_id Id of table to be dropped or table that<br>
      + *        contains index to be dropped.<br>
      + * @param index_id Id of index to be dropped.<br>
        */<br>
       static void<br>
      -sql_clear_stat_spaces(struct Parse *parse, const char
      *table_name,<br>
      -              const char *idx_name)<br>
      +sql_clear_stat_spaces(struct Parse *parse, uint32_t space_id,
      uint32_t index_id)<br>
       {<br>
      -    vdbe_emit_stat_space_clear(parse, "_sql_stat4", idx_name,
      table_name);<br>
      -    vdbe_emit_stat_space_clear(parse, "_sql_stat1", idx_name,
      table_name);<br>
      +    vdbe_emit_stat_space_clear(parse, "_sql_stat4", space_id,
      index_id);<br>
      +    vdbe_emit_stat_space_clear(parse, "_sql_stat1", space_id,
      index_id);<br>
       }<br>
       <br>
       /**<br>
      @@ -1996,7 +1964,7 @@ sql_drop_table(struct Parse *parse_context,
      struct SrcList *table_name_list,<br>
                   goto exit_drop_table;<br>
               }<br>
           }<br>
      -    sql_clear_stat_spaces(parse_context, space_name, NULL);<br>
      +    sql_clear_stat_spaces(parse_context, space->def->id,
      BOX_ID_NIL);<br>
           sql_code_drop_table(parse_context, space, is_view);<br>
       <br>
        exit_drop_table:<br>
      @@ -2845,7 +2813,8 @@ sql_drop_index(struct Parse *parse_context,
      struct SrcList *index_name_list,<br>
            * But firstly, delete statistics since schema<br>
            * changes after DDL.<br>
            */<br>
      -    sql_clear_stat_spaces(parse_context, table_name,
      index->def->name);<br>
      +    sql_clear_stat_spaces(parse_context, space->def->id,
      index->def->iid);<br>
      +<br>
           int record_reg = ++parse_context->nMem;<br>
           int space_id_reg = ++parse_context->nMem;<br>
           sqlite3VdbeAddOp2(v, OP_Integer, space->def->id,
      space_id_reg);<br>
      diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h<br>
      index dbf58d9..2958a68 100644<br>
      --- a/src/box/sql/sqliteInt.h<br>
      +++ b/src/box/sql/sqliteInt.h<br>
      @@ -4926,11 +4926,13 @@ vdbe_emit_halt_with_presence_test(struct
      Parse *parser, int space_id,<br>
        *<br>
        * @param parse The parsing context.<br>
        * @param stat_table_name System stat table name.<br>
      - * @param idx_name Index name.<br>
      - * @param table_name Table name.<br>
      + * @param table_id Id of table of which analysis will be deleted.<br>
      + * @param index_id Id of index of which analysis will be deleted.<br>
      + *        If index_id is BOX_ID_NIL than analysis of all indexes<br>
      + *        of selected table will be deleted.<br>
        */<br>
       void<br>
       vdbe_emit_stat_space_clear(struct Parse *parse, const char
      *stat_table_name,<br>
      -               const char *idx_name, const char *table_name);<br>
      +               uint32_t table_id, uint32_t index_id);<br>
       <br>
       #endif                /* SQLITEINT_H */<br>
      diff --git a/test/box-py/bootstrap.result
      b/test/box-py/bootstrap.result<br>
      index 506aca3..6dc13b4 100644<br>
      --- a/test/box-py/bootstrap.result<br>
      +++ b/test/box-py/bootstrap.result<br>
      @@ -5,7 +5,7 @@ box.space._schema:select{}<br>
       ---<br>
       - - ['cluster', '<cluster uuid>']<br>
         - ['max_id', 511]<br>
      -  - ['version', 2, 1, 0]<br>
      +  - ['version', 2, 1, 1]<br>
       ...<br>
       box.space._cluster:select{}<br>
       ---<br>
      @@ -74,11 +74,12 @@ box.space._space:select{}<br>
               'type': 'unsigned'}]]<br>
         - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id',
      'type': 'unsigned'},<br>
             {'name': 'sequence_id', 'type': 'unsigned'}, {'name':
      'is_generated', 'type': 'boolean'}]]<br>
      -  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl',
      'type': 'string'}, {'name': 'idx',<br>
      -        'type': 'string'}, {'name': 'stat', 'type': 'string'}]]<br>
      -  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl',
      'type': 'string'}, {'name': 'idx',<br>
      -        'type': 'string'}, {'name': 'neq', 'type': 'string'},
      {'name': 'nlt', 'type': 'string'},<br>
      -      {'name': 'ndlt', 'type': 'string'}, {'name': 'sample',
      'type': 'scalar'}]]<br>
      +  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +      {'name': 'index_id', 'type': 'unsigned'}, {'name': 'stat',
      'type': 'string'}]]<br>
      +  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +      {'name': 'index_id', 'type': 'unsigned'}, {'name': 'neq',
      'type': 'string'},<br>
      +      {'name': 'nlt', 'type': 'string'}, {'name': 'ndlt', 'type':
      'string'}, {'name': 'sample',<br>
      +        'type': 'scalar'}]]<br>
         - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name',
      'type': 'string'},<br>
             {'name': 'child_id', 'type': 'unsigned'}, {'name':
      'parent_id', 'type': 'unsigned'},<br>
             {'name': 'is_deferred', 'type': 'boolean'}, {'name':
      'match', 'type': 'string'},<br>
      @@ -134,9 +135,9 @@ box.space._index:select{}<br>
         - [330, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned']]]<br>
         - [340, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned']]]<br>
         - [340, 1, 'sequence', 'tree', {'unique': false}, [[1,
      'unsigned']]]<br>
      -  - [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string']]]<br>
      -  - [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string'], [<br>
      -        5, 'scalar']]]<br>
      +  - [348, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned'], [1, 'unsigned']]]<br>
      +  - [349, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned'], [1, 'unsigned'],<br>
      +      [5, 'scalar']]]<br>
         - [356, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'unsigned']]]<br>
         - [356, 1, 'child_id', 'tree', {'unique': false}, [[1,
      'unsigned']]]<br>
       ...<br>
      diff --git a/test/box/access_misc.result
      b/test/box/access_misc.result<br>
      index 4ffeb38..83e9d3e 100644<br>
      --- a/test/box/access_misc.result<br>
      +++ b/test/box/access_misc.result<br>
      @@ -813,11 +813,12 @@ box.space._space:select()<br>
               'type': 'unsigned'}]]<br>
         - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id',
      'type': 'unsigned'},<br>
             {'name': 'sequence_id', 'type': 'unsigned'}, {'name':
      'is_generated', 'type': 'boolean'}]]<br>
      -  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl',
      'type': 'string'}, {'name': 'idx',<br>
      -        'type': 'string'}, {'name': 'stat', 'type': 'string'}]]<br>
      -  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl',
      'type': 'string'}, {'name': 'idx',<br>
      -        'type': 'string'}, {'name': 'neq', 'type': 'string'},
      {'name': 'nlt', 'type': 'string'},<br>
      -      {'name': 'ndlt', 'type': 'string'}, {'name': 'sample',
      'type': 'scalar'}]]<br>
      +  - [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +      {'name': 'index_id', 'type': 'unsigned'}, {'name': 'stat',
      'type': 'string'}]]<br>
      +  - [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +      {'name': 'index_id', 'type': 'unsigned'}, {'name': 'neq',
      'type': 'string'},<br>
      +      {'name': 'nlt', 'type': 'string'}, {'name': 'ndlt', 'type':
      'string'}, {'name': 'sample',<br>
      +        'type': 'scalar'}]]<br>
         - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name',
      'type': 'string'},<br>
             {'name': 'child_id', 'type': 'unsigned'}, {'name':
      'parent_id', 'type': 'unsigned'},<br>
             {'name': 'is_deferred', 'type': 'boolean'}, {'name':
      'match', 'type': 'string'},<br>
      diff --git a/test/box/alter.result b/test/box/alter.result<br>
      index 9a1086e..86e8c3a 100644<br>
      --- a/test/box/alter.result<br>
      +++ b/test/box/alter.result<br>
      @@ -228,9 +228,9 @@ _index:select{}<br>
         - [330, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned']]]<br>
         - [340, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned']]]<br>
         - [340, 1, 'sequence', 'tree', {'unique': false}, [[1,
      'unsigned']]]<br>
      -  - [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string']]]<br>
      -  - [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string'], [<br>
      -        5, 'scalar']]]<br>
      +  - [348, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned'], [1, 'unsigned']]]<br>
      +  - [349, 0, 'primary', 'tree', {'unique': true}, [[0,
      'unsigned'], [1, 'unsigned'],<br>
      +      [5, 'scalar']]]<br>
         - [356, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'unsigned']]]<br>
         - [356, 1, 'child_id', 'tree', {'unique': false}, [[1,
      'unsigned']]]<br>
       ...<br>
      diff --git a/test/sql-tap/analyze1.test.lua
      b/test/sql-tap/analyze1.test.lua<br>
      index ea414e9..0eb4129 100755<br>
      --- a/test/sql-tap/analyze1.test.lua<br>
      +++ b/test/sql-tap/analyze1.test.lua<br>
      @@ -65,7 +65,7 @@ test:do_execsql_test(<br>
       test:do_execsql_test(<br>
           "analyze-1.7",<br>
           [[<br>
      -        SELECT * FROM "_sql_stat1" WHERE "idx" IS NOT NULL<br>
      +        SELECT * FROM "_sql_stat1" WHERE "index_id" IS NOT NULL<br>
           ]], {<br>
               -- <analyze-1.7><br>
               -- </analyze-1.7><br>
      @@ -84,7 +84,7 @@ test:do_catchsql_test(<br>
       test:do_execsql_test(<br>
           "analyze-1.9",<br>
           [[<br>
      -        SELECT * FROM "_sql_stat1" WHERE "idx" IS NOT NULL<br>
      +        SELECT * FROM "_sql_stat1" WHERE "index_id" IS NOT NULL<br>
           ]], {<br>
               -- <analyze-1.9><br>
               -- </analyze-1.9><br>
      @@ -119,7 +119,7 @@ test:do_execsql_test(<br>
           [[<br>
               CREATE INDEX t1i1 ON t1(a);<br>
               ANALYZE t1;<br>
      -        SELECT * FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT * FROM "_sql_stat1" ORDER BY "index_id";<br>
           ]], {<br>
               -- <analyze-2.1><br>
               -- </analyze-2.1><br>
      @@ -130,7 +130,7 @@ test:do_execsql_test(<br>
           [[<br>
               CREATE INDEX t1i2 ON t1(b);<br>
               ANALYZE t1;<br>
      -        SELECT * FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT * FROM "_sql_stat1" ORDER BY "index_id";<br>
           ]], {<br>
               -- <analyze-2.2><br>
               -- </analyze-2.2><br>
      @@ -141,7 +141,7 @@ test:do_execsql_test(<br>
           [[<br>
               CREATE INDEX t1i3 ON t1(a,b);<br>
               ANALYZE;<br>
      -        SELECT * FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT * FROM "_sql_stat1" ORDER BY "index_id";<br>
           ]], {<br>
               -- <analyze-2.3><br>
               -- </analyze-2.3><br>
      @@ -157,10 +157,10 @@ test:do_execsql_test(<br>
               INSERT INTO t1 VALUES(1, 1,2);<br>
               INSERT INTO t1 VALUES(2, 1,3);<br>
               ANALYZE t1;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.1><br>
      -        "T1", "2 1", "T1I1", "2 2", "T1I2", "2 1", "T1I3", "2 2
      1"<br>
      +        0, "2 1", 1, "2 2", 2, "2 1", 3, "2 2 1"<br>
               -- </analyze-3.1><br>
           })<br>
       <br>
      @@ -170,10 +170,10 @@ test:do_execsql_test(<br>
               INSERT INTO t1 VALUES(3, 1,4);<br>
               INSERT INTO t1 VALUES(4, 1,5);<br>
               ANALYZE t1;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.2><br>
      -        "T1", "4 1", "T1I1", "4 4", "T1I2", "4 1", "T1I3", "4 4
      1"<br>
      +        0, "4 1", 1, "4 4", 2, "4 1", 3, "4 4 1"<br>
               -- </analyze-3.2><br>
           })<br>
       <br>
      @@ -182,10 +182,10 @@ test:do_execsql_test(<br>
           [[<br>
               INSERT INTO t1 (a,b) VALUES(2,5);<br>
               ANALYZE;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.3><br>
      -        "T1","5 1", "T1I1", "5 3", "T1I2", "5 2", "T1I3", "5 3 1"<br>
      +        0,"5 1", 1, "5 3", 2, "5 2", 3, "5 3 1"<br>
               -- </analyze-3.3><br>
           })<br>
       <br>
      @@ -198,10 +198,10 @@ test:do_execsql_test(<br>
               CREATE INDEX t2i2 ON t2(b);<br>
               CREATE INDEX t2i3 ON t2(a,b);<br>
               ANALYZE;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.4><br>
      -        "T1","5 1","T1I1","5 3","T1I2","5 2","T1I3","5 3
      1","T2","5 1","T2I1","5 3","T2I2","5 2","T2I3","5 3 1"<br>
      +        0,"5 1",0,"5 1",1,"5 3",1,"5 3",2,"5 2",2,"5 2",3,"5 3
      1",3,"5 3 1"<br>
               -- </analyze-3.4><br>
           })<br>
       <br>
      @@ -210,10 +210,10 @@ test:do_execsql_test(<br>
           [[<br>
               DROP INDEX t2i3 ON t2;;<br>
               ANALYZE t1;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.5><br>
      -        "T1","5 1","T1I1","5 3","T1I2","5 2","T1I3","5 3
      1","T2","5 1","T2I1","5 3","T2I2","5 2"<br>
      +        0,"5 1",0,"5 1",1,"5 3",1,"5 3",2,"5 2",2,"5 2",3,"5 3 1"<br>
               -- </analyze-3.5><br>
           })<br>
       <br>
      @@ -221,10 +221,10 @@ test:do_execsql_test(<br>
           "analyze-3.6",<br>
           [[<br>
               ANALYZE t2;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.6><br>
      -        "T1","5 1","T1I1","5 3","T1I2","5 2","T1I3","5 3
      1","T2","5 1","T2I1","5 3","T2I2","5 2"<br>
      +        0,"5 1",0,"5 1",1,"5 3",1,"5 3",2,"5 2",2,"5 2",3,"5 3 1"<br>
               -- </analyze-3.6><br>
           })<br>
       <br>
      @@ -233,10 +233,10 @@ test:do_execsql_test(<br>
           [[<br>
               DROP INDEX t2i2 ON t2;<br>
               ANALYZE t2;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.7><br>
      -        "T1","5 1","T1I1","5 3","T1I2","5 2","T1I3","5 3
      1","T2","5 1","T2I1","5 3"<br>
      +        0,"5 1",0,"5 1",1,"5 3",1,"5 3",2,"5 2",3,"5 3 1"<br>
               -- </analyze-3.7><br>
           })<br>
       <br>
      @@ -250,7 +250,7 @@ test:do_execsql_test(<br>
               CREATE INDEX t3i3 ON t3(d,b,c,a);<br>
               DROP TABLE t1;<br>
               DROP TABLE t2;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.8>      <br>
               -- </analyze-3.8><br>
      @@ -260,10 +260,10 @@ test:do_execsql_test(<br>
           "analyze-3.9",<br>
           [[<br>
               ANALYZE;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-3.9><br>
      -        "T3","5 1","T3I1","5 3","T3I2","5 3 1 1 1","T3I3","5 5 2
      1 1"<br>
      +        0,"5 1",1,"5 3",2,"5 3 1 1 1",3,"5 5 2 1 1"<br>
               -- </analyze-3.9><br>
           })<br>
       <br>
      @@ -277,7 +277,7 @@ test:do_execsql_test(<br>
       --         INSERT INTO [silly " name] (a,b,c) VALUES(1, 2, 3);<br>
       --         INSERT INTO [silly " name] (a,b,c) VALUES(4, 5, 6);<br>
       --         ANALYZE;<br>
      ---         SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +--         SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
       --     ]], {<br>
       --         -- <analyze-3.10><br>
       --         "another foolish ' name", "2 1", "foolish ' name", "2
      1 1", "t3i1", "5 3", "t3i2", "5 3 1 1 1", "t3i3", "5 5 2 1 1"<br>
      @@ -288,7 +288,7 @@ test:do_execsql_test(<br>
       --     "analyze-3.11",<br>
       --     [[<br>
       --         DROP INDEX "foolish ' name";<br>
      ---         SELECT "idx", "stat" FROM sqlite_stat1 ORDER BY "idx";<br>
      +--         SELECT "index_id", "stat" FROM sqlite_stat1 ORDER BY
      "index_id";<br>
       --     ]], {<br>
       --         -- <analyze-3.11><br>
       --         "another foolish ' name", "2 1", "t3i1", "5 3",
      "t3i2", "5 3 1 1 1", "t3i3", "5 5 2 1 1"<br>
      @@ -299,7 +299,7 @@ test:do_execsql_test(<br>
       --     "analyze-3.11",<br>
       --     [[<br>
       --         DROP TABLE "silly "" name";<br>
      ---         SELECT "idx", "stat" FROM sqlite_stat1 ORDER BY "idx";<br>
      +--         SELECT "index_id", "stat" FROM sqlite_stat1 ORDER BY
      "index_id";<br>
       --     ]], {<br>
       --         -- <analyze-3.11><br>
       --         "t3i1", "5 3", "t3i2", "5 3 1 1 1", "t3i3", "5 5 2 1
      1"<br>
      @@ -317,31 +317,33 @@ test:do_execsql_test(<br>
               CREATE INDEX t4i2 ON t4(y);<br>
               INSERT INTO t4 SELECT id,a,b,c FROM t3;<br>
               ANALYZE;<br>
      -        SELECT "idx", "stat" FROM "_sql_stat1" ORDER BY "idx";<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" ORDER BY
      "index_id";<br>
           ]], {<br>
               -- <analyze-4.0><br>
      -        "T3", "5 1", "T3I1", "5 3", "T3I2", "5 3 1 1 1", "T3I3",
      "5 5 2 1 1", "T4", "5 1", "T4I1", "5 3", "T4I2", "5 2"<br>
      +        0, "5 1", 0, "5 1", 1, "5 3", 1, "5 3", 2, "5 3 1 1 1",
      2, "5 2", 3, "5 5 2 1 1"<br>
               -- </analyze-4.0><br>
           })<br>
       <br>
      +t4 = box.space.T4<br>
      +<br>
       test:do_execsql_test(<br>
           "analyze-4.1",<br>
      -    [[<br>
      +    string.format([[<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1" VALUES('t4', 't4i1',
      'nonsense');<br>
      -        INSERT INTO "_sql_stat1" VALUES('t4', 't4i2',
      '432653287412874653284129847632');<br>
      +        INSERT INTO "_sql_stat1" VALUES(%i, %i, 'nonsense');<br>
      +        INSERT INTO "_sql_stat1" VALUES(%i, %i,
      '432653287412874653284129847632');<br>
               SELECT * FROM t4 WHERE x = 1234;<br>
      -    ]], {<br>
      +    ]], t4.id, t4.index['T4I1'].id, t4.id, t4.index['T4I2'].id),
      {<br>
               -- <analyze-4.1><br>
               -- </analyze-4.1><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-4.2",<br>
      -    [[<br>
      -        INSERT INTO "_sql_stat1" VALUES('t4', 'xyzzy', '0 1 2
      3');<br>
      +    string.format([[<br>
      +        INSERT INTO "_sql_stat1" VALUES(%i, 12345, '0 1 2 3');<br>
               SELECT * FROM t4 WHERE x = 1234;<br>
      -    ]], {<br>
      +    ]], t4.id), {<br>
               -- <analyze-4.2><br>
               -- </analyze-4.2><br>
           })<br>
      @@ -367,20 +369,20 @@ test:do_execsql_test(<br>
               INSERT INTO t3 (a,b,c,d) SELECT a+64, b+64, c+64, d+64
      FROM t3;<br>
               INSERT INTO t4 (x,y,z) SELECT a, b, c FROM t3;<br>
               ANALYZE;<br>
      -        SELECT DISTINCT "tbl" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT COUNT(DISTINCT "space_id") FROM "_sql_stat1" ORDER
      BY 1;<br>
           ]], {<br>
               -- <analyze-5.0><br>
      -        "T3", "T4"<br>
      +        2<br>
               -- </analyze-5.0><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.0.1",<br>
           [[<br>
      -        SELECT DISTINCT "idx" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT "index_id" FROM "_sql_stat1" ORDER BY 1;<br>
           ]], {<br>
               -- <analyze-5.0><br>
      -        "T3", "T3I1", "T3I2", "T3I3", "T4", "T4I1", "T4I2"<br>
      +        0, 0, 1, 1, 2, 2, 3<br>
               -- </analyze-5.0><br>
           })<br>
       <br>
      @@ -389,20 +391,20 @@ stat = "_sql_stat4"<br>
       test:do_execsql_test(<br>
           "analyze-5.1",<br>
           string.format([[<br>
      -            SELECT DISTINCT "idx" FROM "%s" ORDER BY 1;<br>
      -        ]], stat, stat), {<br>
      +            SELECT DISTINCT "index_id" FROM "%s" ORDER BY 1;<br>
      +        ]], stat), {<br>
               -- <analyze-5.1><br>
      -        "T3", "T3I1", "T3I2", "T3I3", "T4", "T4I1", "T4I2"<br>
      +        0, 1, 2, 3<br>
               -- </analyze-5.1><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.1.1",<br>
           string.format([[<br>
      -            SELECT DISTINCT "tbl" FROM "%s" ORDER BY 1;<br>
      -        ]], stat, stat), {<br>
      +            SELECT COUNT(DISTINCT "space_id") FROM "%s" ORDER BY
      1;<br>
      +        ]], stat), {<br>
               -- <analyze-5.1><br>
      -        "T3", "T4"<br>
      +        2<br>
               -- </analyze-5.1><br>
           })<br>
       <br>
      @@ -411,40 +413,40 @@ test:do_execsql_test(<br>
           [[<br>
               DROP INDEX t3i2 ON t3;<br>
               ANALYZE;<br>
      -        SELECT DISTINCT "idx" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT "index_id" FROM "_sql_stat1" ORDER BY 1;<br>
           ]], {<br>
               -- <analyze-5.2><br>
      -        "T3", "T3I1", "T3I3", "T4", "T4I1", "T4I2"<br>
      +        0, 0, 1, 1, 2, 3<br>
               -- </analyze-5.2><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.2.1",<br>
           [[<br>
      -        SELECT DISTINCT "tbl" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT COUNT(DISTINCT "space_id") FROM "_sql_stat1" ORDER
      BY 1;<br>
           ]], {<br>
               -- <analyze-5.2><br>
      -        "T3", "T4"<br>
      +        2<br>
               -- </analyze-5.2><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.3",<br>
           string.format([[<br>
      -            SELECT DISTINCT "idx" FROM "%s" ORDER BY 1;<br>
      +            SELECT DISTINCT "index_id" FROM "%s" ORDER BY 1;<br>
               ]], stat, stat), {<br>
               -- <analyze-5.3><br>
      -        "T3", "T3I1", "T3I3", "T4", "T4I1", "T4I2"<br>
      +        0, 1, 2, 3<br>
               -- </analyze-5.3><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.3.1",<br>
           string.format([[<br>
      -            SELECT DISTINCT "tbl" FROM "%s" ORDER BY 1;<br>
      -        ]], stat, stat), {<br>
      +            SELECT COUNT(DISTINCT "space_id") FROM "%s" ORDER BY
      1;<br>
      +        ]], stat, stat, stat), {<br>
               -- <analyze-5.3><br>
      -        "T3", "T4"<br>
      +        2<br>
               -- </analyze-5.3><br>
           })<br>
       <br>
      @@ -453,40 +455,40 @@ test:do_execsql_test(<br>
           [[<br>
               DROP TABLE IF EXISTS t3;<br>
               ANALYZE;<br>
      -        SELECT DISTINCT "idx" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT DISTINCT "index_id" FROM "_sql_stat1" ORDER BY 1;<br>
           ]], {<br>
               -- <analyze-5.4><br>
      -        "T4", "T4I1", "T4I2"<br>
      +        0, 1, 2<br>
               -- </analyze-5.4><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.4.1",<br>
           [[<br>
      -        SELECT DISTINCT "tbl" FROM "_sql_stat1" ORDER BY 1;<br>
      +        SELECT COUNT(DISTINCT "space_id") FROM "_sql_stat1" ORDER
      BY 1;<br>
           ]], {<br>
               -- <analyze-5.4><br>
      -        "T4"<br>
      +        1<br>
               -- </analyze-5.4><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.5",<br>
           string.format([[<br>
      -            SELECT DISTINCT "idx" FROM "%s" ORDER BY 1;<br>
      +            SELECT DISTINCT "index_id" FROM "%s" ORDER BY 1;<br>
               ]], stat), {<br>
               -- <analyze-5.5><br>
      -        "T4", "T4I1", "T4I2"<br>
      +        0, 1, 2<br>
               -- </analyze-5.5><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-5.5.1",<br>
           string.format([[<br>
      -            SELECT DISTINCT "tbl" FROM "%s" ORDER BY 1;<br>
      -        ]], stat), {<br>
      +            SELECT COUNT(DISTINCT "space_id") FROM "%s" ORDER BY
      1;<br>
      +        ]], stat, stat), {<br>
               -- <analyze-5.5><br>
      -        "T4"<br>
      +        1<br>
               -- </analyze-5.5><br>
           })<br>
       <br>
      @@ -516,33 +518,35 @@ test:do_test(<br>
           -- </analyze-6.1.1><br>
       })<br>
       <br>
      +t1 = box.space.T1<br>
      +<br>
       test:do_execsql_test(<br>
           "analyze-6.1.2",<br>
      -    [[<br>
      -            SELECT * FROM "_sql_stat1" where "tbl"='T1' and
      "idx"='I1' LIMIT 1;<br>
      -    ]], {<br>
      +    string.format([[<br>
      +            SELECT "index_id", "stat" FROM "_sql_stat1" where
      "space_id"=%i and "index_id"=%i LIMIT 1;<br>
      +    ]], t1.id, t1.index['I1'].id), {<br>
           -- <analyze-6.1.2><br>
      -    "T1", "I1", "221 221 221 221 2"<br>
      +    1, "221 221 221 221 2"<br>
           -- </analyze-6.1.2><br>
       })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-6.1.3",<br>
      -    [[<br>
      -            SELECT "tbl", "idx", "neq", "nlt", "ndlt" FROM
      "_sql_stat4" where "tbl"='T1' and "idx"='I1' ORDER BY "nlt" LIMIT
      1;<br>
      -    ]], {<br>
      +    string.format([[<br>
      +            SELECT "index_id", "neq", "nlt", "ndlt" FROM
      "_sql_stat4" where "space_id"=%i and "index_id"=%i ORDER BY "nlt"
      LIMIT 1;<br>
      +    ]], t1.id, t1.index['I1'].id), {<br>
           -- <analyze-6.1.3><br>
      -    "T1", "I1", "221 221 221 1", "0 0 0 10", "0 0 0 10"<br>
      +    1, "221 221 221 1", "0 0 0 10", "0 0 0 10"<br>
           -- </analyze-6.1.3><br>
       })<br>
       <br>
       test:do_execsql_test(<br>
           "analyze-6.1.4",<br>
      -    [[<br>
      -            SELECT "tbl", "idx", "neq", "nlt", "ndlt" FROM
      "_sql_stat4" where "tbl"='T1' and "idx"='I1' ORDER BY "nlt" DESC
      LIMIT 1;<br>
      -    ]], {<br>
      +    string.format([[<br>
      +            SELECT "index_id", "neq", "nlt", "ndlt" FROM
      "_sql_stat4" where "space_id"=%i and "index_id"=%i ORDER BY "nlt"
      DESC LIMIT 1;<br>
      +    ]], t1.id, t1.index['I1'].id), {<br>
           -- <analyze-6.1.4><br>
      -    "T1", "I1", "221 221 221 1", "0 0 0 99", "0 0 0 99"<br>
      +    1, "221 221 221 1", "0 0 0 99", "0 0 0 99"<br>
           -- </analyze-6.1.4><br>
       })<br>
       <br>
      diff --git a/test/sql-tap/analyze4.test.lua
      b/test/sql-tap/analyze4.test.lua<br>
      index f734423..4cb3ad2 100755<br>
      --- a/test/sql-tap/analyze4.test.lua<br>
      +++ b/test/sql-tap/analyze4.test.lua<br>
      @@ -49,15 +49,19 @@ test:do_test(<br>
               -- </analyze4-1.0><br>
           })<br>
       <br>
      +t1 = box.space.T1<br>
      +<br>
       -- Verify that the t1b index shows that it does not narrow down
      the<br>
       -- search any at all.<br>
       --<br>
       test:do_execsql_test(<br>
           "analyze4-1.1",<br>
      -    [[ SELECT "idx", "stat" FROM "_sql_stat1" WHERE "tbl"='T1'
      ORDER BY "idx"; ]],<br>
      +    string.format([[<br>
      +        SELECT "index_id", "stat" FROM "_sql_stat1" WHERE
      "space_id"=%i ORDER BY "index_id";<br>
      +    ]], t1.id),<br>
           {<br>
               -- <analyze4-1.1><br>
      -        "T1","128 1", "T1A", "128 1", "T1B", "128 128"<br>
      +        0,"128 1", 1, "128 1", 2, "128 128"<br>
               -- </analyze4-1.1><br>
           })<br>
       <br>
      @@ -68,16 +72,16 @@ test:do_execsql_test(<br>
       test:do_test(<br>
           "analyze4-1.2",<br>
           function()<br>
      -        return test:execsql([[<br>
      -            UPDATE t1 SET b='x' WHERE a%2;<br>
      +        return test:execsql(string.format([[<br>
      +            UPDATE t1 SET b='x' WHERE a%%2;<br>
       -- pragma vdbe_debug=1;<br>
                   ANALYZE;<br>
       -- pragma vdbe_debug=0;<br>
      -            SELECT "idx", "stat" FROM "_sql_stat1" WHERE
      "tbl"='T1' ORDER BY "idx";<br>
      -        ]])<br>
      +            SELECT "index_id", "stat" FROM "_sql_stat1" WHERE
      "space_id"=%i ORDER BY "index_id";<br>
      +        ]], t1.id))<br>
           end, {<br>
               -- <analyze4-1.2><br>
      -        "T1", "128 1", "T1A", "128 1", "T1B", "128 64"<br>
      +        0, "128 1", 1, "128 1", 2, "128 64"<br>
               -- </analyze4-1.2><br>
           })<br>
       <br>
      @@ -85,37 +89,42 @@ test:do_test(<br>
       -- Create a multi-column indices using t1.b and verify that
      ANALYZE <br>
       -- processes them correctly.<br>
       --<br>
      +<br>
      +test:execsql([[<br>
      +    -- Tarantool doesn't suppoort ALTER stmt yet.<br>
      +    -- UPDATE t1 SET b=NULL;<br>
      +    --ALTER TABLE t1 ADD COLUMN c;<br>
      +    --ALTER TABLE t1 ADD COLUMN d;<br>
      +    -- So, re-create the table and its contents<br>
      +    DROP TABLE t1;<br>
      +    CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a INT
      ,b INT ,c  INT DEFAULT NULL,d  INT DEFAULT NULL);<br>
      +    CREATE INDEX t1a ON t1(a);<br>
      +    CREATE INDEX t1b ON t1(b);<br>
      +    INSERT INTO t1 (a,b) VALUES(1,NULL);<br>
      +    INSERT INTO t1 (a,b) SELECT a+1, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+2, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+4, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+8, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+16, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+32, b FROM t1;<br>
      +    INSERT INTO t1 (a,b) SELECT a+64, b FROM t1;<br>
      +<br>
      +    UPDATE t1 SET c=a/4, d=a/2;<br>
      +    CREATE INDEX t1bcd ON t1(b,c,d);<br>
      +    CREATE INDEX t1cdb ON t1(c,d,b);<br>
      +    CREATE INDEX t1cbd ON t1(c,b,d);<br>
      +    ANALYZE;<br>
      +]])<br>
      +<br>
      +t1 = box.space.T1<br>
      +<br>
       test:do_execsql_test(<br>
           "analyze4-1.3",<br>
      -    [[<br>
      -            -- Tarantool doesn't suppoort ALTER stmt yet.<br>
      -            -- UPDATE t1 SET b=NULL;<br>
      -            --ALTER TABLE t1 ADD COLUMN c;<br>
      -            --ALTER TABLE t1 ADD COLUMN d;<br>
      -            -- So, re-create the table and its contents<br>
      -            DROP TABLE t1;<br>
      -            CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT,
      a INT ,b INT ,c  INT DEFAULT NULL,d  INT DEFAULT NULL);<br>
      -            CREATE INDEX t1a ON t1(a);<br>
      -            CREATE INDEX t1b ON t1(b);<br>
      -            INSERT INTO t1 (a,b) VALUES(1,NULL);<br>
      -            INSERT INTO t1 (a,b) SELECT a+1, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+2, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+4, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+8, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+16, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+32, b FROM t1;<br>
      -            INSERT INTO t1 (a,b) SELECT a+64, b FROM t1;<br>
      -<br>
      -            UPDATE t1 SET c=a/4, d=a/2;<br>
      -            CREATE INDEX t1bcd ON t1(b,c,d);<br>
      -            CREATE INDEX t1cdb ON t1(c,d,b);<br>
      -            CREATE INDEX t1cbd ON t1(c,b,d);<br>
      -            ANALYZE;<br>
      -            SELECT "idx", "stat" FROM "_sql_stat1" WHERE
      "tbl"='T1' ORDER BY "idx";<br>
      -    ]]<br>
      -    , {<br>
      +    string.format([[<br>
      +            SELECT "index_id", "stat" FROM "_sql_stat1" WHERE
      "space_id"=%i ORDER BY "index_id";<br>
      +    ]], t1.id), {<br>
               -- <analyze4-1.3><br>
      -        "T1","128 1", "T1A", "128 1", "T1B", "128 128", "T1BCD",
      "128 128 4 2", "T1CBD", "128 4 4 2", "T1CDB", "128 4 2 2"<br>
      +        0,"128 1", 1, "128 1", 2, "128 128", 3, "128 128 4 2", 4,
      "128 4 2 2", 5, "128 4 4 2"<br>
               -- </analyze4-1.3><br>
           })<br>
       <br>
      diff --git a/test/sql-tap/analyze5.test.lua
      b/test/sql-tap/analyze5.test.lua<br>
      index e4a6d5e..a55ef48 100755<br>
      --- a/test/sql-tap/analyze5.test.lua<br>
      +++ b/test/sql-tap/analyze5.test.lua<br>
      @@ -115,10 +115,11 @@ test:do_test(<br>
       <br>
               -- DISTINCT idx, sample -- lindex(test_decode(sample),0)<br>
               -- WHERE idx='t1u' ORDER BY nlt;<br>
      -        return test:execsql([[ SELECT DISTINCT
      msgpack_decode("sample")<br>
      -                                 FROM "_sql_stat4"<br>
      -                                 WHERE "idx"='T1U'<br>
      -                                 ORDER BY "nlt"]])<br>
      +        return test:execsql(string.format([[<br>
      +            SELECT DISTINCT msgpack_decode("sample")<br>
      +            FROM "_sql_stat4"<br>
      +            WHERE "index_id"= %i<br>
      +            ORDER BY "nlt"]], box.space.T1.index['T1U'].id))<br>
           end, {<br>
               -- <analyze5-1.0><br>
               "alpha", "bravo", "charlie", "delta"<br>
      @@ -144,10 +145,10 @@ test:do_test(<br>
       test:do_test(<br>
           "analyze5-1.2",<br>
           function()<br>
      -        return test:execsql([[SELECT "idx", count(*) FROM
      "_sql_stat4" GROUP BY 1 ORDER BY 1]])<br>
      +        return test:execsql([[SELECT "index_id", count(*) FROM
      "_sql_stat4" GROUP BY 1 ORDER BY 1]])<br>
           end, {<br>
               -- <analyze5-1.2><br>
      -       
      "T1",24,"T1T",4,"T1U",4,"T1V",1,"T1W",4,"T1X",4,"T1Y",2,"T1Z",4<br>
      +        0,24,1,4,2,4,3,1,4,4,5,4,6,2,7,4<br>
               -- </analyze5-1.2><br>
           })<br>
       <br>
      diff --git a/test/sql-tap/analyze9.test.lua
      b/test/sql-tap/analyze9.test.lua<br>
      index 585e918..55b8d8c 100755<br>
      --- a/test/sql-tap/analyze9.test.lua<br>
      +++ b/test/sql-tap/analyze9.test.lua<br>
      @@ -1,6 +1,6 @@<br>
       #!/usr/bin/env tarantool<br>
       test = require("sqltester")<br>
      -test:plan(121)<br>
      +test:plan(120)<br>
       <br>
       testprefix = "analyze9"<br>
       <br>
      @@ -62,29 +62,29 @@ msgpack_decode_sample = function(txt)<br>
       end<br>
       <br>
       box.internal.sql_create_function("msgpack_decode_sample", "TEXT",
      msgpack_decode_sample)<br>
      +t1 = box.space.T1<br>
       <br>
       test:do_execsql_test(<br>
           1.2,<br>
      -    [[<br>
      -        SELECT
      "tbl","idx","neq","nlt","ndlt",msgpack_decode_sample("sample")
      FROM "_sql_stat4" where "idx" = 'I1';<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT
      "index_id","neq","nlt","ndlt",msgpack_decode_sample("sample") FROM
      "_sql_stat4" where "index_id" = %i;<br>
      +    ]], t1.index['I1'].id), {<br>
               -- <1.2><br>
      -        "T1", "I1", "1 1", "0 0", "0 0", "(0) (0)", "T1", "I1",
      "1 1", "1 1", "1 1", "(1) (1)", <br>
      -        "T1", "I1", "1 1", "2 2", "2 2", "(2) (2)", "T1", "I1",
      "1 1", "3 3", "3 3", "(3) (3)", <br>
      -        "T1", "I1", "1 1", "4 4", "4 4", "(4) (4)"<br>
      +        1, "1 1", "0 0", "0 0", "(0) (0)", 1, "1 1", "1 1", "1
      1", "(1) (1)",<br>
      +        1, "1 1", "2 2", "2 2", "(2) (2)", 1, "1 1", "3 3", "3
      3", "(3) (3)",<br>
      +        1, "1 1", "4 4", "4 4", "(4) (4)"<br>
               -- </1.2><br>
           })<br>
       <br>
       test:do_execsql_test(<br>
           1.3,<br>
      -    [[<br>
      -        SELECT
      "tbl","idx","neq","nlt","ndlt",msgpack_decode_sample("sample")
      FROM "_sql_stat4" where "idx" = 'T1';<br>
      -<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT
      "index_id","neq","nlt","ndlt",msgpack_decode_sample("sample") FROM
      "_sql_stat4" where "index_id" = %i;<br>
      +    ]], t1.index[0].id), {<br>
               -- <1.3><br>
      -        'T1', 'T1', '1', '0', '0', '(0)', 'T1', 'T1', '1', '1',
      '1', '(1)', <br>
      -        'T1', 'T1', '1', '2', '2', '(2)', 'T1', 'T1', '1', '3',
      '3', '(3)', <br>
      -        'T1', 'T1', '1', '4', '4', '(4)'<br>
      +        0, '1', '0', '0', '(0)', 0, '1', '1', '1', '(1)',<br>
      +        0, '1', '2', '2', '(2)', 0, '1', '3', '3', '(3)',<br>
      +        0, '1', '4', '4', '(4)'<br>
               -- </1.3><br>
           })<br>
       <br>
      @@ -101,10 +101,10 @@ test:do_execsql_test(<br>
               INSERT INTO t1 VALUES('text', 12);<br>
               CREATE INDEX i1 ON t1(a, b);<br>
               ANALYZE;<br>
      -        SELECT msgpack_decode_sample("sample") FROM "_sql_stat4";<br>
      +        SELECT msgpack_decode_sample("sample") FROM "_sql_stat4"
      ORDER BY 1;<br>
           ]], {<br>
               -- <2.1><br>
      -        "text 12","some text 14","text","some text"<br>
      +        "some text","some text 14","text","text 12"<br>
               -- </2.1><br>
           })<br>
       <br>
      @@ -116,6 +116,7 @@ test:do_execsql_test(<br>
               CREATE TABLE t2(id INTEGER PRIMARY KEY AUTOINCREMENT, a
      INT , b INT );<br>
               CREATE INDEX i2 ON t2(a, b);<br>
           ]])<br>
      +t2 = box.space.T2<br>
       <br>
       test:do_test(<br>
           3.2,<br>
      @@ -184,10 +185,10 @@ test:do_execsql_test(<br>
       --      <br>
       test:do_execsql_test(<br>
           "3.3.2",<br>
      -    [[<br>
      +    string.format([[<br>
               ANALYZE;<br>
      -        SELECT lrange("neq", 1, 1) FROM "_sql_stat4" WHERE "idx"
      = 'I2';<br>
      -    ]], generate_tens_str(24))<br>
      +        SELECT lrange("neq", 1, 1) FROM "_sql_stat4" WHERE
      "space_id" = %i and "index_id" = %i;<br>
      +    ]], t2.id, t2.index['I2'].id) , generate_tens_str(24))<br>
       <br>
 ---------------------------------------------------------------------------<br>
       -- <br>
      @@ -232,6 +233,7 @@ test:do_execsql_test(<br>
               CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a
      TEXT , b INT , c INT);<br>
               CREATE INDEX i1 ON t1(c, b, a);<br>
           ]])<br>
      +t1 = box.space.T1<br>
       <br>
       insert_filler_rows_n = function(iStart, nCopy, nVal)<br>
           for i = 0, nVal-1 do<br>
      @@ -282,10 +284,10 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           4.3,<br>
      -    [[<br>
      +    string.format([[<br>
               SELECT "neq", lrange("nlt", 1, 3), lrange("ndlt", 1, 3),
      lrange(msgpack_decode_sample("sample"), 1, 3) <br>
      -            FROM "_sql_stat4" WHERE "idx" = 'I1' ORDER BY
      "sample" LIMIT 16;<br>
      -    ]], {<br>
      +            FROM "_sql_stat4" WHERE "space_id" = %i and
      "index_id" = %i ORDER BY "sample" LIMIT 16;<br>
      +    ]], t1.id, t1.index['I1'].id), {<br>
               -- <4.3><br>
               "10 10 10","0 0 0","0 0 0","0 0 0","10 10 10","10 10
      10","1 1 1","1 1 1","10 10 10","20 20 20",<br>
               "2 2 2","2 2 2","10 10 10","30 30 30","3 3 3","3 3 3","10
      10 10","40 40 40","4 4 4","4 4 4",<br>
      @@ -299,10 +301,10 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           4.4,<br>
      -    [[<br>
      +    string.format([[<br>
               SELECT "neq", lrange("nlt", 1, 3), lrange("ndlt", 1, 3),
      lrange(msgpack_decode_sample("sample"), 1, 3) <br>
      -        FROM "_sql_stat4" WHERE "idx" = 'I1' ORDER BY "sample"
      DESC LIMIT 2;<br>
      -    ]], {<br>
      +        FROM "_sql_stat4" WHERE "space_id" = %i and "index_id" =
      %i ORDER BY "sample" DESC LIMIT 2;<br>
      +    ]], t1.id, t1.index['I1'].id), {<br>
               -- <4.4><br>
               "2 1 1","295 296 296","120 122 125","201 4 h","5 3
      1","290 290 291","119 119 120","200 1 b"<br>
               -- </4.4><br>
      @@ -364,11 +366,12 @@ test:do_test(<br>
       test:do_execsql_test(<br>
           4.9,<br>
           [[<br>
      -        SELECT msgpack_decode_sample("sample") FROM "_sql_stat4";<br>
      +        SELECT msgpack_decode_sample("sample") FROM "_sql_stat4"
      ORDER BY 1;<br>
           ]], {<br>
               -- <4.9><br>
      -        "x", 1110, 2230, 2750, 3350, 4090, 4470, 4980, 5240,
      5280, 5290, 5590, 5920, <br>
      -        5930, 6220, 6710, 7000, 7710, 7830, 7970, 8890, 8950,
      9240, 9250, 9680<br>
      +        1110, 2230, 2750, 3350, 4090, 4470, 4980, 5240, 5280,
      5290, 5590, 5920,<br>
      +        5930, 6220, 6710, 7000, 7710, 7830, 7970, 8890, 8950,
      9240, 9250, 9680,<br>
      +        "x"<br>
               -- </4.9><br>
           })<br>
       <br>
      @@ -388,12 +391,14 @@ test:do_execsql_test(<br>
               INSERT INTO t1 VALUES(null, 4, 4);<br>
               INSERT INTO t1 VALUES(null, 5, 5);<br>
               ANALYZE;<br>
      -        CREATE TABLE x1(tbl TEXT, idx TEXT , neq TEXT, nlt TEXT,
      ndlt TEXT, sample BLOB, PRIMARY KEY(tbl, idx, sample));<br>
      +        CREATE TABLE x1(tbl INT, idx INT , neq TEXT, nlt TEXT,
      ndlt TEXT, sample BLOB, PRIMARY KEY(tbl, idx, sample));<br>
               INSERT INTO x1 SELECT * FROM "_sql_stat4";<br>
               DELETE FROM "_sql_stat4";<br>
               INSERT INTO "_sql_stat4" SELECT * FROM x1;<br>
               ANALYZE;<br>
           ]])<br>
      +t1 = box.space.T1<br>
      +x1 = box.space.X1<br>
       <br>
       test:do_execsql_test(<br>
           6.2,<br>
      @@ -407,7 +412,7 @@ test:do_execsql_test(<br>
       --<br>
       test:do_execsql_test(<br>
           7.1,<br>
      -    [[<br>
      +    string.format([[<br>
               DROP TABLE IF EXISTS t1;<br>
               CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a
      INT , b INT );<br>
               CREATE INDEX i1 ON t1(a, b);<br>
      @@ -418,9 +423,9 @@ test:do_execsql_test(<br>
               INSERT INTO t1 VALUES(null, 5, 5);<br>
               ANALYZE;<br>
               UPDATE "_sql_stat4" SET "sample" = '' WHERE "sample" =<br>
      -            (SELECT "sample" FROM "_sql_stat4" WHERE "tbl" = 't1'
      AND "idx" = 'i1' LIMIT 1);<br>
      +            (SELECT "sample" FROM "_sql_stat4" WHERE "space_id" =
      %i AND "index_id" = %i LIMIT 1);<br>
               ANALYZE;<br>
      -    ]])<br>
      +    ]], t1.id, t1.index['I1'].id))<br>
       <br>
       -- Doesn't work due to the fact that in Tarantool rowid has been
      removed,<br>
       -- and tbl, idx and sample have been united into primary key.<br>
      @@ -1014,15 +1019,15 @@ test:do_execsql_test(<br>
       --<br>
       test:do_execsql_test(<br>
           15.1,<br>
      -    [[<br>
      +    string.format([[<br>
               DROP TABLE IF EXISTS x1;<br>
               CREATE TABLE x1(a  INT PRIMARY KEY, b INT , UNIQUE(a,
      b));<br>
               INSERT INTO x1 VALUES(1, 2);<br>
               INSERT INTO x1 VALUES(3, 4);<br>
               INSERT INTO x1 VALUES(5, 6);<br>
               ANALYZE;<br>
      -        INSERT INTO "_sql_stat4" VALUES('x1', 'abc', '', '', '',
      '');<br>
      -    ]])<br>
      +        INSERT INTO "_sql_stat4" VALUES(%i, 12345, '', '', '',
      '');<br>
      +    ]], x1.id))<br>
       <br>
       test:do_execsql_test(<br>
           15.2,<br>
      @@ -1037,7 +1042,7 @@ test:do_execsql_test(<br>
       test:do_execsql_test(<br>
           15.3,<br>
           [[<br>
      -        INSERT INTO "_sql_stat4" VALUES('42', '42', '42', '42',
      '42', '42');<br>
      +        INSERT INTO "_sql_stat4" VALUES(42, 42, '42', '42', '42',
      42);<br>
           ]])<br>
       <br>
       test:do_execsql_test(<br>
      @@ -1054,7 +1059,7 @@ test:do_execsql_test(<br>
           15.7,<br>
           [[<br>
               ANALYZE;<br>
      -        UPDATE "_sql_stat1" SET "tbl" = 'no such tbl';<br>
      +        UPDATE "_sql_stat1" SET "space_id" = "space_id" + 123456;<br>
           ]])<br>
       <br>
       test:do_execsql_test(<br>
      @@ -1067,25 +1072,6 @@ test:do_execsql_test(<br>
               -- </15.8><br>
           })<br>
       <br>
      --- Tarantool: this test seems to be useless. There's no reason<br>
      --- for these fields to be nullable.<br>
      --- test:do_execsql_test(<br>
      ---    15.9,<br>
      ---    [[<br>
      ---        ANALYZE;<br>
      ---        UPDATE "_sql_stat4" SET "neq" = NULL, "nlt" = NULL,
      "ndlt" = NULL;<br>
      ---    ]])<br>
      -<br>
      -test:do_execsql_test(<br>
      -    15.10,<br>
      -    [[<br>
      -        SELECT * FROM x1;<br>
      -    ]], {<br>
      -        -- <15.10><br>
      -        1, 2, 3, 4, 5, 6<br>
      -        -- </15.10><br>
      -    })<br>
      -<br>
       -- This is just for coverage....<br>
       test:do_execsql_test(<br>
           15.11,<br>
      @@ -1135,6 +1121,7 @@ test:do_test(<br>
               -- <17.1><br>
               -- </17.1><br>
           })<br>
      +t1 = box.space.T1<br>
       <br>
       test:do_execsql_test(<br>
           17.2,<br>
      @@ -1197,7 +1184,7 @@ test:do_test(<br>
                   test:execsql(string.format("INSERT INTO t1 VALUES(%s,
      0);", i))<br>
               end<br>
               test:execsql("ANALYZE")<br>
      -        return test:execsql([[ SELECT count(*) FROM "_sql_stat4"
      WHERE "idx" = 'I1'; ]])<br>
      +        return test:execsql(string.format('SELECT count(*) FROM
      "_sql_stat4" WHERE "space_id" = %i AND "index_id" = %i;',
      box.space.T1.id, box.space.T1.index['I1'].id))<br>
           end, {<br>
               -- <18.1><br>
               9<br>
      @@ -1239,12 +1226,13 @@ test:do_execsql_test(<br>
               -- </20.2><br>
           })<br>
       <br>
      +t1 = box.space.T1<br>
       for i = 0, 15 do<br>
           test:do_test(<br>
               "20.3."..i,<br>
               function()<br>
                   return test:execsql(string.format(<br>
      -                [[SELECT count(*) FROM "_sql_stat4" WHERE "idx" =
      'I1' AND lrange(msgpack_decode_sample("sample"), 1, 1) = '%s']],
      i))<br>
      +                [[SELECT count(*) FROM "_sql_stat4" WHERE
      "space_id" = %i AND "index_id" = %i AND
      lrange(msgpack_decode_sample("sample"), 1, 1) = '%s']], t1.id,
      t1.index['I1'].id, i))<br>
               end, {<br>
                   1<br>
               })<br>
      diff --git a/test/sql-tap/analyzeC.test.lua
      b/test/sql-tap/analyzeC.test.lua<br>
      index 266e37e..31392c8 100755<br>
      --- a/test/sql-tap/analyzeC.test.lua<br>
      +++ b/test/sql-tap/analyzeC.test.lua<br>
      @@ -30,9 +30,7 @@ testprefix = "analyzeC"<br>
       -- Baseline case.  Range queries work OK.  Indexes can be used
      for<br>
       -- ORDER BY.<br>
       <br>
      -test:do_execsql_test(<br>
      -    1.0,<br>
      -    [[<br>
      +test:execsql([[<br>
               DROP TABLE IF EXISTS t1;<br>
               CREATE TABLE t1(a  INT PRIMARY KEY, b INT , c INT , d INT
      );<br>
               INSERT INTO t1(a,b,c,d)
VALUES(1,1,2,3),(2,7,8,9),(3,4,5,6),(4,10,11,12),(5,4,8,12),(6,1,11,111);<br>
      @@ -40,10 +38,17 @@ test:do_execsql_test(<br>
               CREATE INDEX t1c ON t1(c);<br>
               ANALYZE;<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1"("tbl","idx","stat")
      VALUES('t1','t1b','12345 2'),('t1','t1c','12345 4');<br>
      +    ]]<br>
      +)<br>
      +t1 = box.space.T1<br>
      +<br>
      +test:do_execsql_test(<br>
      +    1.0,<br>
      +    string.format([[<br>
      +        INSERT INTO "_sql_stat1"("space_id","index_id","stat")
      VALUES(%i,1,'12345 2'),(%i,2,'12345 4');<br>
               ANALYZE;<br>
               SELECT b,c,d, '#' FROM t1 WHERE b BETWEEN 3 AND 8 ORDER
      BY d;<br>
      -    ]], {<br>
      +    ]], t1.id, t1.id), {<br>
               -- <1.0><br>
               4, 5, 6, "#", 7, 8, 9, "#", 4, 8, 12, "#"<br>
               -- </1.0><br>
      @@ -85,11 +90,12 @@ test:do_execsql_test(<br>
       --<br>
       test:do_execsql_test(<br>
           2.0,<br>
      +    string.format(<br>
           [[<br>
      -        UPDATE "_sql_stat1" SET "stat"='12345 2 unordered' WHERE
      "idx"='t1b';<br>
      +        UPDATE "_sql_stat1" SET "stat"='12345 2 unordered' WHERE
      "index_id"=%i;<br>
               ANALYZE;<br>
               SELECT b, c, d, '#' FROM t1 WHERE b BETWEEN 3 AND 8 ORDER
      BY d;<br>
      -    ]], {<br>
      +    ]], box.space.T1.index['T1B'].id), {<br>
               -- <2.0><br>
               4, 5, 6, "#", 7, 8, 9, "#", 4, 8, 12, "#"<br>
               -- </2.0><br>
      @@ -130,11 +136,12 @@ test:do_execsql_test(<br>
       --<br>
       test:do_execsql_test(<br>
           3.0,<br>
      +    string.format(<br>
           [[<br>
      -        UPDATE "_sql_stat1" SET "stat"='12345 2 whatever=5
      unordered xyzzy=11' WHERE "idx"='t1b';<br>
      +        UPDATE "_sql_stat1" SET "stat"='12345 2 whatever=5
      unordered xyzzy=11' WHERE "index_id"=%i;<br>
               ANALYZE;<br>
               SELECT b, c, d, '#' FROM t1 WHERE b BETWEEN 3 AND 8 ORDER
      BY d;<br>
      -    ]], {<br>
      +    ]], box.space.T1.index['T1B'].id), {<br>
               -- <3.0><br>
               4, 5, 6, "#", 7, 8, 9, "#", 4, 8, 12, "#"<br>
               -- </3.0><br>
      @@ -173,17 +180,22 @@ test:do_execsql_test(<br>
       <br>
       -- The sz=NNN parameter determines which index to scan<br>
       --<br>
      -test:do_execsql_test(<br>
      -    4.0,<br>
      -    [[<br>
      +<br>
      +test:execsql([[<br>
               DROP INDEX t1b ON t1;<br>
               CREATE INDEX t1bc ON t1(b,c);<br>
               CREATE INDEX t1db ON t1(d,b);<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1"("tbl","idx","stat")
      VALUES('t1','t1bc','12345 3 2 sz=10'),('t1','t1db','12345 3 2
      sz=20');<br>
      +    ]]<br>
      +)<br>
      +<br>
      +test:do_execsql_test(<br>
      +    4.0,<br>
      +    string.format([[<br>
      +        INSERT INTO "_sql_stat1"("space_id","index_id","stat")
      VALUES(%i,%i,'12345 3 2 sz=10'),(%i,%i,'12345 3 2 sz=20');<br>
               ANALYZE;<br>
               SELECT count(b) FROM t1;<br>
      -    ]], {<br>
      +    ]], t1.id, t1.index['T1BC'].id, t1.id, t1.index['T1DB'].id),
      {<br>
               -- <4.0><br>
               6<br>
               -- </4.0><br>
      @@ -201,12 +213,13 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           4.2,<br>
      +    string.format(<br>
           [[<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1"("tbl","idx","stat")
      VALUES('t1','t1bc','12345 3 2 sz=20'),('t1','t1db','12345 3 2
      sz=10');<br>
      +        INSERT INTO "_sql_stat1"("space_id","index_id","stat")
      VALUES(%i,%i,'12345 3 2 sz=20'),(%i,%i,'12345 3 2 sz=10');<br>
               ANALYZE;<br>
               SELECT count(b) FROM t1;<br>
      -    ]], {<br>
      +    ]], t1.id, t1.index['T1BC'].id, t1.id, t1.index['T1DB'].id),
      {<br>
               -- <4.2><br>
               6<br>
               -- </4.2><br>
      @@ -227,14 +240,14 @@ test:do_execsql_test(<br>
       --<br>
       test:do_execsql_test(<br>
           5.0,<br>
      -    [[<br>
      +    string.format([[<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1"("tbl","idx","stat")<br>
      -          VALUES('t1','t1bc','12345 3 2 x=5 sz=10 y=10'),<br>
      -                ('t1','t1db','12345 3 2 whatever sz=20 junk');<br>
      +        INSERT INTO "_sql_stat1"("space_id","index_id","stat")<br>
      +          VALUES(%i,%i,'12345 3 2 x=5 sz=10 y=10'),<br>
      +                (%i,%i,'12345 3 2 whatever sz=20 junk');<br>
               ANALYZE;<br>
               SELECT count(b) FROM t1;<br>
      -    ]], {<br>
      +    ]], t1.id, t1.index['T1BC'].id, t1.id, t1.index['T1DB'].id),
      {<br>
               -- <5.0><br>
               6<br>
               -- </5.0><br>
      @@ -253,12 +266,12 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           5.2,<br>
      -    [[<br>
      +    string.format([[<br>
               DELETE FROM "_sql_stat1";<br>
      -        INSERT INTO "_sql_stat1"("tbl","idx","stat")
      VALUES('t1','t1db','12345 3 2 x=5 sz=10 y=10'),
      ('t1','t1bc','12345 3 2 whatever sz=20 junk');<br>
      +        INSERT INTO "_sql_stat1"("space_id","index_id","stat")
      VALUES(%i,%i,'12345 3 2 x=5 sz=10 y=10'), (%i,%i,'12345 3 2
      whatever sz=20 junk');<br>
               ANALYZE;<br>
               SELECT count(b) FROM t1;<br>
      -    ]], {<br>
      +    ]], t1.id, t1.index['T1BC'].id, t1.id, t1.index['T1DB'].id),
      {<br>
               -- <5.2><br>
               6<br>
               -- </5.2><br>
      diff --git a/test/sql-tap/analyzeD.test.lua
      b/test/sql-tap/analyzeD.test.lua<br>
      index 4bce88b..55f6e9d 100755<br>
      --- a/test/sql-tap/analyzeD.test.lua<br>
      +++ b/test/sql-tap/analyzeD.test.lua<br>
      @@ -153,9 +153,9 @@ test:do_catchsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           "analyzeD-1.10",<br>
      -    [[<br>
      -        SELECT * FROM "_sql_stat4" WHERE "tbl" = 'v';<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT * FROM "_sql_stat4" WHERE "space_id" = %i;<br>
      +    ]], box.space.V.id), {<br>
               -- <analyzeD-1.10><br>
               <br>
               -- <analyzeD-1.10><br>
      @@ -163,9 +163,9 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           "analyzeD-1.11",<br>
      -    [[<br>
      -        SELECT * FROM "_sql_stat1" WHERE "tbl" = 'v';<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT * FROM "_sql_stat1" WHERE "space_id" = %i;<br>
      +    ]], box.space.V.id), {<br>
               -- <analyzeD-1.11><br>
               <br>
               -- <analyzeD-1.11><br>
      @@ -183,9 +183,9 @@ test:do_catchsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           "analyzeD-1.13",<br>
      -    [[<br>
      -        SELECT * FROM "_sql_stat4" WHERE "tbl" = 'v';<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT * FROM "_sql_stat4" WHERE "space_id" = %i;<br>
      +    ]], box.space.V.id), {<br>
               -- <analyzeD-1.13><br>
               <br>
               -- <analyzeD-1.13><br>
      @@ -193,9 +193,9 @@ test:do_execsql_test(<br>
       <br>
       test:do_execsql_test(<br>
           "analyzeD-1.14",<br>
      -    [[<br>
      -        SELECT * FROM "_sql_stat1" WHERE "tbl" = 'v';<br>
      -    ]], {<br>
      +    string.format([[<br>
      +        SELECT * FROM "_sql_stat1" WHERE "space_id" = %i;<br>
      +    ]], box.space.V.id), {<br>
               -- <analyzeD-1.14><br>
               <br>
               -- <analyzeD-1.14><br>
      diff --git a/test/sql-tap/gh-3350-skip-scan.test.lua
      b/test/sql-tap/gh-3350-skip-scan.test.lua<br>
      index 4cecfe0..640075e 100755<br>
      --- a/test/sql-tap/gh-3350-skip-scan.test.lua<br>
      +++ b/test/sql-tap/gh-3350-skip-scan.test.lua<br>
      @@ -77,9 +77,7 @@ test:do_execsql_test(<br>
               }<br>
       )<br>
       <br>
      -test:do_execsql_test(<br>
      -        "skip-scan-1.4",<br>
      -        [[<br>
      +test:execsql([[<br>
                   DROP TABLE IF EXISTS t1;<br>
                   CREATE TABLE t1(id INTEGER PRIMARY KEY, a TEXT, b
      INT, c INT, d INT);<br>
                   CREATE INDEX t1abc ON t1(a,b,c);<br>
      @@ -96,10 +94,17 @@ test:do_execsql_test(<br>
                   ANALYZE;<br>
                   DELETE FROM "_sql_stat1";<br>
                   DELETE FROM "_sql_stat4";<br>
      -            INSERT INTO "_sql_stat1" VALUES('T1','T1ABC','10000
      5000 2000 10');<br>
      +        ]]<br>
      +)<br>
      +<br>
      +test:do_execsql_test(<br>
      +        "skip-scan-1.4",<br>
      +        string.format(<br>
      +        [[<br>
      +            INSERT INTO "_sql_stat1" VALUES(%i,%i,'10000 5000
      2000 10');<br>
                   ANALYZE t2;<br>
                   SELECT a,b,c,d FROM t1 WHERE b=345;<br>
      -        ]], {<br>
      +        ]], box.space.T1.id, box.space.T1.index['T1ABC'].id), {<br>
                   "abc", 345, 7, 8, "def", 345, 9, 10<br>
               }<br>
       )<br>
      diff --git a/test/sql/sql-statN-index-drop.result
      b/test/sql/sql-statN-index-drop.result<br>
      index 7605951..b31dc81 100644<br>
      --- a/test/sql/sql-statN-index-drop.result<br>
      +++ b/test/sql/sql-statN-index-drop.result<br>
      @@ -31,36 +31,36 @@ box.sql.execute("ANALYZE;")<br>
       ---<br>
       ...<br>
       -- Checking the data.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
       ---<br>
      -- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br>
      -  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br>
      +- - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
      +  - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
       ...<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       ---<br>
      -- - ['T1', 'I1', '1 1']<br>
      -  - ['T1', 'T1', '1 1']<br>
      -  - ['T2', 'I1', '1 1']<br>
      -  - ['T2', 'T2', '1 1']<br>
      +- - [0, '1 1']<br>
      +  - [1, '1 1']<br>
      +  - [0, '1 1']<br>
      +  - [1, '1 1']<br>
       ...<br>
       -- Dropping an index.<br>
       box.sql.execute("DROP INDEX i1 ON t1;")<br>
       ---<br>
       ...<br>
       -- Checking the DROP INDEX results.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
       ---<br>
      -- - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br>
      -  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br>
      +- - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
       ...<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       ---<br>
      -- - ['T1', 'T1', '1 1']<br>
      -  - ['T2', 'I1', '1 1']<br>
      -  - ['T2', 'T2', '1 1']<br>
      +- - [0, '1 1']<br>
      +  - [0, '1 1']<br>
      +  - [1, '1 1']<br>
       ...<br>
       --Cleaning up.<br>
       box.sql.execute("DROP TABLE t1;")<br>
      @@ -93,36 +93,36 @@ box.sql.execute("ANALYZE;")<br>
       ---<br>
       ...<br>
       -- Checking the data.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
       ---<br>
      -- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br>
      -  - ['T2', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br>
      +- - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
      +  - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
       ...<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       ---<br>
      -- - ['T1', 'I1', '1 1']<br>
      -  - ['T1', 'T1', '1 1']<br>
      -  - ['T2', 'I1', '1 1']<br>
      -  - ['T2', 'T2', '1 1']<br>
      +- - [0, '1 1']<br>
      +  - [1, '1 1']<br>
      +  - [0, '1 1']<br>
      +  - [1, '1 1']<br>
       ...<br>
       -- Dropping an index.<br>
       box.sql.execute("DROP INDEX i1 ON t2;")<br>
       ---<br>
       ...<br>
       -- Checking the DROP INDEX results.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
       ---<br>
      -- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]<br>
      -  - ['T1', 'T1', '1', '0', '0', !!binary kQE=]<br>
      -  - ['T2', 'T2', '1', '0', '0', !!binary kQE=]<br>
      +- - [0, '1', '0', '0', !!binary kQE=]<br>
      +  - [1, '1', '0', '0', !!binary kQI=]<br>
      +  - [0, '1', '0', '0', !!binary kQE=]<br>
       ...<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       ---<br>
      -- - ['T1', 'I1', '1 1']<br>
      -  - ['T1', 'T1', '1 1']<br>
      -  - ['T2', 'T2', '1 1']<br>
      +- - [0, '1 1']<br>
      +  - [1, '1 1']<br>
      +  - [0, '1 1']<br>
       ...<br>
       --Cleaning up.<br>
       box.sql.execute("DROP TABLE t1;")<br>
      diff --git a/test/sql/sql-statN-index-drop.test.lua
      b/test/sql/sql-statN-index-drop.test.lua<br>
      index 35f2291..9ce77a5 100644<br>
      --- a/test/sql/sql-statN-index-drop.test.lua<br>
      +++ b/test/sql/sql-statN-index-drop.test.lua<br>
      @@ -14,15 +14,15 @@ box.sql.execute("INSERT INTO t2 VALUES(1,
      2);")<br>
       box.sql.execute("ANALYZE;")<br>
       <br>
       -- Checking the data.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       <br>
       -- Dropping an index.<br>
       box.sql.execute("DROP INDEX i1 ON t1;")<br>
       <br>
       -- Checking the DROP INDEX results.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       <br>
       --Cleaning up.<br>
       box.sql.execute("DROP TABLE t1;")<br>
      @@ -41,15 +41,15 @@ box.sql.execute("INSERT INTO t2 VALUES(1,
      2);")<br>
       box.sql.execute("ANALYZE;")<br>
       <br>
       -- Checking the data.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       <br>
       -- Dropping an index.<br>
       box.sql.execute("DROP INDEX i1 ON t2;")<br>
       <br>
       -- Checking the DROP INDEX results.<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat4\";")<br>
      -box.sql.execute("SELECT * FROM \"_sql_stat1\";")<br>
      +box.sql.execute('SELECT "index_id","neq","nlt","ndlt","sample"
      FROM "_sql_stat4";')<br>
      +box.sql.execute('SELECT "index_id","stat" FROM "_sql_stat1";')<br>
       <br>
       --Cleaning up.<br>
       box.sql.execute("DROP TABLE t1;")<br>
      diff --git a/test/sql/upgrade.result b/test/sql/upgrade.result<br>
      index 5e7d851..9326209 100644<br>
      --- a/test/sql/upgrade.result<br>
      +++ b/test/sql/upgrade.result<br>
      @@ -30,14 +30,15 @@ box.space._space.index['name']:get('_trigger')<br>
       ...<br>
       box.space._space.index['name']:get('_sql_stat1')<br>
       ---<br>
      -- [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'tbl', 'type':
      'string'}, {'name': 'idx',<br>
      -      'type': 'string'}, {'name': 'stat', 'type': 'string'}]]<br>
      +- [348, 1, '_sql_stat1', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +    {'name': 'index_id', 'type': 'unsigned'}, {'name': 'stat',
      'type': 'string'}]]<br>
       ...<br>
       box.space._space.index['name']:get('_sql_stat4')<br>
       ---<br>
      -- [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'tbl', 'type':
      'string'}, {'name': 'idx',<br>
      -      'type': 'string'}, {'name': 'neq', 'type': 'string'},
      {'name': 'nlt', 'type': 'string'},<br>
      -    {'name': 'ndlt', 'type': 'string'}, {'name': 'sample',
      'type': 'scalar'}]]<br>
      +- [349, 1, '_sql_stat4', 'memtx', 0, {}, [{'name': 'space_id',
      'type': 'unsigned'},<br>
      +    {'name': 'index_id', 'type': 'unsigned'}, {'name': 'neq',
      'type': 'string'}, {<br>
      +      'name': 'nlt', 'type': 'string'}, {'name': 'ndlt', 'type':
      'string'}, {'name': 'sample',<br>
      +      'type': 'scalar'}]]<br>
       ...<br>
 box.space._index:get({box.space._space.index['name']:get('_trigger').id,
      0})<br>
       ---<br>
      @@ -45,12 +46,12 @@
      box.space._index:get({box.space._space.index['name']:get('_trigger').id,
      0})<br>
       ...<br>
 box.space._index:get({box.space._space.index['name']:get('_sql_stat1').id,
      0})<br>
       ---<br>
      -- [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string']]]<br>
      +- [348, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'],
      [1, 'unsigned']]]<br>
       ...<br>
 box.space._index:get({box.space._space.index['name']:get('_sql_stat4').id,
      0})<br>
       ---<br>
      -- [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'string'],
      [1, 'string'], [5,<br>
      -      'scalar']]]<br>
      +- [349, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'],
      [1, 'unsigned'],<br>
      +    [5, 'scalar']]]<br>
       ...<br>
       box.space._schema:format()<br>
       ---<br>
      <br>
    </p>
  </body>
</html>