PostgreSQL Source Code git master
Loading...
Searching...
No Matches
hbafuncs.c File Reference
#include "postgres.h"
#include "access/htup_details.h"
#include "catalog/objectaddress.h"
#include "common/ip.h"
#include "funcapi.h"
#include "libpq/hba.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/guc.h"
#include "utils/tuplestore.h"
Include dependency graph for hbafuncs.c:

Go to the source code of this file.

Macros

#define MAX_HBA_OPTIONS   15
 
#define NUM_PG_HBA_FILE_RULES_ATTS   11
 
#define NUM_PG_IDENT_FILE_MAPPINGS_ATTS   7
 

Functions

static ArrayTypeget_hba_options (HbaLine *hba)
 
static void fill_hba_line (Tuplestorestate *tuple_store, TupleDesc tupdesc, int rule_number, char *filename, int lineno, HbaLine *hba, const char *err_msg)
 
static void fill_hba_view (Tuplestorestate *tuple_store, TupleDesc tupdesc)
 
static void fill_ident_line (Tuplestorestate *tuple_store, TupleDesc tupdesc, int map_number, char *filename, int lineno, IdentLine *ident, const char *err_msg)
 
static void fill_ident_view (Tuplestorestate *tuple_store, TupleDesc tupdesc)
 
Datum pg_hba_file_rules (PG_FUNCTION_ARGS)
 
Datum pg_ident_file_mappings (PG_FUNCTION_ARGS)
 

Macro Definition Documentation

◆ MAX_HBA_OPTIONS

#define MAX_HBA_OPTIONS   15

Definition at line 47 of file hbafuncs.c.

◆ NUM_PG_HBA_FILE_RULES_ATTS

#define NUM_PG_HBA_FILE_RULES_ATTS   11

Definition at line 167 of file hbafuncs.c.

◆ NUM_PG_IDENT_FILE_MAPPINGS_ATTS

#define NUM_PG_IDENT_FILE_MAPPINGS_ATTS   7

Definition at line 452 of file hbafuncs.c.

Function Documentation

◆ fill_hba_line()

static void fill_hba_line ( Tuplestorestate tuple_store,
TupleDesc  tupdesc,
int  rule_number,
char filename,
int  lineno,
HbaLine hba,
const char err_msg 
)
static

Definition at line 185 of file hbafuncs.c.

188{
190 bool nulls[NUM_PG_HBA_FILE_RULES_ATTS];
191 char buffer[NI_MAXHOST];
192 HeapTuple tuple;
193 int index;
194 ListCell *lc;
195 const char *typestr;
196 const char *addrstr;
197 const char *maskstr;
199
201
202 memset(values, 0, sizeof(values));
203 memset(nulls, 0, sizeof(nulls));
204 index = 0;
205
206 /* rule_number, nothing on error */
207 if (err_msg)
208 nulls[index++] = true;
209 else
211
212 /* file_name */
214
215 /* line_number */
216 values[index++] = Int32GetDatum(lineno);
217
218 if (hba != NULL)
219 {
220 /* type */
221 /* Avoid a default: case so compiler will warn about missing cases */
222 typestr = NULL;
223 switch (hba->conntype)
224 {
225 case ctLocal:
226 typestr = "local";
227 break;
228 case ctHost:
229 typestr = "host";
230 break;
231 case ctHostSSL:
232 typestr = "hostssl";
233 break;
234 case ctHostNoSSL:
235 typestr = "hostnossl";
236 break;
237 case ctHostGSS:
238 typestr = "hostgssenc";
239 break;
240 case ctHostNoGSS:
241 typestr = "hostnogssenc";
242 break;
243 }
244 if (typestr)
246 else
247 nulls[index++] = true;
248
249 /* database */
250 if (hba->databases)
251 {
252 /*
253 * Flatten AuthToken list to string list. It might seem that we
254 * should re-quote any quoted tokens, but that has been rejected
255 * on the grounds that it makes it harder to compare the array
256 * elements to other system catalogs. That makes entries like
257 * "all" or "samerole" formally ambiguous ... but users who name
258 * databases/roles that way are inflicting their own pain.
259 */
260 List *names = NIL;
261
262 foreach(lc, hba->databases)
263 {
265
266 names = lappend(names, tok->string);
267 }
269 }
270 else
271 nulls[index++] = true;
272
273 /* user */
274 if (hba->roles)
275 {
276 /* Flatten AuthToken list to string list; see comment above */
277 List *roles = NIL;
278
279 foreach(lc, hba->roles)
280 {
282
283 roles = lappend(roles, tok->string);
284 }
286 }
287 else
288 nulls[index++] = true;
289
290 /* address and netmask */
291 /* Avoid a default: case so compiler will warn about missing cases */
292 addrstr = maskstr = NULL;
293 switch (hba->ip_cmp_method)
294 {
295 case ipCmpMask:
296 if (hba->hostname)
297 {
298 addrstr = hba->hostname;
299 }
300 else
301 {
302 /*
303 * Note: if pg_getnameinfo_all fails, it'll set buffer to
304 * "???", which we want to return.
305 */
306 if (hba->addrlen > 0)
307 {
308 if (pg_getnameinfo_all(&hba->addr, hba->addrlen,
309 buffer, sizeof(buffer),
310 NULL, 0,
311 NI_NUMERICHOST) == 0)
312 clean_ipv6_addr(hba->addr.ss_family, buffer);
313 addrstr = pstrdup(buffer);
314 }
315 if (hba->masklen > 0)
316 {
317 if (pg_getnameinfo_all(&hba->mask, hba->masklen,
318 buffer, sizeof(buffer),
319 NULL, 0,
320 NI_NUMERICHOST) == 0)
321 clean_ipv6_addr(hba->mask.ss_family, buffer);
322 maskstr = pstrdup(buffer);
323 }
324 }
325 break;
326 case ipCmpAll:
327 addrstr = "all";
328 break;
329 case ipCmpSameHost:
330 addrstr = "samehost";
331 break;
332 case ipCmpSameNet:
333 addrstr = "samenet";
334 break;
335 }
336 if (addrstr)
338 else
339 nulls[index++] = true;
340 if (maskstr)
342 else
343 nulls[index++] = true;
344
345 /* auth_method */
347
348 /* options */
350 if (options)
352 else
353 nulls[index++] = true;
354 }
355 else
356 {
357 /* no parsing result, so set relevant fields to nulls */
358 memset(&nulls[3], true, (NUM_PG_HBA_FILE_RULES_ATTS - 4) * sizeof(bool));
359 }
360
361 /* error */
362 if (err_msg)
364 else
365 nulls[NUM_PG_HBA_FILE_RULES_ATTS - 1] = true;
366
367 tuple = heap_form_tuple(tupdesc, values, nulls);
368 tuplestore_puttuple(tuple_store, tuple);
369}
static Datum values[MAXATTR]
Definition bootstrap.c:190
#define CStringGetTextDatum(s)
Definition builtins.h:98
#define Assert(condition)
Definition c.h:943
const char * hba_authname(UserAuth auth_method)
Definition hba.c:2948
@ ipCmpAll
Definition hba.h:54
@ ipCmpSameNet
Definition hba.h:53
@ ipCmpMask
Definition hba.h:51
@ ipCmpSameHost
Definition hba.h:52
@ ctHostNoGSS
Definition hba.h:64
@ ctHostSSL
Definition hba.h:61
@ ctHostNoSSL
Definition hba.h:62
@ ctHost
Definition hba.h:60
@ ctHostGSS
Definition hba.h:63
@ ctLocal
Definition hba.h:59
#define NUM_PG_HBA_FILE_RULES_ATTS
Definition hbafuncs.c:167
static ArrayType * get_hba_options(HbaLine *hba)
Definition hbafuncs.c:54
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1025
int pg_getnameinfo_all(const struct sockaddr_storage *addr, int salen, char *node, int nodelen, char *service, int servicelen, int flags)
Definition ip.c:117
List * lappend(List *list, void *datum)
Definition list.c:339
char * pstrdup(const char *in)
Definition mcxt.c:1781
void clean_ipv6_addr(int addr_family, char *addr)
Definition network.c:2028
ArrayType * strlist_to_textarray(List *list)
static char * filename
Definition pg_dumpall.c:133
#define lfirst(lc)
Definition pg_list.h:172
#define NIL
Definition pg_list.h:68
uint64_t Datum
Definition postgres.h:70
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
#define PointerGetDatum(X)
Definition postgres.h:354
static int fb(int x)
UserAuth auth_method
Definition hba.h:108
struct sockaddr_storage mask
Definition hba.h:104
int addrlen
Definition hba.h:103
int masklen
Definition hba.h:105
char * hostname
Definition hba.h:107
List * databases
Definition hba.h:100
ConnType conntype
Definition hba.h:99
struct sockaddr_storage addr
Definition hba.h:102
List * roles
Definition hba.h:101
IPCompareMethod ip_cmp_method
Definition hba.h:106
Definition pg_list.h:54
Definition type.h:96
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
Definition tuplestore.c:765

References HbaLine::addr, HbaLine::addrlen, Assert, HbaLine::auth_method, clean_ipv6_addr(), HbaLine::conntype, CStringGetTextDatum, ctHost, ctHostGSS, ctHostNoGSS, ctHostNoSSL, ctHostSSL, ctLocal, HbaLine::databases, fb(), filename, get_hba_options(), hba_authname(), heap_form_tuple(), HbaLine::hostname, Int32GetDatum(), HbaLine::ip_cmp_method, ipCmpAll, ipCmpMask, ipCmpSameHost, ipCmpSameNet, lappend(), lfirst, HbaLine::mask, HbaLine::masklen, TupleDescData::natts, NIL, NUM_PG_HBA_FILE_RULES_ATTS, pg_getnameinfo_all(), PointerGetDatum, pstrdup(), HbaLine::roles, strlist_to_textarray(), tuplestore_puttuple(), and values.

Referenced by fill_hba_view().

◆ fill_hba_view()

static void fill_hba_view ( Tuplestorestate tuple_store,
TupleDesc  tupdesc 
)
static

Definition at line 376 of file hbafuncs.c.

377{
378 FILE *file;
379 List *hba_lines = NIL;
380 ListCell *line;
381 int rule_number = 0;
384
385 /*
386 * In the unlikely event that we can't open pg_hba.conf, we throw an
387 * error, rather than trying to report it via some sort of view entry.
388 * (Most other error conditions should result in a message in a view
389 * entry.)
390 */
392
394
395 /* Now parse all the lines */
397 "hba parser context",
400 foreach(line, hba_lines)
401 {
404
405 /* don't parse lines that already have errors */
406 if (tok_line->err_msg == NULL)
408
409 /* No error, set a new rule number */
410 if (tok_line->err_msg == NULL)
411 rule_number++;
412
413 fill_hba_line(tuple_store, tupdesc, rule_number,
414 tok_line->file_name, tok_line->line_num, hbaline,
415 tok_line->err_msg);
416 }
417
418 /* Free tokenizer memory */
419 free_auth_file(file, 0);
420 /* Free parse_hba_line memory */
423}
#define DEBUG3
Definition elog.h:29
#define ERROR
Definition elog.h:40
char * HbaFileName
Definition guc_tables.c:584
HbaLine * parse_hba_line(TokenizedAuthLine *tok_line, int elevel)
Definition hba.c:1324
void free_auth_file(FILE *file, int depth)
Definition hba.c:568
void tokenize_auth_file(const char *filename, FILE *file, List **tok_lines, int elevel, int depth)
Definition hba.c:687
FILE * open_auth_file(const char *filename, int elevel, int depth, char **err_msg)
Definition hba.c:593
static void fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, int rule_number, char *filename, int lineno, HbaLine *hba, const char *err_msg)
Definition hbafuncs.c:185
MemoryContext CurrentMemoryContext
Definition mcxt.c:160
void MemoryContextDelete(MemoryContext context)
Definition mcxt.c:472
#define AllocSetContextCreate
Definition memutils.h:129
#define ALLOCSET_SMALL_SIZES
Definition memutils.h:170
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
Definition hba.h:95

References ALLOCSET_SMALL_SIZES, AllocSetContextCreate, CurrentMemoryContext, DEBUG3, ERROR, fb(), fill_hba_line(), free_auth_file(), HbaFileName, lfirst, MemoryContextDelete(), MemoryContextSwitchTo(), NIL, open_auth_file(), parse_hba_line(), and tokenize_auth_file().

Referenced by pg_hba_file_rules().

◆ fill_ident_line()

static void fill_ident_line ( Tuplestorestate tuple_store,
TupleDesc  tupdesc,
int  map_number,
char filename,
int  lineno,
IdentLine ident,
const char err_msg 
)
static

Definition at line 470 of file hbafuncs.c.

473{
476 HeapTuple tuple;
477 int index;
478
480
481 memset(values, 0, sizeof(values));
482 memset(nulls, 0, sizeof(nulls));
483 index = 0;
484
485 /* map_number, nothing on error */
486 if (err_msg)
487 nulls[index++] = true;
488 else
490
491 /* file_name */
493
494 /* line_number */
495 values[index++] = Int32GetDatum(lineno);
496
497 if (ident != NULL)
498 {
499 values[index++] = CStringGetTextDatum(ident->usermap);
500 values[index++] = CStringGetTextDatum(ident->system_user->string);
501 values[index++] = CStringGetTextDatum(ident->pg_user->string);
502 }
503 else
504 {
505 /* no parsing result, so set relevant fields to nulls */
506 memset(&nulls[3], true, (NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 4) * sizeof(bool));
507 }
508
509 /* error */
510 if (err_msg)
512 else
513 nulls[NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 1] = true;
514
515 tuple = heap_form_tuple(tupdesc, values, nulls);
516 tuplestore_puttuple(tuple_store, tuple);
517}
#define NUM_PG_IDENT_FILE_MAPPINGS_ATTS
Definition hbafuncs.c:452
#define ident

References Assert, CStringGetTextDatum, fb(), filename, heap_form_tuple(), ident, Int32GetDatum(), TupleDescData::natts, NUM_PG_IDENT_FILE_MAPPINGS_ATTS, tuplestore_puttuple(), and values.

Referenced by fill_ident_view().

◆ fill_ident_view()

static void fill_ident_view ( Tuplestorestate tuple_store,
TupleDesc  tupdesc 
)
static

Definition at line 523 of file hbafuncs.c.

524{
525 FILE *file;
527 ListCell *line;
528 int map_number = 0;
531
532 /*
533 * In the unlikely event that we can't open pg_ident.conf, we throw an
534 * error, rather than trying to report it via some sort of view entry.
535 * (Most other error conditions should result in a message in a view
536 * entry.)
537 */
539
541
542 /* Now parse all the lines */
544 "ident parser context",
547 foreach(line, ident_lines)
548 {
551
552 /* don't parse lines that already have errors */
553 if (tok_line->err_msg == NULL)
555
556 /* no error, set a new mapping number */
557 if (tok_line->err_msg == NULL)
558 map_number++;
559
560 fill_ident_line(tuple_store, tupdesc, map_number,
561 tok_line->file_name, tok_line->line_num,
562 identline, tok_line->err_msg);
563 }
564
565 /* Free tokenizer memory */
566 free_auth_file(file, 0);
567 /* Free parse_ident_line memory */
570}
char * IdentFileName
Definition guc_tables.c:585
IdentLine * parse_ident_line(TokenizedAuthLine *tok_line, int elevel)
Definition hba.c:2558
static void fill_ident_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, int map_number, char *filename, int lineno, IdentLine *ident, const char *err_msg)
Definition hbafuncs.c:470

References ALLOCSET_SMALL_SIZES, AllocSetContextCreate, CurrentMemoryContext, DEBUG3, ERROR, fb(), fill_ident_line(), free_auth_file(), IdentFileName, lfirst, MemoryContextDelete(), MemoryContextSwitchTo(), NIL, open_auth_file(), parse_ident_line(), and tokenize_auth_file().

Referenced by pg_ident_file_mappings().

◆ get_hba_options()

static ArrayType * get_hba_options ( HbaLine hba)
static

Definition at line 54 of file hbafuncs.c.

55{
56 int noptions;
58
59 noptions = 0;
60
61 if (hba->auth_method == uaGSS || hba->auth_method == uaSSPI)
62 {
63 if (hba->include_realm)
64 options[noptions++] =
65 CStringGetTextDatum("include_realm=true");
66
67 if (hba->krb_realm)
68 options[noptions++] =
69 CStringGetTextDatum(psprintf("krb_realm=%s", hba->krb_realm));
70 }
71
72 if (hba->usermap)
73 options[noptions++] =
74 CStringGetTextDatum(psprintf("map=%s", hba->usermap));
75
76 if (hba->clientcert != clientCertOff)
77 options[noptions++] =
78 CStringGetTextDatum(psprintf("clientcert=%s", (hba->clientcert == clientCertCA) ? "verify-ca" : "verify-full"));
79
80 if (hba->pamservice)
81 options[noptions++] =
82 CStringGetTextDatum(psprintf("pamservice=%s", hba->pamservice));
83
84 if (hba->auth_method == uaLDAP)
85 {
86 if (hba->ldapserver)
87 options[noptions++] =
88 CStringGetTextDatum(psprintf("ldapserver=%s", hba->ldapserver));
89
90 if (hba->ldapport)
91 options[noptions++] =
92 CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport));
93
94 if (hba->ldapscheme)
95 options[noptions++] =
96 CStringGetTextDatum(psprintf("ldapscheme=%s", hba->ldapscheme));
97
98 if (hba->ldaptls)
99 options[noptions++] =
100 CStringGetTextDatum("ldaptls=true");
101
102 if (hba->ldapprefix)
103 options[noptions++] =
104 CStringGetTextDatum(psprintf("ldapprefix=%s", hba->ldapprefix));
105
106 if (hba->ldapsuffix)
107 options[noptions++] =
108 CStringGetTextDatum(psprintf("ldapsuffix=%s", hba->ldapsuffix));
109
110 if (hba->ldapbasedn)
111 options[noptions++] =
112 CStringGetTextDatum(psprintf("ldapbasedn=%s", hba->ldapbasedn));
113
114 if (hba->ldapbinddn)
115 options[noptions++] =
116 CStringGetTextDatum(psprintf("ldapbinddn=%s", hba->ldapbinddn));
117
118 if (hba->ldapbindpasswd)
119 options[noptions++] =
120 CStringGetTextDatum(psprintf("ldapbindpasswd=%s",
121 hba->ldapbindpasswd));
122
123 if (hba->ldapsearchattribute)
124 options[noptions++] =
125 CStringGetTextDatum(psprintf("ldapsearchattribute=%s",
126 hba->ldapsearchattribute));
127
128 if (hba->ldapsearchfilter)
129 options[noptions++] =
130 CStringGetTextDatum(psprintf("ldapsearchfilter=%s",
131 hba->ldapsearchfilter));
132
133 if (hba->ldapscope)
134 options[noptions++] =
135 CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope));
136 }
137
138 if (hba->auth_method == uaOAuth)
139 {
140 if (hba->oauth_issuer)
141 options[noptions++] =
142 CStringGetTextDatum(psprintf("issuer=%s", hba->oauth_issuer));
143
144 if (hba->oauth_scope)
145 options[noptions++] =
146 CStringGetTextDatum(psprintf("scope=%s", hba->oauth_scope));
147
148 if (hba->oauth_validator)
149 options[noptions++] =
150 CStringGetTextDatum(psprintf("validator=%s", hba->oauth_validator));
151
152 if (hba->oauth_skip_usermap)
153 options[noptions++] =
154 CStringGetTextDatum(psprintf("delegate_ident_mapping=true"));
155 }
156
157 /* If you add more options, consider increasing MAX_HBA_OPTIONS. */
159
160 if (noptions > 0)
162 else
163 return NULL;
164}
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
@ uaLDAP
Definition hba.h:38
@ uaGSS
Definition hba.h:34
@ uaOAuth
Definition hba.h:41
@ uaSSPI
Definition hba.h:35
@ clientCertOff
Definition hba.h:69
@ clientCertCA
Definition hba.h:70
#define MAX_HBA_OPTIONS
Definition hbafuncs.c:47
static size_t noptions
char * psprintf(const char *fmt,...)
Definition psprintf.c:43
bool oauth_skip_usermap
Definition hba.h:133
char * ldapserver
Definition hba.h:114
bool include_realm
Definition hba.h:127
ClientCertMode clientcert
Definition hba.h:124
char * ldapsearchfilter
Definition hba.h:119
char * ldapscheme
Definition hba.h:113
char * oauth_issuer
Definition hba.h:130
char * ldapprefix
Definition hba.h:122
char * ldapsearchattribute
Definition hba.h:118
char * krb_realm
Definition hba.h:126
char * ldapbasedn
Definition hba.h:120
char * oauth_scope
Definition hba.h:131
char * oauth_validator
Definition hba.h:132
char * pamservice
Definition hba.h:110
char * usermap
Definition hba.h:109
char * ldapsuffix
Definition hba.h:123
int ldapport
Definition hba.h:115
char * ldapbindpasswd
Definition hba.h:117
char * ldapbinddn
Definition hba.h:116
int ldapscope
Definition hba.h:121
bool ldaptls
Definition hba.h:112

References Assert, HbaLine::auth_method, HbaLine::clientcert, clientCertCA, clientCertOff, construct_array_builtin(), CStringGetTextDatum, fb(), HbaLine::include_realm, HbaLine::krb_realm, HbaLine::ldapbasedn, HbaLine::ldapbinddn, HbaLine::ldapbindpasswd, HbaLine::ldapport, HbaLine::ldapprefix, HbaLine::ldapscheme, HbaLine::ldapscope, HbaLine::ldapsearchattribute, HbaLine::ldapsearchfilter, HbaLine::ldapserver, HbaLine::ldapsuffix, HbaLine::ldaptls, MAX_HBA_OPTIONS, noptions, HbaLine::oauth_issuer, HbaLine::oauth_scope, HbaLine::oauth_skip_usermap, HbaLine::oauth_validator, HbaLine::pamservice, psprintf(), uaGSS, uaLDAP, uaOAuth, uaSSPI, and HbaLine::usermap.

Referenced by fill_hba_line().

◆ pg_hba_file_rules()

Datum pg_hba_file_rules ( PG_FUNCTION_ARGS  )

Definition at line 432 of file hbafuncs.c.

433{
434 ReturnSetInfo *rsi;
435
436 /*
437 * Build tuplestore to hold the result rows. We must use the Materialize
438 * mode to be safe against HBA file changes while the cursor is open. It's
439 * also more efficient than having to look up our current position in the
440 * parsed list every time.
441 */
442 InitMaterializedSRF(fcinfo, 0);
443
444 /* Fill the tuplestore */
445 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
446 fill_hba_view(rsi->setResult, rsi->setDesc);
447
449}
#define PG_RETURN_NULL()
Definition fmgr.h:346
void InitMaterializedSRF(FunctionCallInfo fcinfo, uint32 flags)
Definition funcapi.c:76
static void fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc)
Definition hbafuncs.c:376

References fill_hba_view(), InitMaterializedSRF(), PG_RETURN_NULL, ReturnSetInfo::setDesc, and ReturnSetInfo::setResult.

◆ pg_ident_file_mappings()

Datum pg_ident_file_mappings ( PG_FUNCTION_ARGS  )

Definition at line 576 of file hbafuncs.c.

577{
578 ReturnSetInfo *rsi;
579
580 /*
581 * Build tuplestore to hold the result rows. We must use the Materialize
582 * mode to be safe against HBA file changes while the cursor is open. It's
583 * also more efficient than having to look up our current position in the
584 * parsed list every time.
585 */
586 InitMaterializedSRF(fcinfo, 0);
587
588 /* Fill the tuplestore */
589 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
590 fill_ident_view(rsi->setResult, rsi->setDesc);
591
593}
static void fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc)
Definition hbafuncs.c:523

References fill_ident_view(), InitMaterializedSRF(), PG_RETURN_NULL, ReturnSetInfo::setDesc, and ReturnSetInfo::setResult.