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
20
#include <drizzled/server_includes.h>
22
#include <drizzled/functions/str/quote.h>
25
#define get_esc_bit(mask, num) (1 & (*((mask) + ((num) >> 3))) >> ((num) & 7))
28
QUOTE() function returns argument string in single quotes suitable for
29
using in a SQL statement.
31
Adds a \\ before all characters that needs to be escaped in a SQL string.
32
We also escape '^Z' (END-OF-FILE in windows) to avoid probelms when
33
running commands from a file in windows.
35
This function is very useful when you want to generate SQL statements.
38
QUOTE(NULL) returns the string 'NULL' (4 letters, without quotes).
46
String *Item_func_quote::val_str(String *str)
50
Bit mask that has 1 for set for the position of the following characters:
54
static unsigned char escmask[32]=
56
0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
57
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
58
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
62
char *from, *to, *end, *start;
63
String *arg= args[0]->val_str(str);
64
uint32_t arg_length, new_length;
65
if (!arg) // Null argument
67
/* Return the string 'NULL' */
68
str->copy(STRING_WITH_LEN("NULL"), collation.collation);
73
arg_length= arg->length();
74
new_length= arg_length+2; /* for beginning and ending ' signs */
76
for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++)
77
new_length+= get_esc_bit(escmask, (unsigned char) *from);
79
if (tmp_value.alloc(new_length))
83
We replace characters from the end to the beginning
85
to= (char*) tmp_value.ptr() + new_length - 1;
87
for (start= (char*) arg->ptr(),end= start + arg_length; end-- != start; to--)
90
We can't use the bitmask here as we want to replace \O and ^Z with 0
113
tmp_value.length(new_length);
114
tmp_value.set_charset(collation.collation);