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
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
22
#include <drizzled/function/str/quote.h>
28
static uint32_t get_esc_bit(unsigned char *mask, unsigned char num)
30
return (1 & (*((mask) + ((num) >> 3))) >> ((num) & 7));
35
* Returns the argument string in single quotes suitable for using in a SQL statement.
38
* Adds a \\ before all characters that needs to be escaped in a SQL string.
39
* We also escape '^Z' (END-OF-FILE in windows) to avoid problems when
40
* running commands from a file in windows.
42
* This function is very useful when you want to generate SQL statements.
45
* val_str(NULL) returns the string 'NULL' (4 letters, without quotes).
47
* @retval str Quoted string
48
* @retval NULL Out of memory.
50
String *Item_func_quote::val_str(String *str)
54
Bit mask that has 1 for set for the position of the following characters:
58
static unsigned char escmask[32]=
60
0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
61
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
62
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
66
char *from, *to, *end, *start;
67
String *arg= args[0]->val_str(str);
68
uint32_t arg_length, new_length;
69
if (!arg) // Null argument
71
/* Return the string 'NULL' */
72
str->copy(STRING_WITH_LEN("NULL"), collation.collation);
77
arg_length= arg->length();
78
new_length= arg_length+2; /* for beginning and ending ' signs */
80
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++)
81
new_length+= get_esc_bit(escmask, (unsigned char) *from);
83
if (tmp_value.alloc(new_length))
87
We replace characters from the end to the beginning
89
to= (char*) tmp_value.ptr() + new_length - 1;
91
for (start= (char*) arg->ptr(),end= start + arg_length; end-- != start; to--)
94
We can't use the bitmask here as we want to replace \O and ^Z with 0
117
tmp_value.length(new_length);
118
tmp_value.set_charset(collation.collation);
127
} /* namespace drizzled */