7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.14 2005/01/01 05:43:07 momjian Exp $
10
+ * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.15 2005/03/21 16:29:20 tgl Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
14
14
#include "postgres.h"
15
15
16
- #include <ctype.h>
17
-
18
- #include "mb/pg_wchar.h"
19
16
#include "utils/builtins.h"
20
17
21
18
22
- static bool quote_ident_required (text * iptr );
23
- static text * do_quote_ident (text * iptr );
24
- static text * do_quote_literal (text * iptr );
25
-
26
-
27
19
/*
28
20
* quote_ident -
29
21
* returns a properly quoted identifier
@@ -33,16 +25,22 @@ quote_ident(PG_FUNCTION_ARGS)
33
25
{
34
26
text * t = PG_GETARG_TEXT_P (0 );
35
27
text * result ;
28
+ const char * qstr ;
29
+ char * str ;
30
+ int len ;
36
31
37
- if (quote_ident_required (t ))
38
- result = do_quote_ident (t );
39
- else
40
- {
41
- result = (text * ) palloc (VARSIZE (t ));
42
- memcpy (result , t , VARSIZE (t ));
43
- }
32
+ /* We have to convert to a C string to use quote_identifier */
33
+ len = VARSIZE (t ) - VARHDRSZ ;
34
+ str = (char * ) palloc (len + 1 );
35
+ memcpy (str , VARDATA (t ), len );
36
+ str [len ] = '\0' ;
44
37
45
- PG_FREE_IF_COPY (t , 0 );
38
+ qstr = quote_identifier (str );
39
+
40
+ len = strlen (qstr );
41
+ result = (text * ) palloc (len + VARHDRSZ );
42
+ VARATT_SIZEP (result ) = len + VARHDRSZ ;
43
+ memcpy (VARDATA (result ), qstr , len );
46
44
47
45
PG_RETURN_TEXT_P (result );
48
46
}
@@ -56,136 +54,30 @@ quote_literal(PG_FUNCTION_ARGS)
56
54
{
57
55
text * t = PG_GETARG_TEXT_P (0 );
58
56
text * result ;
59
-
60
- result = do_quote_literal (t );
61
-
62
- PG_FREE_IF_COPY (t , 0 );
63
-
64
- PG_RETURN_TEXT_P (result );
65
- }
66
-
67
- /*
68
- * Check if a given identifier needs quoting
69
- */
70
- static bool
71
- quote_ident_required (text * iptr )
72
- {
73
- char * cp ;
74
- char * ep ;
75
-
76
- cp = VARDATA (iptr );
77
- ep = VARDATA (iptr ) + VARSIZE (iptr ) - VARHDRSZ ;
78
-
79
- if (cp >= ep )
80
- return true;
81
-
82
- if (pg_mblen (cp ) != 1 )
83
- return true;
84
- if (!(* cp == '_' || (* cp >= 'a' && * cp <= 'z' )))
85
- return true;
86
-
87
- while ((++ cp ) < ep )
88
- {
89
- if (pg_mblen (cp ) != 1 )
90
- return true;
91
-
92
- if (* cp >= 'a' && * cp <= 'z' )
93
- continue ;
94
- if (* cp >= '0' && * cp <= '9' )
95
- continue ;
96
- if (* cp == '_' )
97
- continue ;
98
-
99
- return true;
100
- }
101
-
102
- return false;
103
- }
104
-
105
- /*
106
- * Return a properly quoted identifier
107
- */
108
- static text *
109
- do_quote_ident (text * iptr )
110
- {
111
- text * result ;
112
57
char * cp1 ;
113
58
char * cp2 ;
114
59
int len ;
115
- int wl ;
116
60
117
- len = VARSIZE (iptr ) - VARHDRSZ ;
118
- result = (text * ) palloc (len * 2 + VARHDRSZ + 2 );
61
+ len = VARSIZE (t ) - VARHDRSZ ;
62
+ /* We make a worst-case result area; wasting a little space is OK */
63
+ result = (text * ) palloc (len * 2 + 2 + VARHDRSZ );
119
64
120
- cp1 = VARDATA (iptr );
121
- cp2 = VARDATA (result );
122
-
123
- * cp2 ++ = '"' ;
124
- while (len > 0 )
125
- {
126
- if ((wl = pg_mblen (cp1 )) != 1 )
127
- {
128
- len -= wl ;
129
-
130
- while (wl -- > 0 )
131
- * cp2 ++ = * cp1 ++ ;
132
- continue ;
133
- }
134
-
135
- if (* cp1 == '"' )
136
- * cp2 ++ = '"' ;
137
- * cp2 ++ = * cp1 ++ ;
138
-
139
- len -- ;
140
- }
141
- * cp2 ++ = '"' ;
142
-
143
- VARATT_SIZEP (result ) = cp2 - ((char * ) result );
144
-
145
- return result ;
146
- }
147
-
148
- /*
149
- * Return a properly quoted literal value
150
- */
151
- static text *
152
- do_quote_literal (text * lptr )
153
- {
154
- text * result ;
155
- char * cp1 ;
156
- char * cp2 ;
157
- int len ;
158
- int wl ;
159
-
160
- len = VARSIZE (lptr ) - VARHDRSZ ;
161
- result = (text * ) palloc (len * 2 + VARHDRSZ + 2 );
162
-
163
- cp1 = VARDATA (lptr );
65
+ cp1 = VARDATA (t );
164
66
cp2 = VARDATA (result );
165
67
166
68
* cp2 ++ = '\'' ;
167
- while (len > 0 )
69
+ while (len -- > 0 )
168
70
{
169
- if ((wl = pg_mblen (cp1 )) != 1 )
170
- {
171
- len -= wl ;
172
-
173
- while (wl -- > 0 )
174
- * cp2 ++ = * cp1 ++ ;
175
- continue ;
176
- }
177
-
178
71
if (* cp1 == '\'' )
179
72
* cp2 ++ = '\'' ;
180
- if (* cp1 == '\\' )
73
+ else if (* cp1 == '\\' )
181
74
* cp2 ++ = '\\' ;
182
- * cp2 ++ = * cp1 ++ ;
183
75
184
- len -- ;
76
+ * cp2 ++ = * cp1 ++ ;
185
77
}
186
78
* cp2 ++ = '\'' ;
187
79
188
80
VARATT_SIZEP (result ) = cp2 - ((char * ) result );
189
81
190
- return result ;
82
+ PG_RETURN_TEXT_P ( result ) ;
191
83
}
0 commit comments