|
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.24 2001/05/07 19:57:24 petere Exp $ |
22 | 22 | * |
23 | 23 | * ---------- |
24 | 24 | */ |
@@ -941,6 +941,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS) |
941 | 941 | chardel_nulls[RI_MAX_NUMKEYS+1]; |
942 | 942 | boolisnull; |
943 | 943 | inti; |
| 944 | +Oidsave_uid; |
| 945 | +Oidfk_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 | boolisnull; |
1129 | 1137 | inti; |
1130 | 1138 | intj; |
| 1139 | +Oidsave_uid; |
| 1140 | +Oidfk_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 | chardel_nulls[RI_MAX_NUMKEYS+1]; |
1350 | 1366 | boolisnull; |
1351 | 1367 | inti; |
| 1368 | +Oidsave_uid; |
| 1369 | +Oidfk_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 | boolisnull; |
1555 | 1579 | inti; |
1556 | 1580 | Oidsave_uid; |
1557 | | - |
1558 | | -save_uid=GetUserId(); |
| 1581 | +Oidfk_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 | charupd_nulls[RI_MAX_NUMKEYS+1]; |
1765 | 1792 | boolisnull; |
1766 | 1793 | inti; |
| 1794 | +Oidsave_uid; |
| 1795 | +Oidfk_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 | inti; |
1964 | 1999 | intmatch_type; |
1965 | 2000 | booluse_cached_query; |
| 2001 | +Oidsave_uid; |
| 2002 | +Oidfk_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 | charupd_nulls[RI_MAX_NUMKEYS+1]; |
2207 | 2250 | boolisnull; |
2208 | 2251 | inti; |
| 2252 | +Oidsave_uid; |
| 2253 | +Oidfk_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 | boolisnull; |
2452 | 2503 | inti; |
2453 | 2504 | intmatch_type; |
| 2505 | +Oidsave_uid; |
| 2506 | +Oidfk_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 |
|
|