Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit775d283

Browse files
committed
Fix quote_ident to use quote_identifier rather than its own, not quite
up-to-speed logic; in particular this will cause it to quote names thatmatch keywords. Remove unnecessary multibyte cruft from quote_literal(all backend-internal encodings are 8-bit-safe).
1 parent6a8eb1a commit775d283

File tree

1 file changed

+23
-131
lines changed

1 file changed

+23
-131
lines changed

‎src/backend/utils/adt/quote.c

Lines changed: 23 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,15 @@
77
*
88
*
99
* 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 $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include"postgres.h"
1515

16-
#include<ctype.h>
17-
18-
#include"mb/pg_wchar.h"
1916
#include"utils/builtins.h"
2017

2118

22-
staticboolquote_ident_required(text*iptr);
23-
statictext*do_quote_ident(text*iptr);
24-
statictext*do_quote_literal(text*iptr);
25-
26-
2719
/*
2820
* quote_ident -
2921
* returns a properly quoted identifier
@@ -33,16 +25,22 @@ quote_ident(PG_FUNCTION_ARGS)
3325
{
3426
text*t=PG_GETARG_TEXT_P(0);
3527
text*result;
28+
constchar*qstr;
29+
char*str;
30+
intlen;
3631

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';
4437

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);
4644

4745
PG_RETURN_TEXT_P(result);
4846
}
@@ -56,136 +54,30 @@ quote_literal(PG_FUNCTION_ARGS)
5654
{
5755
text*t=PG_GETARG_TEXT_P(0);
5856
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-
staticbool
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-
statictext*
109-
do_quote_ident(text*iptr)
110-
{
111-
text*result;
11257
char*cp1;
11358
char*cp2;
11459
intlen;
115-
intwl;
11660

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);
11964

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-
returnresult;
146-
}
147-
148-
/*
149-
* Return a properly quoted literal value
150-
*/
151-
statictext*
152-
do_quote_literal(text*lptr)
153-
{
154-
text*result;
155-
char*cp1;
156-
char*cp2;
157-
intlen;
158-
intwl;
159-
160-
len=VARSIZE(lptr)-VARHDRSZ;
161-
result= (text*)palloc(len*2+VARHDRSZ+2);
162-
163-
cp1=VARDATA(lptr);
65+
cp1=VARDATA(t);
16466
cp2=VARDATA(result);
16567

16668
*cp2++='\'';
167-
while (len>0)
69+
while (len-->0)
16870
{
169-
if ((wl=pg_mblen(cp1))!=1)
170-
{
171-
len-=wl;
172-
173-
while (wl-->0)
174-
*cp2++=*cp1++;
175-
continue;
176-
}
177-
17871
if (*cp1=='\'')
17972
*cp2++='\'';
180-
if (*cp1=='\\')
73+
elseif (*cp1=='\\')
18174
*cp2++='\\';
182-
*cp2++=*cp1++;
18375

184-
len--;
76+
*cp2++=*cp1++;
18577
}
18678
*cp2++='\'';
18779

18880
VARATT_SIZEP(result)=cp2- ((char*)result);
18981

190-
returnresult;
82+
PG_RETURN_TEXT_P(result);
19183
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp