Commit f201828d authored by igor@olga.mysql.com's avatar igor@olga.mysql.com

Fixed bug #17526: incorrect print method

for class Item_func_trim. 
For 4.1 it caused wrong output for EXPLAIN EXTENDED commands
if expressions with the TRIM function of two arguments were used.
For 5.0 it caused an error message when trying to select
from a view with the TRIM function of two arguments.
This unexpected error message was due to the fact that the
print method for the class Item_func_trim was inherited from
the class Item_func. Yet the TRIM function does not take a list
of its arguments. Rather it takes the arguments in the form:
  [{BOTH | LEADING | TRAILING} [remstr] FROM] str) |
  [remstr FROM] str
parent a8d230c6
...@@ -1036,4 +1036,32 @@ a c ...@@ -1036,4 +1036,32 @@ a c
abc abc abc abc abc abc
xyz xyz xyz xyz xyz xyz
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (s varchar(10));
INSERT INTO t1 VALUES ('yadda'), ('yaddy');
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(s) > 'ab';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
Warnings:
Note 1003 select test.t1.s AS `s` from test.t1 where (trim(test.t1.s) > _latin1'ab')
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM('y' FROM s) > 'ab';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
Warnings:
Note 1003 select test.t1.s AS `s` from test.t1 where (trim(both _latin1'y' from test.t1.s) > _latin1'ab')
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(LEADING 'y' FROM s) > 'ab';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
Warnings:
Note 1003 select test.t1.s AS `s` from test.t1 where (trim(leading _latin1'y' from test.t1.s) > _latin1'ab')
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(TRAILING 'y' FROM s) > 'ab';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
Warnings:
Note 1003 select test.t1.s AS `s` from test.t1 where (trim(trailing _latin1'y' from test.t1.s) > _latin1'ab')
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(BOTH 'y' FROM s) > 'ab';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
Warnings:
Note 1003 select test.t1.s AS `s` from test.t1 where (trim(both _latin1'y' from test.t1.s) > _latin1'ab')
DROP TABLE t1;
End of 4.1 tests End of 4.1 tests
...@@ -698,4 +698,19 @@ SELECT a, CONCAT(a,' ',a) AS c FROM t1 ...@@ -698,4 +698,19 @@ SELECT a, CONCAT(a,' ',a) AS c FROM t1
DROP TABLE t1; DROP TABLE t1;
#
# Bug#17526: WRONG PRINT for TRIM FUNCTION with two arguments
#
CREATE TABLE t1 (s varchar(10));
INSERT INTO t1 VALUES ('yadda'), ('yaddy');
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(s) > 'ab';
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM('y' FROM s) > 'ab';
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(LEADING 'y' FROM s) > 'ab';
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(TRAILING 'y' FROM s) > 'ab';
EXPLAIN EXTENDED SELECT s FROM t1 WHERE TRIM(BOTH 'y' FROM s) > 'ab';
DROP TABLE t1;
--echo End of 4.1 tests --echo End of 4.1 tests
...@@ -1444,6 +1444,23 @@ void Item_func_trim::fix_length_and_dec() ...@@ -1444,6 +1444,23 @@ void Item_func_trim::fix_length_and_dec()
} }
} }
void Item_func_trim::print(String *str)
{
if (arg_count == 1)
{
Item_func::print(str);
return;
}
str->append(Item_func_trim::func_name());
str->append('(');
str->append(mode_name());
str->append(' ');
args[1]->print(str);
str->append(" from ",6);
args[0]->print(str);
str->append(')');
}
/* Item_func_password */ /* Item_func_password */
......
...@@ -218,6 +218,8 @@ public: ...@@ -218,6 +218,8 @@ public:
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "trim"; } const char *func_name() const { return "trim"; }
void print(String *str);
virtual const char *mode_name() const { return "both"; }
}; };
...@@ -228,6 +230,7 @@ public: ...@@ -228,6 +230,7 @@ public:
Item_func_ltrim(Item *a) :Item_func_trim(a) {} Item_func_ltrim(Item *a) :Item_func_trim(a) {}
String *val_str(String *); String *val_str(String *);
const char *func_name() const { return "ltrim"; } const char *func_name() const { return "ltrim"; }
const char *mode_name() const { return "leading"; }
}; };
...@@ -238,6 +241,7 @@ public: ...@@ -238,6 +241,7 @@ public:
Item_func_rtrim(Item *a) :Item_func_trim(a) {} Item_func_rtrim(Item *a) :Item_func_trim(a) {}
String *val_str(String *); String *val_str(String *);
const char *func_name() const { return "rtrim"; } const char *func_name() const { return "rtrim"; }
const char *mode_name() const { return "trailing"; }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment