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-2024, 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  */
24 Datum
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);
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  */
46 static 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  */
77 Datum
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  */
102 char *
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(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  */
124 Datum
126 {
127  if (PG_ARGISNULL(0))
129  else
131  PG_GETARG_DATUM(0)));
132 }
#define VARHDRSZ
Definition: c.h:692
#define ESCAPE_STRING_SYNTAX
Definition: c.h:1166
#define SQL_STR_DOUBLE(ch, escape_backslash)
Definition: c.h:1163
#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:642
#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:1316
const void size_t len
uintptr_t Datum
Definition: postgres.h:64
static size_t quote_literal_internal(char *dst, const char *src, size_t len)
Definition: quote.c:47
Datum quote_ident(PG_FUNCTION_ARGS)
Definition: quote.c:25
char * quote_literal_cstr(const char *rawstr)
Definition: quote.c:103
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:12596
Definition: c.h:687
#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
char * text_to_cstring(const text *t)
Definition: varlena.c:217
text * cstring_to_text(const char *s)
Definition: varlena.c:184