PostgreSQL Source Code: src/backend/utils/adt/domains.c File Reference (original) (raw)
Go to the source code of this file.
Functions | |
---|---|
static bool | domain_check_internal (Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt, Node *escontext) |
static DomainIOData * | domain_state_setup (Oid domainType, bool binary, MemoryContext mcxt) |
static void | domain_check_input (Datum value, bool isnull, DomainIOData *my_extra, Node *escontext) |
Datum | domain_in (PG_FUNCTION_ARGS) |
Datum | domain_recv (PG_FUNCTION_ARGS) |
void | domain_check (Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt) |
bool | domain_check_safe (Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt, Node *escontext) |
int | errdatatype (Oid datatypeOid) |
int | errdomainconstraint (Oid datatypeOid, const char *conname) |
◆ DomainIOData
◆ domain_check()
Definition at line 346 of file domains.c.
348{
350 NULL);
351}
static bool domain_check_internal(Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt, Node *escontext)
References domain_check_internal(), and value.
Referenced by check_domain_for_new_field(), check_domain_for_new_tuple(), expanded_record_set_fields(), hstore_populate_record(), plperl_return_next_internal(), plperl_sv_to_datum(), plpgsql_exec_function(), pltcl_build_tuple_result(), and PLyObject_ToDomain().
◆ domain_check_input()
static void domain_check_input ( Datum value, bool isnull, DomainIOData * my_extra, Node * escontext ) | static |
---|
Definition at line 138 of file domains.c.
140{
143
144
146
148 {
150
152 {
154 if (isnull)
155 {
157 (errcode(ERRCODE_NOT_NULL_VIOLATION),
158 errmsg("domain %s does not allow null values",
161 goto fail;
162 }
163 break;
165 {
166
167 if (econtext == NULL)
168 {
170
174 my_extra->econtext = econtext;
175 }
176
177
178
179
180
181
182
183
184
185
186
191
193 {
195 (errcode(ERRCODE_CHECK_VIOLATION),
196 errmsg("value for domain %s violates check constraint \"%s\"",
200 con->name)));
201 goto fail;
202 }
203 break;
204 }
205 default:
206 elog(ERROR, "unrecognized constraint type: %d",
208 break;
209 }
210 }
211
212
213
214
215
216
217fail:
218 if (econtext)
220}
int errdatatype(Oid datatypeOid)
int errdomainconstraint(Oid datatypeOid, const char *conname)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define errsave(context,...)
bool ExecCheck(ExprState *state, ExprContext *econtext)
void ReScanExprContext(ExprContext *econtext)
ExprContext * CreateStandaloneExprContext(void)
#define MakeExpandedObjectReadOnly(d, isnull, typlen)
char * format_type_be(Oid type_oid)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
DomainConstraintType constrainttype
ExprState * check_exprstate
DomainConstraintRef constraint_ref
void UpdateDomainConstraintRef(DomainConstraintRef *ref)
References DomainConstraintState::check_exprstate, DomainIOData::constraint_ref, DomainConstraintRef::constraints, DomainConstraintState::constrainttype, CreateStandaloneExprContext(), DOM_CONSTRAINT_CHECK, DOM_CONSTRAINT_NOTNULL, DomainIOData::domain_type, ExprContext::domainValue_datum, ExprContext::domainValue_isNull, DomainIOData::econtext, elog, errcode(), errdatatype(), errdomainconstraint(), errmsg(), ERROR, errsave, ExecCheck(), format_type_be(), lfirst, MakeExpandedObjectReadOnly, DomainIOData::mcxt, MemoryContextSwitchTo(), DomainConstraintState::name, ReScanExprContext(), DomainConstraintRef::tcache, TypeCacheEntry::typlen, UpdateDomainConstraintRef(), and value.
Referenced by domain_check_internal(), domain_in(), and domain_recv().
◆ domain_check_internal()
static bool domain_check_internal ( Datum value, bool isnull, Oid domainType, void ** extra, MemoryContext mcxt, Node * escontext ) | static |
---|
Definition at line 371 of file domains.c.
374{
376
377 if (mcxt == NULL)
379
380
381
382
383
384
385 if (extra)
387 if (my_extra == NULL || my_extra->domain_type != domainType)
388 {
390 if (extra)
391 *extra = my_extra;
392 }
393
394
395
396
398
400}
static DomainIOData * domain_state_setup(Oid domainType, bool binary, MemoryContext mcxt)
static void domain_check_input(Datum value, bool isnull, DomainIOData *my_extra, Node *escontext)
MemoryContext CurrentMemoryContext
#define SOFT_ERROR_OCCURRED(escontext)
References CurrentMemoryContext, domain_check_input(), domain_state_setup(), DomainIOData::domain_type, SOFT_ERROR_OCCURRED, and value.
Referenced by domain_check(), and domain_check_safe().
◆ domain_check_safe()
◆ domain_in()
Definition at line 227 of file domains.c.
228{
230 Oid domainType;
231 Node *escontext = fcinfo->context;
234
235
236
237
238
239
241 string = NULL;
242 else
247
248
249
250
251
252
253 my_extra = (DomainIOData *) fcinfo->flinfo->fn_extra;
254 if (my_extra == NULL || my_extra->domain_type != domainType)
255 {
257 fcinfo->flinfo->fn_mcxt);
258 fcinfo->flinfo->fn_extra = my_extra;
259 }
260
261
262
263
265 string,
268 escontext,
271
272
273
274
276
277 if (string == NULL)
279 else
281}
bool InputFunctionCallSafe(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod, fmNodePtr escontext, Datum *result)
#define PG_GETARG_CSTRING(n)
#define PG_RETURN_DATUM(x)
if(TABLE==NULL||TABLE_index==NULL)
References domain_check_input(), domain_state_setup(), DomainIOData::domain_type, if(), InputFunctionCallSafe(), PG_ARGISNULL, PG_GETARG_CSTRING, PG_GETARG_OID, PG_RETURN_DATUM, PG_RETURN_NULL, DomainIOData::proc, DomainIOData::typioparam, DomainIOData::typtypmod, and value.
◆ domain_recv()
Definition at line 287 of file domains.c.
288{
290 Oid domainType;
293
294
295
296
297
298
300 buf = NULL;
301 else
306
307
308
309
310
311
312 my_extra = (DomainIOData *) fcinfo->flinfo->fn_extra;
313 if (my_extra == NULL || my_extra->domain_type != domainType)
314 {
316 fcinfo->flinfo->fn_mcxt);
317 fcinfo->flinfo->fn_extra = my_extra;
318 }
319
320
321
322
327
328
329
330
332
333 if (buf == NULL)
335 else
337}
Datum ReceiveFunctionCall(FmgrInfo *flinfo, StringInfo buf, Oid typioparam, int32 typmod)
#define PG_GETARG_POINTER(n)
StringInfoData * StringInfo
References buf, domain_check_input(), domain_state_setup(), DomainIOData::domain_type, if(), PG_ARGISNULL, PG_GETARG_OID, PG_GETARG_POINTER, PG_RETURN_DATUM, PG_RETURN_NULL, DomainIOData::proc, ReceiveFunctionCall(), DomainIOData::typioparam, DomainIOData::typtypmod, and value.
◆ domain_state_setup()
Definition at line 76 of file domains.c.
77{
80 Oid baseType;
81
83
84
85
86
87
88
89
90
92 if (typentry->typtype != TYPTYPE_DOMAIN)
94 (errcode(ERRCODE_DATATYPE_MISMATCH),
95 errmsg("type %s is not a domain",
97
98
101
102
103 if (binary)
107 else
112
113
115
116
118 my_extra->mcxt = mcxt;
119
120
122
123 return my_extra;
124}
#define ereport(elevel,...)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
void getTypeBinaryInputInfo(Oid type, Oid *typReceive, Oid *typIOParam)
void * MemoryContextAlloc(MemoryContext context, Size size)
void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref, MemoryContext refctx, bool need_exprstate)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define TYPECACHE_DOMAIN_BASE_INFO
References DomainIOData::constraint_ref, DomainIOData::domain_type, TypeCacheEntry::domainBaseType, TypeCacheEntry::domainBaseTypmod, DomainIOData::econtext, ereport, errcode(), errmsg(), ERROR, fmgr_info_cxt(), format_type_be(), getTypeBinaryInputInfo(), getTypeInputInfo(), InitDomainConstraintRef(), lookup_type_cache(), DomainIOData::mcxt, MemoryContextAlloc(), DomainIOData::proc, TYPECACHE_DOMAIN_BASE_INFO, DomainIOData::typiofunc, DomainIOData::typioparam, TypeCacheEntry::typtype, and DomainIOData::typtypmod.
Referenced by domain_check_internal(), domain_in(), and domain_recv().
◆ errdatatype()
int errdatatype | ( | Oid | datatypeOid | ) |
---|
Definition at line 407 of file domains.c.
408{
411
414 elog(ERROR, "cache lookup failed for type %u", datatypeOid);
416
420
422
423 return 0;
424}
int err_generic_string(int field, const char *str)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
char * get_namespace_name(Oid nspid)
FormData_pg_type * Form_pg_type
static Datum ObjectIdGetDatum(Oid X)
#define PG_DIAG_SCHEMA_NAME
#define PG_DIAG_DATATYPE_NAME
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
References elog, err_generic_string(), ERROR, get_namespace_name(), GETSTRUCT(), HeapTupleIsValid, NameStr, ObjectIdGetDatum(), PG_DIAG_DATATYPE_NAME, PG_DIAG_SCHEMA_NAME, ReleaseSysCache(), and SearchSysCache1().
Referenced by domain_check_input(), errdomainconstraint(), and ExecEvalConstraintNotNull().
◆ errdomainconstraint()
int errdomainconstraint | ( | Oid | datatypeOid, |
---|---|---|---|
const char * | conname | ||
) |