diff options
41 files changed, 278 insertions, 203 deletions
diff --git a/BUILD/compile-solaris-amd64 b/BUILD/compile-solaris-amd64 index 58e5cba7d8c..2ae8ff333e8 100755 --- a/BUILD/compile-solaris-amd64 +++ b/BUILD/compile-solaris-amd64 @@ -3,6 +3,6 @@ export LDFLAGS='-m64 -lmtmalloc -R/usr/sfw/lib/64' export CFLAGS='-mtune=i386 -D__sun -m64 -mtune=athlon64' export CXXFLAGS='-mtune=i386 -D__sun -m64 -mtune=athlon64' -cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_EXTRA_CHARSETS=complex -DWITH_READLINE=ON -DWITH_SSL=bundled -DWITH_MAX=ON -DWITH_EMBEDDED_SERVER=ON -DWITH_JEMALLOC=NO +cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_EXTRA_CHARSETS=complex -DWITH_READLINE=ON -DWITH_SSL=bundled -DWITH_MAX=ON -DWITH_EMBEDDED_SERVER=ON gmake -j6 VERBOSE=1 diff --git a/client/mysqlslap.c b/client/mysqlslap.c index afafe1de647..0beb089bf83 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -123,7 +123,8 @@ static char *host= NULL, *opt_password= NULL, *user= NULL, *default_engine= NULL, *pre_system= NULL, *post_system= NULL, - *opt_mysql_unix_port= NULL; + *opt_mysql_unix_port= NULL, + *opt_init_command= NULL; static char *opt_plugin_dir= 0, *opt_default_auth= 0; const char *delimiter= "\n"; @@ -633,6 +634,11 @@ static struct my_option my_long_options[] = GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"host", 'h', "Connect to host.", &host, &host, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"init-command", OPT_INIT_COMMAND, + "SQL Command to execute when connecting to MySQL server. Will " + "automatically be re-executed when reconnecting.", + &opt_init_command, &opt_init_command, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"iterations", 'i', "Number of times to run the tests.", &iterations, &iterations, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0}, {"no-drop", OPT_SLAP_NO_DROP, "Do not drop the schema after the test.", @@ -2245,6 +2251,8 @@ slap_connect(MYSQL *mysql) for (x= 0; x < 10; x++) { set_mysql_connect_options(mysql); + if (opt_init_command) + mysql_options(mysql, MYSQL_INIT_COMMAND, opt_init_command); if (mysql_real_connect(mysql, host, user, opt_password, create_schema_string, opt_mysql_port, diff --git a/cmake/jemalloc.cmake b/cmake/jemalloc.cmake index 5cb9c493a20..bc6bf60781d 100644 --- a/cmake/jemalloc.cmake +++ b/cmake/jemalloc.cmake @@ -15,13 +15,20 @@ MACRO (USE_BUNDLED_JEMALLOC) IF (CMAKE_BUILD_TYPE MATCHES "Debug" AND NOT APPLE) # see the comment in CMakeLists.txt LIST(APPEND JEMALLOC_CONFIGURE_OPTS --enable-debug) ENDIF() + + IF(CMAKE_GENERATOR MATCHES "Makefiles") + SET(MAKE_COMMAND ${CMAKE_MAKE_PROGRAM}) + ELSE() # Xcode/Ninja generators + SET(MAKE_COMMAND make) + ENDIF() + ExternalProject_Add(jemalloc PREFIX extra/jemalloc SOURCE_DIR ${SOURCE_DIR} BINARY_DIR ${BINARY_DIR} STAMP_DIR ${BINARY_DIR} CONFIGURE_COMMAND "${SOURCE_DIR}/configure" ${JEMALLOC_CONFIGURE_OPTS} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} "build_lib_static" + BUILD_COMMAND ${MAKE_COMMAND} "build_lib_static" INSTALL_COMMAND "" ) ADD_LIBRARY(libjemalloc STATIC IMPORTED) @@ -29,13 +36,19 @@ MACRO (USE_BUNDLED_JEMALLOC) ADD_DEPENDENCIES(libjemalloc jemalloc) ENDMACRO() -SET(WITH_JEMALLOC "yes" CACHE STRING +IF(CMAKE_SYSTEM_NAME MATCHES "Linux" OR APPLE) + # Linux and OSX are the only systems where bundled jemalloc can be built without problems, + # as they both have GNU make and jemalloc actually compiles. + # Also, BSDs use jemalloc as malloc already + SET(WITH_JEMALLOC_DEFAULT "yes") +ELSE() + SET(WITH_JEMALLOC_DEFAULT "no") +ENDIF() + +SET(WITH_JEMALLOC ${WITH_JEMALLOC_DEFAULT} CACHE STRING "Which jemalloc to use (possible values are 'no', 'bundled', 'system', 'yes' (system if possible, otherwise bundled)") MACRO (CHECK_JEMALLOC) - IF(WIN32) - SET(WITH_JEMALLOC "no") - ENDIF() IF(WITH_JEMALLOC STREQUAL "system" OR WITH_JEMALLOC STREQUAL "yes") CHECK_LIBRARY_EXISTS(jemalloc malloc_stats_print "" HAVE_JEMALLOC) IF (HAVE_JEMALLOC) diff --git a/man/mysqlslap.1 b/man/mysqlslap.1 index 7446c30a839..e795be397a2 100644 --- a/man/mysqlslap.1 +++ b/man/mysqlslap.1 @@ -578,6 +578,21 @@ Connect to the MySQL server on the given host\&. .sp -1 .IP \(bu 2.3 .\} +.\" mysqlslap: init-command option +.\" init-command option: mysqlslap +\fB\-\-init\-command=str\fR +.sp +SQL Command to execute when connecting to MySQL server\&. Will automatically be re\-executed when reconnecting\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} .\" mysqlslap: iterations option .\" iterations option: mysqlslap \fB\-\-iterations=\fR\fB\fIN\fR\fR, diff --git a/mysql-test/r/innodb_mrr_cpk.result b/mysql-test/r/innodb_mrr_cpk.result index 15ef32447a8..bcee428bc57 100644 --- a/mysql-test/r/innodb_mrr_cpk.result +++ b/mysql-test/r/innodb_mrr_cpk.result @@ -171,3 +171,26 @@ a b c d e g 2 6 two 12 2 6 DROP TABLE t1, t2; set optimizer_switch=@tmp_mdev3817; +# +# MDEV-5037: Server crash on a JOIN on a derived table with join_cache_level > 2 +# +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +CREATE TABLE t1 ( +id char(8) CHARACTER SET utf8 NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +CREATE TABLE t2 ( +id char(8) CHARACTER SET utf8 DEFAULT NULL, +url text CHARACTER SET utf8 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +insert into t1 select '03b2ca8c' from t0 A, t0 B limit 80; +insert into t2 select '03b2ca8c','' from t0 A, t0 B, t0 C; +set @tmp_mdev5037=@@join_cache_level; +set join_cache_level=3; +explain SELECT 1 FROM (SELECT url, id FROM t2 LIMIT 1 OFFSET 20) derived RIGHT JOIN t1 ON t1.id = derived.id; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL # +1 PRIMARY <derived2> hash_ALL key0 #hash#key0 25 test.t1.id # Using join buffer (flat, BNLH join) +2 DERIVED t2 ALL NULL NULL NULL NULL # +set join_cache_level= @tmp_mdev5037; +drop table t0,t1,t2; diff --git a/mysql-test/r/mysqlslap.result b/mysql-test/r/mysqlslap.result index 38a7b0a694e..d3c5107dee3 100644 --- a/mysql-test/r/mysqlslap.result +++ b/mysql-test/r/mysqlslap.result @@ -251,3 +251,7 @@ Benchmark Number of clients running queries: 1 Average number of queries per client: 0 +# +# MDEV-4684 - Enhancement request: --init-command support for mysqlslap +# +DROP TABLE t1; diff --git a/mysql-test/t/innodb_mrr_cpk.test b/mysql-test/t/innodb_mrr_cpk.test index a7b2d9c0ddd..bee8d5796ce 100644 --- a/mysql-test/t/innodb_mrr_cpk.test +++ b/mysql-test/t/innodb_mrr_cpk.test @@ -165,3 +165,30 @@ SELECT * FROM t1, t2 WHERE g = b AND ( a < 7 OR a > e ); DROP TABLE t1, t2; set optimizer_switch=@tmp_mdev3817; +--echo # +--echo # MDEV-5037: Server crash on a JOIN on a derived table with join_cache_level > 2 +--echo # +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE t1 ( + id char(8) CHARACTER SET utf8 NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE t2 ( + id char(8) CHARACTER SET utf8 DEFAULT NULL, + url text CHARACTER SET utf8 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1 select '03b2ca8c' from t0 A, t0 B limit 80; +insert into t2 select '03b2ca8c','' from t0 A, t0 B, t0 C; + +set @tmp_mdev5037=@@join_cache_level; +set join_cache_level=3; + +--replace_column 9 # +explain SELECT 1 FROM (SELECT url, id FROM t2 LIMIT 1 OFFSET 20) derived RIGHT JOIN t1 ON t1.id = derived.id; + +set join_cache_level= @tmp_mdev5037; + +drop table t0,t1,t2; diff --git a/mysql-test/t/mysqlslap.test b/mysql-test/t/mysqlslap.test index 69eaae76409..c49c4ab3d7d 100644 --- a/mysql-test/t/mysqlslap.test +++ b/mysql-test/t/mysqlslap.test @@ -73,3 +73,10 @@ DROP DATABASE bug58090; --replace_regex /queries: [0-9]+.[0-9]+/queries: TIME/ --exec $MYSQL_SLAP + +--echo # +--echo # MDEV-4684 - Enhancement request: --init-command support for mysqlslap +--echo # + +--exec $MYSQL_SLAP --create-schema=test --init-command="CREATE TABLE t1(a INT)" --silent --concurrency=1 --iterations=1 +DROP TABLE t1; diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 1b62f94c176..15c90496047 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -870,12 +870,6 @@ static int findopt(char *optpat, uint length, } } } - if (is_prefix && count == 1) - my_getopt_error_reporter(WARNING_LEVEL, - "Using unique option prefix %.*s instead of %s " - "is deprecated and will be removed in a future " - "release. Please use the full name instead.", - length, optpat, *ffname); DBUG_RETURN(count); } diff --git a/plugin/feedback/utils.cc b/plugin/feedback/utils.cc index c0227cf1292..0510140aee9 100644 --- a/plugin/feedback/utils.cc +++ b/plugin/feedback/utils.cc @@ -44,12 +44,16 @@ static const char *get_os_version_name(OSVERSIONINFOEX *ver) DWORD major = ver->dwMajorVersion; DWORD minor = ver->dwMinorVersion; + if (major == 6 && minor == 3) + { + return (ver->wProductType == VER_NT_WORKSTATION)? + "Windows 8.1":"Windows Server 2012 R2"; + } if (major == 6 && minor == 2) { return (ver->wProductType == VER_NT_WORKSTATION)? "Windows 8":"Windows Server 2012"; } - if (major == 6 && minor == 1) { return (ver->wProductType == VER_NT_WORKSTATION)? diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 488dd527744..56fa8ac8990 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -25,7 +25,6 @@ ${CMAKE_BINARY_DIR}/sql SET(GEN_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.h ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.cc -${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc ${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h ) @@ -92,6 +91,7 @@ SET (SQL_SOURCE my_apc.cc my_apc.h rpl_gtid.cc table_cache.cc + ${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc ${GEN_SOURCES} ${MYSYS_LIBWRAP_SOURCE} ) diff --git a/sql/handler.h b/sql/handler.h index 8c787b50127..a7f00f55076 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -3633,6 +3633,7 @@ public: virtual bool check_if_supported_virtual_columns(void) { return FALSE;} TABLE* get_table() { return table; } + TABLE_SHARE* get_table_share() { return table_share; } protected: /* deprecated, don't use in new engines */ inline void ha_statistic_increment(ulong SSV::*offset) const { } @@ -3884,7 +3885,7 @@ protected: #include "multi_range_read.h" -bool key_uses_partial_cols(TABLE *table, uint keyno); +bool key_uses_partial_cols(TABLE_SHARE *table, uint keyno); /* Some extern variables used with handlers */ diff --git a/sql/item.cc b/sql/item.cc index b04290f1af0..c806b1a6968 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -9720,18 +9720,10 @@ table_map Item_ref::used_tables() const } -void Item_ref::update_used_tables() +void Item_ref::update_used_tables() { if (!get_depended_from()) (*ref)->update_used_tables(); - maybe_null|= (*ref)->maybe_null; -} - -void Item_direct_view_ref::update_used_tables() -{ - Item_ref::update_used_tables(); - if (view->table && view->table->maybe_null) - maybe_null= TRUE; } table_map Item_direct_view_ref::used_tables() const diff --git a/sql/item.h b/sql/item.h index fc8cb58df7a..e03012d9403 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2105,8 +2105,6 @@ public: void update_used_tables() { update_table_bitmaps(); - if (field && field->table) - maybe_null|= field->maybe_null(); } Item *get_tmp_table_item(THD *thd); bool collect_item_field_processor(uchar * arg); @@ -3354,7 +3352,6 @@ public: void update_used_tables() { orig_item->update_used_tables(); - maybe_null|= orig_item->maybe_null; } bool const_item() const { return orig_item->const_item(); } table_map not_null_tables() const { return orig_item->not_null_tables(); } @@ -3447,7 +3444,6 @@ public: Item *replace_equal_field(uchar *arg); table_map used_tables() const; table_map not_null_tables() const; - void update_used_tables(); bool walk(Item_processor processor, bool walk_subquery, uchar *arg) { return (*ref)->walk(processor, walk_subquery, arg) || diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 256cae2e384..0fd5ee4048b 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1354,7 +1354,7 @@ int Arg_comparator::compare_e_row() void Item_func_truth::fix_length_and_dec() { - set_persist_maybe_null(0); + maybe_null= 0; null_value= 0; decimals= 0; max_length= 1; @@ -1906,8 +1906,7 @@ longlong Item_func_eq::val_int() void Item_func_equal::fix_length_and_dec() { Item_bool_func2::fix_length_and_dec(); - set_persist_maybe_null(0); - null_value= 0; + maybe_null=null_value=0; } longlong Item_func_equal::val_int() @@ -2046,7 +2045,7 @@ void Item_func_interval::fix_length_and_dec() } } } - set_persist_maybe_null(0); + maybe_null= 0; max_length= 2; used_tables_cache|= row->used_tables(); not_null_tables_cache= row->not_null_tables(); @@ -2742,7 +2741,7 @@ void Item_func_nullif::fix_length_and_dec() { Item_bool_func2::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null=1; if (args[0]) // Only false if EOM { max_length=args[0]->max_length; @@ -4646,8 +4645,6 @@ void Item_cond::update_used_tables() item->update_used_tables(); used_tables_cache|= item->used_tables(); const_item_cache&= item->const_item(); - if (!persistent_maybe_null && item->maybe_null) - maybe_null= 1; } } @@ -4826,9 +4823,10 @@ longlong Item_is_not_null_test::val_int() */ void Item_is_not_null_test::update_used_tables() { - args[0]->update_used_tables(); if (!args[0]->maybe_null) used_tables_cache= 0; /* is always true */ + else + args[0]->update_used_tables(); } @@ -5118,7 +5116,7 @@ Item_func_regex::fix_length_and_dec() int comp_res= regcomp(TRUE); if (comp_res == -1) { // Will always return NULL - set_persist_maybe_null(1); + maybe_null= 1; return; } else if (comp_res) @@ -5127,7 +5125,7 @@ Item_func_regex::fix_length_and_dec() maybe_null= args[0]->maybe_null; } else - set_persist_maybe_null(1); + maybe_null=1; } @@ -6071,8 +6069,6 @@ void Item_equal::update_used_tables() used_tables_cache|= item->used_tables(); /* see commentary at Item_equal::update_const() */ const_item_cache&= item->const_item() && !item->is_outer_field(); - if (!persistent_maybe_null && item->maybe_null) - maybe_null= 1; } } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 34c665556d0..823de615cc2 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -765,11 +765,6 @@ public: my_decimal *decimal_op(my_decimal *); bool date_op(MYSQL_TIME *ltime,uint fuzzydate); void fix_length_and_dec(); - void update_used_tables() - { - Item_func_coalesce::update_used_tables(); - maybe_null|= args[1]->maybe_null; - } const char *func_name() const { return "ifnull"; } Field *tmp_table_field(TABLE *table); uint decimal_precision() const; @@ -789,11 +784,6 @@ public: String *str_op(String *); bool fix_fields(THD *, Item **); void fix_length_and_dec(); - void update_used_tables() - { - Item_func::update_used_tables(); - maybe_null|= args[1]->maybe_null || args[2]->maybe_null; - } uint decimal_precision() const; const char *func_name() const { return "if"; } bool eval_not_null_tables(uchar *opt_arg); @@ -1259,12 +1249,6 @@ public: bool date_op(MYSQL_TIME *ltime, uint fuzzydate); bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); - void update_used_tables() - { - Item_func::update_used_tables(); - if (else_expr_num == -1 || args[else_expr_num]->maybe_null) - maybe_null= 1; - } uint decimal_precision() const; table_map not_null_tables() const { return 0; } const char *func_name() const { return "case"; } @@ -1384,14 +1368,13 @@ public: enum Functype functype() const { return ISNULL_FUNC; } void fix_length_and_dec() { - decimals=0; max_length=1; set_persist_maybe_null(0); + decimals=0; max_length=1; maybe_null=0; update_used_tables(); } const char *func_name() const { return "isnull"; } /* Optimize case of not_null_column IS NULL */ virtual void update_used_tables() { - args[0]->update_used_tables(); if (!args[0]->maybe_null) { used_tables_cache= 0; /* is always false */ @@ -1399,6 +1382,7 @@ public: } else { + args[0]->update_used_tables(); used_tables_cache= args[0]->used_tables(); const_item_cache= args[0]->const_item(); } @@ -1446,7 +1430,7 @@ public: enum Functype functype() const { return ISNOTNULL_FUNC; } void fix_length_and_dec() { - decimals=0; max_length=1; set_persist_maybe_null(0); + decimals=0; max_length=1; maybe_null=0; } const char *func_name() const { return "isnotnull"; } optimize_type select_optimize() const { return OPTIMIZE_NULL; } @@ -1517,12 +1501,6 @@ public: void cleanup(); longlong val_int(); void fix_length_and_dec(); - void update_used_tables() - { - Item_bool_func::update_used_tables(); - if (regex_is_const) - maybe_null= 1; - } const char *func_name() const { return "regexp"; } virtual inline void print(String *str, enum_query_type query_type) diff --git a/sql/item_func.cc b/sql/item_func.cc index 5af74b0116b..27f9881d91e 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -110,7 +110,7 @@ void Item_func::set_arguments(List<Item> &list) } Item_func::Item_func(List<Item> &list) - :allowed_arg_cols(1), persistent_maybe_null(0) + :allowed_arg_cols(1) { set_arguments(list); } @@ -118,7 +118,6 @@ Item_func::Item_func(List<Item> &list) Item_func::Item_func(THD *thd, Item_func *item) :Item_result_field(thd, item), allowed_arg_cols(item->allowed_arg_cols), - persistent_maybe_null(0), arg_count(item->arg_count), used_tables_cache(item->used_tables_cache), not_null_tables_cache(item->not_null_tables_cache), @@ -446,8 +445,6 @@ void Item_func::update_used_tables() args[i]->update_used_tables(); used_tables_cache|=args[i]->used_tables(); const_item_cache&=args[i]->const_item(); - if (!persistent_maybe_null && args[i]->maybe_null) - maybe_null= 1; } } @@ -1871,7 +1868,7 @@ void Item_func_div::fix_length_and_dec() case IMPOSSIBLE_RESULT: DBUG_ASSERT(0); } - set_persist_maybe_null(1); // devision by zero + maybe_null= 1; // devision by zero DBUG_VOID_RETURN; } @@ -1955,7 +1952,7 @@ void Item_func_int_div::fix_length_and_dec() max_length=args[0]->max_length - (argtype == DECIMAL_RESULT || argtype == INT_RESULT ? args[0]->decimals : 0); - set_persist_maybe_null(1); + maybe_null=1; unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag; } @@ -2042,7 +2039,7 @@ void Item_func_mod::result_precision() void Item_func_mod::fix_length_and_dec() { Item_num_op::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null= 1; unsigned_flag= args[0]->unsigned_flag; } @@ -3260,7 +3257,7 @@ longlong Item_func_field::val_int() void Item_func_field::fix_length_and_dec() { - set_persist_maybe_null(0); max_length=3; + maybe_null=0; max_length=3; cmp_type= args[0]->result_type(); for (uint i=1; i < arg_count ; i++) cmp_type= item_cmp_type(cmp_type, args[i]->result_type()); @@ -5570,7 +5567,7 @@ void Item_func_get_user_var::fix_length_and_dec() { THD *thd=current_thd; int error; - set_persist_maybe_null(1); + maybe_null=1; decimals=NOT_FIXED_DEC; max_length=MAX_BLOB_WIDTH; @@ -5769,7 +5766,7 @@ void Item_func_get_system_var::update_null_value() void Item_func_get_system_var::fix_length_and_dec() { char *cptr; - set_persist_maybe_null(1); + maybe_null= TRUE; max_length= 0; if (var->check_type(var_type)) @@ -6189,7 +6186,7 @@ bool Item_func_match::fix_fields(THD *thd, Item **ref) status_var_increment(thd->status_var.feature_fulltext); - set_persist_maybe_null(1); + maybe_null=1; join_key=0; /* @@ -6475,7 +6472,7 @@ longlong Item_func_row_count::val_int() Item_func_sp::Item_func_sp(Name_resolution_context *context_arg, sp_name *name) :Item_func(), context(context_arg), m_name(name), m_sp(NULL), sp_result_field(NULL) { - set_persist_maybe_null(1); + maybe_null= 1; m_name->init_qname(current_thd); dummy_table= (TABLE*) sql_calloc(sizeof(TABLE)+ sizeof(TABLE_SHARE)); dummy_table->s= (TABLE_SHARE*) (dummy_table+1); @@ -6486,7 +6483,7 @@ Item_func_sp::Item_func_sp(Name_resolution_context *context_arg, sp_name *name, List<Item> &list) :Item_func(list), context(context_arg), m_name(name), m_sp(NULL),sp_result_field(NULL) { - set_persist_maybe_null(1); + maybe_null= 1; m_name->init_qname(current_thd); dummy_table= (TABLE*) sql_calloc(sizeof(TABLE)+ sizeof(TABLE_SHARE)); dummy_table->s= (TABLE_SHARE*) (dummy_table+1); @@ -6640,7 +6637,7 @@ void Item_func_sp::fix_length_and_dec() decimals= sp_result_field->decimals(); max_length= sp_result_field->field_length; collation.set(sp_result_field->charset()); - set_persist_maybe_null(1); + maybe_null= 1; unsigned_flag= test(sp_result_field->flags & UNSIGNED_FLAG); DBUG_VOID_RETURN; diff --git a/sql/item_func.h b/sql/item_func.h index 8d4b507fe28..5c48498001b 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -39,8 +39,6 @@ protected: 0 means get this number from first argument */ uint allowed_arg_cols; - /* maybe_null can't be changed by parameters or used table state */ - bool persistent_maybe_null; String *val_str_from_val_str_ascii(String *str, String *str2); public: uint arg_count; @@ -74,13 +72,13 @@ public: enum Type type() const { return FUNC_ITEM; } virtual enum Functype functype() const { return UNKNOWN_FUNC; } Item_func(void): - allowed_arg_cols(1), persistent_maybe_null(0), arg_count(0) + allowed_arg_cols(1), arg_count(0) { with_sum_func= 0; with_field= 0; } Item_func(Item *a): - allowed_arg_cols(1), persistent_maybe_null(0), arg_count(1) + allowed_arg_cols(1), arg_count(1) { args= tmp_arg; args[0]= a; @@ -88,7 +86,7 @@ public: with_field= a->with_field; } Item_func(Item *a,Item *b): - allowed_arg_cols(1), persistent_maybe_null(0), arg_count(2) + allowed_arg_cols(1), arg_count(2) { args= tmp_arg; args[0]= a; args[1]= b; @@ -96,7 +94,7 @@ public: with_field= a->with_field || b->with_field; } Item_func(Item *a,Item *b,Item *c): - allowed_arg_cols(1), persistent_maybe_null(0) + allowed_arg_cols(1) { arg_count= 0; if ((args= (Item**) sql_alloc(sizeof(Item*)*3))) @@ -108,7 +106,7 @@ public: } } Item_func(Item *a,Item *b,Item *c,Item *d): - allowed_arg_cols(1), persistent_maybe_null(0) + allowed_arg_cols(1) { arg_count= 0; if ((args= (Item**) sql_alloc(sizeof(Item*)*4))) @@ -122,7 +120,7 @@ public: } } Item_func(Item *a,Item *b,Item *c,Item *d,Item* e): - allowed_arg_cols(1), persistent_maybe_null(0) + allowed_arg_cols(1) { arg_count= 5; if ((args= (Item**) sql_alloc(sizeof(Item*)*5))) @@ -190,7 +188,7 @@ public: if (max_result_length >= MAX_BLOB_WIDTH) { max_length= MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } else max_length= (uint32) max_result_length; @@ -396,11 +394,6 @@ public: info.bool_function= &Item::restore_to_before_no_rows_in_result; walk(&Item::call_bool_func_processor, FALSE, (uchar*) &info); } - inline void set_persist_maybe_null(bool mb_null) - { - maybe_null= mb_null; - persistent_maybe_null= 1; - } }; @@ -685,7 +678,7 @@ public: } double val_real(); enum_field_types field_type() const { return MYSQL_TYPE_DOUBLE; } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } const char *func_name() const { return "double_typecast"; } virtual void print(String *str, enum_query_type query_type); }; @@ -826,7 +819,7 @@ class Item_dec_func :public Item_real_func void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); - set_persist_maybe_null(1); + maybe_null=1; } }; @@ -1158,7 +1151,7 @@ public: Item_func_coercibility(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "coercibility"; } - void fix_length_and_dec() { max_length=10; set_persist_maybe_null(0); } + void fix_length_and_dec() { max_length=10; maybe_null= 0; } table_map not_null_tables() const { return 0; } }; @@ -1321,7 +1314,7 @@ public: {} longlong val_int(); const char *func_name() const { return "benchmark"; } - void fix_length_and_dec() { max_length=1; set_persist_maybe_null(0); } + void fix_length_and_dec() { max_length=1; maybe_null=0; } virtual void print(String *str, enum_query_type query_type); bool check_vcol_func_processor(uchar *int_arg) { @@ -1577,7 +1570,7 @@ public: double val_real() { DBUG_ASSERT(fixed == 1); null_value= 1; return 0.0; } longlong val_int() { DBUG_ASSERT(fixed == 1); null_value=1; return 0; } enum Item_result result_type () const { return STRING_RESULT; } - void fix_length_and_dec() { set_persist_maybe_null(1); max_length=0; } + void fix_length_and_dec() { maybe_null=1; max_length=0; } }; #endif /* HAVE_DLOPEN */ @@ -1592,7 +1585,7 @@ class Item_func_get_lock :public Item_int_func Item_func_get_lock(Item *a,Item *b) :Item_int_func(a,b) {} longlong val_int(); const char *func_name() const { return "get_lock"; } - void fix_length_and_dec() { max_length=1; set_persist_maybe_null(1);} + void fix_length_and_dec() { max_length=1; maybe_null=1;} table_map used_tables() const { return Item_int_func::used_tables() | RAND_TABLE_BIT; @@ -1612,7 +1605,7 @@ public: Item_func_release_lock(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "release_lock"; } - void fix_length_and_dec() { max_length=1; set_persist_maybe_null(1);} + void fix_length_and_dec() { max_length= 1; maybe_null= 1;} table_map used_tables() const { return Item_int_func::used_tables() | RAND_TABLE_BIT; @@ -1636,7 +1629,7 @@ public: Item_master_pos_wait(Item *a,Item *b, Item *c, Item *d) :Item_int_func(a,b,c,d) {} longlong val_int(); const char *func_name() const { return "master_pos_wait"; } - void fix_length_and_dec() { max_length=21; set_persist_maybe_null(1);} + void fix_length_and_dec() { max_length=21; maybe_null=1;} bool check_vcol_func_processor(uchar *int_arg) { return trace_unsupported_by_check_vcol_func_processor(func_name()); @@ -1860,8 +1853,7 @@ public: Item_func_inet_aton(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "inet_aton"; } - void fix_length_and_dec() - { decimals= 0; max_length= 21; set_persist_maybe_null(1); unsigned_flag= 1; } + void fix_length_and_dec() { decimals= 0; max_length= 21; maybe_null= 1; unsigned_flag= 1;} }; @@ -1929,8 +1921,7 @@ public: Item_func_is_free_lock(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "is_free_lock"; } - void fix_length_and_dec() - { decimals= 0; max_length= 1; set_persist_maybe_null(1); } + void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;} bool check_vcol_func_processor(uchar *int_arg) { return trace_unsupported_by_check_vcol_func_processor(func_name()); @@ -1944,8 +1935,7 @@ public: Item_func_is_used_lock(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "is_used_lock"; } - void fix_length_and_dec() - { decimals= 0; max_length= 10; set_persist_maybe_null(1);} + void fix_length_and_dec() { decimals=0; max_length=10; maybe_null=1;} bool check_vcol_func_processor(uchar *int_arg) { return trace_unsupported_by_check_vcol_func_processor(func_name()); @@ -1968,7 +1958,7 @@ public: Item_func_row_count() :Item_int_func() {} longlong val_int(); const char *func_name() const { return "row_count"; } - void fix_length_and_dec() { decimals= 0; set_persist_maybe_null(0); } + void fix_length_and_dec() { decimals= 0; maybe_null=0; } bool check_vcol_func_processor(uchar *int_arg) { @@ -2109,7 +2099,7 @@ public: Item_func_found_rows() :Item_int_func() {} longlong val_int(); const char *func_name() const { return "found_rows"; } - void fix_length_and_dec() { decimals= 0; set_persist_maybe_null(0); } + void fix_length_and_dec() { decimals= 0; maybe_null=0; } bool check_vcol_func_processor(uchar *int_arg) { return trace_unsupported_by_check_vcol_func_processor(func_name()); diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index b36375a6e40..665c941414c 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -53,7 +53,7 @@ void Item_geometry_func::fix_length_and_dec() collation.set(&my_charset_bin); decimals=0; max_length= (uint32) 4294967295U; - set_persist_maybe_null(1); + maybe_null= 1; } @@ -147,7 +147,7 @@ void Item_func_as_wkt::fix_length_and_dec() { collation.set(default_charset(), DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); max_length=MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } diff --git a/sql/item_geofunc.h b/sql/item_geofunc.h index 4d5911324ac..2d715dc8765 100644 --- a/sql/item_geofunc.h +++ b/sql/item_geofunc.h @@ -89,7 +89,7 @@ public: { // "GeometryCollection" is the longest fix_length_and_charset(20, default_charset()); - set_persist_maybe_null(1); + maybe_null= 1; }; }; @@ -224,7 +224,7 @@ public: { Item_func::print(str, query_type); } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } bool is_null() { (void) val_int(); return null_value; } }; @@ -251,7 +251,7 @@ public: Item_func::print(str, query_type); } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } bool is_null() { (void) val_int(); return null_value; } }; @@ -342,7 +342,7 @@ public: longlong val_int(); optimize_type select_optimize() const { return OPTIMIZE_NONE; } const char *func_name() const { return "st_isempty"; } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } }; class Item_func_issimple: public Item_bool_func @@ -356,7 +356,7 @@ public: longlong val_int(); optimize_type select_optimize() const { return OPTIMIZE_NONE; } const char *func_name() const { return "st_issimple"; } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } }; class Item_func_isclosed: public Item_bool_func @@ -366,7 +366,7 @@ public: longlong val_int(); optimize_type select_optimize() const { return OPTIMIZE_NONE; } const char *func_name() const { return "st_isclosed"; } - void fix_length_and_dec() { set_persist_maybe_null(1); } + void fix_length_and_dec() { maybe_null= 1; } }; class Item_func_dimension: public Item_int_func @@ -376,7 +376,7 @@ public: Item_func_dimension(Item *a): Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "st_dimension"; } - void fix_length_and_dec() { max_length= 10; set_persist_maybe_null(1); } + void fix_length_and_dec() { max_length= 10; maybe_null= 1; } }; class Item_func_x: public Item_real_func @@ -389,7 +389,7 @@ public: void fix_length_and_dec() { Item_real_func::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -404,7 +404,7 @@ public: void fix_length_and_dec() { Item_real_func::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -416,7 +416,7 @@ public: Item_func_numgeometries(Item *a): Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "st_numgeometries"; } - void fix_length_and_dec() { max_length= 10; set_persist_maybe_null(1); } + void fix_length_and_dec() { max_length= 10; maybe_null= 1; } }; @@ -427,7 +427,7 @@ public: Item_func_numinteriorring(Item *a): Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "st_numinteriorrings"; } - void fix_length_and_dec() { max_length= 10; set_persist_maybe_null(1); } + void fix_length_and_dec() { max_length= 10; maybe_null= 1; } }; @@ -438,7 +438,7 @@ public: Item_func_numpoints(Item *a): Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "st_numpoints"; } - void fix_length_and_dec() { max_length= 10; set_persist_maybe_null(1); } + void fix_length_and_dec() { max_length= 10; maybe_null= 1; } }; @@ -452,7 +452,7 @@ public: void fix_length_and_dec() { Item_real_func::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -467,7 +467,7 @@ public: void fix_length_and_dec() { Item_real_func::fix_length_and_dec(); - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -479,7 +479,7 @@ public: Item_func_srid(Item *a): Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "srid"; } - void fix_length_and_dec() { max_length= 10; set_persist_maybe_null(1); } + void fix_length_and_dec() { max_length= 10; maybe_null= 1; } }; diff --git a/sql/item_row.cc b/sql/item_row.cc index 03b460e3ada..6345eaa864b 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -146,13 +146,11 @@ void Item_row::update_used_tables() { used_tables_cache= 0; const_item_cache= 1; - maybe_null= 0; for (uint i= 0; i < arg_count; i++) { items[i]->update_used_tables(); used_tables_cache|= items[i]->used_tables(); const_item_cache&= items[i]->const_item(); - maybe_null|= items[i]->maybe_null; } } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 2d2b231fdfe..d7aea544fee 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -323,7 +323,7 @@ String *Item_func_sha2::val_str_ascii(String *str) void Item_func_sha2::fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null= 1; max_length = 0; #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) @@ -449,7 +449,7 @@ String *Item_func_aes_decrypt::val_str(String *str) void Item_func_aes_decrypt::fix_length_and_dec() { max_length=args[0]->max_length; - set_persist_maybe_null(1); + maybe_null= 1; } @@ -2677,7 +2677,7 @@ void Item_func_elt::fix_length_and_dec() set_if_bigger(decimals,args[i]->decimals); } fix_char_length(char_length); - set_persist_maybe_null(1); // NULL if wrong first arg + maybe_null=1; // NULL if wrong first arg } @@ -2872,7 +2872,7 @@ void Item_func_repeat::fix_length_and_dec() else { max_length= MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } } @@ -2991,7 +2991,7 @@ void Item_func_rpad::fix_length_and_dec() else { max_length= MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } } @@ -3097,7 +3097,7 @@ void Item_func_lpad::fix_length_and_dec() else { max_length= MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } } @@ -4074,7 +4074,7 @@ bool Item_func_dyncol_create::fix_fields(THD *thd, Item **ref) void Item_func_dyncol_create::fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null= TRUE; collation.set(&my_charset_bin); decimals= 0; } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 5c85c74ad52..582fa05b4a1 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -178,7 +178,7 @@ public: { collation.set(system_charset_info); max_length= MAX_BLOB_WIDTH; - set_persist_maybe_null(1); + maybe_null= 1; } const char *func_name() const { return "decode_histogram"; } }; @@ -400,7 +400,7 @@ public: String *val_str(String *); void fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null=1; /* 9 = MAX ((8- (arg_len % 8)) + 1) */ max_length = args[0]->max_length + 9; } @@ -416,7 +416,7 @@ public: String *val_str(String *); void fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null=1; /* 9 = MAX ((8- (arg_len % 8)) + 1) */ max_length= args[0]->max_length; if (max_length >= 9U) @@ -444,7 +444,7 @@ public: constructor_helper(); } String *val_str(String *); - void fix_length_and_dec() { set_persist_maybe_null(1); max_length = 13; } + void fix_length_and_dec() { maybe_null=1; max_length = 13; } const char *func_name() const { return "encrypt"; } bool check_vcol_func_processor(uchar *int_arg) { @@ -514,7 +514,7 @@ public: void fix_length_and_dec() { max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen; - set_persist_maybe_null(1); + maybe_null=1; } const char *func_name() const { return "database"; } const char *fully_qualified_func_name() const { return "database()"; } @@ -688,7 +688,7 @@ public: { collation.set(default_charset()); max_length=64; - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -715,7 +715,7 @@ public: Item_func_unhex(Item *a) :Item_str_func(a) { /* there can be bad hex strings */ - set_persist_maybe_null(1); + maybe_null= 1; } const char *func_name() const { return "unhex"; } String *val_str(String *); @@ -801,7 +801,7 @@ public: void fix_length_and_dec() { collation.set(&my_charset_bin, DERIVATION_COERCIBLE); - set_persist_maybe_null(1); + maybe_null=1; max_length=MAX_BLOB_WIDTH; } bool check_vcol_func_processor(uchar *int_arg) @@ -834,7 +834,7 @@ public: { decimals= 0; fix_length_and_charset(3 * 8 + 7, default_charset()); - set_persist_maybe_null(1); + maybe_null= 1; } }; @@ -961,7 +961,7 @@ public: { collation.set(system_charset_info); max_length= 64 * collation.collation->mbmaxlen; // should be enough - set_persist_maybe_null(0); + maybe_null= 0; }; table_map not_null_tables() const { return 0; } }; @@ -976,7 +976,7 @@ public: { collation.set(system_charset_info); max_length= 64 * collation.collation->mbmaxlen; // should be enough - set_persist_maybe_null(0); + maybe_null= 0; }; table_map not_null_tables() const { return 0; } }; @@ -1022,8 +1022,7 @@ class Item_func_uncompress: public Item_str_func String buffer; public: Item_func_uncompress(Item *a): Item_str_func(a){} - void fix_length_and_dec() - { set_persist_maybe_null(1); max_length= MAX_BLOB_WIDTH; } + void fix_length_and_dec(){ maybe_null= 1; max_length= MAX_BLOB_WIDTH; } const char *func_name() const{return "uncompress";} String *val_str(String *) ZLIB_DEPENDED_FUNCTION }; @@ -1088,7 +1087,7 @@ public: String *val_str(String *); void fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null= 1; collation.set(&my_charset_bin); decimals= 0; } @@ -1105,7 +1104,7 @@ public: :Item_str_func(str, num) {} void fix_length_and_dec() - { set_persist_maybe_null(1); max_length= MAX_BLOB_WIDTH; } + { maybe_null= 1;; max_length= MAX_BLOB_WIDTH; } /* Mark that collation can change between calls */ bool dynamic_result() { return 1; } @@ -1124,8 +1123,7 @@ class Item_func_dyncol_list: public Item_str_func { public: Item_func_dyncol_list(Item *str) :Item_str_func(str) {}; - void fix_length_and_dec() - { set_persist_maybe_null(1); max_length= MAX_BLOB_WIDTH; }; + void fix_length_and_dec() { maybe_null= 1; max_length= MAX_BLOB_WIDTH; }; const char *func_name() const{ return "column_list"; } String *val_str(String *); }; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index bb7d28d1e18..edd2e79fb7b 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -942,7 +942,7 @@ void Item_func_monthname::fix_length_and_dec() collation.set(cs, DERIVATION_COERCIBLE, repertoire); decimals=0; max_length= locale->max_month_name_length * collation.collation->mbmaxlen; - set_persist_maybe_null(1); + maybe_null=1; } @@ -1089,7 +1089,7 @@ void Item_func_dayname::fix_length_and_dec() collation.set(cs, DERIVATION_COERCIBLE, repertoire); decimals=0; max_length= locale->max_day_name_length * collation.collation->mbmaxlen; - set_persist_maybe_null(1); + maybe_null=1; } @@ -1452,7 +1452,7 @@ void Item_temporal_func::fix_length_and_dec() We set maybe_null to 1 as default as any bad argument with date or time can get us to return NULL. */ - set_persist_maybe_null(1); + maybe_null= 1; if (decimals) { if (decimals == NOT_FIXED_DEC) @@ -1541,7 +1541,7 @@ void Item_func_curdate::fix_length_and_dec() ltime.hour= ltime.minute= ltime.second= 0; ltime.time_type= MYSQL_TIMESTAMP_DATE; Item_datefunc::fix_length_and_dec(); - set_persist_maybe_null(0); + maybe_null= false; } /** @@ -1780,7 +1780,7 @@ void Item_func_date_format::fix_length_and_dec() collation.collation->mbmaxlen; set_if_smaller(max_length,MAX_BLOB_WIDTH); } - set_persist_maybe_null(1); // If wrong date + maybe_null=1; // If wrong date } @@ -2143,7 +2143,7 @@ void Item_extract::print(String *str, enum_query_type query_type) void Item_extract::fix_length_and_dec() { - set_persist_maybe_null(1); // If wrong date + maybe_null=1; // If wrong date switch (int_type) { case INTERVAL_YEAR: max_length=4; date_value=1; break; case INTERVAL_YEAR_MONTH: max_length=6; date_value=1; break; diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index dc3e368be8d..0b5ac95525a 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -80,7 +80,7 @@ public: { decimals=0; max_length=6*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } enum_monotonicity_info get_monotonicity_info() const; longlong val_int_endpoint(bool left_endp, bool *incl_endp); @@ -103,7 +103,7 @@ public: { decimals=0; max_length=6*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null= 1; } enum_monotonicity_info get_monotonicity_info() const; longlong val_int_endpoint(bool left_endp, bool *incl_endp); @@ -136,7 +136,7 @@ public: { decimals=0; max_length=2*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -168,7 +168,7 @@ public: { decimals= 0; fix_char_length(2); - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -206,7 +206,7 @@ public: { decimals= 0; fix_char_length(3); - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -227,7 +227,7 @@ public: { decimals=0; max_length=2*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -248,7 +248,7 @@ public: { decimals=0; max_length=2*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -269,7 +269,7 @@ public: { decimals=0; max_length=1*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -290,7 +290,7 @@ public: { decimals=0; max_length=2*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -311,7 +311,7 @@ public: { decimals=0; max_length=2*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } }; @@ -325,7 +325,7 @@ public: { decimals=0; max_length=6*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -348,7 +348,7 @@ public: { decimals=0; max_length=4*MY_CHARSET_BIN_MB_MAXLEN; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -382,7 +382,7 @@ public: { decimals= 0; fix_char_length(1); - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -419,7 +419,7 @@ public: decimals= args[0]->temporal_precision(arg0_expected_type()); set_if_smaller(decimals, TIME_SECOND_PART_DIGITS); max_length=17 + (decimals ? decimals + 1 : 0); - set_persist_maybe_null(1); + maybe_null= true; } void find_num_type() { cached_result_type= decimals ? DECIMAL_RESULT : INT_RESULT; } @@ -472,7 +472,7 @@ public: const char *func_name() const { return "time_to_sec"; } void fix_num_length_and_dec() { - set_persist_maybe_null(1); + maybe_null= true; Item_func_seconds_hybrid::fix_num_length_and_dec(); } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} @@ -582,7 +582,7 @@ public: { store_now_in_TIME(<ime); Item_timefunc::fix_length_and_dec(); - set_persist_maybe_null(0); + maybe_null= false; } bool get_date(MYSQL_TIME *res, ulonglong fuzzy_date); /* @@ -664,7 +664,7 @@ public: { store_now_in_TIME(<ime); Item_temporal_func::fix_length_and_dec(); - set_persist_maybe_null(0); + maybe_null= false; } bool get_date(MYSQL_TIME *res, ulonglong fuzzy_date); virtual void store_now_in_TIME(MYSQL_TIME *now_time)=0; @@ -709,7 +709,7 @@ public: void update_used_tables() { Item_func_now::update_used_tables(); - set_persist_maybe_null(0); + maybe_null= 0; used_tables_cache|= RAND_TABLE_BIT; } }; @@ -1006,7 +1006,7 @@ public: void fix_length_and_dec() { decimals=0; - set_persist_maybe_null(1); + maybe_null=1; } bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_vcol_func_processor(uchar *int_arg) { return FALSE;} @@ -1028,7 +1028,7 @@ public: void fix_length_and_dec() { decimals=0; - set_persist_maybe_null(1); + maybe_null=1; } virtual void print(String *str, enum_query_type query_type); }; @@ -1050,7 +1050,7 @@ public: const char *func_name() const { return "get_format"; } void fix_length_and_dec() { - set_persist_maybe_null(1); + maybe_null= 1; decimals=0; fix_length_and_charset(17, default_charset()); } diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 1aab6b45c74..456779beec1 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -2604,7 +2604,6 @@ void Item_xml_str_func::fix_length_and_dec() status_var_increment(current_thd->status_var.feature_xml); nodeset_func= 0; - set_persist_maybe_null(1); if (agg_arg_charsets_for_comparison(collation, args, arg_count)) return; diff --git a/sql/item_xmlfunc.h b/sql/item_xmlfunc.h index 3356b4ac902..800cf6ed760 100644 --- a/sql/item_xmlfunc.h +++ b/sql/item_xmlfunc.h @@ -34,10 +34,14 @@ protected: public: Item_xml_str_func(Item *a, Item *b): Item_str_func(a,b) - {} + { + maybe_null= TRUE; + } Item_xml_str_func(Item *a, Item *b, Item *c): Item_str_func(a,b,c) - {} + { + maybe_null= TRUE; + } void fix_length_and_dec(); String *parse_xml(String *raw_xml, String *parsed_xml_buf); bool check_vcol_func_processor(uchar *int_arg) diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index e42ea9ec452..03023927a1d 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -1494,10 +1494,10 @@ ha_rows DsMrr_impl::dsmrr_info_const(uint keyno, RANGE_SEQ_IF *seq, @retval FALSE No */ -bool key_uses_partial_cols(TABLE *table, uint keyno) +bool key_uses_partial_cols(TABLE_SHARE *share, uint keyno) { - KEY_PART_INFO *kp= table->key_info[keyno].key_part; - KEY_PART_INFO *kp_end= kp + table->key_info[keyno].user_defined_key_parts; + KEY_PART_INFO *kp= share->key_info[keyno].key_part; + KEY_PART_INFO *kp_end= kp + share->key_info[keyno].user_defined_key_parts; for (; kp != kp_end; kp++) { if (!kp->field->part_of_key.is_set(keyno)) @@ -1518,10 +1518,11 @@ bool key_uses_partial_cols(TABLE *table, uint keyno) @retval FALSE Otherwise */ -bool DsMrr_impl::check_cpk_scan(THD *thd, uint keyno, uint mrr_flags) +bool DsMrr_impl::check_cpk_scan(THD *thd, TABLE_SHARE *share, uint keyno, + uint mrr_flags) { return test((mrr_flags & HA_MRR_SINGLE_POINT) && - keyno == table->s->primary_key && + keyno == share->primary_key && primary_file->primary_key_is_clustered() && optimizer_flag(thd, OPTIMIZER_SWITCH_MRR_SORT_KEYS)); } @@ -1557,14 +1558,15 @@ bool DsMrr_impl::choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, Cost_estimate dsmrr_cost; bool res; THD *thd= current_thd; + TABLE_SHARE *share= primary_file->get_table_share(); - bool doing_cpk_scan= check_cpk_scan(thd, keyno, *flags); - bool using_cpk= test(keyno == table->s->primary_key && + bool doing_cpk_scan= check_cpk_scan(thd, share, keyno, *flags); + bool using_cpk= test(keyno == share->primary_key && primary_file->primary_key_is_clustered()); *flags &= ~HA_MRR_IMPLEMENTATION_FLAGS; if (!optimizer_flag(thd, OPTIMIZER_SWITCH_MRR) || *flags & HA_MRR_INDEX_ONLY || - (using_cpk && !doing_cpk_scan) || key_uses_partial_cols(table, keyno)) + (using_cpk && !doing_cpk_scan) || key_uses_partial_cols(share, keyno)) { /* Use the default implementation */ *flags |= HA_MRR_USE_DEFAULT_IMPL; @@ -1572,7 +1574,7 @@ bool DsMrr_impl::choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, return TRUE; } - uint add_len= table->key_info[keyno].key_length + primary_file->ref_length; + uint add_len= share->key_info[keyno].key_length + primary_file->ref_length; *bufsz -= add_len; if (get_disk_sweep_mrr_cost(keyno, rows, *flags, bufsz, &dsmrr_cost)) return TRUE; diff --git a/sql/multi_range_read.h b/sql/multi_range_read.h index 387ae9791bc..3b5375293de 100644 --- a/sql/multi_range_read.h +++ b/sql/multi_range_read.h @@ -627,7 +627,7 @@ private: Cost_estimate *cost); bool get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags, uint *buffer_size, Cost_estimate *cost); - bool check_cpk_scan(THD *thd, uint keyno, uint mrr_flags); + bool check_cpk_scan(THD *thd, TABLE_SHARE *share, uint keyno, uint mrr_flags); bool setup_buffer_sharing(uint key_size_in_keybuf, key_part_map key_tuple_map); diff --git a/sql/opt_subselect.h b/sql/opt_subselect.h index 044e2dce3ee..6ed077dcfcb 100644 --- a/sql/opt_subselect.h +++ b/sql/opt_subselect.h @@ -192,7 +192,7 @@ public: (PREV_BITS(key_part_map, max_loose_keypart+1) & // (3) (found_part | loose_scan_keyparts)) == // (3) PREV_BITS(key_part_map, max_loose_keypart+1) && // (3) - !key_uses_partial_cols(s->table, key)) + !key_uses_partial_cols(s->table->s, key)) { /* Ok, can use the strategy */ part1_conds_met= TRUE; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index d9dd538f96d..9f507df3767 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -620,6 +620,15 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) sl->context.outer_context= 0; // Prepare underlying views/DT first. sl->handle_derived(lex, DT_PREPARE); + + if (derived->outer_join) + { + /* Mark that table is part of OUTER JOIN and fields may be NULL */ + for (TABLE_LIST *cursor= (TABLE_LIST*) sl->table_list.first; + cursor; + cursor= cursor->next_local) + cursor->outer_join|= JOIN_TYPE_OUTER; + } } unit->derived= derived; @@ -714,6 +723,10 @@ exit: /* Add new temporary table to list of open derived tables */ table->next= thd->derived_tables; thd->derived_tables= table; + + /* If table is used by a left join, mark that any column may be null */ + if (derived->outer_join) + table->maybe_null= 1; } if (arena) thd->restore_active_arena(arena, &backup); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 715ab133376..6c38c88041a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8931,7 +8931,7 @@ make_outerjoin_info(JOIN *join) TABLE_LIST *tbl= table->pos_in_table_list; TABLE_LIST *embedding= tbl->embedding; - if (tbl->outer_join) + if (tbl->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT)) { /* Table tab is the only one inner table for outer join. @@ -13380,7 +13380,8 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top, table->embedding->nested_join->not_null_tables|= not_null_tables; } - if (!table->outer_join || (used_tables & not_null_tables)) + if (!(table->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT)) || + (used_tables & not_null_tables)) { /* For some of the inner tables there are conjunctive predicates diff --git a/sql/table.h b/sql/table.h index 8e5f8794a51..24035b9dfa8 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1504,6 +1504,7 @@ typedef struct st_schema_table #define JOIN_TYPE_LEFT 1 #define JOIN_TYPE_RIGHT 2 +#define JOIN_TYPE_OUTER 4 /* Marker that this is an outer join */ #define VIEW_SUID_INVOKER 0 #define VIEW_SUID_DEFINER 1 diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index 6b0d2a88ff2..aa9dc83f68b 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -46,6 +46,6 @@ SET(TOKUDB_PLUGIN_DYNAMIC "ha_tokudb") SET(TOKUDB_SOURCES ha_tokudb.cc) MYSQL_ADD_PLUGIN(tokudb ${TOKUDB_SOURCES} STORAGE_ENGINE MODULE_ONLY COMPONENT "tokudb-engine" CONFIG tokudb.cnf - LINK_LIBRARIES tokufractaltree_static tokuportability_static z stdc++) + LINK_LIBRARIES tokufractaltree_static tokuportability_static ${ZLIB_LIBRARY} stdc++) SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} -flto -fuse-linker-plugin") diff --git a/storage/tokudb/ft-index/ft/CMakeLists.txt b/storage/tokudb/ft-index/ft/CMakeLists.txt index d480a1464f3..748e501f922 100644 --- a/storage/tokudb/ft-index/ft/CMakeLists.txt +++ b/storage/tokudb/ft-index/ft/CMakeLists.txt @@ -87,14 +87,14 @@ add_dependencies(ft_static install_tdb_h generate_log_code build_lzma) ## link with lzma (which should be static) and link dependers with zlib target_link_libraries(ft LINK_PRIVATE util_static lzma ${LIBTOKUPORTABILITY}) -target_link_libraries(ft LINK_PUBLIC z) +target_link_libraries(ft LINK_PUBLIC ${ZLIB_LIBRARY} ) target_link_libraries(ft_static LINK_PRIVATE lzma) ## build the bins in this directory foreach(tool tokuftdump tdb_logprint tdb-recover ftverify) add_executable(${tool} ${tool}.cc) add_dependencies(${tool} install_tdb_h) - target_link_libraries(${tool} ft_static util_static z lzma ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) + target_link_libraries(${tool} ft_static util_static ${ZLIB_LIBRARY} lzma ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) add_space_separated_property(TARGET ${tool} COMPILE_FLAGS -fvisibility=hidden) endforeach(tool) diff --git a/storage/tokudb/ft-index/portability/huge_page_detection.cc b/storage/tokudb/ft-index/portability/huge_page_detection.cc index e4bfc8a1035..92891597fa0 100644 --- a/storage/tokudb/ft-index/portability/huge_page_detection.cc +++ b/storage/tokudb/ft-index/portability/huge_page_detection.cc @@ -109,7 +109,7 @@ static bool check_huge_pages_config_file(const char *fname) char *r = fgets(buf, sizeof(buf), f); assert(r != NULL); if (strstr(buf, "[always]")) { - fprintf(stderr, "Transparent huge pages are enabled, according to %s\n", fname); + fprintf(stderr,"TokuDB: Transparent huge pages are enabled, according to %s. TokuDB will be disabled. To use TokuDB disable huge pages in your kernel or, for testing, set the environment variable TOKU_HUGE_PAGES_OK to 1\n", fname); huge_pages_enabled = true; } else { huge_pages_enabled =false; diff --git a/storage/tokudb/ft-index/src/CMakeLists.txt b/storage/tokudb/ft-index/src/CMakeLists.txt index 0867a362645..394d120beaa 100644 --- a/storage/tokudb/ft-index/src/CMakeLists.txt +++ b/storage/tokudb/ft-index/src/CMakeLists.txt @@ -19,7 +19,7 @@ set(tokudb_srcs add_library(${LIBTOKUDB} SHARED ${tokudb_srcs}) add_dependencies(${LIBTOKUDB} install_tdb_h generate_log_code) target_link_libraries(${LIBTOKUDB} LINK_PRIVATE locktree_static ft_static util_static lzma ${LIBTOKUPORTABILITY}) -target_link_libraries(${LIBTOKUDB} LINK_PUBLIC z) +target_link_libraries(${LIBTOKUDB} LINK_PUBLIC ${ZLIB_LIBRARY} ) ## make the static library add_library(tokudb_static_conv STATIC ${tokudb_srcs}) diff --git a/storage/tokudb/ft-index/src/tests/CMakeLists.txt b/storage/tokudb/ft-index/src/tests/CMakeLists.txt index 394015defea..b0576a858aa 100644 --- a/storage/tokudb/ft-index/src/tests/CMakeLists.txt +++ b/storage/tokudb/ft-index/src/tests/CMakeLists.txt @@ -360,7 +360,7 @@ if(BUILD_TESTING OR BUILD_SRC_TESTS) ## #5138 only reproduces when using the static library. list(REMOVE_ITEM tdb_bins test-5138.tdb) add_executable(test-5138.tdb test-5138.cc) - target_link_libraries(test-5138.tdb ${LIBTOKUDB}_static z ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) + target_link_libraries(test-5138.tdb ${LIBTOKUDB}_static ${ZLIB_LIBRARY} ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) set_property(TARGET test-5138.tdb APPEND PROPERTY COMPILE_DEFINITIONS "USE_TDB;IS_TDB=1;TOKUDB=1") add_space_separated_property(TARGET test-5138.tdb COMPILE_FLAGS -fvisibility=hidden) diff --git a/storage/tokudb/ft-index/utils/CMakeLists.txt b/storage/tokudb/ft-index/utils/CMakeLists.txt index 5c73927dd80..b61de890677 100644 --- a/storage/tokudb/ft-index/utils/CMakeLists.txt +++ b/storage/tokudb/ft-index/utils/CMakeLists.txt @@ -5,7 +5,7 @@ foreach(util ${utils}) add_executable(${util} ${util}.cc) set_target_properties(${util} PROPERTIES COMPILE_DEFINITIONS "IS_TDB=1;USE_TDB=1;TDB_IS_STATIC=1") - target_link_libraries(${util} ${LIBTOKUDB}_static ft_static z lzma ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) + target_link_libraries(${util} ${LIBTOKUDB}_static ft_static ${ZLIB_LIBRARY} lzma ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) add_space_separated_property(TARGET ${util} COMPILE_FLAGS -fvisibility=hidden) diff --git a/storage/tokudb/mysql-test/rpl/suite.pm b/storage/tokudb/mysql-test/rpl/suite.pm new file mode 100644 index 00000000000..e001340cd14 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/suite.pm @@ -0,0 +1,11 @@ +package My::Suite::TokuDB; +use File::Basename; +@ISA = qw(My::Suite); + +# Ensure we can run the TokuDB tests even if hugepages are enabled +$ENV{TOKU_HUGE_PAGES_OK}=1; + +#return "Not run for embedded server" if $::opt_embedded_server; +return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; +bless { }; + diff --git a/storage/tokudb/mysql-test/tokudb/suite.pm b/storage/tokudb/mysql-test/tokudb/suite.pm index c56ed6e4f4c..e001340cd14 100644 --- a/storage/tokudb/mysql-test/tokudb/suite.pm +++ b/storage/tokudb/mysql-test/tokudb/suite.pm @@ -2,6 +2,9 @@ package My::Suite::TokuDB; use File::Basename; @ISA = qw(My::Suite); +# Ensure we can run the TokuDB tests even if hugepages are enabled +$ENV{TOKU_HUGE_PAGES_OK}=1; + #return "Not run for embedded server" if $::opt_embedded_server; return "No TokuDB engine" unless $ENV{HA_TOKUDB_SO} or $::mysqld_variables{tokudb}; bless { }; |