diff options
author | unknown <lenz@mysql.com> | 2004-12-28 17:38:30 +0100 |
---|---|---|
committer | unknown <lenz@mysql.com> | 2004-12-28 17:38:30 +0100 |
commit | a77d4ce2725a0d8e2310b3d7e1c3aed7908ea143 (patch) | |
tree | e35eaae1dbce601c83baff0c3600b313ddce1503 | |
parent | 5256ae3541024bfe7bfb2d120be0035a5fbc91a3 (diff) | |
parent | 0ebb5292f8f525fe70f90a6da972c7fc10811c62 (diff) | |
download | mariadb-git-a77d4ce2725a0d8e2310b3d7e1c3aed7908ea143.tar.gz |
Merge lgrimmer@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/space/my/mysql-4.1
-rw-r--r-- | client/mysqldump.c | 43 | ||||
-rw-r--r-- | mysql-test/r/func_str.result | 6 | ||||
-rw-r--r-- | mysql-test/t/func_str.test | 8 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 11 |
4 files changed, 39 insertions, 29 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c index ffdb84397e9..98de9e0b069 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -137,7 +137,6 @@ typedef struct st_table_rule_ent uint key_len; } TABLE_RULE_ENT; -my_bool ignore_table_inited; HASH ignore_table; static struct my_option my_long_options[] = @@ -532,16 +531,12 @@ static byte* get_table_key(TABLE_RULE_ENT* e, uint* len, } -void init_table_rule_hash(HASH* h, bool* h_inited) +void init_table_rule_hash(HASH* h) { if(hash_init(h, charset_info, TABLE_RULE_HASH_SIZE, 0, 0, (hash_get_key) get_table_key, (hash_free_key) free_table_ent, 0)) - { - fprintf(stderr, "Internal hash initialization error\n"); - exit(1); - } - *h_inited= 1; + exit(EX_EOM); } @@ -617,37 +612,30 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case (int) OPT_IGNORE_TABLE: { - const char* dot = strchr(argument, '.'); - if (!dot) - { - fprintf(stderr, "Illegal use of option --ignore-table=<database>.<table>\n"); - exit(1); - } - // len is always > 0 because we know the there exists a '.' uint len= (uint)strlen(argument); - TABLE_RULE_ENT* e= (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT) - + len, MYF(MY_WME)); - if (!e) + TABLE_RULE_ENT* e; + if (!strchr(argument, '.')) { - fprintf(stderr, "Internal memory allocation error\n"); + fprintf(stderr, "Illegal use of option --ignore-table=<database>.<table>\n"); exit(1); } + /* len is always > 0 because we know the there exists a '.' */ + e= (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT) + len, MYF(MY_WME)); + if (!e) + exit(EX_EOM); e->key= (char*)e + sizeof(TABLE_RULE_ENT); e->key_len= len; memcpy(e->key, argument, len); - if (!ignore_table_inited) - init_table_rule_hash(&ignore_table, &ignore_table_inited); - + if (!hash_inited(&ignore_table)) + init_table_rule_hash(&ignore_table); + if(my_hash_insert(&ignore_table, (byte*)e)) - { - fprintf(stderr, "Internal hash insert error\n"); - exit(1); - } + exit(EX_EOM); break; } case (int) OPT_COMPATIBLE: - { + { char buff[255]; char *end= compatible_mode_normal_str; int i; @@ -2021,8 +2009,7 @@ static int init_dumping(char *database) my_bool include_table(byte* hash_key, uint len) { - if (ignore_table_inited && - hash_search(&ignore_table, (byte*) hash_key, len)) + if (hash_search(&ignore_table, (byte*) hash_key, len)) return FALSE; return TRUE; diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 1c560dfa8b4..8348ef12b0d 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -697,3 +697,9 @@ quote(ltrim(concat(' ', 'a'))) select quote(trim(concat(' ', 'a'))); quote(trim(concat(' ', 'a'))) 'a' +select trim(null from 'kate') as "must_be_null"; +must_be_null +NULL +select trim('xyz' from null) as "must_be_null"; +must_be_null +NULL diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index 5477a0ccb30..a5d95332caa 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -435,3 +435,11 @@ drop table t1; select quote(ltrim(concat(' ', 'a'))); select quote(trim(concat(' ', 'a'))); + +# +# Bug#7455 unexpected result: TRIM(<NULL> FROM <whatever>) gives NOT NULL +# According to ANSI if one of the TRIM arguments is NULL, then the result +# must be NULL too. +# +select trim(null from 'kate') as "must_be_null"; +select trim('xyz' from null) as "must_be_null"; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 068878652e4..2a63c5355a4 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1302,9 +1302,18 @@ String *Item_func_trim::val_str(String *str) return 0; /* purecov: inspected */ char buff[MAX_FIELD_WIDTH]; String tmp(buff,sizeof(buff),res->charset()); - String *remove_str= (arg_count==2) ? args[1]->val_str(&tmp) : &remove; uint remove_length; LINT_INIT(remove_length); + String *remove_str; /* The string to remove from res. */ + + if (arg_count == 2) + { + remove_str= args[1]->val_str(&tmp); + if ((null_value= args[1]->null_value)) + return 0; + } + else + remove_str= &remove; /* Default value. */ if (!remove_str || (remove_length=remove_str->length()) == 0 || remove_length > res->length()) |