Thanks to visit codestin.com
Credit goes to github.com

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)