Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * quote.c
4 : : * Functions for quoting identifiers and literals
5 : : *
6 : : * Portions Copyright (c) 2000-2026, 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
9322 JanWieck@Yahoo.com 25 :CBC 4396 : quote_ident(PG_FUNCTION_ARGS)
26 : : {
6564 tgl@sss.pgh.pa.us 27 : 4396 : text *t = PG_GETARG_TEXT_PP(0);
28 : : const char *qstr;
29 : : char *str;
30 : :
31 : 4396 : str = text_to_cstring(t);
7664 32 : 4396 : qstr = quote_identifier(str);
6564 33 : 4396 : 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: This must produce output that will work in old servers with
41 : : * standard_conforming_strings = off. It's used for example by
42 : : * dblink, which may send the result to another server.
43 : : */
44 : : static size_t
5500 peter_e@gmx.net 45 : 4827 : quote_literal_internal(char *dst, const char *src, size_t len)
46 : : {
47 : : const char *s;
5594 rhaas@postgresql.org 48 : 4827 : char *savedst = dst;
49 : :
50 [ + + ]: 350659 : for (s = src; s < src + len; s++)
51 : : {
52 [ + + ]: 345837 : if (*s == '\\')
53 : : {
54 : 5 : *dst++ = ESCAPE_STRING_SYNTAX;
55 : 5 : break;
56 : : }
57 : : }
58 : :
59 : 4827 : *dst++ = '\'';
60 [ + + ]: 350666 : while (len-- > 0)
61 : : {
62 [ + + + + ]: 345839 : if (SQL_STR_DOUBLE(*src, true))
63 : 24 : *dst++ = *src;
64 : 345839 : *dst++ = *src++;
65 : : }
66 : 4827 : *dst++ = '\'';
67 : :
68 : 4827 : return dst - savedst;
69 : : }
70 : :
71 : : /*
72 : : * quote_literal -
73 : : * returns a properly quoted literal
74 : : */
75 : : Datum
9322 JanWieck@Yahoo.com 76 : 1769 : quote_literal(PG_FUNCTION_ARGS)
77 : : {
3290 noah@leadboat.com 78 : 1769 : text *t = PG_GETARG_TEXT_PP(0);
79 : : text *result;
80 : : char *cp1;
81 : : char *cp2;
82 : : int len;
83 : :
84 [ - + - - : 1769 : len = VARSIZE_ANY_EXHDR(t);
- - - - +
+ ]
85 : : /* We make a worst-case result area; wasting a little space is OK */
7561 bruce@momjian.us 86 : 1769 : result = (text *) palloc(len * 2 + 3 + VARHDRSZ);
87 : :
3290 noah@leadboat.com 88 [ + + ]: 1769 : cp1 = VARDATA_ANY(t);
9322 JanWieck@Yahoo.com 89 : 1769 : cp2 = VARDATA(result);
90 : :
5594 rhaas@postgresql.org 91 : 1769 : SET_VARSIZE(result, VARHDRSZ + quote_literal_internal(cp2, cp1, len));
92 : :
93 : 1769 : PG_RETURN_TEXT_P(result);
94 : : }
95 : :
96 : : /*
97 : : * quote_literal_cstr -
98 : : * returns a properly quoted literal
99 : : */
100 : : char *
5500 peter_e@gmx.net 101 : 3058 : quote_literal_cstr(const char *rawstr)
102 : : {
103 : : char *result;
104 : : int len;
105 : : int newlen;
106 : :
5594 rhaas@postgresql.org 107 : 3058 : len = strlen(rawstr);
108 : : /* We make a worst-case result area; wasting a little space is OK */
342 michael@paquier.xyz 109 : 3058 : result = palloc(
110 : : (len * 2) /* doubling for every character if each one is
111 : : * a quote */
112 : : + 3 /* two outer quotes + possibly 'E' if needed */
113 : 3058 : + 1 /* null terminator */
114 : : );
115 : :
5594 rhaas@postgresql.org 116 : 3058 : newlen = quote_literal_internal(result, rawstr, len);
117 : 3058 : result[newlen] = '\0';
118 : :
119 : 3058 : return result;
120 : : }
121 : :
122 : : /*
123 : : * quote_nullable -
124 : : * Returns a properly quoted literal, with null values returned
125 : : * as the text string 'NULL'.
126 : : */
127 : : Datum
6566 tgl@sss.pgh.pa.us 128 : 790 : quote_nullable(PG_FUNCTION_ARGS)
129 : : {
130 [ + + ]: 790 : if (PG_ARGISNULL(0))
6564 131 : 42 : PG_RETURN_TEXT_P(cstring_to_text("NULL"));
132 : : else
6566 133 : 748 : PG_RETURN_DATUM(DirectFunctionCall1(quote_literal,
134 : : PG_GETARG_DATUM(0)));
135 : : }
|