Commit b43eb82b authored by ram@ram.(none)'s avatar ram@ram.(none)
Browse files

QUOTE() func changes according to monty's suggestions

parent b7403f3d
Loading
Loading
Loading
Loading
+19 −34
Original line number Diff line number Diff line
@@ -2071,55 +2071,40 @@ String* Item_func_inet_ntoa::val_str(String* str)
  return str;
}

/*
  QUOTE() function returns argument string in single quotes,
  also adds a \ before \, ' CHAR(0) and CHAR(24)
*/
String *Item_func_quote::val_str(String *str)
{
  static char escmask[64] = {0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
			     0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  String *arg= args[0]->val_str(str);
  char *strptr, *argptr, *end, *arglast;
  char *from, *to, *end;
  uint delta= 2; /* for beginning and ending ' signs */

  for (argptr= (char*) arg->ptr(), end= argptr + arg->length(); argptr < end;
       argptr++)
  for (from= (char*) arg->ptr(), end= from + arg->length(); from < end; from++)
  {
    switch (*argptr) {
    case '\'':
    case '\\':
    case 0:
    case '\032':
    if (*(escmask + (*from >> 3)) and (1 << (*from & 7)))
      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--)
  to= (char*) str->ptr() + arg->length() + delta - 1;
  *to--= '\'';
  for (end= (char*) arg->ptr(), from= end + arg->length() - 1; from >= end; 
       from--, to--)
  {
    switch (*argptr) {
    case '\'':
    case '\\':
    case 0:
    case '\032':
      strptr-= arglast - argptr;
      memmove(strptr, argptr, arglast - argptr);
      arglast= argptr;
      *--strptr= '\\';
    *to= *from;
    if (*(escmask + (*from >> 3)) and (1 << (*from & 7)))
      *--to= '\\';
  }
  }
  if (arglast != end)
  {
    strptr-= arglast - end;
    memmove(strptr, end, arglast - end);
  }
  *--strptr= '\'';
  *to= '\'';
  str->length(arg->length() + delta);
  return str;
}

void Item_func_quote::fix_length_and_dec()
{
  max_length= args[0]->max_length * 2 + 2;
}
+1 −1
Original line number Diff line number Diff line
@@ -542,5 +542,5 @@ class Item_func_quote :public Item_str_func
  Item_func_quote(Item *a) :Item_str_func(a) {}
  const char *func_name() const { return "quote"; }
  String *val_str(String *);
  void fix_length_and_dec();
  void fix_length_and_dec() { max_length= args[0]->max_length * 2 + 2; }
};
+0 −3
Original line number Diff line number Diff line
@@ -283,7 +283,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token	PROCESS
%token	PROCESSLIST_SYM
%token	QUERY_SYM
%token  QUOTE
%token	RAID_0_SYM
%token	RAID_STRIPED_SYM
%token	RAID_TYPE
@@ -1816,8 +1815,6 @@ simple_expr:
	   }
	| POSITION_SYM '(' no_in_expr IN_SYM expr ')'
	  { $$ = new Item_func_locate($5,$3); }
	| QUOTE '(' expr ')'
	  { $$= new Item_func_quote($3); }
	| RAND '(' expr ')'
	  { $$= new Item_func_rand($3); current_thd->safe_to_cache_query=0;}
	| RAND '(' ')'