summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <lenz@mysql.com>2004-12-28 17:38:30 +0100
committerunknown <lenz@mysql.com>2004-12-28 17:38:30 +0100
commita77d4ce2725a0d8e2310b3d7e1c3aed7908ea143 (patch)
treee35eaae1dbce601c83baff0c3600b313ddce1503
parent5256ae3541024bfe7bfb2d120be0035a5fbc91a3 (diff)
parent0ebb5292f8f525fe70f90a6da972c7fc10811c62 (diff)
downloadmariadb-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.c43
-rw-r--r--mysql-test/r/func_str.result6
-rw-r--r--mysql-test/t/func_str.test8
-rw-r--r--sql/item_strfunc.cc11
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())