summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@hfmain.(none)>2007-05-11 13:07:53 +0500
committerunknown <holyfoot/hf@hfmain.(none)>2007-05-11 13:07:53 +0500
commit812a6ee7afdd79341c1b63ea328631bafe1e8839 (patch)
treecfe1053ca43f5280090655ddfc9adf20870cb60c
parent59ae1777e5e5e123baf57e497791a2c2596096da (diff)
parenta6da564a1d15925780f45d4bef439d4ae548f70d (diff)
downloadmariadb-git-812a6ee7afdd79341c1b63ea328631bafe1e8839.tar.gz
Merge mysql.com:/home/hf/work/27921/my50-27921
into mysql.com:/home/hf/work/27921/my51-27921 mysql-test/r/cast.result: Auto merged mysql-test/r/view.result: Auto merged sql/field.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_create.h: merging sql/my_decimal.h: merging sql/sql_yacc.yy: merging
-rw-r--r--mysql-test/r/view.result13
-rw-r--r--sql/field.cc3
-rw-r--r--sql/item_create.cc20
-rw-r--r--sql/item_create.h6
-rw-r--r--sql/item_func.cc19
-rw-r--r--sql/item_func.h2
-rw-r--r--sql/my_decimal.h11
-rw-r--r--sql/sql_yacc.yy12
8 files changed, 64 insertions, 22 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index cc353f5e1db..d1098020b25 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -3346,6 +3346,19 @@ id select_type table type possible_keys key key_len ref rows Extra
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL Using filesort
DROP VIEW v1;
DROP TABLE t1;
+CREATE VIEW v1 AS SELECT CAST( 1.23456789 AS DECIMAL( 7,5 ) ) AS col;
+SELECT * FROM v1;
+col
+1.23457
+DESCRIBE v1;
+Field Type Null Key Default Extra
+col decimal(7,5) NO 0.00000
+DROP VIEW v1;
+CREATE VIEW v1 AS SELECT CAST(1.23456789 AS DECIMAL(8,0)) AS col;
+SHOW CREATE VIEW v1;
+View Create View
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(1.23456789 as decimal(8,0)) AS `col`
+DROP VIEW v1;
End of 5.0 tests.
DROP DATABASE IF EXISTS `d-1`;
CREATE DATABASE `d-1`;
diff --git a/sql/field.cc b/sql/field.cc
index 3ae82fe6182..fa25871fe61 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -8772,8 +8772,7 @@ bool create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
case MYSQL_TYPE_NULL:
break;
case MYSQL_TYPE_NEWDECIMAL:
- if (!fld_length && !decimals)
- length= 10;
+ my_decimal_trim(&length, &decimals);
if (length > DECIMAL_MAX_PRECISION)
{
my_error(ER_TOO_BIG_PRECISION, MYF(0), length, fld_name,
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 8ff78ef1b48..c40c7a4de6c 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -3916,6 +3916,7 @@ Create_func_master_pos_wait Create_func_master_pos_wait::s_singleton;
Item*
Create_func_master_pos_wait::create_native(THD *thd, LEX_STRING name,
List<Item> *item_list)
+
{
Item *func= NULL;
int arg_count= 0;
@@ -3946,7 +3947,6 @@ Create_func_master_pos_wait::create_native(THD *thd, LEX_STRING name,
my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name.str);
break;
}
- }
return func;
}
@@ -4970,11 +4970,15 @@ find_qualified_function_builder(THD *thd)
return & Create_sp_func::s_singleton;
}
-Item*
-create_func_cast(THD *thd, Item *a, Cast_target cast_type, int len, int dec,
+
+Item *
+create_func_cast(Item *a, Cast_target cast_type,
+ const char *c_len, const char *c_dec,
CHARSET_INFO *cs)
{
Item *res;
+ ulong len;
+ uint dec;
LINT_INIT(res);
switch (cast_type) {
@@ -4998,18 +5002,21 @@ create_func_cast(THD *thd, Item *a, Cast_target cast_type, int len, int dec,
break;
case ITEM_CAST_DECIMAL:
{
- int tmp_len= (len>0) ? len : 10;
- if (tmp_len < dec)
+ len= c_len ? atoi(c_len) : 0;
+ dec= c_dec ? atoi(c_dec) : 0;
+ my_decimal_trim(&len, &dec);
+ if (len < dec)
{
my_error(ER_M_BIGGER_THAN_D, MYF(0), "");
return 0;
}
- res= new (thd->mem_root) Item_decimal_typecast(a, tmp_len, dec);
+ res= new (thd->mem_root) Item_decimal_typecast(a, len, dec);
break;
}
case ITEM_CAST_CHAR:
{
CHARSET_INFO *real_cs= (cs ? cs : thd->variables.collation_connection);
+ len= c_len ? atoi(c_len) : -1;
res= new (thd->mem_root) Item_char_typecast(a, len, real_cs);
break;
}
@@ -5022,4 +5029,3 @@ create_func_cast(THD *thd, Item *a, Cast_target cast_type, int len, int dec,
}
return res;
}
-
diff --git a/sql/item_create.h b/sql/item_create.h
index 0a668b3e67f..7ace4032515 100644
--- a/sql/item_create.h
+++ b/sql/item_create.h
@@ -159,9 +159,9 @@ protected:
@param dec TODO
@param cs The character set
*/
-Item*
-create_func_cast(THD *thd, Item *a, Cast_target cast_type, int len, int dec,
+Item *
+create_func_cast(THD *thd, Item *a, Cast_target cast_type,
+ const char *len, const char *dec,
CHARSET_INFO *cs);
-
#endif
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 33521edbbd4..10021b11769 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1080,9 +1080,26 @@ err:
void Item_decimal_typecast::print(String *str)
{
+ char len_buf[20*3 + 1];
+ char *end;
+ CHARSET_INFO *cs= str->charset();
+
+ uint precision= my_decimal_length_to_precision(max_length, decimals,
+ unsigned_flag);
str->append(STRING_WITH_LEN("cast("));
args[0]->print(str);
- str->append(STRING_WITH_LEN(" as decimal)"));
+ str->append(STRING_WITH_LEN(" as decimal("));
+
+ end=int10_to_str(precision, len_buf,10);
+ str->append(len_buf, (uint32) (end - len_buf));
+
+ str->append(',');
+
+ end=int10_to_str(decimals, len_buf,10);
+ str->append(len_buf, (uint32) (end - len_buf));
+
+ str->append(')');
+ str->append(')');
}
diff --git a/sql/item_func.h b/sql/item_func.h
index 10464a408a7..1661e1a10de 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -333,8 +333,8 @@ class Item_decimal_typecast :public Item_func
public:
Item_decimal_typecast(Item *a, int len, int dec) :Item_func(a)
{
- max_length= len + 2;
decimals= dec;
+ max_length= my_decimal_precision_to_length(len, dec, unsigned_flag);
}
String *val_str(String *str);
double val_real();
diff --git a/sql/my_decimal.h b/sql/my_decimal.h
index eade029677f..b349fc3f62e 100644
--- a/sql/my_decimal.h
+++ b/sql/my_decimal.h
@@ -395,5 +395,16 @@ int my_decimal_intg(const my_decimal *a)
}
+void my_decimal_trim(ulong *precision, uint *scale)
+{
+ if (!(*precision) && !(*scale))
+ {
+ *precision= 10;
+ *scale= 0;
+ return;
+ }
+}
+
+
#endif /*my_decimal_h*/
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 87cd33117dc..f75683c31de 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -6477,15 +6477,13 @@ simple_expr:
}
| BINARY simple_expr %prec NEG
{
- $$= create_func_cast(YYTHD, $2, ITEM_CAST_CHAR, -1, 0,
+ $$= create_func_cast(YYTHD, $2, ITEM_CAST_CHAR, NULL, NULL,
&my_charset_bin);
}
| CAST_SYM '(' expr AS cast_type ')'
{
LEX *lex= Lex;
- $$= create_func_cast(YYTHD, $3, $5,
- lex->length ? atoi(lex->length) : -1,
- lex->dec ? atoi(lex->dec) : 0,
+ $$= create_func_cast(YYTHD, $3, $5, lex->length, lex->dec,
lex->charset);
if (!$$)
MYSQL_YYABORT;
@@ -6494,10 +6492,8 @@ simple_expr:
{ $$= new (YYTHD->mem_root) Item_func_case(* $3, $2, $4 ); }
| CONVERT_SYM '(' expr ',' cast_type ')'
{
- $$= create_func_cast(YYTHD, $3, $5,
- Lex->length ? atoi(Lex->length) : -1,
- Lex->dec ? atoi(Lex->dec) : 0,
- Lex->charset);
+ $$= create_func_cast(YYTHD, $3, $5, Lex->length, Lex->dec,
+ Lex->charset);
if (!$$)
MYSQL_YYABORT;
}