summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/view.result28
-rw-r--r--sql/share/czech/errmsg.txt4
-rw-r--r--sql/share/danish/errmsg.txt4
-rw-r--r--sql/share/dutch/errmsg.txt4
-rw-r--r--sql/share/english/errmsg.txt4
-rw-r--r--sql/share/estonian/errmsg.txt4
-rw-r--r--sql/share/french/errmsg.txt4
-rw-r--r--sql/share/german/errmsg.txt4
-rw-r--r--sql/share/greek/errmsg.txt4
-rw-r--r--sql/share/hungarian/errmsg.txt4
-rw-r--r--sql/share/italian/errmsg.txt4
-rw-r--r--sql/share/japanese/errmsg.txt4
-rw-r--r--sql/share/korean/errmsg.txt4
-rw-r--r--sql/share/norwegian-ny/errmsg.txt4
-rw-r--r--sql/share/norwegian/errmsg.txt4
-rw-r--r--sql/share/polish/errmsg.txt4
-rw-r--r--sql/share/portuguese/errmsg.txt4
-rw-r--r--sql/share/romanian/errmsg.txt4
-rw-r--r--sql/share/russian/errmsg.txt4
-rw-r--r--sql/share/serbian/errmsg.txt4
-rw-r--r--sql/share/slovak/errmsg.txt4
-rw-r--r--sql/share/spanish/errmsg.txt4
-rw-r--r--sql/share/swedish/errmsg.txt4
-rw-r--r--sql/share/ukrainian/errmsg.txt4
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_insert.cc69
-rw-r--r--sql/sql_update.cc62
-rw-r--r--sql/sql_view.cc6
-rw-r--r--sql/table.cc34
-rw-r--r--sql/table.h7
30 files changed, 154 insertions, 146 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 47c73dfb23f..9e9b81a1393 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 7bc8350c2eb..d5be03e85a6 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 25f43038072..228db75e126 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 d324135b1a0..2a31a3a23cc 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 b89cc530130..0b9bbd08250 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 39861a6534d..cebf27d8461 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 e173cd4bd23..f356ad6a002 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 a843a183487..fd6307ae7cd 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 6d90dade6c4..a634df3a13b 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 6e5f71888f2..b6e15d58bb2 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 944770ea1f7..01de7becbf2 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 592dcb906f0..a273134b5a4 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 303cac6a415..45b23c3fb0f 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 2204c8233c7..a9aca0af144 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 d0cdef14b6b..73a8eb0a0dc 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 bfbff949ef6..bf2e8d289e5 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 16320887933..255a8c6c974 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 8ed25a2bc12..e5b5152260d 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 857c1399a72..fb58bafb196 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 f0ddbebd9d1..eb00c450898 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 41e03dee4a2..83105c709c4 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 da155dfe2c9..331e96a9435 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 1874bb289d3..e3553914e6c 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 8bebd615eef..fa4fc8e12c6 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 fd05dd8d73b..5681724e451 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 9afef1b7cb0..03afc665941 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 06b0a5c08ed..62694e32ba7 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 2877d6177ea..c94cc9acb44 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 28ba4287348..cc6210b1455 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 4c397ded0cf..8f846ee157b 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);