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
)