PostgreSQL Source Code: src/backend/utils/adt/quote.c Source File

PostgreSQL Source Code git master
quote.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * quote.c
4 * Functions for quoting identifiers and literals
5 *
6 * Portions Copyright (c) 2000-2025, PostgreSQL Global Development Group
7 *
8 *
9 * IDENTIFICATION
10 * src/backend/utils/adt/quote.c
11 *
12 *-------------------------------------------------------------------------
13 */
14#include "postgres.h"
15
16#include "utils/builtins.h"
17#include "varatt.h"
18
19
20/*
21 * quote_ident -
22 * returns a properly quoted identifier
23 */
24Datum
25 quote_ident(PG_FUNCTION_ARGS)
26{
27 text *t = PG_GETARG_TEXT_PP(0);
28 const char *qstr;
29 char *str;
30
31 str = text_to_cstring(t);
32 qstr = quote_identifier(str);
33 PG_RETURN_TEXT_P(cstring_to_text(qstr));
34}
35
36/*
37 * quote_literal_internal -
38 * helper function for quote_literal and quote_literal_cstr
39 *
40 * NOTE: think not to make this function's behavior change with
41 * standard_conforming_strings. We don't know where the result
42 * literal will be used, and so we must generate a result that
43 * will work with either setting. Take a look at what dblink
44 * uses this for before thinking you know better.
45 */
46static size_t
47 quote_literal_internal(char *dst, const char *src, size_t len)
48{
49 const char *s;
50 char *savedst = dst;
51
52 for (s = src; s < src + len; s++)
53 {
54 if (*s == '\\')
55 {
56 *dst++ = ESCAPE_STRING_SYNTAX;
57 break;
58 }
59 }
60
61 *dst++ = '\'';
62 while (len-- > 0)
63 {
64 if (SQL_STR_DOUBLE(*src, true))
65 *dst++ = *src;
66 *dst++ = *src++;
67 }
68 *dst++ = '\'';
69
70 return dst - savedst;
71}
72
73/*
74 * quote_literal -
75 * returns a properly quoted literal
76 */
77Datum
78 quote_literal(PG_FUNCTION_ARGS)
79{
80 text *t = PG_GETARG_TEXT_PP(0);
81 text *result;
82 char *cp1;
83 char *cp2;
84 int len;
85
86 len = VARSIZE_ANY_EXHDR(t);
87 /* We make a worst-case result area; wasting a little space is OK */
88 result = (text *) palloc(len * 2 + 3 + VARHDRSZ);
89
90 cp1 = VARDATA_ANY(t);
91 cp2 = VARDATA(result);
92
93 SET_VARSIZE(result, VARHDRSZ + quote_literal_internal(cp2, cp1, len));
94
95 PG_RETURN_TEXT_P(result);
96}
97
98/*
99 * quote_literal_cstr -
100 * returns a properly quoted literal
101 */
102char *
103 quote_literal_cstr(const char *rawstr)
104{
105 char *result;
106 int len;
107 int newlen;
108
109 len = strlen(rawstr);
110 /* We make a worst-case result area; wasting a little space is OK */
111 result = palloc(
112 (len * 2) /* doubling for every character if each one is
113 * a quote */
114 + 3 /* two outer quotes + possibly 'E' if needed */
115 + 1 /* null terminator */
116 );
117
118 newlen = quote_literal_internal(result, rawstr, len);
119 result[newlen] = '0円';
120
121 return result;
122}
123
124/*
125 * quote_nullable -
126 * Returns a properly quoted literal, with null values returned
127 * as the text string 'NULL'.
128 */
129Datum
130 quote_nullable(PG_FUNCTION_ARGS)
131{
132 if (PG_ARGISNULL(0))
133 PG_RETURN_TEXT_P(cstring_to_text("NULL"));
134 else
135 PG_RETURN_DATUM(DirectFunctionCall1(quote_literal,
136 PG_GETARG_DATUM(0)));
137}
#define VARHDRSZ
Definition: c.h:697
#define ESCAPE_STRING_SYNTAX
Definition: c.h:1165
#define SQL_STR_DOUBLE(ch, escape_backslash)
Definition: c.h:1162
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
#define PG_ARGISNULL(n)
Definition: fmgr.h:209
#define DirectFunctionCall1(func, arg1)
Definition: fmgr.h:682
#define PG_GETARG_DATUM(n)
Definition: fmgr.h:268
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:372
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:353
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
const char * str
void * palloc(Size size)
Definition: mcxt.c:1365
const void size_t len
uint64_t Datum
Definition: postgres.h:70
static size_t quote_literal_internal(char *dst, const char *src, size_t len)
Definition: quote.c:47
char * quote_literal_cstr(const char *rawstr)
Definition: quote.c:103
Datum quote_ident(PG_FUNCTION_ARGS)
Definition: quote.c:25
Datum quote_nullable(PG_FUNCTION_ARGS)
Definition: quote.c:130
Datum quote_literal(PG_FUNCTION_ARGS)
Definition: quote.c:78
const char * quote_identifier(const char *ident)
Definition: ruleutils.c:13035
Definition: c.h:692
static Size VARSIZE_ANY_EXHDR(const void *PTR)
Definition: varatt.h:472
static char * VARDATA(const void *PTR)
Definition: varatt.h:305
static char * VARDATA_ANY(const void *PTR)
Definition: varatt.h:486
static void SET_VARSIZE(void *PTR, Size len)
Definition: varatt.h:432
text * cstring_to_text(const char *s)
Definition: varlena.c:181
char * text_to_cstring(const text *t)
Definition: varlena.c:214

AltStyle によって変換されたページ (->オリジナル) /