1 /*-------------------------------------------------------------------------
2  *
3  * queryenvironment.h
4  *	  Access to functions to mutate the query environment and retrieve the
5  *	  actual data related to entries (if any).
6  *
7  * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/utils/queryenvironment.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef QUERYENVIRONMENT_H
15 #define QUERYENVIRONMENT_H
16 
17 #include "access/tupdesc.h"
18 
19 
20 typedef enum EphemeralNameRelationType
21 {
22 	ENR_NAMED_TUPLESTORE		/* named tuplestore relation; e.g., deltas */
23 } EphemeralNameRelationType;
24 
25 /*
26  * Some ephemeral named relations must match some relation (e.g., trigger
27  * transition tables), so to properly handle cached plans and DDL, we should
28  * carry the OID of that relation.  In other cases an ENR might be independent
29  * of any relation which is stored in the system catalogs, so we need to be
30  * able to directly store the TupleDesc.  We never need both.
31  */
32 typedef struct EphemeralNamedRelationMetadataData
33 {
34 	char	   *name;			/* name used to identify the relation */
35 
36 	/* only one of the next two fields should be used */
37 	Oid			reliddesc;		/* oid of relation to get tupdesc */
38 	TupleDesc	tupdesc;		/* description of result rows */
39 
40 	EphemeralNameRelationType enrtype;	/* to identify type of relation */
41 	double		enrtuples;		/* estimated number of tuples */
42 } EphemeralNamedRelationMetadataData;
43 
44 typedef EphemeralNamedRelationMetadataData *EphemeralNamedRelationMetadata;
45 
46 /*
47  * Ephemeral Named Relation data; used for parsing named relations not in the
48  * catalog, like transition tables in AFTER triggers.
49  */
50 typedef struct EphemeralNamedRelationData
51 {
52 	EphemeralNamedRelationMetadataData md;
53 	void	   *reldata;		/* structure for execution-time access to data */
54 } EphemeralNamedRelationData;
55 
56 typedef EphemeralNamedRelationData *EphemeralNamedRelation;
57 
58 /*
59  * This is an opaque structure outside of queryenvironment.c itself.  The
60  * intention is to be able to change the implementation or add new context
61  * features without needing to change existing code for use of existing
62  * features.
63  */
64 typedef struct QueryEnvironment QueryEnvironment;
65 
66 
67 extern QueryEnvironment *create_queryEnv(void);
68 extern EphemeralNamedRelationMetadata get_visible_ENR_metadata(QueryEnvironment *queryEnv, const char *refname);
69 extern void register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr);
70 extern void unregister_ENR(QueryEnvironment *queryEnv, const char *name);
71 extern EphemeralNamedRelation get_ENR(QueryEnvironment *queryEnv, const char *name);
72 extern TupleDesc ENRMetadataGetTupDesc(EphemeralNamedRelationMetadata enrmd);
73 
74 #endif							/* QUERYENVIRONMENT_H */
75