From: "n.pettik" <korablev@tarantool.org> To: tarantool-patches@freelists.org Cc: Imeev Mergen <imeevma@tarantool.org> Subject: [tarantool-patches] Re: [PATCH v2 1/1] sql: hold in stat tables space/index id instead of name Date: Thu, 6 Sep 2018 02:13:53 +0300 [thread overview] Message-ID: <14AA0E00-B3ED-41E2-9E8D-575097320E05@tarantool.org> (raw) In-Reply-To: <1f1960f842e9443511b4bf2712a0b79bd7fb0764.1535711802.git.imeevma@gmail.com> > 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.
next prev parent reply other threads:[~2018-09-05 23:14 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 ` n.pettik [this message] 2018-09-07 16:49 ` [tarantool-patches] " 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 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=14AA0E00-B3ED-41E2-9E8D-575097320E05@tarantool.org \ --to=korablev@tarantool.org \ --cc=imeevma@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