From e05e18606be069b79d44ca004315293cd1ac5ed8 Mon Sep 17 00:00:00 2001
From: unknown <bell@sanja.is.com.ua>
Date: Wed, 29 Sep 2004 16:35:01 +0300
Subject: [PATCH] post review changes: CHECK OPTION moved to one function view
 name added to error messages

mysql-test/r/view.result:
  error messages changed
sql/share/czech/errmsg.txt:
  view name added
sql/share/danish/errmsg.txt:
  view name added
sql/share/dutch/errmsg.txt:
  view name added
sql/share/english/errmsg.txt:
  view name added
sql/share/estonian/errmsg.txt:
  view name added
sql/share/french/errmsg.txt:
  view name added
sql/share/german/errmsg.txt:
  view name added
sql/share/greek/errmsg.txt:
  view name added
sql/share/hungarian/errmsg.txt:
  view name added
sql/share/italian/errmsg.txt:
  view name added
sql/share/japanese/errmsg.txt:
  view name added
sql/share/korean/errmsg.txt:
  view name added
sql/share/norwegian-ny/errmsg.txt:
  view name added
sql/share/norwegian/errmsg.txt:
  view name added
sql/share/polish/errmsg.txt:
  view name added
sql/share/portuguese/errmsg.txt:
  view name added
sql/share/romanian/errmsg.txt:
  view name added
sql/share/russian/errmsg.txt:
  view name added
sql/share/serbian/errmsg.txt:
  view name added
sql/share/slovak/errmsg.txt:
  view name added
sql/share/spanish/errmsg.txt:
  view name added
sql/share/swedish/errmsg.txt:
  view name added
sql/share/ukrainian/errmsg.txt:
  view name added
sql/sql_class.h:
  view reference saved
sql/sql_insert.cc:
  CHECK OPTION moved to one function
sql/sql_update.cc:
  CHECK OPTION moved to one function
sql/sql_view.cc:
  view name added to error message
sql/table.cc:
  CHECK OPTION moved to one function
sql/table.h:
  CHECK OPTION moved to one function
---
 mysql-test/r/view.result          | 28 ++++++-------
 sql/share/czech/errmsg.txt        |  4 +-
 sql/share/danish/errmsg.txt       |  4 +-
 sql/share/dutch/errmsg.txt        |  4 +-
 sql/share/english/errmsg.txt      |  4 +-
 sql/share/estonian/errmsg.txt     |  4 +-
 sql/share/french/errmsg.txt       |  4 +-
 sql/share/german/errmsg.txt       |  4 +-
 sql/share/greek/errmsg.txt        |  4 +-
 sql/share/hungarian/errmsg.txt    |  4 +-
 sql/share/italian/errmsg.txt      |  4 +-
 sql/share/japanese/errmsg.txt     |  4 +-
 sql/share/korean/errmsg.txt       |  4 +-
 sql/share/norwegian-ny/errmsg.txt |  4 +-
 sql/share/norwegian/errmsg.txt    |  4 +-
 sql/share/polish/errmsg.txt       |  4 +-
 sql/share/portuguese/errmsg.txt   |  4 +-
 sql/share/romanian/errmsg.txt     |  4 +-
 sql/share/russian/errmsg.txt      |  4 +-
 sql/share/serbian/errmsg.txt      |  4 +-
 sql/share/slovak/errmsg.txt       |  4 +-
 sql/share/spanish/errmsg.txt      |  4 +-
 sql/share/swedish/errmsg.txt      |  4 +-
 sql/share/ukrainian/errmsg.txt    |  4 +-
 sql/sql_class.h                   |  2 +-
 sql/sql_insert.cc                 | 69 +++++++++++--------------------
 sql/sql_update.cc                 | 62 ++++++++++++---------------
 sql/sql_view.cc                   |  6 +--
 sql/table.cc                      | 34 +++++++++++++++
 sql/table.h                       |  7 ++++
 30 files changed, 154 insertions(+), 146 deletions(-)

diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 47c73dfb23..9e9b81a139 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -477,7 +477,7 @@ drop view v1;
 drop table t1;
 create table t1 (a int);
 create view v1 as select distinct a from t1 WITH CHECK OPTION;
-ERROR HY000: CHECK OPTION on non-updatable view
+ERROR HY000: CHECK OPTION on non-updatable view 'test.v1'
 create view v1 as select a from t1 WITH CHECK OPTION;
 create view v2 as select a from t1 WITH CASCADED CHECK OPTION;
 create view v3 as select a from t1 WITH LOCAL CHECK OPTION;
@@ -1276,11 +1276,11 @@ create table t1 (a int);
 create view v1 as select * from t1 where a < 2 with check option;
 insert into v1 values(1);
 insert into v1 values(3);
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v1'
 insert ignore into v1 values (2),(3),(0);
 Warnings:
-Error	1359	CHECK OPTION failed
-Error	1359	CHECK OPTION failed
+Error	1359	CHECK OPTION failed 'test.v1'
+Error	1359	CHECK OPTION failed 'test.v1'
 select * from t1;
 a
 1
@@ -1288,20 +1288,20 @@ a
 delete from t1;
 insert into v1 SELECT 1;
 insert into v1 SELECT 3;
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v1'
 create table t2 (a int);
 insert into t2 values (2),(3),(0);
 insert ignore into v1 SELECT a from t2;
 Warnings:
-Error	1359	CHECK OPTION failed
-Error	1359	CHECK OPTION failed
+Error	1359	CHECK OPTION failed 'test.v1'
+Error	1359	CHECK OPTION failed 'test.v1'
 select * from t1;
 a
 1
 0
 update v1 set a=-1 where a=0;
 update v1 set a=2 where a=1;
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v1'
 select * from t1;
 a
 1
@@ -1316,7 +1316,7 @@ a
 update v1 set a=a+1;
 update ignore v1,t2 set v1.a=v1.a+1 where v1.a=t2.a;
 Warnings:
-Error	1359	CHECK OPTION failed
+Error	1359	CHECK OPTION failed 'test.v1'
 select * from t1;
 a
 1
@@ -1330,12 +1330,12 @@ create view v3 as select * from v1 where a > 0 with cascaded check option;
 insert into v2 values (1);
 insert into v3 values (1);
 insert into v2 values (0);
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v2'
 insert into v3 values (0);
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v3'
 insert into v2 values (2);
 insert into v3 values (2);
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v3'
 select * from t1;
 a
 1
@@ -1347,10 +1347,10 @@ create table t1 (a int, primary key (a));
 create view v1 as select * from t1 where a < 2 with check option;
 insert into v1 values (1) on duplicate key update a=2;
 insert into v1 values (1) on duplicate key update a=2;
-ERROR HY000: CHECK OPTION failed
+ERROR HY000: CHECK OPTION failed 'test.v1'
 insert ignore into v1 values (1) on duplicate key update a=2;
 Warnings:
-Error	1359	CHECK OPTION failed
+Error	1359	CHECK OPTION failed 'test.v1'
 select * from t1;
 a
 1
diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt
index 7bc8350c2e..d5be03e85a 100644
--- a/sql/share/czech/errmsg.txt
+++ b/sql/share/czech/errmsg.txt
@@ -370,5 +370,5 @@ character-set=latin2
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt
index 25f4303807..228db75e12 100644
--- a/sql/share/danish/errmsg.txt
+++ b/sql/share/danish/errmsg.txt
@@ -364,5 +364,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt
index d324135b1a..2a31a3a23c 100644
--- a/sql/share/dutch/errmsg.txt
+++ b/sql/share/dutch/errmsg.txt
@@ -372,5 +372,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt
index b89cc53013..0b9bbd0825 100644
--- a/sql/share/english/errmsg.txt
+++ b/sql/share/english/errmsg.txt
@@ -361,5 +361,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt
index 39861a6534..cebf27d846 100644
--- a/sql/share/estonian/errmsg.txt
+++ b/sql/share/estonian/errmsg.txt
@@ -366,5 +366,5 @@ character-set=latin7
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt
index e173cd4bd2..f356ad6a00 100644
--- a/sql/share/french/errmsg.txt
+++ b/sql/share/french/errmsg.txt
@@ -361,5 +361,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt
index a843a18348..fd6307ae7c 100644
--- a/sql/share/german/errmsg.txt
+++ b/sql/share/german/errmsg.txt
@@ -373,5 +373,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt
index 6d90dade6c..a634df3a13 100644
--- a/sql/share/greek/errmsg.txt
+++ b/sql/share/greek/errmsg.txt
@@ -361,5 +361,5 @@ character-set=greek
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt
index 6e5f71888f..b6e15d58bb 100644
--- a/sql/share/hungarian/errmsg.txt
+++ b/sql/share/hungarian/errmsg.txt
@@ -363,5 +363,5 @@ character-set=latin2
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt
index 944770ea1f..01de7becbf 100644
--- a/sql/share/italian/errmsg.txt
+++ b/sql/share/italian/errmsg.txt
@@ -361,5 +361,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt
index 592dcb906f..a273134b5a 100644
--- a/sql/share/japanese/errmsg.txt
+++ b/sql/share/japanese/errmsg.txt
@@ -363,5 +363,5 @@ character-set=ujis
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt
index 303cac6a41..45b23c3fb0 100644
--- a/sql/share/korean/errmsg.txt
+++ b/sql/share/korean/errmsg.txt
@@ -361,5 +361,5 @@ character-set=euckr
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt
index 2204c8233c..a9aca0af14 100644
--- a/sql/share/norwegian-ny/errmsg.txt
+++ b/sql/share/norwegian-ny/errmsg.txt
@@ -363,5 +363,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt
index d0cdef14b6..73a8eb0a0d 100644
--- a/sql/share/norwegian/errmsg.txt
+++ b/sql/share/norwegian/errmsg.txt
@@ -363,5 +363,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt
index bfbff949ef..bf2e8d289e 100644
--- a/sql/share/polish/errmsg.txt
+++ b/sql/share/polish/errmsg.txt
@@ -365,5 +365,5 @@ character-set=latin2
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt
index 1632088793..255a8c6c97 100644
--- a/sql/share/portuguese/errmsg.txt
+++ b/sql/share/portuguese/errmsg.txt
@@ -362,5 +362,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt
index 8ed25a2bc1..e5b5152260 100644
--- a/sql/share/romanian/errmsg.txt
+++ b/sql/share/romanian/errmsg.txt
@@ -365,5 +365,5 @@ character-set=latin2
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt
index 857c1399a7..fb58bafb19 100644
--- a/sql/share/russian/errmsg.txt
+++ b/sql/share/russian/errmsg.txt
@@ -363,5 +363,5 @@ character-set=koi8r
 "View '%-.64s.%-.64s' ссылается на несуществующие таблицы или слолбцы"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION для необновляемого VIEW"
-"проверка CHECK OPTION провалилась"
+"CHECK OPTION для необновляемого VIEW '%-.64s.%-.64s'"
+"проверка CHECK OPTION для VIEW '%-.64s.%-.64s' провалилась"
diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt
index f0ddbebd9d..eb00c45089 100644
--- a/sql/share/serbian/errmsg.txt
+++ b/sql/share/serbian/errmsg.txt
@@ -367,5 +367,5 @@ character-set=cp1250
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt
index 41e03dee4a..83105c709c 100644
--- a/sql/share/slovak/errmsg.txt
+++ b/sql/share/slovak/errmsg.txt
@@ -369,5 +369,5 @@ character-set=latin2
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt
index da155dfe2c..331e96a943 100644
--- a/sql/share/spanish/errmsg.txt
+++ b/sql/share/spanish/errmsg.txt
@@ -363,5 +363,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt
index 1874bb289d..e3553914e6 100644
--- a/sql/share/swedish/errmsg.txt
+++ b/sql/share/swedish/errmsg.txt
@@ -361,5 +361,5 @@ character-set=latin1
 "View '%-.64s.%-.64s' references invalid table(s) or column(s)"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION on non-updatable view"
-"CHECK OPTION failed"
+"CHECK OPTION on non-updatable view '%-.64s.%-.64s'"
+"CHECK OPTION failed '%-.64s.%-.64s'"
diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt
index 8bebd615ee..fa4fc8e12c 100644
--- a/sql/share/ukrainian/errmsg.txt
+++ b/sql/share/ukrainian/errmsg.txt
@@ -366,5 +366,5 @@ character-set=koi8u
 "View '%-.64s.%-.64s' посилаєтся на неіснуючі таблиці або стовбці"
 "Can't drop a %s from within another stored routine"
 "GOTO is not allowed in a stored procedure handler"
-"CHECK OPTION для VIEW що не може бути оновленним"
-"перевірка CHECK OPTION не пройшла"
+"CHECK OPTION для VIEW '%-.64s.%-.64s' що не може бути оновленним"
+"перевірка CHECK OPTION для VIEW '%-.64s.%-.64s' не пройшла"
diff --git a/sql/sql_class.h b/sql/sql_class.h
index fd05dd8d73..5681724e45 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -228,7 +228,7 @@ typedef struct st_copy_info {
   List<Item> *update_fields;
   List<Item> *update_values;
 /* for VIEW ... WITH CHECK OPTION */
-  Item *check_option;
+  TABLE_LIST *view;
   bool ignore;
 } COPY_INFO;
 
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9afef1b7cb..03afc66594 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -128,7 +128,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
   */
   bool log_on= (thd->options & OPTION_BIN_LOG) || (!(thd->master_access & SUPER_ACL));
   bool transactional_table, log_delayed;
-  bool check;
+  bool ignore_err= (thd->lex->duplicates == DUP_IGNORE);
   uint value_count;
   ulong counter = 1;
   ulonglong id;
@@ -242,8 +242,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
   info.handle_duplicates=duplic;
   info.update_fields=&update_fields;
   info.update_values=&update_values;
-  info.check_option= table_list->check_option;
-  info.ignore= thd->lex->duplicates == DUP_IGNORE;
+  info.view= (table_list->view ? table_list : 0);
+  info.ignore= ignore_err;
   /*
     Count warnings for all inserts.
     For single line insert, generate an error if try to set a NOT NULL field
@@ -271,8 +271,6 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
   if (lock_type != TL_WRITE_DELAYED)
     table->file->start_bulk_insert(values_list.elements);
 
-  check= (table_list->check_option != 0);
-
   while ((values= its++))
   {
     if (fields.elements || !value_count)
@@ -307,20 +305,13 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
 	break;
       }
     }
-    if (check && table_list->check_option->val_int() == 0)
+    if ((res= table_list->view_check_option(thd, ignore_err)) ==
+        VIEW_CHECK_SKIP)
+      continue;
+    else if (res == VIEW_CHECK_ERROR)
     {
-      if (thd->lex->duplicates == DUP_IGNORE)
-      {
-        push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
-                     ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED));
-        continue;
-      }
-      else
-      {
-        my_error(ER_VIEW_CHECK_FAILED, MYF(0));
-        error=1;
-	break;
-      }
+      error= 1;
+      break;
     }
 #ifndef EMBEDDED_LIBRARY
     if (lock_type == TL_WRITE_DELAYED)
@@ -708,6 +699,7 @@ int write_record(TABLE *table,COPY_INFO *info)
       }
       if (info->handle_duplicates == DUP_UPDATE)
       {
+        int res= 0;
         /* we don't check for other UNIQUE keys - the first row
            that matches, is updated. If update causes a conflict again,
            an error is returned
@@ -718,21 +710,12 @@ int write_record(TABLE *table,COPY_INFO *info)
           goto err;
 
         /* CHECK OPTION for VIEW ... ON DUPLICATE KEY UPDATE ... */
-        if (info->check_option &&
-            info->check_option->val_int() == 0)
-        {
-          if (info->ignore)
-          {
-            push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
-                         ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED));
-            break;
-          }
-          else
-          {
-            my_error(ER_VIEW_CHECK_FAILED, MYF(0));
-            goto err;
-          }
-        }
+        if (info->view &&
+            (res= info->view->view_check_option(current_thd, info->ignore)) ==
+            VIEW_CHECK_SKIP)
+          break;
+        else if (res == VIEW_CHECK_ERROR)
+          goto err;
 
         if ((error=table->file->update_row(table->record[1],table->record[0])))
           goto err;
@@ -1663,7 +1646,7 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
   bzero((char*) &info,sizeof(info));
   info.handle_duplicates=duplic;
   if (table_list_par)
-    info.check_option= table_list_par->check_option;
+    info.view= (table_list_par->view ? table_list_par : 0);
   info.ignore= ignore_check_option_errors;
 }
 
@@ -1712,19 +1695,13 @@ bool select_insert::send_data(List<Item> &values)
     fill_record(*fields, values, 1);
   else
     fill_record(table->field, values, 1);
-  if (table_list->check_option && table_list->check_option->val_int() == 0)
+  switch (table_list->view_check_option(thd,
+                                        thd->lex->duplicates == DUP_IGNORE))
   {
-    if (thd->lex->duplicates == DUP_IGNORE)
-    {
-      push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
-                   ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED));
-      DBUG_RETURN(0);
-    }
-    else
-    {
-      my_error(ER_VIEW_CHECK_FAILED, MYF(0));
-      DBUG_RETURN(1);
-    }
+  case VIEW_CHECK_SKIP:
+    DBUG_RETURN(0);
+  case VIEW_CHECK_ERROR:
+    DBUG_RETURN(1);
   }
   if (thd->net.report_error || write_record(table,&info))
     DBUG_RETURN(1);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 06b0a5c08e..62694e32ba 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -94,11 +94,12 @@ int mysql_update(THD *thd,
 		 ha_rows limit,
 		 enum enum_duplicates handle_duplicates)
 {
-  bool 		using_limit=limit != HA_POS_ERROR;
+  bool		using_limit= limit != HA_POS_ERROR;
   bool		safe_update= thd->options & OPTION_SAFE_UPDATES;
   bool		used_key_is_modified, transactional_table, log_delayed;
-  bool          check;
+  bool          ignore_err= (thd->lex->duplicates == DUP_IGNORE);
   int		error=0;
+  int           res;
   uint		used_index;
 #ifndef NO_EMBEDDED_ACCESS_CHECKS
   uint		want_privilege;
@@ -150,7 +151,7 @@ int mysql_update(THD *thd,
 #endif
   {
     thd->lex->select_lex.no_wrap_view_item= 1;
-    int res= setup_fields(thd, 0, table_list, fields, 1, 0, 0);
+    res= setup_fields(thd, 0, table_list, fields, 1, 0, 0);
     thd->lex->select_lex.no_wrap_view_item= 0;
     if (res)
       DBUG_RETURN(-1);				/* purecov: inspected */
@@ -345,7 +346,6 @@ int mysql_update(THD *thd,
   thd->count_cuted_fields= CHECK_FIELD_WARN;		/* calc cuted fields */
   thd->cuted_fields=0L;
   thd->proc_info="Updating";
-  check= (table_list->check_option != 0);
   query_id=thd->query_id;
 
   while (!(error=info.read_record(&info)) && !thd->killed)
@@ -355,25 +355,21 @@ int mysql_update(THD *thd,
       store_record(table,record[1]);
       if (fill_record(fields,values, 0) || thd->net.report_error)
 	break; /* purecov: inspected */
-      if (check && table_list->check_option->val_int() == 0)
-      {
-        if (thd->lex->duplicates == DUP_IGNORE)
-        {
-          push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
-                       ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED));
-          continue;
-        }
-        else
-        {
-          my_error(ER_VIEW_CHECK_FAILED, MYF(0));
-          error=1;
-          break;
-        }
-      }
-
       found++;
       if (compare_record(table, query_id))
       {
+        if ((res= table_list->view_check_option(thd, ignore_err)) !=
+            VIEW_CHECK_OK)
+        {
+          found--;
+          if (res == VIEW_CHECK_SKIP)
+            continue;
+          else if (res == VIEW_CHECK_ERROR)
+          {
+            error= 1;
+            break;
+          }
+        }
 	if (!(error=table->file->update_row((byte*) table->record[1],
 					    (byte*) table->record[0])))
 	{
@@ -974,6 +970,7 @@ multi_update::~multi_update()
 bool multi_update::send_data(List<Item> &not_used_values)
 {
   TABLE_LIST *cur_table;
+  bool ignore_err= (thd->lex->duplicates == DUP_IGNORE);
   DBUG_ENTER("multi_update::send_data");
 
   for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local)
@@ -1002,26 +999,19 @@ bool multi_update::send_data(List<Item> &not_used_values)
       store_record(table,record[1]);
       if (fill_record(*fields_for_table[offset], *values_for_table[offset], 0))
 	DBUG_RETURN(1);
-
-      if (cur_table->check_option && cur_table->check_option->val_int() == 0)
-      {
-        if (thd->lex->duplicates == DUP_IGNORE)
-        {
-          push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
-                       ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED));
-          continue;
-        }
-        else
-        {
-          my_error(ER_VIEW_CHECK_FAILED, MYF(0));
-          DBUG_RETURN(1);
-        }
-      }
-
       found++;
       if (compare_record(table, thd->query_id))
       {
 	int error;
+        if ((error= cur_table->view_check_option(thd, ignore_err)) !=
+            VIEW_CHECK_OK)
+        {
+          found--;
+          if (error == VIEW_CHECK_SKIP)
+            continue;
+          else if (error == VIEW_CHECK_ERROR)
+            DBUG_RETURN(1);
+        }
 	if (!updated++)
 	{
 	  /*
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 2877d6177e..c94cc9acb4 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -398,7 +398,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
     char path_buff[FN_REFLEN];
     LEX_STRING path;
     File_parser *parser;
- 
+
     path.str= path_buff;
     fn_format(path_buff, file.str, dir.str, 0, MY_UNPACK_FILENAME);
     path.length= strlen(path_buff);
@@ -424,7 +424,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
 
       /*
         read revision number
-        
+
         TODO: read dependense list, too, to process cascade/restrict
         TODO: special cascade/restrict procedure for alter?
       */
@@ -481,7 +481,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
   if (view->with_check != VIEW_CHECK_NONE &&
       !view->updatable_view)
   {
-    my_error(ER_VIEW_NONUPD_CHECK, MYF(0));
+    my_error(ER_VIEW_NONUPD_CHECK, MYF(0), view->db, view->real_name);
     DBUG_RETURN(-1);
   }
 
diff --git a/sql/table.cc b/sql/table.cc
index 28ba428734..cc6210b145 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1653,6 +1653,40 @@ err:
 }
 
 
+/*
+  check CHECK OPTION condition
+
+  SYNOPSIS
+    check_option()
+    ignore_failure ignore check option fail
+
+  RETURN
+    VIEW_CHECK_OK     OK
+    VIEW_CHECK_ERROR  FAILED
+    VIEW_CHECK_SKIP   FAILED, but continue
+*/
+
+int st_table_list::view_check_option(THD *thd, bool ignore_failure)
+{
+  if (check_option && check_option->val_int() == 0)
+  {
+    if (ignore_failure)
+    {
+      push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
+                          ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED),
+                          view_db.str, view_name.str);
+      return(VIEW_CHECK_SKIP);
+    }
+    else
+    {
+      my_error(ER_VIEW_CHECK_FAILED, MYF(0), view_db.str, view_name.str);
+      return(VIEW_CHECK_ERROR);
+    }
+  }
+  return(VIEW_CHECK_OK);
+}
+
+
 void Field_iterator_view::set(TABLE_LIST *table)
 {
   ptr= table->field_translation;
diff --git a/sql/table.h b/sql/table.h
index 4c397ded0c..8f846ee157 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -185,10 +185,16 @@ struct st_table {
 #define VIEW_ALGORITHM_TMPTABLE	1
 #define VIEW_ALGORITHM_MERGE		2
 
+/* view WITH CHECK OPTION parameter options */
 #define VIEW_CHECK_NONE       0
 #define VIEW_CHECK_LOCAL      1
 #define VIEW_CHECK_CASCADED   2
 
+/* result of view WITH CHECK OPTION parameter check */
+#define VIEW_CHECK_OK         0
+#define VIEW_CHECK_ERROR      1
+#define VIEW_CHECK_SKIP       2
+
 struct st_lex;
 
 typedef struct st_table_list
@@ -264,6 +270,7 @@ typedef struct st_table_list
 
   void calc_md5(char *buffer);
   void set_ancestor();
+  int view_check_option(THD *thd, bool ignore_failure);
   bool setup_ancestor(THD *thd, Item **conds);
   bool placeholder() {return derived || view; }
   void print(THD *thd, String *str);
-- 
2.30.9