From 35606a7e4e66f3279f52be941b0b9bce29d73de3 Mon Sep 17 00:00:00 2001 From: Antonin Houska Date: Wed, 8 Apr 2020 15:03:20 +0200 Subject: [PATCH 1/4] Check for RI violation outside ri_PerformCheck(). --- src/backend/utils/adt/ri_triggers.c | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index bb49e80d16..6220872126 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -389,11 +389,16 @@ RI_FKey_check(TriggerData *trigdata) /* * Now check that foreign key exists in PK table */ - ri_PerformCheck(riinfo, &qkey, qplan, - fk_rel, pk_rel, - NULL, newslot, - false, - SPI_OK_SELECT); + if (!ri_PerformCheck(riinfo, &qkey, qplan, + fk_rel, pk_rel, + NULL, newslot, + false, + SPI_OK_SELECT)) + ri_ReportViolation(riinfo, + pk_rel, fk_rel, + newslot, + NULL, + qkey.constr_queryno, false); if (SPI_finish() != SPI_OK_FINISH) elog(ERROR, "SPI_finish failed"); @@ -708,11 +713,16 @@ ri_restrict(TriggerData *trigdata, bool is_no_action) /* * We have a plan now. Run it to check for existing references. */ - ri_PerformCheck(riinfo, &qkey, qplan, - fk_rel, pk_rel, - oldslot, NULL, - true, /* must detect new rows */ - SPI_OK_SELECT); + if (ri_PerformCheck(riinfo, &qkey, qplan, + fk_rel, pk_rel, + oldslot, NULL, + true, /* must detect new rows */ + SPI_OK_SELECT)) + ri_ReportViolation(riinfo, + pk_rel, fk_rel, + oldslot, + NULL, + qkey.constr_queryno, false); if (SPI_finish() != SPI_OK_FINISH) elog(ERROR, "SPI_finish failed"); @@ -2288,16 +2298,6 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, RelationGetRelationName(fk_rel)), errhint("This is most likely due to a rule having rewritten the query."))); - /* XXX wouldn't it be clearer to do this part at the caller? */ - if (qkey->constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK && - expect_OK == SPI_OK_SELECT && - (SPI_processed == 0) == (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK)) - ri_ReportViolation(riinfo, - pk_rel, fk_rel, - newslot ? newslot : oldslot, - NULL, - qkey->constr_queryno, false); - return SPI_processed != 0; } -- 2.20.1