22#include "access/htup_details.h"
24#include "catalog/namespace.h"
25#include "catalog/pg_type.h"
26#include "catalog/pg_enum.h"
27#include "catalog/pg_namespace.h"
28#include "catalog/pg_operator.h"
29#include "catalog/pg_type.h"
31#include "nodes/value.h"
32#include "parser/parse_func.h"
33#include "utils/syscache.h"
34#include "utils/lsyscache.h"
72 bool was_unknown =
false;
75 if ((arg1 == UNKNOWNOID) && (arg2 != InvalidOid))
80 else if ((arg2 == UNKNOWNOID) && (arg1 != InvalidOid))
86 result = OpernameGetOprid(opname, arg1, arg2);
87 if (OidIsValid(result))
93 Oid basetype = getBaseType(arg1);
97 result = OpernameGetOprid(opname, basetype, basetype);
98 if (OidIsValid(result))
111 List *
const equals=list_make1(makeString(
"="));
113 FuncCandidateList clist;
114 Oid inputOids[2] = {ltypeId,rtypeId};
119 if(result!=InvalidOid)
122 clist = OpernameGetCandidates(equals,
'b',
false);
124 ncandidates = func_match_argtypes(2, inputOids,
127 if (ncandidates == 0)
129 else if (ncandidates == 1)
132 clist = func_select_candidate(2, inputOids, clist);
151 FuncCandidateList fcl=FuncnameGetCandidates(
152 list_make1(makeString(s)),
157#
if PG_VERSION_NUM >= 140000
177 FuncCandidateList fcl=FuncnameGetCandidates(
178 list_make2(makeString(
"provsql"),makeString(s)),
183#
if PG_VERSION_NUM >= 140000
208 const char *operatorName,
209 Oid operatorNamespace,
212 Oid *operatorObjectId,
213 Oid *functionObjectId)
218 tup = SearchSysCache4(OPERNAMENSP,
219 PointerGetDatum(operatorName),
220 ObjectIdGetDatum(leftObjectId),
221 ObjectIdGetDatum(rightObjectId),
222 ObjectIdGetDatum(operatorNamespace));
223 if (HeapTupleIsValid(tup))
225 Form_pg_operator oprform = (Form_pg_operator) GETSTRUCT(tup);
226#if PG_VERSION_NUM >= 120000
227 *operatorObjectId = oprform->oid;
229 *operatorObjectId = HeapTupleGetOid(tup);
231 *functionObjectId = oprform->oprcode;
232 defined = RegProcedureIsValid(oprform->oprcode);
233 ReleaseSysCache(tup);
241 *operatorObjectId = 0;
242 *functionObjectId = 0;
258 tup = SearchSysCache2(ENUMTYPOIDNAME,
259 ObjectIdGetDatum(enumtypoid),
260 CStringGetDatum(label));
261 Assert(HeapTupleIsValid(tup));
263#if PG_VERSION_NUM >= 120000
264 ret = ((Form_pg_enum) GETSTRUCT(tup))->oid;
266 ret = HeapTupleGetOid(tup);
269 ReleaseSysCache(tup);
291 constants.
ok =
false;
294 #define CheckOid(o) if(constants.o==InvalidOid) { \
295 if(failure_if_not_possible) \
296 provsql_error("Could not initialize provsql constants"); \
308#
if PG_VERSION_NUM >= 120000
311 CStringGetDatum(
"provenance_gate"),
318#
if PG_VERSION_NUM >= 120000
321 CStringGetDatum(
"agg_token"),
351 CheckOid(OID_FUNCTION_PROVENANCE_PLUS);
354 CheckOid(OID_FUNCTION_PROVENANCE_TIMES);
357 CheckOid(OID_FUNCTION_PROVENANCE_MONUS);
360 CheckOid(OID_FUNCTION_PROVENANCE_PROJECT);
363 CheckOid(OID_FUNCTION_PROVENANCE_EQ);
369 CheckOid(OID_FUNCTION_PROVENANCE_DELTA);
372 CheckOid(OID_FUNCTION_PROVENANCE_AGGREGATE);
375 CheckOid(OID_FUNCTION_PROVENANCE_SEMIMOD);
384 CheckOid(OID_FUNCTION_PROVENANCE_CMP);
387 CheckOid(OID_FUNCTION_AGG_TOKEN_UUID);
390 CheckOid(OID_OPERATOR_NOT_EQUAL_UUID);
391 CheckOid(OID_FUNCTION_NOT_EQUAL_UUID);
394 #define GET_GATE_TYPE_OID(x) { \
395 constants.GATE_TYPE_TO_OID[gate_ ## x] = get_enum_oid( \
396 constants.OID_TYPE_GATE_TYPE, \
398 if(constants.GATE_TYPE_TO_OID[gate_ ## x]==InvalidOid) \
399 provsql_error("Could not initialize provsql gate type " #x); }
432 unsigned mid=(start+end)/2;
442 for(
unsigned i=0; i<start; ++i)
445 constants_cache2[start].
database=MyDatabaseId;
471 unsigned mid=(start+end)/2;
const char * gate_type_name[]
Names of gate types.
static Oid get_enum_oid(Oid enumtypoid, const char *label)
Return the OID of a specific enum label within an enum type.
static void OperatorGet(const char *operatorName, Oid operatorNamespace, Oid leftObjectId, Oid rightObjectId, Oid *operatorObjectId, Oid *functionObjectId)
Retrieve operator and function OIDs for a named operator.
Datum reset_constants_cache(PG_FUNCTION_ARGS)
SQL function to invalidate the OID constants cache.
Oid find_equality_operator(Oid ltypeId, Oid rtypeId)
Find the equality operator OID for two given types.
static Oid get_provsql_func_oid(char *s)
Return the OID of a provsql-schema function named s.
database_constants_t * constants_cache
Per-database OID constants cache (sorted by database OID)
constants_t get_constants(bool failure_if_not_possible)
Retrieve the cached OID constants for the current database.
unsigned constants_cache_len
Number of valid entries in constants_cache.
static Oid get_func_oid(char *s)
Return the OID of a globally qualified function named s.
static Oid binary_oper_exact(List *opname, Oid arg1, Oid arg2)
Look up an exactly matching binary operator OID.
#define GET_GATE_TYPE_OID(x)
static constants_t initialize_constants(bool failure_if_not_possible)
Query the system catalogs to populate a fresh constants_t.
Core types, constants, and utilities shared across ProvSQL.
Structure to store the value of various constants.
Oid OID_FUNCTION_PROVENANCE_EQ
OID of the provenance_eq FUNCTION.
Oid OID_FUNCTION_PROVENANCE_AGGREGATE
OID of the provenance_aggregate FUNCTION.
Oid OID_FUNCTION_PROVENANCE_SEMIMOD
OID of the provenance_semimod FUNCTION.
Oid OID_FUNCTION_PROVENANCE
OID of the provenance FUNCTION.
Oid OID_FUNCTION_AGG_TOKEN_UUID
OID of the agg_token_uuid FUNCTION.
Oid OID_TYPE_VARCHAR
OID of the VARCHAR TYPE.
Oid OID_FUNCTION_GATE_ZERO
OID of the provenance_zero FUNCTION.
Oid OID_SCHEMA_PROVSQL
OID of the provsql SCHEMA.
Oid OID_TYPE_GATE_TYPE
OID of the provenance_gate TYPE.
Oid OID_FUNCTION_PROVENANCE_PROJECT
OID of the provenance_project FUNCTION.
Oid OID_TYPE_FLOAT
OID of the FLOAT TYPE.
Oid OID_TYPE_AGG_TOKEN
OID of the agg_token TYPE.
Oid OID_FUNCTION_ARRAY_AGG
OID of the array_agg FUNCTION.
Oid OID_TYPE_INT
OID of the INT TYPE.
Oid OID_FUNCTION_PROVENANCE_PLUS
OID of the provenance_plus FUNCTION.
Oid OID_OPERATOR_NOT_EQUAL_UUID
OID of the <> operator on UUIDs FUNCTION.
Oid OID_TYPE_UUID
OID of the uuid TYPE.
bool ok
true if constants were loaded
Oid OID_TYPE_INT_ARRAY
OID of the INT[] TYPE.
Oid OID_FUNCTION_PROVENANCE_DELTA
OID of the provenance_delta FUNCTION.
Oid OID_FUNCTION_PROVENANCE_TIMES
OID of the provenance_times FUNCTION.
Oid OID_FUNCTION_PROVENANCE_MONUS
OID of the provenance_monus FUNCTION.
Oid OID_TYPE_BOOL
OID of the BOOL TYPE.
Oid OID_FUNCTION_NOT_EQUAL_UUID
OID of the = operator on UUIDs FUNCTION.
Oid OID_FUNCTION_GATE_ONE
OID of the provenance_one FUNCTION.
Oid OID_TYPE_UUID_ARRAY
OID of the uuid[] TYPE.
Oid OID_FUNCTION_PROVENANCE_CMP
OID of the provenance_cmp FUNCTION.
Structure to store the value of various constants for a specific database.
Oid database
OID of the database these constants belong to.
constants_t constants
Cached OID constants for this database.