[tarantool-patches] Re: [PATCH v2 1/1] sql: hold in stat tables space/index id instead of name
n.pettik
korablev at tarantool.org
Thu Sep 6 02:13:53 MSK 2018
> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
> index d9c2ae4..bb8dc36 100644
> --- a/src/box/lua/upgrade.lua
> +++ b/src/box/lua/upgrade.lua
> @@ -520,11 +520,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='tbl', type='unsigned'},
> + {name='idx', type='unsigned’},
Nit: why you didn’t rename these fields to ’space_id’ and ‘index_id’
(like in _index)? The same for stat4.
> @@ -793,8 +794,8 @@ analyzeOneTable(Parse * pParse, /* Parser context */
> int regChng = iMem++; /* Index of changed index field */
> int regKey = iMem++; /* Key argument passed to stat_push() */
> int regTemp = iMem++; /* Temporary use register */
> - int regTabname = iMem++; /* Register containing table name */
> - int regIdxname = iMem++; /* Register containing index name */
> + int reg_space_id = iMem++; /* Register containing table id */
> + int reg_index_id = iMem++; /* Register containing index id */
Nit: put comments above the code to be commented and put dots
at the end of comment.
> @@ -1246,24 +1246,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++];
> - uint32_t space_id = box_space_id_by_name(argv[0], strlen(argv[0]));
> + uint32_t space_id = atoll(argv[0]);
I would add assertion like:
assert(space_id != 0);
Since atoll in case of fail returns 0 and BOX_ID_NIL != 0.
> if (space_id == BOX_ID_NIL)
> 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_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);
> assert(index != NULL);
> /*
> * Additional field is used to describe total
> @@ -1410,27 +1400,17 @@ 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)
> + if (sqlite3_column_text(stmt, 0) == NULL ||
> + sqlite3_column_text(stmt, 1) == NULL)
> continue;
> - uint32_t sample_count = sqlite3_column_int(stmt, 2);
> - uint32_t space_id = box_space_id_by_name(space_name,
> - strlen(space_name));
> + uint32_t space_id = sqlite3_column_int(stmt, 0);
Why do you check on nullability text value, but fetch int?
It looks suspicious…
The same for other usages.
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index a1e16b2..ece1092 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -1888,75 +1888,45 @@ sql_store_select(struct Parse *parse_context, struct Select *select)
> parse_context->parsed_ast.select = select_copy;
> }
>
> -/**
> - * Create expression record "@col_name = '@col_value'".
> - *
> - * @param parse The parsing context.
> - * @param col_name Name of column.
> - * @param col_value Name of row.
> - * @retval not NULL on success.
> - * @retval NULL on failure.
> - */
> -static struct Expr *
> -sql_id_eq_str_expr(struct Parse *parse, const char *col_name,
> - const char *col_value)
> -{
> - struct sqlite3 *db = parse->db;
> -
> - struct Expr *col_name_expr = sqlite3Expr(db, TK_ID, col_name);
> - if (col_name_expr == NULL)
> - return NULL;
> - struct Expr *col_value_expr = sqlite3Expr(db, TK_STRING, col_value);
> - if (col_value_expr == NULL) {
> - sql_expr_delete(db, col_name_expr, false);
> - return NULL;
> - }
> - return sqlite3PExpr(parse, TK_EQ, col_name_expr, col_value_expr);
> -}
> -
> void
> -vdbe_emit_stat_space_clear(struct Parse *parse, const char *stat_table_name,
> - const char *idx_name, const char *table_name)
> +sql_remove_from_stat(struct Parse *parse, const char *stat_table_name,
> + uint32_t space_id, uint32_t index_id)
Remove what? Why did you rename function?
>
> /**
> - * Remove entries from the _sql_stat1 and _sql_stat4
> - * system spaces after a DROP INDEX or DROP TABLE command.
> + * Remove entries from the _sql_stat1 and _sql_stat4 system spaces
> + * after a DROP INDEX or DROP TABLE command.
Nit: noise diff.
> *
> - * @param parse The parsing context.
> - * @param table_name The table to be dropped or
> - * the table that contains index to be dropped.
> - * @param idx_name Index to be dropped.
> + * @param parse The parsing context.
> + * @param table_name The table to be dropped or the table that
> + * contains index to be dropped.
You forgot to rename args here.
> + * @param idx_name Index to be dropped.
> */
> static void
> -sql_clear_stat_spaces(struct Parse *parse, const char *table_name,
> - const char *idx_name)
> +sql_clear_stat_spaces(struct Parse *parse, uint32_t space_id, uint32_t index_id)
> {
> - vdbe_emit_stat_space_clear(parse, "_sql_stat4", idx_name, table_name);
> - vdbe_emit_stat_space_clear(parse, "_sql_stat1", idx_name, table_name);
> + sql_remove_from_stat(parse, TARANTOOL_SYS_SQL_STAT1_NAME, space_id,
> + index_id);
> + sql_remove_from_stat(parse, TARANTOOL_SYS_SQL_STAT4_NAME, space_id,
> + index_id);
Don’t use this macros: it is awful and going to disappear.
Just simply inline name of stat space.
> }
>
> /**
> @@ -2177,7 +2147,7 @@ sql_drop_table(struct Parse *parse_context, struct SrcList *table_name_list,
> goto exit_drop_table;
> }
> }
> - sql_clear_stat_spaces(parse_context, space_name, NULL);
> + sql_clear_stat_spaces(parse_context, space->def->id, BOX_ID_NIL);
> sql_code_drop_table(parse_context, space, is_view);
>
> exit_drop_table:
> @@ -3119,11 +3089,12 @@ sql_drop_index(struct Parse *parse_context, struct SrcList *index_name_list,
> }
>
> /*
> - * Generate code to remove entry from _index space
> - * But firstly, delete statistics since schema
> - * changes after DDL.
> + * Generate code to remove entry from _index space.
> + * But firstly, delete statistics since schema changes
> + * after DDL.
Nit: again noise diff.
> diff --git a/test/sql-tap/analyze9.test.lua b/test/sql-tap/analyze9.test.lua
> index 1dbfe5d..2c6b4b8 100755
> --- a/test/sql-tap/analyze9.test.lua
> +++ b/test/sql-tap/analyze9.test.lua
> @@ -1,6 +1,6 @@
> #!/usr/bin/env tarantool
> test = require("sqltester")
> -test:plan(121)
> +test:plan(118)
>
> -test:do_execsql_test(
> - 15.7,
> - [[
> - ANALYZE;
> - UPDATE "_sql_stat1" SET "tbl" = 'no such tbl';
> - ]])
Why did you simply delete this test? Rewrite it pls using space id.
> diff --git a/test/sql/sql-statN-index-drop.result b/test/sql/sql-statN-index-drop.result
> index a751eca..0e5f2a3 100644
> --- a/test/sql/sql-statN-index-drop.result
> +++ b/test/sql/sql-statN-index-drop.result
> @@ -31,36 +31,36 @@ box.sql.execute("ANALYZE;")
> ---
> ...
> -- Checking the data.
> -box.sql.execute("SELECT * FROM \"_sql_stat4\";")
> +box.sql.execute('SELECT "idx","neq","nlt","ndlt","sample" FROM \"_sql_stat4\";')
> ---
> -- - ['T1', 'I1', '1', '0', '0', !!binary kQI=]
> - - ['T1', 'T1', '1', '0', '0', !!binary kQE=]
> - - ['T2', 'I1', '1', '0', '0', !!binary kQI=]
> - - ['T2', 'T2', '1', '0', '0', !!binary kQE=]
> +- - [0, '1', '0', '0', !!binary kQE=]
> + - [1, '1', '0', '0', !!binary kQI=]
> + - [0, '1', '0', '0', !!binary kQE=]
> + - [1, '1', '0', '0', !!binary kQI=]
> ...
> -box.sql.execute("SELECT * FROM \"_sql_stat1\";")
> +box.sql.execute('SELECT "idx","stat" FROM \"_sql_stat1\";’)
Without space_id/space name this test is less representative.
The same for other similar tests.
More information about the Tarantool-patches
mailing list