mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
merge
This commit is contained in:
commit
16d13fe521
10 changed files with 119 additions and 22 deletions
|
@ -843,14 +843,17 @@ extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
|
|||
extern int get_defaults_options(int argc, char **argv,
|
||||
char **defaults, char **extra_defaults,
|
||||
char **group_suffix);
|
||||
extern int my_load_defaults(const char *conf_file, const char **groups,
|
||||
int *argc, char ***argv, const char ***);
|
||||
extern int load_defaults(const char *conf_file, const char **groups,
|
||||
int *argc, char ***argv);
|
||||
int *argc, char ***argv);
|
||||
extern int modify_defaults_file(const char *file_location, const char *option,
|
||||
const char *option_value,
|
||||
const char *section_name, int remove_option);
|
||||
extern int my_search_option_files(const char *conf_file, int *argc,
|
||||
char ***argv, uint *args_used,
|
||||
Process_option_func func, void *func_ctx);
|
||||
Process_option_func func, void *func_ctx,
|
||||
const char **default_directories);
|
||||
extern void free_defaults(char **argv);
|
||||
extern void my_print_default_files(const char *conf_file);
|
||||
extern void print_defaults(const char *conf_file, const char **groups);
|
||||
|
|
|
@ -4416,4 +4416,32 @@ date_nokey
|
|||
Warnings:
|
||||
Warning 1292 Incorrect date value: '10:41:7' for column 'date_nokey' at row 1
|
||||
DROP TABLE A,C;
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT);
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1 100.00
|
||||
Warnings:
|
||||
Note 1003 select '1' AS `a`,'1' AS `b` from `test`.`t1` where 1
|
||||
SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
|
||||
a b
|
||||
1 1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c INT NOT NULL);
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND c=c) OR b > 20;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a AND b=b) OR b > 20;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND a=a) OR b > 20;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -3769,4 +3769,20 @@ SELECT date_nokey FROM C
|
|||
|
||||
DROP TABLE A,C;
|
||||
|
||||
#
|
||||
# Bug #42957: no results from
|
||||
# select where .. (col=col and col=col) or ... (false expression)
|
||||
#
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT);
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
|
||||
SELECT * FROM t1 WHERE (a=a AND a=a) OR b > 2;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c INT NOT NULL);
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND c=c) OR b > 20;
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a AND b=b) OR b > 20;
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND a=a) OR b > 20;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -152,7 +152,7 @@ static char *remove_end_comment(char *ptr);
|
|||
|
||||
int my_search_option_files(const char *conf_file, int *argc, char ***argv,
|
||||
uint *args_used, Process_option_func func,
|
||||
void *func_ctx)
|
||||
void *func_ctx, const char **default_directories)
|
||||
{
|
||||
const char **dirs, *forced_default_file, *forced_extra_defaults;
|
||||
int error= 0;
|
||||
|
@ -359,9 +359,8 @@ int get_defaults_options(int argc, char **argv,
|
|||
return org_argc - argc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read options from configurations files
|
||||
Wrapper around my_load_defaults() for interface compatibility.
|
||||
|
||||
SYNOPSIS
|
||||
load_defaults()
|
||||
|
@ -372,6 +371,35 @@ int get_defaults_options(int argc, char **argv,
|
|||
argc Pointer to argc of original program
|
||||
argv Pointer to argv of original program
|
||||
|
||||
NOTES
|
||||
|
||||
This function is NOT thread-safe as it uses a global pointer internally.
|
||||
See also notes for my_load_defaults().
|
||||
|
||||
RETURN
|
||||
0 ok
|
||||
1 The given conf_file didn't exists
|
||||
*/
|
||||
int load_defaults(const char *conf_file, const char **groups,
|
||||
int *argc, char ***argv)
|
||||
{
|
||||
return my_load_defaults(conf_file, groups, argc, argv, &default_directories);
|
||||
}
|
||||
|
||||
/*
|
||||
Read options from configurations files
|
||||
|
||||
SYNOPSIS
|
||||
my_load_defaults()
|
||||
conf_file Basename for configuration file to search for.
|
||||
If this is a path, then only this file is read.
|
||||
groups Which [group] entrys to read.
|
||||
Points to an null terminated array of pointers
|
||||
argc Pointer to argc of original program
|
||||
argv Pointer to argv of original program
|
||||
default_directories Pointer to a location where a pointer to the list
|
||||
of default directories will be stored
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
Read options from configuration files and put them BEFORE the arguments
|
||||
|
@ -386,13 +414,18 @@ int get_defaults_options(int argc, char **argv,
|
|||
that was put in *argv
|
||||
|
||||
RETURN
|
||||
0 ok
|
||||
1 The given conf_file didn't exists
|
||||
- If successful, 0 is returned. If 'default_directories' is not NULL,
|
||||
a pointer to the array of default directory paths is stored to a location
|
||||
it points to. That stored value must be passed to my_search_option_files()
|
||||
later.
|
||||
|
||||
- 1 is returned if the given conf_file didn't exist. In this case, the
|
||||
value pointed to by default_directories is undefined.
|
||||
*/
|
||||
|
||||
|
||||
int load_defaults(const char *conf_file, const char **groups,
|
||||
int *argc, char ***argv)
|
||||
int my_load_defaults(const char *conf_file, const char **groups,
|
||||
int *argc, char ***argv, const char ***default_directories)
|
||||
{
|
||||
DYNAMIC_ARRAY args;
|
||||
TYPELIB group;
|
||||
|
@ -402,10 +435,11 @@ int load_defaults(const char *conf_file, const char **groups,
|
|||
MEM_ROOT alloc;
|
||||
char *ptr,**res;
|
||||
struct handle_option_ctx ctx;
|
||||
const char **dirs;
|
||||
DBUG_ENTER("load_defaults");
|
||||
|
||||
init_alloc_root(&alloc,512,0);
|
||||
if ((default_directories= init_default_directories(&alloc)) == NULL)
|
||||
if ((dirs= init_default_directories(&alloc)) == NULL)
|
||||
goto err;
|
||||
/*
|
||||
Check if the user doesn't want any default option processing
|
||||
|
@ -426,6 +460,8 @@ int load_defaults(const char *conf_file, const char **groups,
|
|||
(*argc)--;
|
||||
*argv=res;
|
||||
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
|
||||
if (default_directories)
|
||||
*default_directories= dirs;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -444,7 +480,8 @@ int load_defaults(const char *conf_file, const char **groups,
|
|||
ctx.group= &group;
|
||||
|
||||
error= my_search_option_files(conf_file, argc, argv, &args_used,
|
||||
handle_default_option, (void *) &ctx);
|
||||
handle_default_option, (void *) &ctx,
|
||||
dirs);
|
||||
/*
|
||||
Here error contains <> 0 only if we have a fully specified conf_file
|
||||
or a forced default file
|
||||
|
@ -490,6 +527,10 @@ int load_defaults(const char *conf_file, const char **groups,
|
|||
puts("");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (error == 0 && default_directories)
|
||||
*default_directories= dirs;
|
||||
|
||||
DBUG_RETURN(error);
|
||||
|
||||
err:
|
||||
|
@ -895,15 +936,11 @@ void my_print_default_files(const char *conf_file)
|
|||
fputs(conf_file,stdout);
|
||||
else
|
||||
{
|
||||
/*
|
||||
If default_directories is already initialized, use it. Otherwise,
|
||||
use a private MEM_ROOT.
|
||||
*/
|
||||
const char **dirs = default_directories;
|
||||
const char **dirs;
|
||||
MEM_ROOT alloc;
|
||||
init_alloc_root(&alloc,512,0);
|
||||
|
||||
if (!dirs && (dirs= init_default_directories(&alloc)) == NULL)
|
||||
if ((dirs= init_default_directories(&alloc)) == NULL)
|
||||
{
|
||||
fputs("Internal error initializing default directories list", stdout);
|
||||
}
|
||||
|
|
|
@ -536,7 +536,8 @@ int Instance_map::load()
|
|||
*/
|
||||
if (my_search_option_files(Options::Main::config_file, &argc,
|
||||
(char ***) &argv, &args_used,
|
||||
process_option, (void*) this))
|
||||
process_option, (void*) this,
|
||||
Options::default_directories))
|
||||
log_info("Falling back to compiled-in defaults.");
|
||||
|
||||
return complete_initialization();
|
||||
|
|
|
@ -86,6 +86,7 @@ const char *Options::Main::bind_address= NULL; /* No default value */
|
|||
uint Options::Main::monitoring_interval= DEFAULT_MONITORING_INTERVAL;
|
||||
uint Options::Main::port_number= DEFAULT_PORT;
|
||||
my_bool Options::Main::mysqld_safe_compatible= FALSE;
|
||||
const char **Options::default_directories= NULL;
|
||||
|
||||
/* Options::User_management */
|
||||
|
||||
|
@ -439,7 +440,8 @@ int Options::load(int argc, char **argv)
|
|||
log_info("Loading config file '%s'...",
|
||||
(const char *) Main::config_file);
|
||||
|
||||
load_defaults(Main::config_file, default_groups, &argc, &saved_argv);
|
||||
my_load_defaults(Main::config_file, default_groups, &argc,
|
||||
&saved_argv, &default_directories);
|
||||
|
||||
if ((handle_options(&argc, &saved_argv, my_long_options, get_one_option)))
|
||||
return ERR_INVALID_USAGE;
|
||||
|
|
|
@ -91,6 +91,9 @@ struct Options
|
|||
#endif
|
||||
|
||||
public:
|
||||
/* Array of paths to be passed to my_search_option_files() later */
|
||||
static const char **default_directories;
|
||||
|
||||
static int load(int argc, char **argv);
|
||||
static void cleanup();
|
||||
|
||||
|
|
|
@ -1021,7 +1021,7 @@ void mysql_read_default_options(struct st_mysql_options *options,
|
|||
argc=1; argv=argv_buff; argv_buff[0]= (char*) "client";
|
||||
groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0;
|
||||
|
||||
load_defaults(filename, groups, &argc, &argv);
|
||||
my_load_defaults(filename, groups, &argc, &argv, NULL);
|
||||
if (argc != 1) /* If some default option */
|
||||
{
|
||||
char **option=argv;
|
||||
|
|
|
@ -1652,7 +1652,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
|
|||
pthread_mutex_lock(&LOCK_plugin);
|
||||
rw_wrlock(&LOCK_system_variables_hash);
|
||||
|
||||
load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv);
|
||||
my_load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv, NULL);
|
||||
error= plugin_add(thd->mem_root, name, dl, &argc, argv, REPORT_TO_USER);
|
||||
if (argv)
|
||||
free_defaults(argv);
|
||||
|
|
|
@ -7625,7 +7625,7 @@ static COND *build_equal_items_for_cond(THD *thd, COND *cond,
|
|||
if (and_level)
|
||||
{
|
||||
/*
|
||||
Retrieve all conjucts of this level detecting the equality
|
||||
Retrieve all conjuncts of this level detecting the equality
|
||||
that are subject to substitution by multiple equality items and
|
||||
removing each such predicate from the conjunction after having
|
||||
found/created a multiple equality whose inference the predicate is.
|
||||
|
@ -7641,6 +7641,13 @@ static COND *build_equal_items_for_cond(THD *thd, COND *cond,
|
|||
li.remove();
|
||||
}
|
||||
|
||||
/*
|
||||
Check if we eliminated all the predicates of the level, e.g.
|
||||
(a=a AND b=b AND a=a)
|
||||
*/
|
||||
if (!(args->elements + cond_equal.current_level.elements + eq_list.elements))
|
||||
return new Item_int((longlong) 1,1);
|
||||
|
||||
List_iterator_fast<Item_equal> it(cond_equal.current_level);
|
||||
while ((item_equal= it++))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue