67 elog(
DEBUG4,
"check_primary_key: Enter Function");
77 elog(
ERROR,
"check_primary_key: not fired by trigger manager");
82 elog(
ERROR,
"check_primary_key: must be fired for row");
91 elog(
ERROR,
"check_primary_key: cannot process DELETE events");
99 args = trigger->tgargs;
103 elog(
ERROR,
"check_primary_key: odd number of arguments should be specified");
113 elog(
ERROR,
"check_primary_key: SPI_connect returned %d", ret);
129 if (
plan->nplans <= 0)
133 for (
i = 0;
i < nkeys;
i++)
141 (
errcode(ERRCODE_UNDEFINED_COLUMN),
142 errmsg(
"there is no attribute \"%s\" in relation \"%s\"",
159 if (
plan->nplans <= 0)
166 if (
plan->nplans <= 0)
176 for (
i = 0;
i < nkeys;
i++)
178 snprintf(sql + strlen(sql),
sizeof(sql) - strlen(sql),
"%s = $%d %s",
179 args[
i + nkeys + 1],
i + 1, (
i < nkeys - 1) ?
"and " :
"");
194 elog(
ERROR,
"check_primary_key: SPI_keepplan failed");
197 *(
plan->splan) = pplan;
209 elog(
ERROR,
"check_primary_key: SPI_execp returned %d", ret);
216 (
errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
217 errmsg(
"tuple references non-existent key"),
218 errdetail(
"Trigger \"%s\" found tuple referencing non-existent key in \"%s\".", trigger->tgname,
relname)));
257 Oid *argtypes = NULL;
267 elog(
DEBUG4,
"check_foreign_key: Enter Function");
277 elog(
ERROR,
"check_foreign_key: not fired by trigger manager");
282 elog(
ERROR,
"check_foreign_key: must be fired for row");
287 elog(
ERROR,
"check_foreign_key: cannot process INSERT events");
304 args = trigger->tgargs;
309 elog(
ERROR,
"check_foreign_key: too short %d (< 5) list of arguments", nargs);
314 elog(
ERROR,
"check_foreign_key: %d (< 1) number of references specified", nrefs);
318 elog(
ERROR,
"check_foreign_key: invalid action %s",
args[1]);
321 nkeys = (nargs - nrefs) / (nrefs + 1);
322 if (nkeys <= 0 || nargs != (nrefs + nkeys * (nrefs + 1)))
324 elog(
ERROR,
"check_foreign_key: invalid number of arguments %d for %d references",
333 elog(
ERROR,
"check_foreign_key: SPI_connect returned %d", ret);
349 if (
plan->nplans <= 0)
355 else if (
plan->nplans != nrefs)
357 elog(
ERROR,
"%s: check_foreign_key: # of plans changed in meantime",
361 for (
i = 0;
i < nkeys;
i++)
369 (
errcode(ERRCODE_UNDEFINED_COLUMN),
370 errmsg(
"there is no attribute \"%s\" in relation \"%s\"",
392 if (newtuple != NULL)
394 char *oldval =
SPI_getvalue(trigtuple, tupdesc, fnumber);
406 if (
plan->nplans <= 0)
416 if (
plan->nplans <= 0)
425 for (r = 0; r < nrefs; r++)
469 for (k = 1; k <= nkeys; k++)
471 int is_char_type = 0;
479 if (strcmp(
type,
"text") == 0 ||
480 strcmp(
type,
"varchar") == 0 ||
481 strcmp(
type,
"char") == 0 ||
482 strcmp(
type,
"bpchar") == 0 ||
483 strcmp(
type,
"date") == 0 ||
484 strcmp(
type,
"timestamp") == 0)
487 elog(
DEBUG4,
"check_foreign_key Debug value %s type %s %d",
488 nv,
type, is_char_type);
494 snprintf(sql + strlen(sql),
sizeof(sql) - strlen(sql),
496 args2[k], (is_char_type > 0) ?
"'" :
"",
497 nv, (is_char_type > 0) ?
"'" :
"", (k < nkeys) ?
", " :
"");
499 strcat(sql,
" where ");
515 for (
i = 1;
i <= nkeys;
i++)
517 snprintf(sql + strlen(sql),
sizeof(sql) - strlen(sql),
519 args2[
i], (
i < nkeys) ?
", " :
"");
521 strcat(sql,
" where ");
525 for (
i = 1;
i <= nkeys;
i++)
527 snprintf(sql + strlen(sql),
sizeof(sql) - strlen(sql),
"%s = $%d %s",
528 args2[
i],
i, (
i < nkeys) ?
"and " :
"");
543 elog(
ERROR,
"check_foreign_key: SPI_keepplan failed");
545 plan->splan[r] = pplan;
549 plan->nplans = nrefs;
551 elog(
DEBUG4,
"check_foreign_key Debug Query is : %s ", sql);
558 if (newtuple != NULL && isequal)
567 for (r = 0; r < nrefs; r++)
573 int tcount = (
action ==
'r') ? 1 : 0;
584 (
errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
585 errmsg(
"SPI_execp returned %d", ret)));
593 (
errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
594 errmsg(
"\"%s\": tuple is referenced in \"%s\"",
599 #ifdef REFINT_VERBOSE
602 (
action ==
'c') ?
"deleted" :
"set to null");
628 for (
i = 0;
i < *nplans;
i++)
elog(ERROR, "%s: %s", p2, msg)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
char * pstrdup(const char *in)
MemoryContext TopMemoryContext
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
int32 pg_strtoint32(const char *s)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static Datum PointerGetDatum(const void *X)
Datum check_foreign_key(PG_FUNCTION_ARGS)
Datum check_primary_key(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(check_primary_key)
static EPlan * find_plan(char *ident, EPlan **eplan, int *nplans)
char * SPI_getrelname(Relation rel)
int SPI_fnumber(TupleDesc tupdesc, const char *fname)
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
const char * SPI_result_code_string(int code)
SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes)
int SPI_keepplan(SPIPlanPtr plan)
int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls, long tcount)
char * SPI_gettype(TupleDesc tupdesc, int fnumber)
char * SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull)
static void * fn(void *arg)
#define TRIGGER_FIRED_BY_DELETE(event)
#define CALLED_AS_TRIGGER(fcinfo)
#define TRIGGER_FIRED_FOR_ROW(event)
#define TRIGGER_FIRED_BY_INSERT(event)
#define TRIGGER_FIRED_BY_UPDATE(event)