Skip to content

Commit 32f7c0a

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 1b1d3d9 commit 32f7c0a

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
@@ -976,23 +976,23 @@ CheckValidResultRel(Relation resultRel, CmdType operation)
976976
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
977977
errmsg("cannot insert into view \"%s\"",
978978
RelationGetRelationName(resultRel)),
979-
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.")));
979+
errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
980980
break;
981981
case CMD_UPDATE:
982982
if (!trigDesc || !trigDesc->trig_update_instead_row)
983983
ereport(ERROR,
984984
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
985985
errmsg("cannot update view \"%s\"",
986986
RelationGetRelationName(resultRel)),
987-
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.")));
987+
errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
988988
break;
989989
case CMD_DELETE:
990990
if (!trigDesc || !trigDesc->trig_delete_instead_row)
991991
ereport(ERROR,
992992
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
993993
errmsg("cannot delete from view \"%s\"",
994994
RelationGetRelationName(resultRel)),
995-
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.")));
995+
errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
996996
break;
997997
default:
998998
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
@@ -2344,23 +2344,23 @@ rewriteTargetView(Query *parsetree, Relation view)
23442344
errmsg("cannot insert into view \"%s\"",
23452345
RelationGetRelationName(view)),
23462346
errdetail_internal("%s", _(auto_update_detail)),
2347-
errhint("To make the view insertable, provide an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger.")));
2347+
errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")));
23482348
break;
23492349
case CMD_UPDATE:
23502350
ereport(ERROR,
23512351
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
23522352
errmsg("cannot update view \"%s\"",
23532353
RelationGetRelationName(view)),
23542354
errdetail_internal("%s", _(auto_update_detail)),
2355-
errhint("To make the view updatable, provide an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.")));
2355+
errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")));
23562356
break;
23572357
case CMD_DELETE:
23582358
ereport(ERROR,
23592359
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
23602360
errmsg("cannot delete from view \"%s\"",
23612361
RelationGetRelationName(view)),
23622362
errdetail_internal("%s", _(auto_update_detail)),
2363-
errhint("To make the view updatable, provide an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger.")));
2363+
errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")));
23642364
break;
23652365
default:
23662366
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)