diff options
author | unknown <holyfoot/hf@hfmain.(none)> | 2007-05-11 13:07:53 +0500 |
---|---|---|
committer | unknown <holyfoot/hf@hfmain.(none)> | 2007-05-11 13:07:53 +0500 |
commit | 812a6ee7afdd79341c1b63ea328631bafe1e8839 (patch) | |
tree | cfe1053ca43f5280090655ddfc9adf20870cb60c | |
parent | 59ae1777e5e5e123baf57e497791a2c2596096da (diff) | |
parent | a6da564a1d15925780f45d4bef439d4ae548f70d (diff) | |
download | mariadb-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.result | 13 | ||||
-rw-r--r-- | sql/field.cc | 3 | ||||
-rw-r--r-- | sql/item_create.cc | 20 | ||||
-rw-r--r-- | sql/item_create.h | 6 | ||||
-rw-r--r-- | sql/item_func.cc | 19 | ||||
-rw-r--r-- | sql/item_func.h | 2 | ||||
-rw-r--r-- | sql/my_decimal.h | 11 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 12 |
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; } |