Skip to content

Commit 9e3f42f

Browse files
committed
Improve error message when view is not updatable
Avoid using the term "updatable" in confusing ways. Suggest a trigger first, before a rule.
1 parent 6c5f68e commit 9e3f42f

File tree

3 files changed

+26
-26
lines changed

3 files changed

+26
-26
lines changed

src/backend/executor/execMain.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -975,23 +975,23 @@ CheckValidResultRel(Relation resultRel, CmdType operation)
975975
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
976976
errmsg("cannot insert into view \"%s\"",
977977
RelationGetRelationName(resultRel)),
978-
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.")));
978+
errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
979979
break;
980980
case CMD_UPDATE:
981981
if (!trigDesc || !trigDesc->trig_update_instead_row)
982982
ereport(ERROR,
983983
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
984984
errmsg("cannot update view \"%s\"",
985985
RelationGetRelationName(resultRel)),
986-
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.")));
986+
errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
987987
break;
988988
case CMD_DELETE:
989989
if (!trigDesc || !trigDesc->trig_delete_instead_row)
990990
ereport(ERROR,
991991
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
992992
errmsg("cannot delete from view \"%s\"",
993993
RelationGetRelationName(resultRel)),
994-
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.")));
994+
errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
995995
break;
996996
default:
997997
elog(ERROR, "unrecognized CmdType: %d", (int) operation);

src/backend/rewrite/rewriteHandler.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2318,23 +2318,23 @@ rewriteTargetView(Query *parsetree, Relation view)
23182318
errmsg("cannot insert into view \"%s\"",
23192319
RelationGetRelationName(view)),
23202320
errdetail_internal("%s", _(auto_update_detail)),
2321-
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.")));
2321+
errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
23222322
break;
23232323
case CMD_UPDATE:
23242324
ereport(ERROR,
23252325
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
23262326
errmsg("cannot update view \"%s\"",
23272327
RelationGetRelationName(view)),
23282328
errdetail_internal("%s", _(auto_update_detail)),
2329-
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.")));
2329+
errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
23302330
break;
23312331
case CMD_DELETE:
23322332
ereport(ERROR,
23332333
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
23342334
errmsg("cannot delete from view \"%s\"",
23352335
RelationGetRelationName(view)),
23362336
errdetail_internal("%s", _(auto_update_detail)),
2337-
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.")));
2337+
errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
23382338
break;
23392339
default:
23402340
elog(ERROR, "unrecognized CmdType: %d",

src/test/regress/expected/updatable_views.out

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -136,83 +136,83 @@ SELECT table_name, column_name, is_updatable
136136
DELETE FROM ro_view1;
137137
ERROR: cannot delete from view "ro_view1"
138138
DETAIL: Views containing DISTINCT are not automatically updatable.
139-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
139+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
140140
DELETE FROM ro_view2;
141141
ERROR: cannot delete from view "ro_view2"
142142
DETAIL: Views containing GROUP BY are not automatically updatable.
143-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
143+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
144144
DELETE FROM ro_view3;
145145
ERROR: cannot delete from view "ro_view3"
146146
DETAIL: Views containing HAVING are not automatically updatable.
147-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
147+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
148148
DELETE FROM ro_view4;
149149
ERROR: cannot delete from view "ro_view4"
150150
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
151-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
151+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
152152
DELETE FROM ro_view5;
153153
ERROR: cannot delete from view "ro_view5"
154154
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
155-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
155+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
156156
DELETE FROM ro_view6;
157157
ERROR: cannot delete from view "ro_view6"
158158
DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable.
159-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
159+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
160160
UPDATE ro_view7 SET a=a+1;
161161
ERROR: cannot update view "ro_view7"
162162
DETAIL: Views containing WITH are not automatically updatable.
163-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
163+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
164164
UPDATE ro_view8 SET a=a+1;
165165
ERROR: cannot update view "ro_view8"
166166
DETAIL: Views containing LIMIT or OFFSET are not automatically updatable.
167-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
167+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
168168
UPDATE ro_view9 SET a=a+1;
169169
ERROR: cannot update view "ro_view9"
170170
DETAIL: Views containing LIMIT or OFFSET are not automatically updatable.
171-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
171+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
172172
UPDATE ro_view10 SET a=a+1;
173173
ERROR: cannot update view "ro_view10"
174174
DETAIL: Views that do not select from a single table or view are not automatically updatable.
175-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
175+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
176176
UPDATE ro_view11 SET a=a+1;
177177
ERROR: cannot update view "ro_view11"
178178
DETAIL: Views that do not select from a single table or view are not automatically updatable.
179-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
179+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
180180
UPDATE ro_view12 SET a=a+1;
181181
ERROR: cannot update view "ro_view12"
182182
DETAIL: Views that do not select from a single table or view are not automatically updatable.
183-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
183+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
184184
INSERT INTO ro_view13 VALUES (3, 'Row 3');
185185
ERROR: cannot insert into view "ro_view13"
186186
DETAIL: Views that do not select from a single table or view are not automatically updatable.
187-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
187+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
188188
INSERT INTO ro_view14 VALUES (null);
189189
ERROR: cannot insert into view "ro_view14"
190190
DETAIL: Views that return system columns are not automatically updatable.
191-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
191+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
192192
INSERT INTO ro_view15 VALUES (3, 'ROW 3');
193193
ERROR: cannot insert into view "ro_view15"
194194
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
195-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
195+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
196196
INSERT INTO ro_view16 VALUES (3, 'Row 3', 3);
197197
ERROR: cannot insert into view "ro_view16"
198198
DETAIL: Views that return the same column more than once are not automatically updatable.
199-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
199+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
200200
INSERT INTO ro_view17 VALUES (3, 'ROW 3');
201201
ERROR: cannot insert into view "ro_view1"
202202
DETAIL: Views containing DISTINCT are not automatically updatable.
203-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
203+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
204204
INSERT INTO ro_view18 VALUES (3, 'ROW 3');
205205
ERROR: cannot insert into view "ro_view18"
206206
DETAIL: Security-barrier views are not automatically updatable.
207-
HINT: To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.
207+
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
208208
DELETE FROM ro_view19;
209209
ERROR: cannot delete from view "ro_view19"
210210
DETAIL: Views that do not select from a single table or view are not automatically updatable.
211-
HINT: To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.
211+
HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
212212
UPDATE ro_view20 SET max_value=1000;
213213
ERROR: cannot update view "ro_view20"
214214
DETAIL: Views that do not select from a single table or view are not automatically updatable.
215-
HINT: To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.
215+
HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
216216
DROP TABLE base_tbl CASCADE;
217217
NOTICE: drop cascades to 16 other objects
218218
DETAIL: drop cascades to view ro_view1

0 commit comments

Comments
 (0)