1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
#include <drizzled/lex_string.h>
30
static uint32_t get_esc_bit(unsigned char *mask, unsigned char num)
32
return (1 & (*((mask) + ((num) >> 3))) >> ((num) & 7));
37
* Returns the argument string in single quotes suitable for using in a SQL statement.
40
* Adds a \\ before all characters that needs to be escaped in a SQL string.
41
* We also escape '^Z' (END-OF-FILE in windows) to avoid problems when
42
* running commands from a file in windows.
44
* This function is very useful when you want to generate SQL statements.
47
* val_str(NULL) returns the string 'NULL' (4 letters, without quotes).
49
* @retval str Quoted string
50
* @retval NULL Out of memory.
52
String *Item_func_quote::val_str(String *str)
56
Bit mask that has 1 for set for the position of the following characters:
60
static unsigned char escmask[32]=
62
0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
63
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
64
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
68
char *from, *to, *end, *start;
69
String *arg= args[0]->val_str(str);
70
uint32_t arg_length, new_length;
71
if (!arg) // Null argument
73
/* Return the string 'NULL' */
74
str->copy(STRING_WITH_LEN("NULL"), collation.collation);
79
arg_length= arg->length();
80
new_length= arg_length+2; /* for beginning and ending ' signs */
82
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++)
83
new_length+= get_esc_bit(escmask, (unsigned char) *from);
85
if (tmp_value.alloc(new_length))
89
We replace characters from the end to the beginning
91
to= (char*) tmp_value.ptr() + new_length - 1;
93
for (start= (char*) arg->ptr(),end= start + arg_length; end-- != start; to--)
96
We can't use the bitmask here as we want to replace \O and ^Z with 0
119
tmp_value.length(new_length);
120
tmp_value.set_charset(collation.collation);
129
} /* namespace drizzled */