diff options
author | unknown <vva@eagle.mysql.r18.ru> | 2003-09-30 12:32:48 -0400 |
---|---|---|
committer | unknown <vva@eagle.mysql.r18.ru> | 2003-09-30 12:32:48 -0400 |
commit | de6a1085eb101d9a091a1d437c1ff4e75eb5e8a0 (patch) | |
tree | 99cd610ffe9d4d0dbe5668a7764c6f2cc479a443 /sql/item_func.cc | |
parent | 2d9e4e66981844fec25185660f9164b49fc58126 (diff) | |
download | mariadb-git-de6a1085eb101d9a091a1d437c1ff4e75eb5e8a0.tar.gz |
rewrite Item_func_set_user_var ::val, ::val_str, ::val_int, ::update
with less code duplication
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 135 |
1 files changed, 46 insertions, 89 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 10f267b766d..2105df6156c 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1899,35 +1899,46 @@ void Item_func_set_user_var::update_hash(void *ptr, uint length, return; } +double Item_func_set_user_var::native_val() +{ + double value=args[0]->val(); + update_hash((void*) &value,sizeof(value), REAL_RESULT); + return value; +} + +longlong Item_func_set_user_var::native_val_int() +{ + longlong value=args[0]->val_int(); + update_hash((void*) &value,sizeof(longlong),INT_RESULT); + return value; +} + +String *Item_func_set_user_var::native_val_str(String *str) +{ + char buffer[MAX_FIELD_WIDTH]; + String *res=args[0]->val_str(str); + if (!res) // Null value + update_hash((void*) 0,0,STRING_RESULT); + else + update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); + return res; +} + +String *Item_func_set_user_var::native_val_str() +{ + char buffer[MAX_FIELD_WIDTH]; + String tmp(buffer,sizeof(buffer)); + return native_val_str(&tmp); +} bool Item_func_set_user_var::update() { DBUG_ENTER("Item_func_set_user_var::update"); switch (cached_result_type) { - case REAL_RESULT: - { - double value=args[0]->val(); - update_hash((void*) &value,sizeof(value), REAL_RESULT); - break; - } - case INT_RESULT: - { - longlong value=args[0]->val_int(); - update_hash((void*) &value,sizeof(longlong),INT_RESULT); - break; - } - case STRING_RESULT: - { - char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer)); - String *res=args[0]->val_str(&tmp); - if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT); - else - update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); - break; - } + case REAL_RESULT: (void)native_val(); break; + case INT_RESULT: (void)native_val_int(); break; + case STRING_RESULT: (void)native_val_str(); break; } DBUG_RETURN(current_thd->fatal_error); } @@ -1938,28 +1949,12 @@ Item_func_set_user_var::val() { DBUG_ENTER("Item_func_set_user_var::val"); switch (cached_result_type) { - case REAL_RESULT: - { - double value=args[0]->val(); - update_hash((void*) &value,sizeof(value), REAL_RESULT); - return value; - } - case INT_RESULT: - { - longlong value=args[0]->val_int(); - update_hash((void*) &value,sizeof(longlong),INT_RESULT); - return value; - } + case REAL_RESULT: return native_val(); break; + case INT_RESULT: return native_val_int(); break; case STRING_RESULT: { - char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer)); - String *res=args[0]->val_str(&tmp); - if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT); - else - update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); - return atof(res->c_ptr()); + String *res= native_val_str(); + return !res ? 0 : atof(res->c_ptr()); } } DBUG_RETURN(args[0]->val()); @@ -1970,28 +1965,12 @@ Item_func_set_user_var::val_int() { DBUG_ENTER("Item_func_set_user_var::val_int"); switch (cached_result_type) { - case REAL_RESULT: - { - double value=args[0]->val(); - update_hash((void*) &value,sizeof(value), REAL_RESULT); - return (longlong)value; - } - case INT_RESULT: - { - longlong value=args[0]->val_int(); - update_hash((void*) &value,sizeof(longlong),INT_RESULT); - return value; - } + case REAL_RESULT: return (longlong)native_val(); break; + case INT_RESULT: return native_val_int(); break; case STRING_RESULT: { - char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer)); - String *res=args[0]->val_str(&tmp); - if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT); - else - update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); - return strtoull(res->c_ptr(),NULL,10); + String *res= native_val_str(); + return !res ? 0 : strtoull(res->c_ptr(),NULL,10); } } DBUG_RETURN(args[0]->val_int()); @@ -2002,33 +1981,11 @@ Item_func_set_user_var::val_str(String *str) { DBUG_ENTER("Item_func_set_user_var::val_str"); switch (cached_result_type) { - case REAL_RESULT: - { - double value=args[0]->val(); - update_hash((void*) &value,sizeof(value), REAL_RESULT); - str->set(value,decimals); - return str; - } - case INT_RESULT: - { - longlong value=args[0]->val_int(); - update_hash((void*) &value,sizeof(longlong),INT_RESULT); - str->set(value,decimals); - return str; - } - case STRING_RESULT: - { - char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer)); - String *res=args[0]->val_str(&tmp); - if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT); - else - update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); - return res; + case REAL_RESULT: str->set(native_val(),decimals); break; + case INT_RESULT: str->set(native_val_int(),decimals); break; + case STRING_RESULT: str= native_val_str(str); break; } - } - DBUG_RETURN(args[0]->val_str(str)); + DBUG_RETURN(str); } |