Age Owner Branch data TLA Line data Source code
1 : : /*
2 : : * pgcrypto.c
3 : : * Various cryptographic stuff for PostgreSQL.
4 : : *
5 : : * Copyright (c) 2001 Marko Kreen
6 : : * All rights reserved.
7 : : *
8 : : * Redistribution and use in source and binary forms, with or without
9 : : * modification, are permitted provided that the following conditions
10 : : * are met:
11 : : * 1. Redistributions of source code must retain the above copyright
12 : : * notice, this list of conditions and the following disclaimer.
13 : : * 2. Redistributions in binary form must reproduce the above copyright
14 : : * notice, this list of conditions and the following disclaimer in the
15 : : * documentation and/or other materials provided with the distribution.
16 : : *
17 : : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 : : * SUCH DAMAGE.
28 : : *
29 : : * contrib/pgcrypto/pgcrypto.c
30 : : */
31 : :
32 : : #include "postgres.h"
33 : :
34 : : #include <ctype.h>
35 : :
36 : : #include "parser/scansup.h"
37 : : #include "pgcrypto.h"
38 : : #include "px-crypt.h"
39 : : #include "px.h"
40 : : #include "utils/builtins.h"
41 : : #include "utils/uuid.h"
42 : : #include "varatt.h"
43 : :
6529 tgl@sss.pgh.pa.us 44 :CBC 23 : PG_MODULE_MAGIC;
45 : :
46 : : /* private stuff */
47 : :
48 : : typedef int (*PFN) (const char *name, void **res);
49 : : static void *find_provider(text *name, PFN provider_lookup, const char *desc,
50 : : int silent);
51 : :
52 : : /* SQL function: hash(bytea, text) returns bytea */
8272 bruce@momjian.us 53 : 8 : PG_FUNCTION_INFO_V1(pg_digest);
54 : :
55 : : Datum
56 : 44 : pg_digest(PG_FUNCTION_ARGS)
57 : : {
58 : : bytea *arg;
59 : : text *name;
60 : : unsigned len,
61 : : hlen;
62 : : PX_MD *md;
63 : : bytea *res;
64 : :
2590 noah@leadboat.com 65 : 44 : name = PG_GETARG_TEXT_PP(1);
66 : :
67 : : /* will give error if fails */
8272 bruce@momjian.us 68 : 44 : md = find_provider(name, (PFN) px_find_digest, "Digest", 0);
69 : :
70 : 43 : hlen = px_md_result_size(md);
71 : :
8424 72 : 43 : res = (text *) palloc(hlen + VARHDRSZ);
6256 tgl@sss.pgh.pa.us 73 : 43 : SET_VARSIZE(res, hlen + VARHDRSZ);
74 : :
2590 noah@leadboat.com 75 : 43 : arg = PG_GETARG_BYTEA_PP(0);
76 [ - + - - : 43 : len = VARSIZE_ANY_EXHDR(arg);
- - - - -
+ ]
77 : :
78 [ - + ]: 43 : px_md_update(md, (uint8 *) VARDATA_ANY(arg), len);
6777 tgl@sss.pgh.pa.us 79 : 43 : px_md_finish(md, (uint8 *) VARDATA(res));
8272 bruce@momjian.us 80 : 43 : px_md_free(md);
81 : :
8566 peter_e@gmx.net 82 [ - + ]: 43 : PG_FREE_IF_COPY(arg, 0);
8468 bruce@momjian.us 83 [ - + ]: 43 : PG_FREE_IF_COPY(name, 1);
84 : :
8272 85 : 43 : PG_RETURN_BYTEA_P(res);
86 : : }
87 : :
88 : : /* SQL function: hmac(data:bytea, key:bytea, type:text) returns bytea */
89 : 7 : PG_FUNCTION_INFO_V1(pg_hmac);
90 : :
91 : : Datum
92 : 15 : pg_hmac(PG_FUNCTION_ARGS)
93 : : {
94 : : bytea *arg;
95 : : bytea *key;
96 : : text *name;
97 : : unsigned len,
98 : : hlen,
99 : : klen;
100 : : PX_HMAC *h;
101 : : bytea *res;
102 : :
2590 noah@leadboat.com 103 : 15 : name = PG_GETARG_TEXT_PP(2);
104 : :
105 : : /* will give error if fails */
8272 bruce@momjian.us 106 : 15 : h = find_provider(name, (PFN) px_find_hmac, "HMAC", 0);
107 : :
108 : 14 : hlen = px_hmac_result_size(h);
109 : :
110 : 14 : res = (text *) palloc(hlen + VARHDRSZ);
6256 tgl@sss.pgh.pa.us 111 : 14 : SET_VARSIZE(res, hlen + VARHDRSZ);
112 : :
2590 noah@leadboat.com 113 : 14 : arg = PG_GETARG_BYTEA_PP(0);
114 : 14 : key = PG_GETARG_BYTEA_PP(1);
115 [ - + - - : 14 : len = VARSIZE_ANY_EXHDR(arg);
- - - - -
+ ]
116 [ - + - - : 14 : klen = VARSIZE_ANY_EXHDR(key);
- - - - -
+ ]
117 : :
118 [ - + ]: 14 : px_hmac_init(h, (uint8 *) VARDATA_ANY(key), klen);
119 [ - + ]: 14 : px_hmac_update(h, (uint8 *) VARDATA_ANY(arg), len);
6777 tgl@sss.pgh.pa.us 120 : 14 : px_hmac_finish(h, (uint8 *) VARDATA(res));
8272 bruce@momjian.us 121 : 14 : px_hmac_free(h);
122 : :
123 [ - + ]: 14 : PG_FREE_IF_COPY(arg, 0);
124 [ - + ]: 14 : PG_FREE_IF_COPY(key, 1);
125 [ - + ]: 14 : PG_FREE_IF_COPY(name, 2);
126 : :
127 : 14 : PG_RETURN_BYTEA_P(res);
128 : : }
129 : :
130 : :
131 : : /* SQL function: pg_gen_salt(text) returns text */
132 : 4 : PG_FUNCTION_INFO_V1(pg_gen_salt);
133 : :
134 : : Datum
135 : 3 : pg_gen_salt(PG_FUNCTION_ARGS)
136 : : {
5864 tgl@sss.pgh.pa.us 137 : 3 : text *arg0 = PG_GETARG_TEXT_PP(0);
138 : : int len;
139 : : char buf[PX_MAX_SALT_LEN + 1];
140 : :
141 : 3 : text_to_cstring_buffer(arg0, buf, sizeof(buf));
8239 bruce@momjian.us 142 : 3 : len = px_gen_salt(buf, buf, 0);
6964 neilc@samurai.com 143 [ + + ]: 3 : if (len < 0)
7570 tgl@sss.pgh.pa.us 144 [ + - ]: 1 : ereport(ERROR,
145 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
146 : : errmsg("gen_salt: %s", px_strerror(len))));
147 : :
8272 bruce@momjian.us 148 [ - + ]: 2 : PG_FREE_IF_COPY(arg0, 0);
149 : :
5864 tgl@sss.pgh.pa.us 150 : 2 : PG_RETURN_TEXT_P(cstring_to_text_with_len(buf, len));
151 : : }
152 : :
153 : : /* SQL function: pg_gen_salt(text, int4) returns text */
8239 bruce@momjian.us 154 : 3 : PG_FUNCTION_INFO_V1(pg_gen_salt_rounds);
155 : :
156 : : Datum
157 : 2 : pg_gen_salt_rounds(PG_FUNCTION_ARGS)
158 : : {
5864 tgl@sss.pgh.pa.us 159 : 2 : text *arg0 = PG_GETARG_TEXT_PP(0);
160 : 2 : int rounds = PG_GETARG_INT32(1);
161 : : int len;
162 : : char buf[PX_MAX_SALT_LEN + 1];
163 : :
164 : 2 : text_to_cstring_buffer(arg0, buf, sizeof(buf));
8239 bruce@momjian.us 165 : 2 : len = px_gen_salt(buf, buf, rounds);
6964 neilc@samurai.com 166 [ - + ]: 2 : if (len < 0)
7570 tgl@sss.pgh.pa.us 167 [ # # ]:UBC 0 : ereport(ERROR,
168 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
169 : : errmsg("gen_salt: %s", px_strerror(len))));
170 : :
8239 bruce@momjian.us 171 [ - + ]:CBC 2 : PG_FREE_IF_COPY(arg0, 0);
172 : :
5864 tgl@sss.pgh.pa.us 173 : 2 : PG_RETURN_TEXT_P(cstring_to_text_with_len(buf, len));
174 : : }
175 : :
176 : : /* SQL function: pg_crypt(psw:text, salt:text) returns text */
8272 bruce@momjian.us 177 : 5 : PG_FUNCTION_INFO_V1(pg_crypt);
178 : :
179 : : Datum
180 : 25 : pg_crypt(PG_FUNCTION_ARGS)
181 : : {
5864 tgl@sss.pgh.pa.us 182 : 25 : text *arg0 = PG_GETARG_TEXT_PP(0);
183 : 25 : text *arg1 = PG_GETARG_TEXT_PP(1);
184 : : char *buf0,
185 : : *buf1,
186 : : *cres,
187 : : *resbuf;
188 : : text *res;
189 : :
190 : 25 : buf0 = text_to_cstring(arg0);
191 : 25 : buf1 = text_to_cstring(arg1);
192 : :
6365 neilc@samurai.com 193 : 25 : resbuf = palloc0(PX_MAX_CRYPT);
194 : :
8272 bruce@momjian.us 195 : 25 : cres = px_crypt(buf0, buf1, resbuf, PX_MAX_CRYPT);
196 : :
197 : 20 : pfree(buf0);
198 : 20 : pfree(buf1);
199 : :
200 [ + + ]: 20 : if (cres == NULL)
7570 tgl@sss.pgh.pa.us 201 [ + - ]: 2 : ereport(ERROR,
202 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
203 : : errmsg("crypt(3) returned NULL")));
204 : :
5864 205 : 18 : res = cstring_to_text(cres);
206 : :
8272 bruce@momjian.us 207 : 18 : pfree(resbuf);
208 : :
209 [ - + ]: 18 : PG_FREE_IF_COPY(arg0, 0);
210 [ - + ]: 18 : PG_FREE_IF_COPY(arg1, 1);
211 : :
212 : 18 : PG_RETURN_TEXT_P(res);
213 : : }
214 : :
215 : : /* SQL function: pg_encrypt(bytea, bytea, text) returns bytea */
216 : 7 : PG_FUNCTION_INFO_V1(pg_encrypt);
217 : :
218 : : Datum
219 : 55 : pg_encrypt(PG_FUNCTION_ARGS)
220 : : {
221 : : int err;
222 : : bytea *data,
223 : : *key,
224 : : *res;
225 : : text *type;
226 : : PX_Combo *c;
227 : : unsigned dlen,
228 : : klen,
229 : : rlen;
230 : :
2590 noah@leadboat.com 231 : 55 : type = PG_GETARG_TEXT_PP(2);
8207 bruce@momjian.us 232 : 55 : c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
233 : :
2590 noah@leadboat.com 234 : 54 : data = PG_GETARG_BYTEA_PP(0);
235 : 54 : key = PG_GETARG_BYTEA_PP(1);
236 [ - + - - : 54 : dlen = VARSIZE_ANY_EXHDR(data);
- - - - -
+ ]
237 [ - + - - : 54 : klen = VARSIZE_ANY_EXHDR(key);
- - - - -
+ ]
238 : :
8272 bruce@momjian.us 239 : 54 : rlen = px_combo_encrypt_len(c, dlen);
240 : 54 : res = palloc(VARHDRSZ + rlen);
241 : :
2590 noah@leadboat.com 242 [ - + ]: 54 : err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
8272 bruce@momjian.us 243 [ + + ]: 54 : if (!err)
2590 noah@leadboat.com 244 [ - + ]: 50 : err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
245 : : (uint8 *) VARDATA(res), &rlen);
8272 bruce@momjian.us 246 : 54 : px_combo_free(c);
247 : :
248 [ - + ]: 54 : PG_FREE_IF_COPY(data, 0);
249 [ - + ]: 54 : PG_FREE_IF_COPY(key, 1);
250 [ - + ]: 54 : PG_FREE_IF_COPY(type, 2);
251 : :
8207 252 [ + + ]: 54 : if (err)
253 : : {
8272 254 : 33 : pfree(res);
7570 tgl@sss.pgh.pa.us 255 [ + - ]: 33 : ereport(ERROR,
256 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
257 : : errmsg("encrypt error: %s", px_strerror(err))));
258 : : }
259 : :
6256 260 : 21 : SET_VARSIZE(res, VARHDRSZ + rlen);
8272 bruce@momjian.us 261 : 21 : PG_RETURN_BYTEA_P(res);
262 : : }
263 : :
264 : : /* SQL function: pg_decrypt(bytea, bytea, text) returns bytea */
265 : 3 : PG_FUNCTION_INFO_V1(pg_decrypt);
266 : :
267 : : Datum
268 : 5 : pg_decrypt(PG_FUNCTION_ARGS)
269 : : {
270 : : int err;
271 : : bytea *data,
272 : : *key,
273 : : *res;
274 : : text *type;
275 : : PX_Combo *c;
276 : : unsigned dlen,
277 : : klen,
278 : : rlen;
279 : :
2590 noah@leadboat.com 280 : 5 : type = PG_GETARG_TEXT_PP(2);
8207 bruce@momjian.us 281 : 5 : c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
282 : :
2590 noah@leadboat.com 283 : 5 : data = PG_GETARG_BYTEA_PP(0);
284 : 5 : key = PG_GETARG_BYTEA_PP(1);
285 [ - + - - : 5 : dlen = VARSIZE_ANY_EXHDR(data);
- - - - -
+ ]
286 [ - + - - : 5 : klen = VARSIZE_ANY_EXHDR(key);
- - - - -
+ ]
287 : :
8272 bruce@momjian.us 288 : 5 : rlen = px_combo_decrypt_len(c, dlen);
289 : 5 : res = palloc(VARHDRSZ + rlen);
290 : :
2590 noah@leadboat.com 291 [ - + ]: 5 : err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
8272 bruce@momjian.us 292 [ + - ]: 5 : if (!err)
2590 noah@leadboat.com 293 [ - + ]: 5 : err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
294 : : (uint8 *) VARDATA(res), &rlen);
295 : :
8272 bruce@momjian.us 296 : 5 : px_combo_free(c);
297 : :
298 [ + + ]: 5 : if (err)
7570 tgl@sss.pgh.pa.us 299 [ + - ]: 1 : ereport(ERROR,
300 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
301 : : errmsg("decrypt error: %s", px_strerror(err))));
302 : :
6256 303 : 4 : SET_VARSIZE(res, VARHDRSZ + rlen);
304 : :
8272 bruce@momjian.us 305 [ - + ]: 4 : PG_FREE_IF_COPY(data, 0);
306 [ - + ]: 4 : PG_FREE_IF_COPY(key, 1);
307 [ - + ]: 4 : PG_FREE_IF_COPY(type, 2);
308 : :
309 : 4 : PG_RETURN_BYTEA_P(res);
310 : : }
311 : :
312 : : /* SQL function: pg_encrypt_iv(bytea, bytea, bytea, text) returns bytea */
313 : 6 : PG_FUNCTION_INFO_V1(pg_encrypt_iv);
314 : :
315 : : Datum
316 : 5 : pg_encrypt_iv(PG_FUNCTION_ARGS)
317 : : {
318 : : int err;
319 : : bytea *data,
320 : : *key,
321 : : *iv,
322 : : *res;
323 : : text *type;
324 : : PX_Combo *c;
325 : : unsigned dlen,
326 : : klen,
327 : : ivlen,
328 : : rlen;
329 : :
2590 noah@leadboat.com 330 : 5 : type = PG_GETARG_TEXT_PP(3);
8207 bruce@momjian.us 331 : 5 : c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
332 : :
2590 noah@leadboat.com 333 : 5 : data = PG_GETARG_BYTEA_PP(0);
334 : 5 : key = PG_GETARG_BYTEA_PP(1);
335 : 5 : iv = PG_GETARG_BYTEA_PP(2);
336 [ - + - - : 5 : dlen = VARSIZE_ANY_EXHDR(data);
- - - - -
+ ]
337 [ - + - - : 5 : klen = VARSIZE_ANY_EXHDR(key);
- - - - -
+ ]
338 [ - + - - : 5 : ivlen = VARSIZE_ANY_EXHDR(iv);
- - - - -
+ ]
339 : :
8272 bruce@momjian.us 340 : 5 : rlen = px_combo_encrypt_len(c, dlen);
341 : 5 : res = palloc(VARHDRSZ + rlen);
342 : :
2590 noah@leadboat.com 343 [ - + - + ]: 5 : err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
344 : : (uint8 *) VARDATA_ANY(iv), ivlen);
8272 bruce@momjian.us 345 [ + - ]: 5 : if (!err)
2590 noah@leadboat.com 346 [ - + ]: 5 : err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
347 : : (uint8 *) VARDATA(res), &rlen);
348 : :
8272 bruce@momjian.us 349 : 5 : px_combo_free(c);
350 : :
351 [ + + ]: 5 : if (err)
7570 tgl@sss.pgh.pa.us 352 [ + - ]: 3 : ereport(ERROR,
353 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
354 : : errmsg("encrypt_iv error: %s", px_strerror(err))));
355 : :
6256 356 : 2 : SET_VARSIZE(res, VARHDRSZ + rlen);
357 : :
8272 bruce@momjian.us 358 [ - + ]: 2 : PG_FREE_IF_COPY(data, 0);
359 [ - + ]: 2 : PG_FREE_IF_COPY(key, 1);
360 [ - + ]: 2 : PG_FREE_IF_COPY(iv, 2);
361 [ - + ]: 2 : PG_FREE_IF_COPY(type, 3);
362 : :
363 : 2 : PG_RETURN_BYTEA_P(res);
364 : : }
365 : :
366 : : /* SQL function: pg_decrypt_iv(bytea, bytea, bytea, text) returns bytea */
367 : 6 : PG_FUNCTION_INFO_V1(pg_decrypt_iv);
368 : :
369 : : Datum
370 : 6 : pg_decrypt_iv(PG_FUNCTION_ARGS)
371 : : {
372 : : int err;
373 : : bytea *data,
374 : : *key,
375 : : *iv,
376 : : *res;
377 : : text *type;
378 : : PX_Combo *c;
379 : : unsigned dlen,
380 : : klen,
381 : : rlen,
382 : : ivlen;
383 : :
2590 noah@leadboat.com 384 : 6 : type = PG_GETARG_TEXT_PP(3);
8207 bruce@momjian.us 385 : 6 : c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
386 : :
2590 noah@leadboat.com 387 : 6 : data = PG_GETARG_BYTEA_PP(0);
388 : 6 : key = PG_GETARG_BYTEA_PP(1);
389 : 6 : iv = PG_GETARG_BYTEA_PP(2);
390 [ - + - - : 6 : dlen = VARSIZE_ANY_EXHDR(data);
- - - - -
+ ]
391 [ - + - - : 6 : klen = VARSIZE_ANY_EXHDR(key);
- - - - -
+ ]
392 [ - + - - : 6 : ivlen = VARSIZE_ANY_EXHDR(iv);
- - - - -
+ ]
393 : :
8272 bruce@momjian.us 394 : 6 : rlen = px_combo_decrypt_len(c, dlen);
395 : 6 : res = palloc(VARHDRSZ + rlen);
396 : :
2590 noah@leadboat.com 397 [ - + - + ]: 6 : err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
398 : : (uint8 *) VARDATA_ANY(iv), ivlen);
8272 bruce@momjian.us 399 [ + - ]: 6 : if (!err)
2590 noah@leadboat.com 400 [ - + ]: 6 : err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
401 : : (uint8 *) VARDATA(res), &rlen);
402 : :
8272 bruce@momjian.us 403 : 6 : px_combo_free(c);
404 : :
405 [ + + ]: 6 : if (err)
7570 tgl@sss.pgh.pa.us 406 [ + - ]: 4 : ereport(ERROR,
407 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
408 : : errmsg("decrypt_iv error: %s", px_strerror(err))));
409 : :
6256 410 : 2 : SET_VARSIZE(res, VARHDRSZ + rlen);
411 : :
8272 bruce@momjian.us 412 [ - + ]: 2 : PG_FREE_IF_COPY(data, 0);
413 [ - + ]: 2 : PG_FREE_IF_COPY(key, 1);
414 [ - + ]: 2 : PG_FREE_IF_COPY(iv, 2);
415 [ - + ]: 2 : PG_FREE_IF_COPY(type, 3);
416 : :
417 : 2 : PG_RETURN_BYTEA_P(res);
418 : : }
419 : :
420 : : /* SQL function: pg_random_bytes(int4) returns bytea */
6485 neilc@samurai.com 421 : 1 : PG_FUNCTION_INFO_V1(pg_random_bytes);
422 : :
423 : : Datum
6485 neilc@samurai.com 424 :UBC 0 : pg_random_bytes(PG_FUNCTION_ARGS)
425 : : {
6402 bruce@momjian.us 426 : 0 : int len = PG_GETARG_INT32(0);
427 : : bytea *res;
428 : :
6485 neilc@samurai.com 429 [ # # # # ]: 0 : if (len < 1 || len > 1024)
430 [ # # ]: 0 : ereport(ERROR,
431 : : (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
432 : : errmsg("Length not in range")));
433 : :
434 : 0 : res = palloc(VARHDRSZ + len);
6256 tgl@sss.pgh.pa.us 435 : 0 : SET_VARSIZE(res, VARHDRSZ + len);
436 : :
437 : : /* generate result */
2687 heikki.linnakangas@i 438 [ # # ]: 0 : if (!pg_strong_random(VARDATA(res), len))
439 : 0 : px_THROW_ERROR(PXE_NO_RANDOM);
440 : :
6485 neilc@samurai.com 441 : 0 : PG_RETURN_BYTEA_P(res);
442 : : }
443 : :
444 : : /* SQL function: gen_random_uuid() returns uuid */
3740 tgl@sss.pgh.pa.us 445 :CBC 1 : PG_FUNCTION_INFO_V1(pg_random_uuid);
446 : :
447 : : Datum
3740 tgl@sss.pgh.pa.us 448 :UBC 0 : pg_random_uuid(PG_FUNCTION_ARGS)
449 : : {
450 : : /* redirect to built-in function */
1736 peter@eisentraut.org 451 : 0 : return gen_random_uuid(fcinfo);
452 : : }
453 : :
454 : : static void *
8207 bruce@momjian.us 455 :CBC 130 : find_provider(text *name,
456 : : PFN provider_lookup,
457 : : const char *desc, int silent)
458 : : {
459 : : void *res;
460 : : char *buf;
461 : : int err;
462 : :
2590 noah@leadboat.com 463 [ - + ]: 130 : buf = downcase_truncate_identifier(VARDATA_ANY(name),
464 [ - + - - : 130 : VARSIZE_ANY_EXHDR(name),
- - - - -
+ ]
465 : : false);
466 : :
8272 bruce@momjian.us 467 : 130 : err = provider_lookup(buf, &res);
468 : :
469 [ + + + - ]: 130 : if (err && !silent)
7570 tgl@sss.pgh.pa.us 470 [ + - ]: 3 : ereport(ERROR,
471 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
472 : : errmsg("Cannot use \"%s\": %s", buf, px_strerror(err))));
473 : :
7282 474 : 127 : pfree(buf);
475 : :
8272 bruce@momjian.us 476 [ + - ]: 127 : return err ? NULL : res;
477 : : }
|