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>
27
#define get_esc_bit(mask, num) (1 & (*((mask) + ((num) >> 3))) >> ((num) & 7))
30
QUOTE() function returns argument string in single quotes suitable for
31
using in a SQL statement.
33
Adds a \\ before all characters that needs to be escaped in a SQL string.
34
We also escape '^Z' (END-OF-FILE in windows) to avoid probelms when
35
running commands from a file in windows.
37
This function is very useful when you want to generate SQL statements.
40
QUOTE(NULL) returns the string 'NULL' (4 letters, without quotes).
48
String *Item_func_quote::val_str(String *str)
52
Bit mask that has 1 for set for the position of the following characters:
56
static unsigned char escmask[32]=
58
0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
59
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
60
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
64
char *from, *to, *end, *start;
65
String *arg= args[0]->val_str(str);
66
uint32_t arg_length, new_length;
67
if (!arg) // Null argument
69
/* Return the string 'NULL' */
70
str->copy(STRING_WITH_LEN("NULL"), collation.collation);
75
arg_length= arg->length();
76
new_length= arg_length+2; /* for beginning and ending ' signs */
78
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++)
79
new_length+= get_esc_bit(escmask, (unsigned char) *from);
81
if (tmp_value.alloc(new_length))
85
We replace characters from the end to the beginning
87
to= (char*) tmp_value.ptr() + new_length - 1;
89
for (start= (char*) arg->ptr(),end= start + arg_length; end-- != start; to--)
92
We can't use the bitmask here as we want to replace \O and ^Z with 0
115
tmp_value.length(new_length);
116
tmp_value.set_charset(collation.collation);
125
} /* namespace drizzled */