diff options
author | unknown <ram@ram.(none)> | 2002-08-08 20:25:53 +0500 |
---|---|---|
committer | unknown <ram@ram.(none)> | 2002-08-08 20:25:53 +0500 |
commit | 744a4f95d9c581588ffb11cce01ca15310d734da (patch) | |
tree | 4a9a6bb08d5e22e59a72992adf73586c7f810ecd /sql/item_strfunc.cc | |
parent | 028cfaba9ba0fcbba30511e6951daab6a1829f20 (diff) | |
download | mariadb-git-744a4f95d9c581588ffb11cce01ca15310d734da.tar.gz |
new QUOTE() fuction has been added
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r-- | sql/item_strfunc.cc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index f074629e376..30968faa9b8 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2070,3 +2070,56 @@ String* Item_func_inet_ntoa::val_str(String* str) str->length(str->length()-1); // Remove last '.'; return str; } + +String *Item_func_quote::val_str(String *str) +{ + String *arg= args[0]->val_str(str); + char *strptr, *argptr, *end, *arglast; + uint delta= 2; /* for beginning and ending ' signs */ + + for (argptr= (char*) arg->ptr(), end= argptr + arg->length(); argptr < end; + argptr++) + { + switch (*argptr) { + case '\'': + case '\\': + case 0: + case '\032': + delta++; + } + } + if (str->alloc(arg->length() + delta)) + { + null_value= 1; + return 0; + } + strptr= (char*) str->ptr() + arg->length() + delta - 1; + *strptr= '\''; + for (end= (char*) arg->ptr(), arglast= end + arg->length(), + argptr= arglast - 1; argptr >= end; argptr--) + { + switch (*argptr) { + case '\'': + case '\\': + case 0: + case '\032': + strptr-= arglast - argptr; + memmove(strptr, argptr, arglast - argptr); + arglast= argptr; + *--strptr= '\\'; + } + } + if (arglast != end) + { + strptr-= arglast - end; + memmove(strptr, end, arglast - end); + } + *--strptr= '\''; + str->length(arg->length() + delta); + return str; +} + +void Item_func_quote::fix_length_and_dec() +{ + max_length= args[0]->max_length * 2 + 2; +} |