Commit 32f7c0ae authored by Peter Eisentraut's avatar Peter Eisentraut

Improve error message when view is not updatable

Avoid using the term "updatable" in confusing ways.  Suggest a trigger
first, before a rule.
parent 1b1d3d92
...@@ -976,7 +976,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation) ...@@ -976,7 +976,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation)
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("cannot insert into view \"%s\"", errmsg("cannot insert into view \"%s\"",
RelationGetRelationName(resultRel)), RelationGetRelationName(resultRel)),
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger."))); errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
break; break;
case CMD_UPDATE: case CMD_UPDATE:
if (!trigDesc || !trigDesc->trig_update_instead_row) if (!trigDesc || !trigDesc->trig_update_instead_row)
...@@ -984,7 +984,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation) ...@@ -984,7 +984,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation)
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("cannot update view \"%s\"", errmsg("cannot update view \"%s\"",
RelationGetRelationName(resultRel)), RelationGetRelationName(resultRel)),
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger."))); errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
break; break;
case CMD_DELETE: case CMD_DELETE:
if (!trigDesc || !trigDesc->trig_delete_instead_row) if (!trigDesc || !trigDesc->trig_delete_instead_row)
...@@ -992,7 +992,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation) ...@@ -992,7 +992,7 @@ CheckValidResultRel(Relation resultRel, CmdType operation)
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("cannot delete from view \"%s\"", errmsg("cannot delete from view \"%s\"",
RelationGetRelationName(resultRel)), RelationGetRelationName(resultRel)),
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger."))); errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
break; break;
default: default:
elog(ERROR, "unrecognized CmdType: %d", (int) operation); elog(ERROR, "unrecognized CmdType: %d", (int) operation);
......
...@@ -2344,7 +2344,7 @@ rewriteTargetView(Query *parsetree, Relation view) ...@@ -2344,7 +2344,7 @@ rewriteTargetView(Query *parsetree, Relation view)
errmsg("cannot insert into view \"%s\"", errmsg("cannot insert into view \"%s\"",
RelationGetRelationName(view)), RelationGetRelationName(view)),
errdetail_internal("%s", _(auto_update_detail)), errdetail_internal("%s", _(auto_update_detail)),
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger."))); errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
break; break;
case CMD_UPDATE: case CMD_UPDATE:
ereport(ERROR, ereport(ERROR,
...@@ -2352,7 +2352,7 @@ rewriteTargetView(Query *parsetree, Relation view) ...@@ -2352,7 +2352,7 @@ rewriteTargetView(Query *parsetree, Relation view)
errmsg("cannot update view \"%s\"", errmsg("cannot update view \"%s\"",
RelationGetRelationName(view)), RelationGetRelationName(view)),
errdetail_internal("%s", _(auto_update_detail)), errdetail_internal("%s", _(auto_update_detail)),
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger."))); errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
break; break;
case CMD_DELETE: case CMD_DELETE:
ereport(ERROR, ereport(ERROR,
...@@ -2360,7 +2360,7 @@ rewriteTargetView(Query *parsetree, Relation view) ...@@ -2360,7 +2360,7 @@ rewriteTargetView(Query *parsetree, Relation view)
errmsg("cannot delete from view \"%s\"", errmsg("cannot delete from view \"%s\"",
RelationGetRelationName(view)), RelationGetRelationName(view)),
errdetail_internal("%s", _(auto_update_detail)), errdetail_internal("%s", _(auto_update_detail)),
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger."))); errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
break; break;
default: default:
elog(ERROR, "unrecognized CmdType: %d", elog(ERROR, "unrecognized CmdType: %d",
......
...@@ -136,83 +136,83 @@ SELECT table_name, column_name, is_updatable ...@@ -136,83 +136,83 @@ SELECT table_name, column_name, is_updatable
DELETE FROM ro_view1; DELETE FROM ro_view1;
ERROR: cannot delete from view "ro_view1" ERROR: cannot delete from view "ro_view1"
DETAIL: Views containing DISTINCT are not automatically updatable. DETAIL: Views containing DISTINCT are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
DELETE FROM ro_view2; DELETE FROM ro_view2;
ERROR: cannot delete from view "ro_view2" ERROR: cannot delete from view "ro_view2"
DETAIL: Views containing GROUP BY are not automatically updatable. DETAIL: Views containing GROUP BY are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
DELETE FROM ro_view3; DELETE FROM ro_view3;
ERROR: cannot delete from view "ro_view3" ERROR: cannot delete from view "ro_view3"
DETAIL: Views containing HAVING are not automatically updatable. DETAIL: Views containing HAVING are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
DELETE FROM ro_view4; DELETE FROM ro_view4;
ERROR: cannot delete from view "ro_view4" ERROR: cannot delete from view "ro_view4"
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable. DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
DELETE FROM ro_view5; DELETE FROM ro_view5;
ERROR: cannot delete from view "ro_view5" ERROR: cannot delete from view "ro_view5"
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable. DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
DELETE FROM ro_view6; DELETE FROM ro_view6;
ERROR: cannot delete from view "ro_view6" ERROR: cannot delete from view "ro_view6"
DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable. DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
UPDATE ro_view7 SET a=a+1; UPDATE ro_view7 SET a=a+1;
ERROR: cannot update view "ro_view7" ERROR: cannot update view "ro_view7"
DETAIL: Views containing WITH are not automatically updatable. DETAIL: Views containing WITH are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
UPDATE ro_view8 SET a=a+1; UPDATE ro_view8 SET a=a+1;
ERROR: cannot update view "ro_view8" ERROR: cannot update view "ro_view8"
DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. DETAIL: Views containing LIMIT or OFFSET are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
UPDATE ro_view9 SET a=a+1; UPDATE ro_view9 SET a=a+1;
ERROR: cannot update view "ro_view9" ERROR: cannot update view "ro_view9"
DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. DETAIL: Views containing LIMIT or OFFSET are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
UPDATE ro_view10 SET a=a+1; UPDATE ro_view10 SET a=a+1;
ERROR: cannot update view "ro_view10" ERROR: cannot update view "ro_view10"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
UPDATE ro_view11 SET a=a+1; UPDATE ro_view11 SET a=a+1;
ERROR: cannot update view "ro_view11" ERROR: cannot update view "ro_view11"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
UPDATE ro_view12 SET a=a+1; UPDATE ro_view12 SET a=a+1;
ERROR: cannot update view "ro_view12" ERROR: cannot update view "ro_view12"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
INSERT INTO ro_view13 VALUES (3, 'Row 3'); INSERT INTO ro_view13 VALUES (3, 'Row 3');
ERROR: cannot insert into view "ro_view13" ERROR: cannot insert into view "ro_view13"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
INSERT INTO ro_view14 VALUES (null); INSERT INTO ro_view14 VALUES (null);
ERROR: cannot insert into view "ro_view14" ERROR: cannot insert into view "ro_view14"
DETAIL: Views that return system columns are not automatically updatable. DETAIL: Views that return system columns are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
INSERT INTO ro_view15 VALUES (3, 'ROW 3'); INSERT INTO ro_view15 VALUES (3, 'ROW 3');
ERROR: cannot insert into view "ro_view15" ERROR: cannot insert into view "ro_view15"
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable. DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
INSERT INTO ro_view16 VALUES (3, 'Row 3', 3); INSERT INTO ro_view16 VALUES (3, 'Row 3', 3);
ERROR: cannot insert into view "ro_view16" ERROR: cannot insert into view "ro_view16"
DETAIL: Views that return the same column more than once are not automatically updatable. DETAIL: Views that return the same column more than once are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
INSERT INTO ro_view17 VALUES (3, 'ROW 3'); INSERT INTO ro_view17 VALUES (3, 'ROW 3');
ERROR: cannot insert into view "ro_view1" ERROR: cannot insert into view "ro_view1"
DETAIL: Views containing DISTINCT are not automatically updatable. DETAIL: Views containing DISTINCT are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
INSERT INTO ro_view18 VALUES (3, 'ROW 3'); INSERT INTO ro_view18 VALUES (3, 'ROW 3');
ERROR: cannot insert into view "ro_view18" ERROR: cannot insert into view "ro_view18"
DETAIL: Security-barrier views are not automatically updatable. DETAIL: Security-barrier views are not automatically updatable.
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
DELETE FROM ro_view19; DELETE FROM ro_view19;
ERROR: cannot delete from view "ro_view19" ERROR: cannot delete from view "ro_view19"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
UPDATE ro_view20 SET max_value=1000; UPDATE ro_view20 SET max_value=1000;
ERROR: cannot update view "ro_view20" ERROR: cannot update view "ro_view20"
DETAIL: Views that do not select from a single table or view are not automatically updatable. DETAIL: Views that do not select from a single table or view are not automatically updatable.
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
DROP TABLE base_tbl CASCADE; DROP TABLE base_tbl CASCADE;
NOTICE: drop cascades to 16 other objects NOTICE: drop cascades to 16 other objects
DETAIL: drop cascades to view ro_view1 DETAIL: drop cascades to view ro_view1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment