[Maria-developers] Fwd: bc7d600a27f: MDEV-15951 system versioning by trx id doesn't work with partitioning
---------- Forwarded message --------- From: Nikita Malyavin <nikitamalyavin@gmail.com> Date: пт, 21 дек. 2018 г. в 04:52 Subject: Re: bc7d600a27f: MDEV-15951 system versioning by trx id doesn't work with partitioning To: Sergei Golubchik <serg@mariadb.org> вт, 13 нояб. 2018 г. в 04:43, Sergei Golubchik <serg@mariadb.org>:
Hi, Nikita!
Hi, Sergei! I've updated the tests with respect to issues You mentioned. For the rest i'll give my answers.
-create table t1 (x int) +create or replace table t1 (x int, ROW_START, ROW_END, period for system_time(row_start, row_end))
ouch. that looks very weird. please, only replace the type, not the whole column definition. Like everywhere else:
--replace_result $sys_datatype_expl SYS_DATATYPE
Fixed it, thanks. Did not notice the weirdness in test results reading.
if you have tests with innodb and trx_id, please, put them in a separate test file, say, partition_innodb.test. partition.test is for common tests that are repeated three times, with myisam, innodb, timestamps, and trx_id. There is no need to repeat your test three times.
Did it, though i have an opinion that it makes tests run slower at overall. Every test case adds quite a noticeable lag, more than several test(s) runs.
diff --git a/mysql-test/suite/versioning/t/partition.combinations b/mysql-test/suite/versioning/t/partition.combinations index 4d73ef5a5ea..561c5656929 100644 --- a/mysql-test/suite/versioning/t/partition.combinations +++ b/mysql-test/suite/versioning/t/partition.combinations @@ -1,5 +1,8 @@ [timestamp] default-storage-engine=innodb
+[trx_id] +default-storage-engine=innodb + [myisam] default-storage-engine=myisam
But then you don't need partition.combinations at all, just add
--source engines.inc
like other tests do.
-- Fixed
@@ -4938,6 +4938,7 @@ int ha_create_table(THD *thd, const char *path, !create_info->tmp_table();
share.frm_image= frm; + share.orig_table_name= table_name;
why? if orig_table_name is NULL, error_table_name() will use table_name, so there's never need to make orig_table_name==table_name.
and I don't understand all your other manipulations with orig_table_name. Could you please explain that?
It affects ALTER TABLE error messages. table_name will contain temporary name, and error_table_name() will output "(temporary)", which is rather inconvenient. AFAICS, orig_table_name purpose is exactly for fixing that, but some corner cases were not covered to this moment.
// open an frm image if (share.init_from_binary_frm_image(thd, write_frm_now, @@ -6952,29 +6953,6 @@ bool Vers_parse_info::fix_implicit(THD *thd,
Alter_info *alter_info)
return false; }
-bool Table_scope_and_contents_source_st::vers_native(THD *thd) const -{ - if (ha_check_storage_engine_flag(db_type, HTON_NATIVE_SYS_VERSIONING)) - return true; - -#ifdef WITH_PARTITION_STORAGE_ENGINE - partition_info *info= thd->work_part_info; - if (info && !(used_fields & HA_CREATE_USED_ENGINE)) - { - if (handlerton *hton= info->default_engine_type) - return ha_check_storage_engine_flag(hton, HTON_NATIVE_SYS_VERSIONING); - - List_iterator_fast<partition_element> it(info->partitions); - while (partition_element *partition_element= it++) - { - if (partition_element->find_engine_flag(HTON_NATIVE_SYS_VERSIONING)) - return true; - } - } -#endif - return false; -}
what was wrong with that (and all other changed code in this file) ?
Mostly I'm ok with handler.cc code 🙂 except it is mixed with various classes implementations. First, find_engine_flag is not the correct function here, as it says "if there's _any_ node in a tree with corresponding flag". We should check _all_ nodes instead of _any_. Second, we need to make this check at TABLE_SHARE::init_from_binary_frm_image to set TABLE_SHARE::versioned properly and handle errors in place. That's why I've introduced handler::vers_can native [a nice thing about it is that wrote it first and then found same-named share's field used exactly where it's needed, just with lack of tree traversal]. But it makes Table_scope_and_contents_source_st::vers_native redundant, as well as all related code in handler.cc. Other important thing is that TABLE_SHARE::vers_can_native value is now also correct with respect to partition tree, but i have not it used anywhere. I have updated my pull request at github. I don't know how it keeps in sync with mailing lists, so here's a link: https://github.com/MariaDB/server/pull/870. Also rebased to latest 10.3 for convenience Regards! Nikita Malyavin Tempesta Technologies https://github.com/tempesta-tech
participants (1)
-
Nikita Malyavin