Hi, Sanja! Summary: The implementation looks very much ok, all comments below are about details, nothing big. Well done!
On Jul 14, [email protected] wrote: > revision-id: 686761fbb0fc36e4fa781b68aba24af21599822d > parent(s): 302bf7c4664b904482ecc133476e822d497b114d > committer: Oleksandr Byelkin > branch nick: server could you update your post-commit trigger? thanks. > timestamp: 2015-07-14 00:11:25 +0200 > message: > > MDEV-6066: Merge new defaults from 5.6 and 5.7 (part 1 (no hash serch) v2) > diff --git a/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc > b/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc > index 95440ab..c072d50 100644 > --- a/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc > +++ b/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc > @@ -16,6 +16,7 @@ > # > > --source include/have_log_bin.inc > +set sql_mode=""; please split this big commit in 'new defaults' and 'autoset' commits. > > SET NAMES 'utf8'; > #SHOW VARIABLES LIKE 'character_set%'; > diff --git a/mysql-test/r/analyze_stmt_privileges.result > b/mysql-test/r/analyze_stmt_privileges.result > index d382b0b..05a35e7 100644 > --- a/mysql-test/r/analyze_stmt_privileges.result > +++ b/mysql-test/r/analyze_stmt_privileges.result > @@ -7,7 +7,7 @@ use db; > create table t1 (i int, c varchar(8)); > insert into t1 values (1,'foo'),(2,'bar'),(3,'baz'),(4,'qux'); > create view v1 as select * from t1 where i > 1; > -grant ALL on db.v1 to u1@localhost; > +set statement sql_mode="" for grant ALL on db.v1 to u1@localhost; heh. I think it would've been less confusing to put here an explicit CREATE USER statement > connect con1,localhost,u1,,; > select * from db.t1; > ERROR 42000: SELECT command denied to user 'u1'@'localhost' for table 't1' > diff --git a/mysql-test/r/blackhole_plugin.result > b/mysql-test/r/blackhole_plugin.result > index 4ef9fa0..ab106f8 100644 > --- a/mysql-test/r/blackhole_plugin.result > +++ b/mysql-test/r/blackhole_plugin.result > @@ -1,7 +1,9 @@ > +set sql_mode=""; you could've put --error 1286 instead. > CREATE TABLE t1(a int) ENGINE=BLACKHOLE; > Warnings: > Warning 1286 Unknown storage engine 'BLACKHOLE' > Warning 1266 Using storage engine MyISAM for table 't1' > +set sql_mode=default; > DROP TABLE t1; > INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so'; > INSTALL PLUGIN BLACKHOLE SONAME 'ha_blackhole.so'; > diff --git a/mysql-test/r/change_user.result b/mysql-test/r/change_user.result > index 18c53a5..bd87398 100644 > --- a/mysql-test/r/change_user.result > +++ b/mysql-test/r/change_user.result > @@ -1,3 +1,5 @@ > +set sql_mode=""; > +set global secure_auth=0; > grant select on test.* to test_nopw; > grant select on test.* to test_oldpw identified by password > "09301740536db389"; > grant select on test.* to test_newpw identified by "newpw"; you could've used "create user" instead of "grant select on test.* to" and that would work without resetting sql_mode > diff --git a/mysql-test/r/concurrent_innodb_safelog.result > b/mysql-test/r/concurrent_innodb_safelog.result > index 24a84af..03d20f4 100644 > --- a/mysql-test/r/concurrent_innodb_safelog.result > +++ b/mysql-test/r/concurrent_innodb_safelog.result > @@ -1,4 +1,5 @@ > SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; > +SET SQL_MODE=""; same. basically I'd suggest to fix tests instead of setting sql_mode="". i suspect it's mostly adding create user or replacing grant with create user. sometimes it's about removing engine=xxx and you're doing that already. > SELECT @@global.tx_isolation; > @@global.tx_isolation > REPEATABLE-READ > diff --git a/mysql-test/r/func_compress.result > b/mysql-test/r/func_compress.result > index 9fde006..4763d87 100644 > --- a/mysql-test/r/func_compress.result > +++ b/mysql-test/r/func_compress.result > @@ -1,3 +1,4 @@ > +set global max_allowed_packet=1048576; again, I'd rather fix the test > select @test_compress_string:='string for test compress function > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > '; > @test_compress_string:='string for test compress function > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > ' > string for test compress function > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > > diff --git a/mysql-test/r/host_cache_size_functionality.result > b/mysql-test/r/host_cache_size_functionality.result > index e7f9e09..ffa8d71 100644 > --- a/mysql-test/r/host_cache_size_functionality.result > +++ b/mysql-test/r/host_cache_size_functionality.result > @@ -9,7 +9,7 @@ SELECT COUNT(@@GLOBAL.Host_Cache_Size) > set @Default_host_cache_size=128; > select @@global.Host_Cache_Size=@Default_host_cache_size; > @@global.Host_Cache_Size=@Default_host_cache_size > -1 > +0 > 1 Expected Now that looks weird. > '#---------------------WL6372_VAR_6_02----------------------#' > # Restart server with Host_Cache_Size 1 > diff --git a/mysql-test/r/index_intersect.result > b/mysql-test/r/index_intersect.result > index 1337c3f..edc52db 100644 > --- a/mysql-test/r/index_intersect.result > +++ b/mysql-test/r/index_intersect.result > @@ -1035,7 +1032,7 @@ EXPLAIN > SELECT * FROM t1 > WHERE (f1 < 535 OR f1 > 985) AND ( f4='r' OR f4 LIKE 'a%' ) ; > id select_type table type possible_keys key key_len ref > rows Extra > -1 SIMPLE t1 range PRIMARY,f4 f4 35 NULL # > Using index condition; Using where > +1 SIMPLE t1 index_merge PRIMARY,f4 PRIMARY,f4 4,39 > NULL # Using sort_intersect(PRIMARY,f4); Using where why? > SELECT * FROM t1 > WHERE (f1 < 535 OR f1 > 985) AND ( f4='r' OR f4 LIKE 'a%' ) ; > f1 f4 f5 > diff --git a/mysql-test/r/mysqld--help.result > b/mysql-test/r/mysqld--help.result > index fc22af6..1f2a8cf 100644 > --- a/mysql-test/r/mysqld--help.result > +++ b/mysql-test/r/mysqld--help.result > @@ -890,6 +890,7 @@ The following options may be given as the first argument: > write privileges to the mysql.user table. > --secure-auth Disallow authentication for accounts that have old > (pre-4.1) passwords > + (Defaults to on; use --skip-secure-auth to disable.) You know what, it would be nice if the user would know what options support the --autoset prefix. I think here's a good place for it, the help for back_log can end with gets very many connection requests in a very short time (Automatically configured unless set explicitly) Of course, this line should be automatically generated by my_print_help(), not manually added to the help text of every autoset variable. > --secure-file-priv=name > Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to > files within specified directory > diff --git a/mysql-test/r/selectivity.result b/mysql-test/r/selectivity.result > index 620bdc6..4238359 100644 > --- a/mysql-test/r/selectivity.result > +++ b/mysql-test/r/selectivity.result > @@ -1298,10 +1298,10 @@ Note 1003 select `test`.`t1`.`a` AS > `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A > select * from t1, t2, t1 as t3 > where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000; > a b c d a b > -1495 89366 89366 28296 28296 3 > -961 24512 24512 85239 85239 4 > 1063 89366 89366 28296 28296 3 > +1495 89366 89366 28296 28296 3 > 221 56120 56120 28296 28296 3 > +961 24512 24512 85239 85239 4 why? > set optimizer_use_condition_selectivity=3; > explain extended > select * from t1, t2, t1 as t3 > @@ -1315,10 +1315,10 @@ Note 1003 select `test`.`t1`.`a` AS > `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A > select * from t1, t2, t1 as t3 > where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000; > a b c d a b > -961 24512 24512 85239 85239 4 > -1495 89366 89366 28296 28296 3 > 1063 89366 89366 28296 28296 3 > +1495 89366 89366 28296 28296 3 > 221 56120 56120 28296 28296 3 > +961 24512 24512 85239 85239 4 why? > set > optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; > drop table t1,t2; > set histogram_type=@save_histogram_type; > diff --git a/mysql-test/r/selectivity_innodb.result > b/mysql-test/r/selectivity_innodb.result > index 0acbb46..daf2807 100644 > --- a/mysql-test/r/selectivity_innodb.result > +++ b/mysql-test/r/selectivity_innodb.result > @@ -1308,10 +1308,10 @@ Note 1003 select `test`.`t1`.`a` AS > `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A > select * from t1, t2, t1 as t3 > where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000; > a b c d a b > -1495 89366 89366 28296 28296 3 > -961 24512 24512 85239 85239 4 > 1063 89366 89366 28296 28296 3 > +1495 89366 89366 28296 28296 3 > 221 56120 56120 28296 28296 3 > +961 24512 24512 85239 85239 4 why? > set optimizer_use_condition_selectivity=3; > explain extended > select * from t1, t2, t1 as t3 > @@ -1325,10 +1325,10 @@ Note 1003 select `test`.`t1`.`a` AS > `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A > select * from t1, t2, t1 as t3 > where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000; > a b c d a b > -961 24512 24512 85239 85239 4 > -1495 89366 89366 28296 28296 3 > 1063 89366 89366 28296 28296 3 > +1495 89366 89366 28296 28296 3 > 221 56120 56120 28296 28296 3 > +961 24512 24512 85239 85239 4 why? > set > optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; > drop table t1,t2; > set histogram_type=@save_histogram_type; > diff --git a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result > b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result > index c314165..bd49492 100644 > --- a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result > +++ b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result > @@ -167,9 +167,9 @@ def information_schema GEOMETRY_COLUMNS > MAX_PPR 12 0 NO tinyint NULL NULL 3 0 NU > def information_schema GEOMETRY_COLUMNS SRID 13 0 > NO smallint NULL NULL 5 0 NULL NULL NULL > smallint(5) > def information_schema GEOMETRY_COLUMNS STORAGE_TYPE 9 > 0 NO tinyint NULL NULL 3 0 NULL NULL NULL > tinyint(2) > def information_schema GLOBAL_STATUS VARIABLE_NAME 1 > NO varchar 64 192 NULL NULL NULL utf8 > utf8_general_ci varchar(64) > -def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 > NO varchar 1024 3072 NULL NULL NULL utf8 > utf8_general_ci varchar(1024) > +def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 > NO varchar 2048 6144 NULL NULL NULL utf8 > utf8_general_ci varchar(2048) > def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 > NO varchar 64 192 NULL NULL NULL utf8 > utf8_general_ci varchar(64) > -def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 > NO varchar 1024 3072 NULL NULL NULL utf8 > utf8_general_ci varchar(1024) > +def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 > NO varchar 2048 6144 NULL NULL NULL utf8 > utf8_general_ci varchar(2048) why? > def information_schema INDEX_STATISTICS INDEX_NAME 3 > NO varchar 192 576 NULL NULL NULL utf8 > utf8_general_ci varchar(192) > def information_schema INDEX_STATISTICS ROWS_READ 4 > 0 NO bigint NULL NULL 19 0 NULL NULL NULL > bigint(21) > def information_schema INDEX_STATISTICS TABLE_NAME 2 > NO varchar 192 576 NULL NULL NULL utf8 > utf8_general_ci varchar(192) > diff --git a/mysql-test/suite/perfschema/r/stage_mdl_global.result > b/mysql-test/suite/perfschema/r/stage_mdl_global.result > index 1a6f51a..de5df8f 100644 > --- a/mysql-test/suite/perfschema/r/stage_mdl_global.result > +++ b/mysql-test/suite/perfschema/r/stage_mdl_global.result > @@ -6,6 +6,8 @@ user1 statement/sql/flush flush tables with read lock > username event_name nesting_event_type > username event_name nesting_event_type > user1 stage/sql/init STATEMENT > +user1 stage/sql/Waiting for query cache lock STATEMENT > +user1 stage/sql/init STATEMENT why? > user1 stage/sql/query end STATEMENT > user1 stage/sql/closing tables STATEMENT > user1 stage/sql/freeing items STATEMENT > diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c > index 88fa3d4..1d32833 100644 > --- a/mysys/my_getopt.c > +++ b/mysys/my_getopt.c > @@ -47,14 +47,15 @@ static char *check_struct_option(char *cur_arg, char > *key_name); > order of their arguments must correspond to each other. > */ > static const char *special_opt_prefix[]= > -{"skip", "disable", "enable", "maximum", "loose", 0}; > +{"skip", "disable", "enable", "maximum", "loose", "autoset", 0}; So, I'm not very happy with the --autoset- prefix. Because it cannot be used from the SQL. In SQL we have to use SET variable=AUTO; or something like that. And it would be good to use the same approach on the command line and from SQL. On the other hand, =AUTO has its problems too - it conflicts with the AUTO value of the enum/set variables. I don't have a good answer to this :( > static const uint special_opt_prefix_lengths[]= > -{ 4, 7, 6, 7, 5, 0}; > +{ 4, 7, 6, 7, 5, 7, 0}; > enum enum_special_opt > -{ OPT_SKIP, OPT_DISABLE, OPT_ENABLE, OPT_MAXIMUM, OPT_LOOSE}; > +{ OPT_SKIP, OPT_DISABLE, OPT_ENABLE, OPT_MAXIMUM, OPT_LOOSE, OPT_AUTOSET}; > > char *disabled_my_option= (char*) "0"; > char *enabled_my_option= (char*) "1"; > +char *autoset_my_option= (char*) ""; > > /* > This is a flag that can be set in client programs. 0 means that > @@ -458,6 +462,36 @@ int handle_options(int *argc, char ***argv, > } > argument= optend; > } > + else if (option_is_autoset) > + { > + if (optend) > + { > + my_getopt_error_reporter(ERROR_LEVEL, > + "%s: automatic setup request of " > + "option '--%s' cannot take an argument", > + my_progname, optp->name); heh, another argument agains --autoset- prefix. With the =AUTO value one cannot possibly have this error. So, perhaps, I'm *slighty* leaning towards the =AUTO vs --autoset. > + > + DBUG_RETURN(EXIT_NO_ARGUMENT_ALLOWED); > + } > + /* > + We support automatic setup only via get_one_option and only for > + marked options. > + */ > + if (!get_one_option || > + !(optp->var_type & GET_AUTO)) > + { > + my_getopt_error_reporter(option_is_loose ? > + WARNING_LEVEL : ERROR_LEVEL, > + "%s: automatic setup request is " > + "unsupported by option '--%s'", > + my_progname, optp->name); > + if (!option_is_loose) > + return EXIT_ARGUMENT_INVALID; > + continue; > + } > + else > + argument= autoset_my_option; > + } > else if (optp->arg_type == REQUIRED_ARG && !optend) > { > /* Check if there are more arguments after this one, > diff --git a/sql/set_var.cc b/sql/set_var.cc > index c65ca3d..2251c36 100644 > --- a/sql/set_var.cc > +++ b/sql/set_var.cc > @@ -1075,7 +1076,7 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND > *cond) > // NUMERIC_MAX_VALUE > // NUMERIC_BLOCK_SIZE > bool is_unsigned= true; > - switch (var->option.var_type) > + switch (vartype) ah, yes. thanks. > { > case GET_INT: > case GET_LONG: > @@ -1176,3 +1177,20 @@ void mark_sys_var_value_origin(void *ptr, enum > sys_var::where here) > DBUG_ASSERT(found); // variable must have been found > } > > +enum sys_var::where get_sys_var_value_origin(void *ptr) > +{ > + DBUG_ASSERT(!mysqld_server_started); // only to be used during startup > + > + for (uint i= 0; i < system_variable_hash.records; i++) > + { > + sys_var *var= (sys_var*) my_hash_element(&system_variable_hash, i); > + if (var->option.value == ptr) > + { > + return var->value_origin; //first match > + } > + } > + > + DBUG_ASSERT(1); // variable must have been found you mean DBUG_ASSERT(0); here > + return sys_var::CONFIG; > +} > + > diff --git a/sql/mysqld.cc b/sql/mysqld.cc > index 43a3f0e..21a1198 100644 > --- a/sql/mysqld.cc > +++ b/sql/mysqld.cc > @@ -4316,6 +4316,27 @@ static int init_common_variables() > } > #endif /* HAVE_SOLARIS_LARGE_PAGES */ > > + > + /* Fix host_cache_size. */ > + if (IS_SYSVAR_AUTOSIZE(&host_cache_size)) > + { > + if (max_connections <= 628 - 128) > + SYSVAR_AUTOSIZE(host_cache_size, 128 + max_connections); > + else if (max_connections <= ((ulong)(2000 - 628)) * 20 + 500) > + SYSVAR_AUTOSIZE(host_cache_size, 628 + ((max_connections - 500) / 20)); > + else > + SYSVAR_AUTOSIZE(host_cache_size, 2000); > + } > + > + /* Fix back_log */ > + if (back_log == 0 || IS_SYSVAR_AUTOSIZE(&back_log)) why back_log==0 ? > + { > + if ((900 - 50) * 5 >= max_connections) > + SYSVAR_AUTOSIZE(back_log, (50 + max_connections / 5)); > + else > + SYSVAR_AUTOSIZE(back_log, 900); > + } > + > /* connections and databases needs lots of files */ > { > uint files, wanted_files, max_open_files; > diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic > index 7c0359a..b04bdb5 100644 > --- a/sql/sys_vars.ic > +++ b/sql/sys_vars.ic > @@ -226,6 +227,7 @@ class Sys_var_integer: public sys_var > typedef Sys_var_integer<int, GET_INT, SHOW_SINT> Sys_var_int; > typedef Sys_var_integer<uint, GET_UINT, SHOW_UINT> Sys_var_uint; > typedef Sys_var_integer<ulong, GET_ULONG, SHOW_ULONG> Sys_var_ulong; > +typedef Sys_var_integer<ulong, (GET_ULONG|GET_AUTO), SHOW_ULONG> > Sys_var_aulong; Hmm, why did you make it a new type? I think the *type* of the variable doesn't depend on the auto-set behavior. The type defines storage size, how to print the value, etc. While auto-set is just a behavior modifier. I'd rather put it in flags: - READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG), + AUTO_SET READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG), > typedef Sys_var_integer<ha_rows, GET_HA_ROWS, SHOW_HA_ROWS> Sys_var_harows; > typedef Sys_var_integer<ulonglong, GET_ULL, SHOW_ULONGLONG> > Sys_var_ulonglong; > typedef Sys_var_integer<long, GET_LONG, SHOW_SLONG> Sys_var_long; > diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc > index 7a7b9d1..6d90305 100644 > --- a/sql/sys_vars.cc > +++ b/sql/sys_vars.cc > @@ -360,12 +360,12 @@ static Sys_var_mybool Sys_automatic_sp_privileges( > GLOBAL_VAR(sp_automatic_privileges), > CMD_LINE(OPT_ARG), DEFAULT(TRUE)); > > -static Sys_var_ulong Sys_back_log( > +static Sys_var_aulong Sys_back_log( > "back_log", "The number of outstanding connection requests " > "MySQL can have. This comes into play when the main MySQL thread " s/MySQL/MariaDB/ I suppose > "gets very many connection requests in a very short time", > READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG), > - VALID_RANGE(1, 65535), DEFAULT(150), BLOCK_SIZE(1)); > + VALID_RANGE(0, 65535), DEFAULT(150), BLOCK_SIZE(1)); > > static Sys_var_charptr Sys_basedir( > "basedir", "Path to installation directory. All paths are " > @@ -2751,16 +2743,38 @@ static bool check_query_cache_type(sys_var *self, THD > *thd, set_var *var) > my_error(ER_QUERY_CACHE_IS_DISABLED, MYF(0)); > return true; > } > - if (var->type != OPT_GLOBAL && > - global_system_variables.query_cache_type == 0 && > - var->value->val_int() != 0) > + > + if (var->type != OPT_GLOBAL && global_system_variables.query_cache_type == > 0) > { > - my_error(ER_QUERY_CACHE_IS_GLOBALY_DISABLED, MYF(0)); > - return true; > - } > + uint value= 0 /*default is off*/; > + if (var->value) > + { > + if (var->value->result_type() == INT_RESULT) > + value= var->value->val_int(); > + else > + { > + char buff[STRING_BUFFER_USUAL_SIZE]; > + String str(buff, sizeof(buff), system_charset_info), *res; > + if (!(res=var->value->val_str(&str))) > + return true; > + if (res->length() != 3 || > + my_toupper(res->charset(), res->ptr()[0]) != 'O' || > + my_toupper(res->charset(), res->ptr()[1]) != 'F' || > + my_toupper(res->charset(), res->ptr()[2]) != 'F') eh? query_cache_type is ENUM variable, there is no need to compare string values manually. > + value= 1; // set to something not 0 > + } > + } > > + if (value != 0) > + { > + my_error(ER_QUERY_CACHE_IS_GLOBALY_DISABLED, MYF(0)); > + return true; > + } > + } > return false; > } > + > + > static bool fix_query_cache_type(sys_var *self, THD *thd, enum_var_type type) > { > if (type != OPT_GLOBAL) > diff --git a/unittest/mysys/CMakeLists.txt b/unittest/mysys/CMakeLists.txt > index 8c09a46..6564e09 100644 > --- a/unittest/mysys/CMakeLists.txt > +++ b/unittest/mysys/CMakeLists.txt > @@ -13,7 +13,7 @@ > # along with this program; if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > -MY_ADD_TESTS(bitmap base64 my_vsnprintf my_atomic my_rdtsc lf my_malloc > +MY_ADD_TESTS(bitmap base64 my_vsnprintf my_atomic my_rdtsc lf my_malloc > my_getopt Ah, that's great, thanks! Long overdue. > LINK_LIBRARIES mysys) > > MY_ADD_TESTS(ma_dyncol Regards, Sergei _______________________________________________ Mailing list: https://launchpad.net/~maria-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~maria-developers More help : https://help.launchpad.net/ListHelp

