|
18 | 18 | * Portions Copyright (c) 2000-2001, PostgreSQL Global Development Group
|
19 | 19 | * Copyright 1999 Jan Wieck
|
20 | 20 | *
|
21 |
| - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.23 2001/03/22 06:16:17 momjian Exp $ |
| 21 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.23.2.1 2001/05/09 16:28:31 petere Exp $ |
22 | 22 | *
|
23 | 23 | * ----------
|
24 | 24 | */
|
@@ -941,6 +941,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
|
941 | 941 | char del_nulls[RI_MAX_NUMKEYS + 1];
|
942 | 942 | bool isnull;
|
943 | 943 | int i;
|
| 944 | + Oid save_uid; |
| 945 | + Oid fk_owner; |
944 | 946 |
|
945 | 947 | ReferentialIntegritySnapshotOverride = true;
|
946 | 948 |
|
@@ -978,6 +980,7 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
|
978 | 980 | * tuple.
|
979 | 981 | */
|
980 | 982 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 983 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
981 | 984 | pk_rel = trigdata->tg_relation;
|
982 | 985 | old_row = trigdata->tg_trigtuple;
|
983 | 986 |
|
@@ -1081,9 +1084,14 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
|
1081 | 1084 | /*
|
1082 | 1085 | * Now delete constraint
|
1083 | 1086 | */
|
| 1087 | + save_uid = GetUserId(); |
| 1088 | + SetUserId(fk_owner); |
| 1089 | + |
1084 | 1090 | if (SPI_execp(qplan, del_values, del_nulls, 0) != SPI_OK_DELETE)
|
1085 | 1091 | elog(ERROR, "SPI_execp() failed in RI_FKey_cascade_del()");
|
1086 | 1092 |
|
| 1093 | + SetUserId(save_uid); |
| 1094 | + |
1087 | 1095 | if (SPI_finish() != SPI_OK_FINISH)
|
1088 | 1096 | elog(NOTICE, "SPI_finish() failed in RI_FKey_cascade_del()");
|
1089 | 1097 |
|
@@ -1128,6 +1136,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
|
1128 | 1136 | bool isnull;
|
1129 | 1137 | int i;
|
1130 | 1138 | int j;
|
| 1139 | + Oid save_uid; |
| 1140 | + Oid fk_owner; |
1131 | 1141 |
|
1132 | 1142 | ReferentialIntegritySnapshotOverride = true;
|
1133 | 1143 |
|
@@ -1165,6 +1175,7 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
|
1165 | 1175 | * and old tuple.
|
1166 | 1176 | */
|
1167 | 1177 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 1178 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
1168 | 1179 | pk_rel = trigdata->tg_relation;
|
1169 | 1180 | new_row = trigdata->tg_newtuple;
|
1170 | 1181 | old_row = trigdata->tg_trigtuple;
|
@@ -1297,9 +1308,14 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
|
1297 | 1308 | /*
|
1298 | 1309 | * Now update the existing references
|
1299 | 1310 | */
|
| 1311 | + save_uid = GetUserId(); |
| 1312 | + SetUserId(fk_owner); |
| 1313 | + |
1300 | 1314 | if (SPI_execp(qplan, upd_values, upd_nulls, 0) != SPI_OK_UPDATE)
|
1301 | 1315 | elog(ERROR, "SPI_execp() failed in RI_FKey_cascade_upd()");
|
1302 | 1316 |
|
| 1317 | + SetUserId(save_uid); |
| 1318 | + |
1303 | 1319 | if (SPI_finish() != SPI_OK_FINISH)
|
1304 | 1320 | elog(NOTICE, "SPI_finish() failed in RI_FKey_cascade_upd()");
|
1305 | 1321 |
|
@@ -1349,6 +1365,8 @@ RI_FKey_restrict_del(PG_FUNCTION_ARGS)
|
1349 | 1365 | char del_nulls[RI_MAX_NUMKEYS + 1];
|
1350 | 1366 | bool isnull;
|
1351 | 1367 | int i;
|
| 1368 | + Oid save_uid; |
| 1369 | + Oid fk_owner; |
1352 | 1370 |
|
1353 | 1371 | ReferentialIntegritySnapshotOverride = true;
|
1354 | 1372 |
|
@@ -1386,6 +1404,7 @@ RI_FKey_restrict_del(PG_FUNCTION_ARGS)
|
1386 | 1404 | * tuple.
|
1387 | 1405 | */
|
1388 | 1406 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 1407 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
1389 | 1408 | pk_rel = trigdata->tg_relation;
|
1390 | 1409 | old_row = trigdata->tg_trigtuple;
|
1391 | 1410 |
|
@@ -1493,9 +1512,14 @@ RI_FKey_restrict_del(PG_FUNCTION_ARGS)
|
1493 | 1512 | /*
|
1494 | 1513 | * Now check for existing references
|
1495 | 1514 | */
|
| 1515 | + save_uid = GetUserId(); |
| 1516 | + SetUserId(fk_owner); |
| 1517 | + |
1496 | 1518 | if (SPI_execp(qplan, del_values, del_nulls, 1) != SPI_OK_SELECT)
|
1497 | 1519 | elog(ERROR, "SPI_execp() failed in RI_FKey_restrict_del()");
|
1498 | 1520 |
|
| 1521 | + SetUserId(save_uid); |
| 1522 | + |
1499 | 1523 | if (SPI_processed > 0)
|
1500 | 1524 | elog(ERROR, "%s referential integrity violation - "
|
1501 | 1525 | "key in %s still referenced from %s",
|
@@ -1554,8 +1578,7 @@ RI_FKey_restrict_upd(PG_FUNCTION_ARGS)
|
1554 | 1578 | bool isnull;
|
1555 | 1579 | int i;
|
1556 | 1580 | Oid save_uid;
|
1557 |
| - |
1558 |
| - save_uid = GetUserId(); |
| 1581 | + Oid fk_owner; |
1559 | 1582 |
|
1560 | 1583 | ReferentialIntegritySnapshotOverride = true;
|
1561 | 1584 |
|
@@ -1593,6 +1616,7 @@ RI_FKey_restrict_upd(PG_FUNCTION_ARGS)
|
1593 | 1616 | * and old tuple.
|
1594 | 1617 | */
|
1595 | 1618 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 1619 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
1596 | 1620 | pk_rel = trigdata->tg_relation;
|
1597 | 1621 | new_row = trigdata->tg_newtuple;
|
1598 | 1622 | old_row = trigdata->tg_trigtuple;
|
@@ -1708,6 +1732,9 @@ RI_FKey_restrict_upd(PG_FUNCTION_ARGS)
|
1708 | 1732 | /*
|
1709 | 1733 | * Now check for existing references
|
1710 | 1734 | */
|
| 1735 | + save_uid = GetUserId(); |
| 1736 | + SetUserId(fk_owner); |
| 1737 | + |
1711 | 1738 | SetUserId(RelationGetForm(pk_rel)->relowner);
|
1712 | 1739 |
|
1713 | 1740 | if (SPI_execp(qplan, upd_values, upd_nulls, 1) != SPI_OK_SELECT)
|
@@ -1764,6 +1791,8 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
|
1764 | 1791 | char upd_nulls[RI_MAX_NUMKEYS + 1];
|
1765 | 1792 | bool isnull;
|
1766 | 1793 | int i;
|
| 1794 | + Oid save_uid; |
| 1795 | + Oid fk_owner; |
1767 | 1796 |
|
1768 | 1797 | ReferentialIntegritySnapshotOverride = true;
|
1769 | 1798 |
|
@@ -1801,6 +1830,7 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
|
1801 | 1830 | * tuple.
|
1802 | 1831 | */
|
1803 | 1832 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 1833 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
1804 | 1834 | pk_rel = trigdata->tg_relation;
|
1805 | 1835 | old_row = trigdata->tg_trigtuple;
|
1806 | 1836 |
|
@@ -1915,9 +1945,14 @@ RI_FKey_setnull_del(PG_FUNCTION_ARGS)
|
1915 | 1945 | /*
|
1916 | 1946 | * Now update the existing references
|
1917 | 1947 | */
|
| 1948 | + save_uid = GetUserId(); |
| 1949 | + SetUserId(fk_owner); |
| 1950 | + |
1918 | 1951 | if (SPI_execp(qplan, upd_values, upd_nulls, 0) != SPI_OK_UPDATE)
|
1919 | 1952 | elog(ERROR, "SPI_execp() failed in RI_FKey_setnull_del()");
|
1920 | 1953 |
|
| 1954 | + SetUserId(save_uid); |
| 1955 | + |
1921 | 1956 | if (SPI_finish() != SPI_OK_FINISH)
|
1922 | 1957 | elog(NOTICE, "SPI_finish() failed in RI_FKey_setnull_del()");
|
1923 | 1958 |
|
@@ -1963,6 +1998,8 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
|
1963 | 1998 | int i;
|
1964 | 1999 | int match_type;
|
1965 | 2000 | bool use_cached_query;
|
| 2001 | + Oid save_uid; |
| 2002 | + Oid fk_owner; |
1966 | 2003 |
|
1967 | 2004 | ReferentialIntegritySnapshotOverride = true;
|
1968 | 2005 |
|
@@ -2000,6 +2037,7 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
|
2000 | 2037 | * tuple.
|
2001 | 2038 | */
|
2002 | 2039 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 2040 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
2003 | 2041 | pk_rel = trigdata->tg_relation;
|
2004 | 2042 | new_row = trigdata->tg_newtuple;
|
2005 | 2043 | old_row = trigdata->tg_trigtuple;
|
@@ -2161,9 +2199,14 @@ RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
|
2161 | 2199 | /*
|
2162 | 2200 | * Now update the existing references
|
2163 | 2201 | */
|
| 2202 | + save_uid = GetUserId(); |
| 2203 | + SetUserId(fk_owner); |
| 2204 | + |
2164 | 2205 | if (SPI_execp(qplan, upd_values, upd_nulls, 0) != SPI_OK_UPDATE)
|
2165 | 2206 | elog(ERROR, "SPI_execp() failed in RI_FKey_setnull_upd()");
|
2166 | 2207 |
|
| 2208 | + SetUserId(save_uid); |
| 2209 | + |
2167 | 2210 | if (SPI_finish() != SPI_OK_FINISH)
|
2168 | 2211 | elog(NOTICE, "SPI_finish() failed in RI_FKey_setnull_upd()");
|
2169 | 2212 |
|
@@ -2206,6 +2249,8 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
|
2206 | 2249 | char upd_nulls[RI_MAX_NUMKEYS + 1];
|
2207 | 2250 | bool isnull;
|
2208 | 2251 | int i;
|
| 2252 | + Oid save_uid; |
| 2253 | + Oid fk_owner; |
2209 | 2254 |
|
2210 | 2255 | ReferentialIntegritySnapshotOverride = true;
|
2211 | 2256 |
|
@@ -2243,6 +2288,7 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
|
2243 | 2288 | * tuple.
|
2244 | 2289 | */
|
2245 | 2290 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 2291 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
2246 | 2292 | pk_rel = trigdata->tg_relation;
|
2247 | 2293 | old_row = trigdata->tg_trigtuple;
|
2248 | 2294 |
|
@@ -2404,9 +2450,14 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
|
2404 | 2450 | /*
|
2405 | 2451 | * Now update the existing references
|
2406 | 2452 | */
|
| 2453 | + save_uid = GetUserId(); |
| 2454 | + SetUserId(fk_owner); |
| 2455 | + |
2407 | 2456 | if (SPI_execp(qplan, upd_values, upd_nulls, 0) != SPI_OK_UPDATE)
|
2408 | 2457 | elog(ERROR, "SPI_execp() failed in RI_FKey_setdefault_del()");
|
2409 | 2458 |
|
| 2459 | + SetUserId(save_uid); |
| 2460 | + |
2410 | 2461 | if (SPI_finish() != SPI_OK_FINISH)
|
2411 | 2462 | elog(NOTICE, "SPI_finish() failed in RI_FKey_setdefault_del()");
|
2412 | 2463 |
|
@@ -2451,6 +2502,8 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
|
2451 | 2502 | bool isnull;
|
2452 | 2503 | int i;
|
2453 | 2504 | int match_type;
|
| 2505 | + Oid save_uid; |
| 2506 | + Oid fk_owner; |
2454 | 2507 |
|
2455 | 2508 | ReferentialIntegritySnapshotOverride = true;
|
2456 | 2509 |
|
@@ -2488,6 +2541,7 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
|
2488 | 2541 | * tuple.
|
2489 | 2542 | */
|
2490 | 2543 | fk_rel = heap_openr(tgargs[RI_FK_RELNAME_ARGNO], NoLock);
|
| 2544 | + fk_owner = RelationGetForm(fk_rel)->relowner; |
2491 | 2545 | pk_rel = trigdata->tg_relation;
|
2492 | 2546 | new_row = trigdata->tg_newtuple;
|
2493 | 2547 | old_row = trigdata->tg_trigtuple;
|
@@ -2676,9 +2730,14 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
|
2676 | 2730 | /*
|
2677 | 2731 | * Now update the existing references
|
2678 | 2732 | */
|
| 2733 | + save_uid = GetUserId(); |
| 2734 | + SetUserId(fk_owner); |
| 2735 | + |
2679 | 2736 | if (SPI_execp(qplan, upd_values, upd_nulls, 0) != SPI_OK_UPDATE)
|
2680 | 2737 | elog(ERROR, "SPI_execp() failed in RI_FKey_setdefault_upd()");
|
2681 | 2738 |
|
| 2739 | + SetUserId(save_uid); |
| 2740 | + |
2682 | 2741 | if (SPI_finish() != SPI_OK_FINISH)
|
2683 | 2742 | elog(NOTICE, "SPI_finish() failed in RI_FKey_setdefault_upd()");
|
2684 | 2743 |
|
|
0 commit comments