Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: Imeev Mergen <imeevma@tarantool.org>,
	tarantool-patches@freelists.org,
	Kirill Yukhin <kyukhin@tarantool.org>
Cc: "n.pettik" <korablev@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH v2 1/1] sql: hold in stat tables space/index id instead of name
Date: Mon, 19 Nov 2018 13:27:51 +0300	[thread overview]
Message-ID: <2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org> (raw)
In-Reply-To: <207b4057-eaab-b3bd-1bec-bff9111c0743@tarantool.org>

Hi! Thanks for the rebase! See 4 comments below.

> commit b9792dfc183d7d0851f3492c8ba9e2f7c46fe385
> Author: Mergen Imeev <imeevma@gmail.com>
> Date:   Fri Aug 31 12:37:48 2018 +0300
> 
>      sql: hold in stat tables space/index id instead of name
> 
>      To avoid problems with table and index renaming it is good idea
>      to save ids of tables and indexes instead of their names. Ids of
>      tables and indexes are fixed values.
> 
>      Closes #3242
>      Closes #2962
> 
> diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
> index b7789d6..538e635 100644
> Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ
> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
> index 3d9acc9..3ce586b 100644
> --- a/src/box/lua/upgrade.lua
> +++ b/src/box/lua/upgrade.lua
> @@ -550,11 +550,11 @@ local function upgrade_to_2_1_0()
>       _index:insert{_trigger.id, 1, 'space_id', 'tree', { unique = false },
>                     {{1, 'unsigned'}}}
> 
> -    local stat1_ft = {{name='tbl', type='string'},
> -                      {name='idx', type='string'},
> +    local stat1_ft = {{name='space_id', type='unsigned'},
> +                      {name='index_id', type='unsigned'},
>                         {name='stat', type='string'}}
> -    local stat4_ft = {{name='tbl', type='string'},
> -                      {name='idx', type='string'},
> +    local stat4_ft = {{name='space_id', type='unsigned'},
> +                      {name='index_id', type='unsigned'},
>                         {name='neq', type='string'},
>                         {name='nlt', type='string'},
>                         {name='ndlt', type='string'}

1. Unfortunately, as I said earlier, you can not change the
past. 2.1.0 is already released, so you should create upgrade_to_2_2_0()
function and here update stat spaces format.

> diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c
> index e786c90..aa5d349 100644
> --- a/src/box/sql/analyze.c
> +++ b/src/box/sql/analyze.c
> @@ -800,13 +800,13 @@ vdbe_emit_analyze_space(struct Parse *parse, struct space *space)
>       assert(space->index_count != 0);
>       struct Vdbe *v = sqlite3GetVdbe(parse);
>       assert(v != NULL);
> -    const char *tab_name = space_name(space);
> +    MAYBE_UNUSED const char *tab_name = space_name(space);

2. Why unused?

>       sqlite3VdbeAddOp4(v, OP_IteratorOpen, tab_cursor, 0, 0, (void *) space,
>                 P4_SPACEPTR);
> -    sqlite3VdbeLoadString(v, tab_name_reg, space->def->name);
> +    sqlite3VdbeAddOp2(v, OP_Integer, space->def->id, space_id_reg);
>       for (uint32_t j = 0; j < space->index_count; ++j) {
>           struct index *idx = space->index[j];
> -        const char *idx_name;
> +        MAYBE_UNUSED const char *idx_name;

3. Why?

>           /*
>            * Primary indexes feature automatically generated
>            * names. Thus, for the sake of clarity, use
> @@ -1225,23 +1224,14 @@ analysis_loader(void *data, int argc, char **argv, char **unused)
>       struct analysis_index_info *info = (struct analysis_index_info *) data;
>       assert(info->stats != NULL);
>       struct index_stat *stat = &info->stats[info->index_count++];
> -    struct space *space = space_by_name(argv[0]);
> -    if (space == NULL)
> +    uint32_t space_id = atoll(argv[0]);
> +    if (space_id == 0)
>           return -1;
> +    struct space *space = space_by_id(space_id);
> +    assert(space != NULL);
>       struct index *index;
> -    uint32_t iid = box_index_id_by_name(space->def->id, argv[1],
> -                        strlen(argv[1]));
> -    /*
> -     * Convention is if index's name matches with space's
> -     * one, then it is primary index.
> -     */
> -    if (iid != BOX_ID_NIL) {
> -        index = space_index(space, iid);
> -    } else {
> -        if (sqlite3_stricmp(argv[0], argv[1]) != 0)
> -            return -1;
> -        index = space_index(space, 0);
> -    }
> +    uint32_t iid = atoll(argv[1]);
> +    index = space_index(space, iid);

4.1. Why in some places d oyou check result of
atoll and sqlite3_column_int, but in others do not?

>       assert(index != NULL);
>       /*
>        * Additional field is used to describe total
> @@ -1387,24 +1381,14 @@ load_stat_from_space(struct sqlite3 *db, const char *sql_select_prepare,
>           goto finalize;
>       uint32_t current_idx_count = 0;
>       while (sqlite3_step(stmt) == SQLITE_ROW) {
> -        const char *space_name = (char *)sqlite3_column_text(stmt, 0);
> -        if (space_name == NULL)
> -            continue;
> -        const char *index_name = (char *)sqlite3_column_text(stmt, 1);
> -        if (index_name == NULL)
> -            continue;
> -        uint32_t sample_count = sqlite3_column_int(stmt, 2);
> -        struct space *space = space_by_name(space_name);
> +        uint32_t space_id = sqlite3_column_int(stmt, 0);
> +        assert(space_id != 0);
> +        struct space *space = space_by_id(space_id);

4.2. Here you do not check, but ...

>           assert(space != NULL);
> -        struct index *index;
> @@ -1537,24 +1509,13 @@ load_stat_to_index(struct sqlite3 *db, const char *sql_select_load,
>           return -1;
>       uint32_t current_idx_count = 0;
>       while (sqlite3_step(stmt) == SQLITE_ROW) {
> -        const char *space_name = (char *)sqlite3_column_text(stmt, 0);
> -        if (space_name == NULL)
> -            continue;
> -        const char *index_name = (char *)sqlite3_column_text(stmt, 1);
> -        if (index_name == NULL)
> -            continue;
> -        struct space *space = space_by_name(space_name);
> +        uint32_t space_id = sqlite3_column_int(stmt, 0);
> +        if (space_id == 0)
> +            return -1;

4.3. ... here you check again.

> +        struct space *space = space_by_id(space_id);
>           assert(space != NULL);
> -        struct index *index;
> -        uint32_t iid = box_index_id_by_name(space->def->id, index_name,
> -                            strlen(index_name));
> -        if (iid != BOX_ID_NIL) {
> -            index = space_index(space, iid);
> -        } else {
> -            if (sqlite3_stricmp(space_name, index_name) != 0)
> -                return -1;
> -            index = space_index(space, 0);
> -        }
> +        uint32_t iid = sqlite3_column_int(stmt, 1);

4.4. And here you don't ...

> +        struct index *index = space_index(space, iid);
>           assert(index != NULL);
>           free(index->def->opts.stat);
>           index->def->opts.stat = stats[current_idx_count++];

  reply	other threads:[~2018-11-19 10:27 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-31 10:39 [tarantool-patches] " imeevma
2018-09-05 23:13 ` [tarantool-patches] " n.pettik
2018-09-07 16:49   ` Imeev Mergen
2018-09-30 23:40     ` n.pettik
2018-10-01 11:20       ` n.pettik
2018-10-02 16:42       ` [tarantool-patches] Re[2]: [tarantool-patches] " Мерген Имеев
2018-10-09 12:36         ` [tarantool-patches] " n.pettik
2018-10-10 17:17           ` Imeev Mergen
2018-10-11 11:41             ` n.pettik
2018-10-11 14:56               ` Imeev Mergen
2018-10-11 15:00                 ` n.pettik
2018-11-17 14:09                   ` Imeev Mergen
2018-11-19 10:27                     ` Vladislav Shpilevoy [this message]
2018-11-19 10:38                       ` Vladislav Shpilevoy
2018-11-21 16:00                       ` Konstantin Osipov
2018-11-21 16:11                         ` Vladislav Shpilevoy
2018-12-08 12:39                       ` Imeev Mergen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2b509f61-9145-c1fa-4e1d-a734f615479e@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=imeevma@tarantool.org \
    --cc=korablev@tarantool.org \
    --cc=kyukhin@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH v2 1/1] sql: hold in stat tables space/index id instead of name' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox