summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <wax@kishkin.ru>2003-06-05 16:30:24 +0600
committerunknown <wax@kishkin.ru>2003-06-05 16:30:24 +0600
commit6bb747bb71c209ba03e56389c15e51e6bee7dcbc (patch)
tree75d36785e4e89436ca278fc41a56acf6b987eb39
parent284a6abeea27640bf7a726c06c90c5af9db09cf7 (diff)
parent0831433e8f8005331d68cd7edd708feb76dd3325 (diff)
downloadmariadb-git-6bb747bb71c209ba03e56389c15e51e6bee7dcbc.tar.gz
Merge kishkin.ru:/home/wax/mysql-4n into kishkin.ru:/home/wax/mysql-4g
-rw-r--r--mysql-test/r/func_str.result35
-rw-r--r--mysql-test/t/func_str.test15
-rw-r--r--sql/item_create.cc19
-rw-r--r--sql/item_strfunc.cc29
-rw-r--r--sql/item_strfunc.h30
-rw-r--r--sql/sql_yacc.yy20
6 files changed, 116 insertions, 32 deletions
diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index b69af17edd7..1a1de0ee3d5 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -270,6 +270,24 @@ latin2_general_ci 3
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
collation(concat_ws(_latin2'a',_latin2'b')) coercibility(concat_ws(_latin2'a',_latin2'b'))
latin2_general_ci 3
+select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
+collation(trim(_latin2' a ')) coercibility(trim(_latin2' a '))
+latin2_general_ci 3
+select collation(ltrim(_latin2' a ')), coercibility(ltrim(_latin2' a '));
+collation(ltrim(_latin2' a ')) coercibility(ltrim(_latin2' a '))
+latin2_general_ci 3
+select collation(rtrim(_latin2' a ')), coercibility(rtrim(_latin2' a '));
+collation(rtrim(_latin2' a ')) coercibility(rtrim(_latin2' a '))
+latin2_general_ci 3
+select collation(trim(LEADING _latin2' ' FROM _latin2'a')), coercibility(trim(LEADING _latin2'a' FROM _latin2'a'));
+collation(trim(LEADING _latin2' ' FROM _latin2'a')) coercibility(trim(LEADING _latin2'a' FROM _latin2'a'))
+latin2_general_ci 3
+select collation(trim(TRAILING _latin2' ' FROM _latin2'a')), coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'));
+collation(trim(TRAILING _latin2' ' FROM _latin2'a')) coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'))
+latin2_general_ci 3
+select collation(trim(BOTH _latin2' ' FROM _latin2'a')), coercibility(trim(BOTH _latin2'a' FROM _latin2'a'));
+collation(trim(BOTH _latin2' ' FROM _latin2'a')) coercibility(trim(BOTH _latin2'a' FROM _latin2'a'))
+latin2_general_ci 3
create table t1
select
left(_latin2'a',1),
@@ -278,7 +296,14 @@ lcase(_latin2'a'),
ucase(_latin2'a'),
substring(_latin2'a',1,1),
concat(_latin2'a',_latin2'b'),
-concat_ws(_latin2'a',_latin2'b');
+concat_ws(_latin2'a',_latin2'b'),
+trim(_latin2' a '),
+ltrim(_latin2' a '),
+rtrim(_latin2' a '),
+trim(LEADING _latin2' ' FROM _latin2' a '),
+trim(TRAILING _latin2' ' FROM _latin2' a '),
+trim(BOTH _latin2' ' FROM _latin2' a ')
+;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -288,6 +313,12 @@ t1 CREATE TABLE `t1` (
`ucase(_latin2'a')` char(1) character set latin2 NOT NULL default '',
`substring(_latin2'a',1,1)` char(1) character set latin2 NOT NULL default '',
`concat(_latin2'a',_latin2'b')` char(2) character set latin2 NOT NULL default '',
- `concat_ws(_latin2'a',_latin2'b')` char(1) character set latin2 NOT NULL default ''
+ `concat_ws(_latin2'a',_latin2'b')` char(1) character set latin2 NOT NULL default '',
+ `trim(_latin2' a ')` char(3) character set latin2 NOT NULL default '',
+ `ltrim(_latin2' a ')` char(3) character set latin2 NOT NULL default '',
+ `rtrim(_latin2' a ')` char(3) character set latin2 NOT NULL default '',
+ `trim(LEADING _latin2' ' FROM _latin2' a ')` char(3) character set latin2 NOT NULL default '',
+ `trim(TRAILING _latin2' ' FROM _latin2' a ')` char(3) character set latin2 NOT NULL default '',
+ `trim(BOTH _latin2' ' FROM _latin2' a ')` char(3) character set latin2 NOT NULL default ''
) TYPE=MyISAM CHARSET=latin1
drop table t1;
diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test
index 43530aa640d..d99b54d88ff 100644
--- a/mysql-test/t/func_str.test
+++ b/mysql-test/t/func_str.test
@@ -143,6 +143,12 @@ select collation(right(_latin2'a',1)), coercibility(right(_latin2'a',1));
select collation(substring(_latin2'a',1,1)), coercibility(substring(_latin2'a',1,1));
select collation(concat(_latin2'a',_latin2'b')), coercibility(concat(_latin2'a',_latin2'b'));
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
+select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
+select collation(ltrim(_latin2' a ')), coercibility(ltrim(_latin2' a '));
+select collation(rtrim(_latin2' a ')), coercibility(rtrim(_latin2' a '));
+select collation(trim(LEADING _latin2' ' FROM _latin2'a')), coercibility(trim(LEADING _latin2'a' FROM _latin2'a'));
+select collation(trim(TRAILING _latin2' ' FROM _latin2'a')), coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'));
+select collation(trim(BOTH _latin2' ' FROM _latin2'a')), coercibility(trim(BOTH _latin2'a' FROM _latin2'a'));
create table t1
select
left(_latin2'a',1),
@@ -151,7 +157,14 @@ select
ucase(_latin2'a'),
substring(_latin2'a',1,1),
concat(_latin2'a',_latin2'b'),
- concat_ws(_latin2'a',_latin2'b');
+ concat_ws(_latin2'a',_latin2'b'),
+ trim(_latin2' a '),
+ ltrim(_latin2' a '),
+ rtrim(_latin2' a '),
+ trim(LEADING _latin2' ' FROM _latin2' a '),
+ trim(TRAILING _latin2' ' FROM _latin2' a '),
+ trim(BOTH _latin2' ' FROM _latin2' a ')
+;
show create table t1;
drop table t1;
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 00c98937659..eb442424ca8 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -266,7 +266,7 @@ Item *create_func_lpad(Item* a, Item *b, Item *c)
Item *create_func_ltrim(Item* a)
{
- return new Item_func_ltrim(a,new Item_string(" ",1,default_charset_info));
+ return new Item_func_ltrim(a);
}
Item *create_func_md5(Item* a)
@@ -365,7 +365,7 @@ Item *create_func_rpad(Item* a, Item *b, Item *c)
Item *create_func_rtrim(Item* a)
{
- return new Item_func_rtrim(a,new Item_string(" ",1,default_charset_info));
+ return new Item_func_rtrim(a);
}
Item *create_func_sec_to_time(Item* a)
@@ -390,7 +390,20 @@ Item *create_func_sha(Item* a)
Item *create_func_space(Item *a)
{
- return new Item_func_repeat(new Item_string(" ",1,default_charset_info),a);
+ CHARSET_INFO *cs= current_thd->variables.collation_connection;
+ Item *sp;
+
+ if (cs->state & MY_CS_NONTEXT)
+ {
+ sp= new Item_string("",0,cs);
+ if (sp)
+ sp->str_value.copy(" ",1,&my_charset_latin1,cs);
+ }
+ else
+ {
+ sp= new Item_string(" ",1,cs);
+ }
+ return new Item_func_repeat(sp, a);
}
Item *create_func_soundex(Item* a)
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 3c4b5070850..2a4f4e0c410 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1136,7 +1136,7 @@ String *Item_func_ltrim::val_str(String *str)
return 0; /* purecov: inspected */
char buff[MAX_FIELD_WIDTH];
String tmp(buff,sizeof(buff),res->charset());
- String *remove_str=args[1]->val_str(&tmp);
+ String *remove_str= (arg_count==2) ? args[1]->val_str(&tmp) : &remove;
uint remove_length;
LINT_INIT(remove_length);
@@ -1174,7 +1174,7 @@ String *Item_func_rtrim::val_str(String *str)
return 0; /* purecov: inspected */
char buff[MAX_FIELD_WIDTH];
String tmp(buff,sizeof(buff),res->charset());
- String *remove_str=args[1]->val_str(&tmp);
+ String *remove_str= (arg_count==2) ? args[1]->val_str(&tmp) : &remove;
uint remove_length;
LINT_INIT(remove_length);
@@ -1246,7 +1246,7 @@ 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=args[1]->val_str(&tmp);
+ String *remove_str= (arg_count==2) ? args[1]->val_str(&tmp) : &remove;
uint remove_length;
LINT_INIT(remove_length);
@@ -1291,6 +1291,29 @@ String *Item_func_trim::val_str(String *str)
return &tmp_value;
}
+void Item_func_trim::fix_length_and_dec()
+{
+ max_length= args[0]->max_length;
+ if (arg_count == 1)
+ {
+ set_charset(args[0]->charset(), args[0]->coercibility);
+ remove.set_charset(charset());
+ remove.set_ascii(" ",1);
+ }
+ else
+ if (set_charset(args[1]->charset(), args[1]->coercibility,
+ args[0]->charset(), args[0]->coercibility))
+ {
+ my_error(ER_CANT_AGGREGATE_COLLATIONS,MYF(0),
+ args[1]->charset()->name,coercion_name(args[1]->coercibility),
+ args[0]->charset()->name,coercion_name(args[0]->coercibility),
+ func_name());
+ }
+}
+
+
+
+
void Item_func_password::fix_length_and_dec()
{
/*
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 65aad3a3fff..a70c9b39255 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -220,35 +220,37 @@ public:
};
-class Item_func_ltrim :public Item_str_func
+class Item_func_trim :public Item_str_func
{
+protected:
String tmp_value;
+ String remove;
public:
- Item_func_ltrim(Item *a,Item *b) :Item_str_func(a,b) {}
+ Item_func_trim(Item *a,Item *b) :Item_str_func(a,b) {}
+ Item_func_trim(Item *a) :Item_str_func(a) {}
String *val_str(String *);
- void fix_length_and_dec() { max_length= args[0]->max_length; }
- const char *func_name() const { return "ltrim"; }
+ void fix_length_and_dec();
+ const char *func_name() const { return "trim"; }
};
-class Item_func_rtrim :public Item_str_func
+class Item_func_ltrim :public Item_func_trim
{
- String tmp_value;
public:
- Item_func_rtrim(Item *a,Item *b) :Item_str_func(a,b) {}
+ Item_func_ltrim(Item *a,Item *b) :Item_func_trim(a,b) {}
+ Item_func_ltrim(Item *a) :Item_func_trim(a) {}
String *val_str(String *);
- void fix_length_and_dec() { max_length= args[0]->max_length; }
- const char *func_name() const { return "rtrim"; }
+ const char *func_name() const { return "ltrim"; }
};
-class Item_func_trim :public Item_str_func
+
+class Item_func_rtrim :public Item_func_trim
{
- String tmp_value;
public:
- Item_func_trim(Item *a,Item *b) :Item_str_func(a,b) {}
+ Item_func_rtrim(Item *a,Item *b) :Item_func_trim(a,b) {}
+ Item_func_rtrim(Item *a) :Item_func_trim(a) {}
String *val_str(String *);
- void fix_length_and_dec() { max_length= args[0]->max_length; }
- const char *func_name() const { return "trim"; }
+ const char *func_name() const { return "rtrim"; }
};
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 66a29a8cbd5..9b2808f93a8 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -593,7 +593,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%type <item>
literal text_literal insert_ident order_ident
simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr
- table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr
+ table_wild no_in_expr expr_expr simple_expr no_and_expr
using_list expr_or_default set_expr_or_default interval_expr
param_marker singlerow_subselect singlerow_subselect_init
exists_subselect exists_subselect_init
@@ -2479,13 +2479,19 @@ simple_expr:
| SUBSTRING_INDEX '(' expr ',' expr ',' expr ')'
{ $$= new Item_func_substr_index($3,$5,$7); }
| TRIM '(' expr ')'
- { $$= new Item_func_trim($3,new Item_string(" ",1,default_charset_info)); }
- | TRIM '(' LEADING opt_pad FROM expr ')'
+ { $$= new Item_func_trim($3); }
+ | TRIM '(' LEADING expr FROM expr ')'
{ $$= new Item_func_ltrim($6,$4); }
- | TRIM '(' TRAILING opt_pad FROM expr ')'
+ | TRIM '(' TRAILING expr FROM expr ')'
{ $$= new Item_func_rtrim($6,$4); }
- | TRIM '(' BOTH opt_pad FROM expr ')'
+ | TRIM '(' BOTH expr FROM expr ')'
{ $$= new Item_func_trim($6,$4); }
+ | TRIM '(' LEADING FROM expr ')'
+ { $$= new Item_func_ltrim($5); }
+ | TRIM '(' TRAILING FROM expr ')'
+ { $$= new Item_func_rtrim($5); }
+ | TRIM '(' BOTH FROM expr ')'
+ { $$= new Item_func_trim($5); }
| TRIM '(' expr FROM expr ')'
{ $$= new Item_func_trim($5,$3); }
| TRUNCATE_SYM '(' expr ',' expr ')'
@@ -2707,10 +2713,6 @@ when_list2:
sel->when_list.head()->push_back($5);
};
-opt_pad:
- /* empty */ { $$=new Item_string(" ",1,default_charset_info); }
- | expr { $$=$1; };
-
join_table_list:
'(' join_table_list ')' { $$=$2; }
| join_table { $$=$1; }