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-2018, 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