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 */
26{
27 text *t = PG_GETARG_TEXT_PP(0);
28 const char *qstr;
29 char *str;
30
32 qstr = quote_identifier(str);
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
47quote_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 */
79{
80 text *t = PG_GETARG_TEXT_PP(0);
81 text *result;
82 char *cp1;
83 char *cp2;
84 int len;
85
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 *
103quote_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(len * 2 + 3 + 1);
112
113 newlen = quote_literal_internal(result, rawstr, len);
114 result[newlen] = '\0';
115
116 return result;
117}
118
119/*
120 * quote_nullable -
121 * Returns a properly quoted literal, with null values returned
122 * as the text string 'NULL'.
123 */
124Datum
126{
127 if (PG_ARGISNULL(0))
129 else
131 PG_GETARG_DATUM(0)));
132}
#define VARHDRSZ
Definition: c.h:649
#define ESCAPE_STRING_SYNTAX
Definition: c.h:1123
#define SQL_STR_DOUBLE(ch, escape_backslash)
Definition: c.h:1120
#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:641
#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:1317
const void size_t len
uintptr_t Datum
Definition: postgres.h:69
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:125
Datum quote_literal(PG_FUNCTION_ARGS)
Definition: quote.c:78
const char * quote_identifier(const char *ident)
Definition: ruleutils.c:12940
Definition: c.h:644
#define VARDATA(PTR)
Definition: varatt.h:278
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define SET_VARSIZE(PTR, len)
Definition: varatt.h:305
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317
text * cstring_to_text(const char *s)
Definition: varlena.c:184
char * text_to_cstring(const text *t)
Definition: varlena.c:217