From a8dacae6f65d87d620e4af17ea210349f9e25cba Mon Sep 17 00:00:00 2001 From: MySQL Build Team Date: Wed, 12 Jan 2011 23:07:20 +0100 Subject: [PATCH 1/9] bumping version for 5.5.9 build --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f85cac84d7e..17335ff3fc5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=5 MYSQL_VERSION_MINOR=5 -MYSQL_VERSION_PATCH=9 +MYSQL_VERSION_PATCH=10 MYSQL_VERSION_EXTRA= From 3571aa4f71f61124df2cd6aaf8455071b9d5d61f Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Wed, 2 Feb 2011 10:38:50 +0300 Subject: [PATCH 2/9] Bug #59148 - made tests experimental --- mysql-test/collections/default.experimental | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/collections/default.experimental b/mysql-test/collections/default.experimental index ea2f63314dd..0366bc7b949 100644 --- a/mysql-test/collections/default.experimental +++ b/mysql-test/collections/default.experimental @@ -30,6 +30,8 @@ sys_vars.rpl_semi_sync_master_enabled_basic # Bug #59148 2011-01-10 joro 'INSTAL sys_vars.rpl_semi_sync_master_timeout_basic # Bug #59148 2011-01-10 joro 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries sys_vars.rpl_semi_sync_master_trace_level_basic # Bug #59148 2011-01-10 joro 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries sys_vars.rpl_semi_sync_master_wait_no_slave_basic # Bug #59148 2011-01-10 joro 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries +rpl.rpl_semi_sync_event # Bug #59148 2011-02-02 svoj 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries +rpl.rpl_semi_sync # Bug #59148 2011-02-02 svoj 'INSTALL PLUGIN rpl_semi_sync_master' fails in release build with debug binaries # BUG #59055 : All ndb tests should be removed from the repository # Leaving the sys_vars tests for now. sys_vars.all_vars.test fails on removing ndb tests From e9fc441a525de89be0295ef1766c72a7e39c9b1d Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Fri, 11 Feb 2011 12:54:16 +0300 Subject: [PATCH 3/9] Bug#59685 crash in String::length with date types The crash happens because Item_cache which is result holder for Item_subselect can't correctly convert a DATETIME value from string to int representation. The fix is to disable constant item convertion for subselect(partial rollback of bug52157 fix). --- mysql-test/r/type_date.result | 12 ++++++++++++ mysql-test/t/type_date.test | 12 ++++++++++++ sql/item_cmpfunc.cc | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/type_date.result b/mysql-test/r/type_date.result index 41345be5b8d..17e617758b4 100644 --- a/mysql-test/r/type_date.result +++ b/mysql-test/r/type_date.result @@ -296,6 +296,18 @@ the_date the_time the_date the_time 2010-01-01 01:01:01 2010-01-01 01:01:01 DROP TABLE t1; DROP VIEW v1; +# +# Bug#59685 crash in String::length with date types +# +CREATE TABLE t1(a DATE, b YEAR, KEY(a)); +INSERT INTO t1 VALUES ('2011-01-01',2011); +SELECT b = (SELECT CONVERT(a, DATE) FROM t1 GROUP BY a) FROM t1; +b = (SELECT CONVERT(a, DATE) FROM t1 GROUP BY a) +0 +SELECT b = CONVERT((SELECT CONVERT(a, DATE) FROM t1 GROUP BY a), DATE) FROM t1; +b = CONVERT((SELECT CONVERT(a, DATE) FROM t1 GROUP BY a), DATE) +0 +DROP TABLE t1; End of 5.1 tests # # Bug #33629: last_day function can return null, but has 'not null' diff --git a/mysql-test/t/type_date.test b/mysql-test/t/type_date.test index 6dec86dacab..9a21d8b370d 100644 --- a/mysql-test/t/type_date.test +++ b/mysql-test/t/type_date.test @@ -266,6 +266,18 @@ SELECT * FROM t1 JOIN v1 ON addtime( t1.the_date, t1.the_time ) = DROP TABLE t1; DROP VIEW v1; +--echo # +--echo # Bug#59685 crash in String::length with date types +--echo # + +CREATE TABLE t1(a DATE, b YEAR, KEY(a)); +INSERT INTO t1 VALUES ('2011-01-01',2011); + +SELECT b = (SELECT CONVERT(a, DATE) FROM t1 GROUP BY a) FROM t1; +SELECT b = CONVERT((SELECT CONVERT(a, DATE) FROM t1 GROUP BY a), DATE) FROM t1; + +DROP TABLE t1; + --echo End of 5.1 tests --echo # diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 67635c73b43..6be1d09323d 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -403,7 +403,7 @@ static bool convert_constant_item(THD *thd, Item_field *field_item, Field *field= field_item->field; int result= 0; - if ((*item)->const_item()) + if (!(*item)->with_subselect && (*item)->const_item()) { TABLE *table= field->table; ulonglong orig_sql_mode= thd->variables.sql_mode; From 77c0f33ee2b2ad46088364630275735f9d744ed2 Mon Sep 17 00:00:00 2001 From: Guilhem Bichot Date: Fri, 11 Feb 2011 15:00:09 +0100 Subject: [PATCH 4/9] Fix for BUG#59894 "set optimizer_switch to e or d causes invalid memory writes/valgrind warnings": due to prefix support, the argument "e" was overwritten with its full value "engine_condition_pushdown", which caused a buffer overrun. This was wrong usage of find_type(); other wrong usages are fixed here too. Please start reading with the comment of typelib.c. --- client/mysqladmin.cc | 7 +-- client/mysqldump.c | 4 +- client/mysqltest.cc | 2 +- include/mysql.h.pp | 2 +- include/typelib.h | 14 +++++- mysql-test/r/mysqldump.result | 32 ++++++++++++ .../sys_vars/r/optimizer_switch_basic.result | 7 +++ .../sys_vars/t/optimizer_switch_basic.test | 8 +++ mysql-test/t/mysqldump.test | 10 ++++ mysys/default.c | 4 +- mysys/my_getopt.c | 4 +- mysys/typelib.c | 49 +++++++++---------- sql-common/client.c | 13 +++-- sql/sql_db.cc | 6 +-- sql/sql_handler.cc | 5 +- sql/sql_help.cc | 12 +++-- sql/strfunc.cc | 4 +- sql/table.cc | 4 +- storage/myisam/myisamchk.c | 5 +- storage/myisammrg/myrg_open.c | 6 +-- 20 files changed, 136 insertions(+), 62 deletions(-) diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index 580caa38c0d..82cea8e78c9 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -369,7 +369,8 @@ int main(int argc,char *argv[]) /* Return 0 if all commands are PING */ for (; argc > 0; argv++, argc--) { - if (find_type(argv[0], &command_typelib, 2) != ADMIN_PING) + if (find_type(argv[0], &command_typelib, FIND_TYPE_BASIC) != + ADMIN_PING) { error= 1; break; @@ -592,7 +593,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) for (; argc > 0 ; argv++,argc--) { - switch (find_type(argv[0],&command_typelib,2)) { + switch (find_type(argv[0],&command_typelib, FIND_TYPE_BASIC)) { case ADMIN_CREATE: { char buff[FN_REFLEN+20]; @@ -931,7 +932,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) if (typed_password[0]) { - bool old= (find_type(argv[0], &command_typelib, 2) == + bool old= (find_type(argv[0], &command_typelib, FIND_TYPE_BASIC) == ADMIN_OLD_PASSWORD); #ifdef __WIN__ size_t pw_len= strlen(typed_password); diff --git a/client/mysqldump.c b/client/mysqldump.c index 66f0c2801f5..2dba7d7cfe8 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -4644,7 +4644,7 @@ static ulong find_set(TYPELIB *lib, const char *x, uint length, for (; pos != end && *pos != ','; pos++) ; var_len= (uint) (pos - start); strmake(buff, start, min(sizeof(buff) - 1, var_len)); - find= find_type(buff, lib, var_len); + find= find_type(buff, lib, FIND_TYPE_BASIC); if (!find) { *err_pos= (char*) start; diff --git a/client/mysqltest.cc b/client/mysqltest.cc index ffc99a3dffd..dc1bba588f0 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -8017,7 +8017,7 @@ void get_command_type(struct st_command* command) save= command->query[command->first_word_len]; command->query[command->first_word_len]= 0; - type= find_type(command->query, &command_typelib, 1+2); + type= find_type(command->query, &command_typelib, FIND_TYPE_NO_PREFIX); command->query[command->first_word_len]= save; if (type > 0) { diff --git a/include/mysql.h.pp b/include/mysql.h.pp index 0a5c3d83148..169a8b30e2b 100644 --- a/include/mysql.h.pp +++ b/include/mysql.h.pp @@ -227,7 +227,7 @@ typedef struct st_typelib { extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); extern int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option); -extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +extern int find_type(const char *x, const TYPELIB *typelib, unsigned int flags); extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); extern const char *get_type(TYPELIB *typelib,unsigned int nr); extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); diff --git a/include/typelib.h b/include/typelib.h index 3badb14c96e..00dbafea34e 100644 --- a/include/typelib.h +++ b/include/typelib.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,17 @@ typedef struct st_typelib { /* Different types saved here */ extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); extern int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option); -extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name); +#define FIND_TYPE_BASIC 0 +/** makes @c find_type() require the whole name, no prefix */ +#define FIND_TYPE_NO_PREFIX (1 << 0) +/** always implicitely on, so unused, but old code may pass it */ +#define FIND_TYPE_NO_OVERWRITE (1 << 1) +/** makes @c find_type() accept a number */ +#define FIND_TYPE_ALLOW_NUMBER (1 << 2) +/** makes @c find_type() treat ',' as terminator */ +#define FIND_TYPE_COMMA_TERM (1 << 3) + +extern int find_type(const char *x, const TYPELIB *typelib, unsigned int flags); extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); extern const char *get_type(TYPELIB *typelib,unsigned int nr); extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from); diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index dd3ea5e9716..7f480ac06df 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -4593,3 +4593,35 @@ DROP TABLE `comment_table`; # # End of 5.1 tests # +# +# Verify that two modes can be given in --compatible; +# and are reflected in SET SQL_MODE in the mysqldump output. +# Also verify that a prefix of the mode's name is enough. +# +CREATE TABLE t1 (a INT); +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +DROP TABLE t1; diff --git a/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result b/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result index acc8cd699f8..dfd776c9970 100644 --- a/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result +++ b/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result @@ -60,6 +60,13 @@ set session optimizer_switch="index_merge"; ERROR 42000: Variable 'optimizer_switch' can't be set to the value of 'index_merge' set session optimizer_switch="foobar"; ERROR 42000: Variable 'optimizer_switch' can't be set to the value of 'foobar' +# +# Bug#59894 set optimizer_switch to e or d causes invalid +# memory writes/valgrind warnings + +set global optimizer_switch = 'd'; +set global optimizer_switch = 'e'; +ERROR 42000: Variable 'optimizer_switch' can't be set to the value of 'e' SET @@global.optimizer_switch = @start_global_value; SELECT @@global.optimizer_switch; @@global.optimizer_switch diff --git a/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test b/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test index 4267b3726aa..df1a3511fa1 100644 --- a/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test +++ b/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test @@ -46,5 +46,13 @@ set session optimizer_switch="index_merge"; --error ER_WRONG_VALUE_FOR_VAR set session optimizer_switch="foobar"; +--echo # +--echo # Bug#59894 set optimizer_switch to e or d causes invalid +--echo # memory writes/valgrind warnings +--echo +set global optimizer_switch = 'd'; # means default +--error ER_WRONG_VALUE_FOR_VAR +set global optimizer_switch = 'e'; + SET @@global.optimizer_switch = @start_global_value; SELECT @@global.optimizer_switch; diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 8ffa2e164cd..9e74023030e 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -2182,5 +2182,15 @@ DROP TABLE `comment_table`; --echo # End of 5.1 tests --echo # +--echo # +--echo # Verify that two modes can be given in --compatible; +--echo # and are reflected in SET SQL_MODE in the mysqldump output. +--echo # Also verify that a prefix of the mode's name is enough. +--echo # +CREATE TABLE t1 (a INT); +# no_t = no_table_options; no_f = no_field_options +--exec $MYSQL_DUMP --compatible=no_t,no_f --skip-comments test +DROP TABLE t1; + # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc diff --git a/mysys/default.c b/mysys/default.c index 9a4b990f003..25cef2a3a7f 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -376,7 +376,7 @@ static int handle_default_option(void *in_ctx, const char *group_name, if (!option) return 0; - if (find_type((char *)group_name, ctx->group, 3)) + if (find_type((char *)group_name, ctx->group, FIND_TYPE_NO_PREFIX)) { if (!(tmp= alloc_root(ctx->alloc, strlen(option) + 1))) return 1; diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 6f7ed070ccf..ac4ae46eab5 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2006 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -695,7 +695,7 @@ static int setval(const struct my_option *opts, void *value, char *argument, break; case GET_ENUM: { - int type= find_type(argument, opts->typelib, 2); + int type= find_type(argument, opts->typelib, FIND_TYPE_BASIC); if (type == 0) { /* diff --git a/mysys/typelib.c b/mysys/typelib.c index 7681ff581ac..c0d37e26ecf 100644 --- a/mysys/typelib.c +++ b/mysys/typelib.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option) int res; const char **ptr; - if ((res= find_type((char *) x, typelib, 2)) <= 0) + if ((res= find_type((char *) x, typelib, FIND_TYPE_BASIC)) <= 0) { ptr= typelib->type_names; if (!*x) @@ -48,16 +48,13 @@ int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option) Search after a string in a list of strings. Endspace in x is not compared. @param x String to find - @param lib TYPELIB (struct of pointer to values + count) - @param full_name bitmap of what to do - If & 1 accept only whole names - If & 2 don't expand if half field - If & 4 allow #number# as type - If & 8 use ',' as string terminator - - @note - If part, uniq field is found and full_name == 0 then x is expanded - to full field. + @param typelib TYPELIB (struct of pointer to values + count) + @param flags flags to tune behaviour: a combination of + FIND_TYPE_NO_PREFIX + FIND_TYPE_ALLOW_NUMBER + FIND_TYPE_COMMA_TERM. + FIND_TYPE_NO_OVERWRITE can be passed but is + superfluous (is always implicitely on). @retval -1 Too many matching values @@ -68,15 +65,17 @@ int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option) */ -int find_type(char *x, const TYPELIB *typelib, uint full_name) +int find_type(const char *x, const TYPELIB *typelib, uint flags) { int find,pos; int UNINIT_VAR(findpos); /* guarded by find */ - reg1 char * i; - reg2 const char *j; + const char *i; + const char *j; DBUG_ENTER("find_type"); DBUG_PRINT("enter",("x: '%s' lib: 0x%lx", x, (long) typelib)); + DBUG_ASSERT(!(flags & ~(FIND_TYPE_NO_PREFIX | FIND_TYPE_ALLOW_NUMBER | + FIND_TYPE_NO_OVERWRITE | FIND_TYPE_COMMA_TERM))); if (!typelib->count) { DBUG_PRINT("exit",("no count")); @@ -86,24 +85,26 @@ int find_type(char *x, const TYPELIB *typelib, uint full_name) for (pos=0 ; (j=typelib->type_names[pos]) ; pos++) { for (i=x ; - *i && (!(full_name & 8) || !is_field_separator(*i)) && + *i && (!(flags & FIND_TYPE_COMMA_TERM) || !is_field_separator(*i)) && my_toupper(&my_charset_latin1,*i) == my_toupper(&my_charset_latin1,*j) ; i++, j++) ; if (! *j) { while (*i == ' ') i++; /* skip_end_space */ - if (! *i || ((full_name & 8) && is_field_separator(*i))) + if (! *i || ((flags & FIND_TYPE_COMMA_TERM) && is_field_separator(*i))) DBUG_RETURN(pos+1); } - if ((!*i && (!(full_name & 8) || !is_field_separator(*i))) && - (!*j || !(full_name & 1))) + if ((!*i && + (!(flags & FIND_TYPE_COMMA_TERM) || !is_field_separator(*i))) && + (!*j || !(flags & FIND_TYPE_NO_PREFIX))) { find++; findpos=pos; } } - if (find == 0 && (full_name & 4) && x[0] == '#' && strend(x)[-1] == '#' && + if (find == 0 && (flags & FIND_TYPE_ALLOW_NUMBER) && x[0] == '#' && + strend(x)[-1] == '#' && (findpos=atoi(x+1)-1) >= 0 && (uint) findpos < typelib->count) find=1; else if (find == 0 || ! x[0]) @@ -111,13 +112,11 @@ int find_type(char *x, const TYPELIB *typelib, uint full_name) DBUG_PRINT("exit",("Couldn't find type")); DBUG_RETURN(0); } - else if (find != 1 || (full_name & 1)) + else if (find != 1 || (flags & FIND_TYPE_NO_PREFIX)) { DBUG_PRINT("exit",("Too many possybilities")); DBUG_RETURN(-1); } - if (!(full_name & 2)) - (void) strmov(x,typelib->type_names[findpos]); DBUG_RETURN(findpos+1); } /* find_type */ @@ -192,7 +191,7 @@ my_ulonglong find_typeset(char *x, TYPELIB *lib, int *err) x++; if (x[0] && x[1]) /* skip separator if found */ x++; - if ((find= find_type(i, lib, 2 | 8) - 1) < 0) + if ((find= find_type(i, lib, FIND_TYPE_COMMA_TERM) - 1) < 0) DBUG_RETURN(0); result|= (ULL(1) << find); } @@ -276,7 +275,7 @@ static TYPELIB on_off_default_typelib= {array_elements(on_off_default_names)-1, static uint parse_name(const TYPELIB *lib, const char **strpos, const char *end) { const char *pos= *strpos; - uint find= find_type((char*)pos, lib, 8); + uint find= find_type(pos, lib, FIND_TYPE_COMMA_TERM); for (; pos != end && *pos != '=' && *pos !=',' ; pos++); *strpos= pos; return find; diff --git a/sql-common/client.c b/sql-common/client.c index 0ff03f6609b..90d07f3e409 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1145,10 +1145,10 @@ enum option_id { OPT_ssl_key, OPT_ssl_cert, OPT_ssl_ca, OPT_ssl_capath, OPT_character_sets_dir, OPT_default_character_set, OPT_interactive_timeout, OPT_connect_timeout, OPT_local_infile, OPT_disable_local_infile, - OPT_replication_probe, OPT_enable_reads_from_master, OPT_repl_parse_query, OPT_ssl_cipher, OPT_max_allowed_packet, OPT_protocol, OPT_shared_memory_base_name, OPT_multi_results, OPT_multi_statements, OPT_multi_queries, OPT_secure_auth, OPT_report_data_truncation, OPT_plugin_dir, OPT_default_auth, + OPT_keep_this_one_last }; static TYPELIB option_types={array_elements(default_options)-1, @@ -1198,6 +1198,9 @@ void mysql_read_default_options(struct st_mysql_options *options, DBUG_ENTER("mysql_read_default_options"); DBUG_PRINT("enter",("file: %s group: %s",filename,group ? group :"NULL")); + compile_time_assert(OPT_keep_this_one_last == + array_elements(default_options)); + argc=1; argv=argv_buff; argv_buff[0]= (char*) "client"; groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0; @@ -1222,7 +1225,7 @@ void mysql_read_default_options(struct st_mysql_options *options, /* Change all '_' in variable name to '-' */ for (end= *option ; *(end= strcend(end,'_')) ; ) *end= '-'; - switch (find_type(*option+2,&option_types,2)) { + switch (find_type(*option + 2, &option_types, FIND_TYPE_BASIC)) { case OPT_port: if (opt_arg) options->port=atoi(opt_arg); @@ -1338,8 +1341,8 @@ void mysql_read_default_options(struct st_mysql_options *options, options->max_allowed_packet= atoi(opt_arg); break; case OPT_protocol: - if ((options->protocol= find_type(opt_arg, - &sql_protocol_typelib,0)) <= 0) + if ((options->protocol= find_type(opt_arg, &sql_protocol_typelib, + FIND_TYPE_BASIC)) <= 0) { fprintf(stderr, "Unknown option to protocol: %s\n", opt_arg); exit(1); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 38f39ec0be7..6c3024d16df 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1038,9 +1038,9 @@ static bool find_db_tables_and_rm_known_files(THD *thd, MY_DIR *dirp, } if (!(extension= strrchr(file->name, '.'))) extension= strend(file->name); - if (find_type(extension, &deletable_extentions,1+2) <= 0) + if (find_type(extension, &deletable_extentions, FIND_TYPE_NO_PREFIX) <= 0) { - if (find_type(extension, ha_known_exts(),1+2) <= 0) + if (find_type(extension, ha_known_exts(), FIND_TYPE_NO_PREFIX) <= 0) *found_other_files= true; continue; } diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index b5cd3ac9e9a..cd40af5a46d 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2004 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -613,7 +613,8 @@ retry: if (keyname) { - if ((keyno=find_type(keyname, &table->s->keynames, 1+2)-1)<0) + if ((keyno= find_type(keyname, &table->s->keynames, + FIND_TYPE_NO_PREFIX) - 1) < 0) { my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias); goto err; diff --git a/sql/sql_help.cc b/sql/sql_help.cc index 7d106fbe936..858205f8da6 100644 --- a/sql/sql_help.cc +++ b/sql/sql_help.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -284,10 +284,12 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations, Field *rtopic_id, *rkey_id; DBUG_ENTER("get_topics_for_keyword"); - if ((iindex_topic= find_type((char*) primary_key_name, - &topics->s->keynames, 1+2)-1)<0 || - (iindex_relations= find_type((char*) primary_key_name, - &relations->s->keynames, 1+2)-1)<0) + if ((iindex_topic= + find_type(primary_key_name, &topics->s->keynames, + FIND_TYPE_NO_PREFIX) - 1) < 0 || + (iindex_relations= + find_type(primary_key_name, &relations->s->keynames, + FIND_TYPE_NO_PREFIX) - 1) < 0) { my_message(ER_CORRUPT_HELP_DB, ER(ER_CORRUPT_HELP_DB), MYF(0)); DBUG_RETURN(-1); diff --git a/sql/strfunc.cc b/sql/strfunc.cc index a0e2f39f8dc..0c0742b3805 100644 --- a/sql/strfunc.cc +++ b/sql/strfunc.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 MySQL AB +/* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -96,7 +96,7 @@ ulonglong find_set(TYPELIB *lib, const char *str, uint length, CHARSET_INFO *cs, /* Function to find a string in a TYPELIB - (Same format as mysys/typelib.c) + (similar to find_type() of mysys/typelib.c) SYNOPSIS find_type() diff --git a/sql/table.cc b/sql/table.cc index 0ce7d7427d3..84aea77bc76 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1444,8 +1444,8 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head, /* Fix key->name and key_part->field */ if (key_parts) { - uint primary_key=(uint) (find_type((char*) primary_key_name, - &share->keynames, 3) - 1); + uint primary_key=(uint) (find_type(primary_key_name, &share->keynames, + FIND_TYPE_NO_PREFIX) - 1); longlong ha_option= handler_file->ha_table_flags(); keyinfo= share->key_info; key_part= keyinfo->key_part; diff --git a/storage/myisam/myisamchk.c b/storage/myisam/myisamchk.c index 35b68fe00df..d56f1e18930 100644 --- a/storage/myisam/myisamchk.c +++ b/storage/myisam/myisamchk.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2003 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -673,7 +673,8 @@ get_one_option(int optid, int method; enum_mi_stats_method UNINIT_VAR(method_conv); myisam_stats_method_str= argument; - if ((method=find_type(argument, &myisam_stats_method_typelib, 2)) <= 0) + if ((method= find_type(argument, &myisam_stats_method_typelib, + FIND_TYPE_BASIC)) <= 0) { fprintf(stderr, "Invalid value of stats_method: %s.\n", argument); exit(1); diff --git a/storage/myisammrg/myrg_open.c b/storage/myisammrg/myrg_open.c index c545aff912f..533e5d13cdd 100644 --- a/storage/myisammrg/myrg_open.c +++ b/storage/myisammrg/myrg_open.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2006 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -77,7 +77,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) { if (!strncmp(buff+1,"INSERT_METHOD=",14)) { /* Lookup insert method */ - int tmp=find_type(buff+15,&merge_insert_method,2); + int tmp= find_type(buff + 15, &merge_insert_method, FIND_TYPE_BASIC); found_merge_insert_method = (uint) (tmp >= 0 ? tmp : 0); } continue; /* Skip comments */ @@ -271,7 +271,7 @@ MYRG_INFO *myrg_parent_open(const char *parent_name, { /* Compare buffer with global methods list: merge_insert_method. */ insert_method= find_type(child_name_buff + 15, - &merge_insert_method, 2); + &merge_insert_method, FIND_TYPE_BASIC); } continue; } From 32e6d14728673debf6b005a4418248ae017d7ac3 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Fri, 11 Feb 2011 16:20:27 +0100 Subject: [PATCH 5/9] Bug #59686 crash in String::copy() with time data type The problem was that Item_sum_hybrid::val_xxx() did not propagate null values up the expression tree. --- mysql-test/r/func_time.result | 12 ++++++++++++ mysql-test/t/func_time.test | 8 ++++++++ sql/item_sum.cc | 20 ++++++++++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index 2a95b234548..0ffc988519c 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -1368,3 +1368,15 @@ SELECT SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR); SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR) NULL # +# Bug #59686 crash in String::copy() with time data type +# +SELECT min(timestampadd(month, 1>'', from_days('%Z'))); +min(timestampadd(month, 1>'', from_days('%Z'))) +NULL +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '%Z' +create table t1(a time); +insert into t1 values ('00:00:00'),('00:01:00'); +select 1 from t1 where 1 < some (select cast(a as datetime) from t1); +1 +drop table t1; diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index eaa592c2ad5..0afc882ea6c 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -880,5 +880,13 @@ DROP TABLE t1; SELECT WEEK(STR_TO_DATE(NULL,0)); SELECT SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR); +--echo # +--echo # Bug #59686 crash in String::copy() with time data type --echo # +SELECT min(timestampadd(month, 1>'', from_days('%Z'))); + +create table t1(a time); +insert into t1 values ('00:00:00'),('00:01:00'); +select 1 from t1 where 1 < some (select cast(a as datetime) from t1); +drop table t1; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index adfa1ea66f0..8855ef05c84 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1903,7 +1903,10 @@ double Item_sum_hybrid::val_real() DBUG_ASSERT(fixed == 1); if (null_value) return 0.0; - return value->val_real(); + double retval= value->val_real(); + if ((null_value= value->null_value)) + DBUG_ASSERT(retval == 0.0); + return retval; } longlong Item_sum_hybrid::val_int() @@ -1911,7 +1914,10 @@ longlong Item_sum_hybrid::val_int() DBUG_ASSERT(fixed == 1); if (null_value) return 0; - return value->val_int(); + longlong retval= value->val_int(); + if ((null_value= value->null_value)) + DBUG_ASSERT(retval == 0); + return retval; } @@ -1920,7 +1926,10 @@ my_decimal *Item_sum_hybrid::val_decimal(my_decimal *val) DBUG_ASSERT(fixed == 1); if (null_value) return 0; - return value->val_decimal(val); + my_decimal *retval= value->val_decimal(val); + if ((null_value= value->null_value)) + DBUG_ASSERT(retval == NULL); + return retval; } @@ -1930,7 +1939,10 @@ Item_sum_hybrid::val_str(String *str) DBUG_ASSERT(fixed == 1); if (null_value) return 0; - return value->val_str(str); + String *retval= value->val_str(str); + if ((null_value= value->null_value)) + DBUG_ASSERT(retval == NULL); + return retval; } From 19fc30a6d7900b7725b6fe6f5ef248c40cce4143 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Thu, 17 Feb 2011 13:41:25 +0100 Subject: [PATCH 6/9] Bug #11766860 - 60085: CRASH IN ITEM::SAVE_IN_FIELD() WITH TIME DATA TYPE This assumption in Item_cache_datetime::cache_value_int was wrong: - /* Assume here that the underlying item will do correct conversion.*/ - int_value= example->val_int_result(); --- mysql-test/r/subselect_innodb.result | 9 ++++++ mysql-test/t/subselect_innodb.test | 9 ++++++ sql/item.cc | 41 ++++++++++++++++++++++++---- sql/item.h | 2 +- sql/item_cmpfunc.cc | 1 + sql/item_subselect.cc | 13 +++++---- 6 files changed, 62 insertions(+), 13 deletions(-) diff --git a/mysql-test/r/subselect_innodb.result b/mysql-test/r/subselect_innodb.result index 6c6d563e284..ab623ad6a28 100644 --- a/mysql-test/r/subselect_innodb.result +++ b/mysql-test/r/subselect_innodb.result @@ -245,3 +245,12 @@ x NULL drop procedure p1; drop tables t1,t2,t3; +# +# Bug#60085 crash in Item::save_in_field() with time data type +# +CREATE TABLE t1(a date, b int, unique(b), unique(a), key(b)) engine=innodb; +INSERT INTO t1 VALUES ('2011-05-13', 0); +SELECT * FROM t1 WHERE b < (SELECT CAST(a as date) FROM t1 GROUP BY a); +a b +2011-05-13 0 +DROP TABLE t1; diff --git a/mysql-test/t/subselect_innodb.test b/mysql-test/t/subselect_innodb.test index 573fe0c1810..73491417e0c 100644 --- a/mysql-test/t/subselect_innodb.test +++ b/mysql-test/t/subselect_innodb.test @@ -238,3 +238,12 @@ call p1(); call p1(); drop procedure p1; drop tables t1,t2,t3; + +--echo # +--echo # Bug#60085 crash in Item::save_in_field() with time data type +--echo # + +CREATE TABLE t1(a date, b int, unique(b), unique(a), key(b)) engine=innodb; +INSERT INTO t1 VALUES ('2011-05-13', 0); +SELECT * FROM t1 WHERE b < (SELECT CAST(a as date) FROM t1 GROUP BY a); +DROP TABLE t1; diff --git a/sql/item.cc b/sql/item.cc index c7787d65c22..c15ef624a08 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1059,7 +1059,9 @@ int Item::save_in_field_no_warnings(Field *field, bool no_conversions) ulonglong sql_mode= thd->variables.sql_mode; thd->variables.sql_mode&= ~(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE); thd->count_cuted_fields= CHECK_FIELD_IGNORE; + res= save_in_field(field, no_conversions); + thd->count_cuted_fields= tmp; dbug_tmp_restore_column_map(table->write_set, old_map); thd->variables.sql_mode= sql_mode; @@ -7462,16 +7464,43 @@ longlong Item_cache_int::val_int() bool Item_cache_datetime::cache_value_int() { if (!example) - return FALSE; + return false; - value_cached= TRUE; + value_cached= true; // Mark cached string value obsolete - str_value_cached= FALSE; - /* Assume here that the underlying item will do correct conversion.*/ - int_value= example->val_int_result(); + str_value_cached= false; + + MYSQL_TIME ltime; + const bool eval_error= + (field_type() == MYSQL_TYPE_TIME) ? + example->get_time(<ime) : + example->get_date(<ime, TIME_FUZZY_DATE); + + if (eval_error) + int_value= 0; + else + { + switch(field_type()) + { + case MYSQL_TYPE_DATETIME: + case MYSQL_TYPE_TIMESTAMP: + int_value= TIME_to_ulonglong_datetime(<ime); + break; + case MYSQL_TYPE_TIME: + int_value= TIME_to_ulonglong_time(<ime); + break; + default: + int_value= TIME_to_ulonglong_date(<ime); + break; + } + if (ltime.neg) + int_value= -int_value; + } + null_value= example->null_value; unsigned_flag= example->unsigned_flag; - return TRUE; + + return true; } diff --git a/sql/item.h b/sql/item.h index fc203f03e79..6cd91f03604 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3449,7 +3449,7 @@ class Item_cache_datetime: public Item_cache { protected: String str_value; - ulonglong int_value; + longlong int_value; bool str_value_cached; public: Item_cache_datetime(enum_field_types field_type_arg): diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 6be1d09323d..9586004c630 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -403,6 +403,7 @@ static bool convert_constant_item(THD *thd, Item_field *field_item, Field *field= field_item->field; int result= 0; + // TODO: revert Bug#59685 here, as we now cache datetimes correctly. if (!(*item)->with_subselect && (*item)->const_item()) { TABLE *table= field->table; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 6b54a088112..118bae7342f 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -256,30 +256,31 @@ bool Item_subselect::walk(Item_processor processor, bool walk_subquery, bool Item_subselect::exec() { - int res; + DBUG_ENTER("Item_subselect::exec"); /* Do not execute subselect in case of a fatal error or if the query has been killed. */ if (thd->is_error() || thd->killed) - return 1; + DBUG_RETURN(true); DBUG_ASSERT(!thd->lex->context_analysis_only); /* Simulate a failure in sub-query execution. Used to test e.g. out of memory or query being killed conditions. */ - DBUG_EXECUTE_IF("subselect_exec_fail", return 1;); + DBUG_EXECUTE_IF("subselect_exec_fail", DBUG_RETURN(true);); - res= engine->exec(); + bool res= engine->exec(); if (engine_changed) { engine_changed= 0; - return exec(); + res= exec(); + DBUG_RETURN(res); } - return (res); + DBUG_RETURN(res); } Item::Type Item_subselect::type() const From 8576d2a118f13842892d774383579e94cd02d6fb Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Thu, 17 Feb 2011 13:57:42 +0100 Subject: [PATCH 7/9] Revert 59685, as we now cache datetimes correctly. See also bug 11775312, all queries listed there now have the same results here, as they have in 5.1 --- mysql-test/r/type_date.result | 4 ++-- sql/item_cmpfunc.cc | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/type_date.result b/mysql-test/r/type_date.result index 17e617758b4..96bd025aaed 100644 --- a/mysql-test/r/type_date.result +++ b/mysql-test/r/type_date.result @@ -303,10 +303,10 @@ CREATE TABLE t1(a DATE, b YEAR, KEY(a)); INSERT INTO t1 VALUES ('2011-01-01',2011); SELECT b = (SELECT CONVERT(a, DATE) FROM t1 GROUP BY a) FROM t1; b = (SELECT CONVERT(a, DATE) FROM t1 GROUP BY a) -0 +1 SELECT b = CONVERT((SELECT CONVERT(a, DATE) FROM t1 GROUP BY a), DATE) FROM t1; b = CONVERT((SELECT CONVERT(a, DATE) FROM t1 GROUP BY a), DATE) -0 +1 DROP TABLE t1; End of 5.1 tests # diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 9586004c630..67635c73b43 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -403,8 +403,7 @@ static bool convert_constant_item(THD *thd, Item_field *field_item, Field *field= field_item->field; int result= 0; - // TODO: revert Bug#59685 here, as we now cache datetimes correctly. - if (!(*item)->with_subselect && (*item)->const_item()) + if ((*item)->const_item()) { TABLE *table= field->table; ulonglong orig_sql_mode= thd->variables.sql_mode; From e73cd9b6c2a92a5132b59b9cc9c14b54e6739f3b Mon Sep 17 00:00:00 2001 From: Jonathan Perkin Date: Thu, 17 Feb 2011 10:10:37 -0800 Subject: [PATCH 8/9] Merge README update into the 5.5.10 release clone. --- README | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/README b/README index 48948352e12..2e18fb55a22 100644 --- a/README +++ b/README @@ -3,18 +3,29 @@ MySQL Server This is a release of MySQL, a dual-license SQL database server. For the avoidance of doubt, this particular copy of the software is released under the version 2 of the GNU General Public License. -MySQL is brought to you by the MySQL team at Oracle. +MySQL is brought to you by Oracle. Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. License information can be found in the COPYING file. +MySQL FOSS License Exception +We want free and open source software applications under certain +licenses to be able to use specified GPL-licensed MySQL client +libraries despite the fact that not all such FOSS licenses are +compatible with version 2 of the GNU General Public License. +Therefore there are special exceptions to the terms and conditions +of the GPLv2 as applied to these client libraries, which are +identified and described in more detail in the FOSS License +Exception at +. + This distribution may include materials developed by third parties. For license and attribution notices for these materials, please refer to the documentation that accompanies -this distribution (see the Licenses for Third-Party Components -appendix). A copy of the license/notices is also reproduced -below. +this distribution (see the "Licenses for Third-Party Components" +appendix) or view the online documentation at +. GPLv2 Disclaimer For the avoidance of doubt, except that if any license choice @@ -38,8 +49,6 @@ Some Reference Manual sections of special interest: chapter. - For the new features/bugfix history, see the MySQL Change History appendix. -- For currently known bugs, see the Errors and Common Problems - appendix. You can browse the MySQL Reference Manual online or download it in any of several formats at the URL given earlier in this file. From eea75513c22f074c6d7e46f14acf693bcbb0da56 Mon Sep 17 00:00:00 2001 From: Kent Boortz Date: Thu, 17 Feb 2011 19:36:19 +0100 Subject: [PATCH 9/9] The client shared library major version was changed to 18, to reflect ABI changes (Bug#60061) Bumping the version from 16 to 18, instead of 17, was done to avoid a library conflict on Mac OS X between MySQL 5.1 and MySQL 5.5. In MySQL 5.1 GNU libtool was used, that made the ABI version used in the file name to be 16, and the one stored inside the binary to be 17. MySQL 5.5 uses CMake as a build tool, that will store the same ABI number in the file name as inside the binary in Mac OS X, and then bumping the ABI number two steps avoids a conflict on Mac OS X. --- cmake/mysql_version.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/mysql_version.cmake b/cmake/mysql_version.cmake index 3ed93020e8a..5aca3c825a6 100644 --- a/cmake/mysql_version.cmake +++ b/cmake/mysql_version.cmake @@ -17,7 +17,7 @@ # Global constants, only to be changed between major releases. # -SET(SHARED_LIB_MAJOR_VERSION "16") +SET(SHARED_LIB_MAJOR_VERSION "18") SET(PROTOCOL_VERSION "10") SET(DOT_FRM_VERSION "6")