summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2004-09-03 15:18:40 +0300
committerunknown <bell@sanja.is.com.ua>2004-09-03 15:18:40 +0300
commit704fb6daf749e66d39a7155c1e7f9465733ec140 (patch)
tree887af5e66cac0f28f08971bc57b9d874c53dc747 /sql
parent2c3f49a64d773395cc0e41fb35c5b6e3b5a56871 (diff)
downloadmariadb-git-704fb6daf749e66d39a7155c1e7f9465733ec140.tar.gz
CHECK OPTIONs added (WL#1983)
include/mysqld_error.h: new error messages mysql-test/r/view.result: test of CHECK OPTION in a views mysql-test/t/view.test: test of CHECK OPTION in a views sql/share/czech/errmsg.txt: new error messages sql/share/danish/errmsg.txt: new error messages sql/share/dutch/errmsg.txt: new error messages sql/share/english/errmsg.txt: new error messages sql/share/estonian/errmsg.txt: new error messages sql/share/french/errmsg.txt: new error messages sql/share/german/errmsg.txt: new error messages sql/share/greek/errmsg.txt: new error messages sql/share/hungarian/errmsg.txt: new error messages sql/share/italian/errmsg.txt: new error messages sql/share/japanese/errmsg.txt: new error messages sql/share/korean/errmsg.txt: new error messages sql/share/norwegian-ny/errmsg.txt: new error messages sql/share/norwegian/errmsg.txt: new error messages sql/share/polish/errmsg.txt: new error messages sql/share/portuguese/errmsg.txt: new error messages sql/share/romanian/errmsg.txt: new error messages sql/share/russian/errmsg.txt: new error messages sql/share/serbian/errmsg.txt: new error messages sql/share/slovak/errmsg.txt: new error messages sql/share/spanish/errmsg.txt: new error messages sql/share/swedish/errmsg.txt: new error messages sql/share/ukrainian/errmsg.txt: new error messages sql/sql_insert.cc: CHECK OPTIONs added sql/sql_lex.h: CHECK OPTIONs added sql/sql_update.cc: CHECK OPTIONs added sql/sql_view.cc: new parameter added returnrd values fixed sql/sql_yacc.yy: CHECK OPTIONs added sql/table.cc: CHECK OPTIONs added sql/table.h: CHECK OPTIONs added
Diffstat (limited to 'sql')
-rw-r--r--sql/share/czech/errmsg.txt2
-rw-r--r--sql/share/danish/errmsg.txt2
-rw-r--r--sql/share/dutch/errmsg.txt2
-rw-r--r--sql/share/english/errmsg.txt2
-rw-r--r--sql/share/estonian/errmsg.txt2
-rw-r--r--sql/share/french/errmsg.txt2
-rw-r--r--sql/share/german/errmsg.txt2
-rw-r--r--sql/share/greek/errmsg.txt2
-rw-r--r--sql/share/hungarian/errmsg.txt2
-rw-r--r--sql/share/italian/errmsg.txt2
-rw-r--r--sql/share/japanese/errmsg.txt2
-rw-r--r--sql/share/korean/errmsg.txt2
-rw-r--r--sql/share/norwegian-ny/errmsg.txt2
-rw-r--r--sql/share/norwegian/errmsg.txt2
-rw-r--r--sql/share/polish/errmsg.txt2
-rw-r--r--sql/share/portuguese/errmsg.txt2
-rw-r--r--sql/share/romanian/errmsg.txt2
-rw-r--r--sql/share/russian/errmsg.txt2
-rw-r--r--sql/share/serbian/errmsg.txt2
-rw-r--r--sql/share/slovak/errmsg.txt2
-rw-r--r--sql/share/spanish/errmsg.txt2
-rw-r--r--sql/share/swedish/errmsg.txt2
-rw-r--r--sql/share/ukrainian/errmsg.txt2
-rw-r--r--sql/sql_insert.cc37
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_update.cc34
-rw-r--r--sql/sql_view.cc33
-rw-r--r--sql/sql_yacc.yy12
-rw-r--r--sql/table.cc48
-rw-r--r--sql/table.h7
30 files changed, 190 insertions, 28 deletions
diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt
index 9d1c429d5b6..67b27fbaab5 100644
--- a/sql/share/czech/errmsg.txt
+++ b/sql/share/czech/errmsg.txt
@@ -370,3 +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"
diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt
index b2d2fdf4d77..b114ca95bec 100644
--- a/sql/share/danish/errmsg.txt
+++ b/sql/share/danish/errmsg.txt
@@ -364,3 +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"
diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt
index 85c0443869f..b1d5688bede 100644
--- a/sql/share/dutch/errmsg.txt
+++ b/sql/share/dutch/errmsg.txt
@@ -372,3 +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"
diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt
index 641f267d67e..561d08c57c8 100644
--- a/sql/share/english/errmsg.txt
+++ b/sql/share/english/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt
index e64c0c17e74..66f6d93d301 100644
--- a/sql/share/estonian/errmsg.txt
+++ b/sql/share/estonian/errmsg.txt
@@ -366,3 +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"
diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt
index f3443457346..41c7a0a1b44 100644
--- a/sql/share/french/errmsg.txt
+++ b/sql/share/french/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt
index 498a230faed..a0467836f72 100644
--- a/sql/share/german/errmsg.txt
+++ b/sql/share/german/errmsg.txt
@@ -373,3 +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"
diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt
index 2827517ba9a..5746be6c955 100644
--- a/sql/share/greek/errmsg.txt
+++ b/sql/share/greek/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt
index fab0b156322..c411bcc5dc9 100644
--- a/sql/share/hungarian/errmsg.txt
+++ b/sql/share/hungarian/errmsg.txt
@@ -363,3 +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"
diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt
index 24634514a23..c01b37132a0 100644
--- a/sql/share/italian/errmsg.txt
+++ b/sql/share/italian/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt
index 68f2857aeca..ee2b1ed4d9f 100644
--- a/sql/share/japanese/errmsg.txt
+++ b/sql/share/japanese/errmsg.txt
@@ -363,3 +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"
diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt
index 70267c82364..2a44095a5c9 100644
--- a/sql/share/korean/errmsg.txt
+++ b/sql/share/korean/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt
index 1d84a3a5e5a..3b5de96ddd7 100644
--- a/sql/share/norwegian-ny/errmsg.txt
+++ b/sql/share/norwegian-ny/errmsg.txt
@@ -363,3 +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"
diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt
index be881d54473..d2a8b505cd6 100644
--- a/sql/share/norwegian/errmsg.txt
+++ b/sql/share/norwegian/errmsg.txt
@@ -363,3 +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"
diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt
index 8a576b5bf82..89cb546c668 100644
--- a/sql/share/polish/errmsg.txt
+++ b/sql/share/polish/errmsg.txt
@@ -365,3 +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"
diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt
index 6794db726cc..f308d7eac1d 100644
--- a/sql/share/portuguese/errmsg.txt
+++ b/sql/share/portuguese/errmsg.txt
@@ -362,3 +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"
diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt
index 9eaa4860b64..ef56babaca0 100644
--- a/sql/share/romanian/errmsg.txt
+++ b/sql/share/romanian/errmsg.txt
@@ -365,3 +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"
diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt
index eec85d611fc..fbb41c886c4 100644
--- a/sql/share/russian/errmsg.txt
+++ b/sql/share/russian/errmsg.txt
@@ -363,3 +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 провалилась"
diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt
index 4039268f446..265c77f576f 100644
--- a/sql/share/serbian/errmsg.txt
+++ b/sql/share/serbian/errmsg.txt
@@ -367,3 +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"
diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt
index 9be5ce01d6a..4575fa5b7c6 100644
--- a/sql/share/slovak/errmsg.txt
+++ b/sql/share/slovak/errmsg.txt
@@ -369,3 +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"
diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt
index dc15f8b8d5e..d2df49488ff 100644
--- a/sql/share/spanish/errmsg.txt
+++ b/sql/share/spanish/errmsg.txt
@@ -363,3 +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"
diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt
index ee5436c3b80..efd5640ddfd 100644
--- a/sql/share/swedish/errmsg.txt
+++ b/sql/share/swedish/errmsg.txt
@@ -361,3 +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"
diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt
index cb1d99e2fec..503124d7a55 100644
--- a/sql/share/ukrainian/errmsg.txt
+++ b/sql/share/ukrainian/errmsg.txt
@@ -366,3 +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 не пройшла"
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index b43c4d31b34..5656cfaba1d 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -128,6 +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;
uint value_count;
ulong counter = 1;
ulonglong id;
@@ -268,6 +269,8 @@ 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)
@@ -302,6 +305,21 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
break;
}
}
+ 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;
+ }
+ }
#ifndef EMBEDDED_LIBRARY
if (lock_type == TL_WRITE_DELAYED)
{
@@ -1562,6 +1580,11 @@ int mysql_insert_select_prepare(THD *thd)
bool insert_into_view= (table_list->view != 0);
DBUG_ENTER("mysql_insert_select_prepare");
+ /*
+ SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
+ clasue if table is VIEW
+ */
+ table_list->no_where_clause= 1;
if (setup_tables(thd, table_list, &lex->select_lex.where))
DBUG_RETURN(-1);
@@ -1627,6 +1650,20 @@ 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)
+ {
+ 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);
+ }
+ }
if (thd->net.report_error || write_record(table,&info))
DBUG_RETURN(1);
if (table->next_number_field) // Clear for next record
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 84b5cf3454b..a3986d7d6ff 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -682,6 +682,7 @@ typedef struct st_lex
uint8 describe;
uint8 derived_tables;
uint8 create_view_algorithm;
+ uint8 create_view_check;
bool drop_if_exists, drop_temporary, local_file, one_shot_set;
bool in_comment, ignore_space, verbose, no_write_to_binlog;
/* special JOIN::prepare mode: changing of query is prohibited */
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 61fb4b97200..b43afa8ea79 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -97,6 +97,7 @@ int mysql_update(THD *thd,
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;
int error=0;
uint used_index;
#ifndef NO_EMBEDDED_ACCESS_CHECKS
@@ -344,6 +345,7 @@ 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)
@@ -353,6 +355,22 @@ 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))
{
@@ -984,6 +1002,22 @@ 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))
{
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 3f0e0db1724..31e5796d946 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -327,6 +327,7 @@ static char *view_field_names[]=
(char*)"md5",
(char*)"updatable",
(char*)"algorithm",
+ (char*)"with_check_option",
(char*)"revision",
(char*)"timestamp",
(char*)"create-version",
@@ -343,13 +344,15 @@ static File_option view_parameters[]=
FILE_OPTIONS_ULONGLONG},
{{view_field_names[3], 9}, offsetof(TABLE_LIST, algorithm),
FILE_OPTIONS_ULONGLONG},
- {{view_field_names[4], 8}, offsetof(TABLE_LIST, revision),
+ {{view_field_names[4], 17}, offsetof(TABLE_LIST, with_check),
+ FILE_OPTIONS_ULONGLONG},
+ {{view_field_names[5], 8}, offsetof(TABLE_LIST, revision),
FILE_OPTIONS_REV},
- {{view_field_names[5], 9}, offsetof(TABLE_LIST, timestamp),
+ {{view_field_names[6], 9}, offsetof(TABLE_LIST, timestamp),
FILE_OPTIONS_TIMESTAMP},
- {{view_field_names[6], 14}, offsetof(TABLE_LIST, file_version),
+ {{view_field_names[7], 14}, offsetof(TABLE_LIST, file_version),
FILE_OPTIONS_ULONGLONG},
- {{view_field_names[7], 6}, offsetof(TABLE_LIST, source),
+ {{view_field_names[8], 6}, offsetof(TABLE_LIST, source),
FILE_OPTIONS_ESTRING},
{{NULL, 0}, 0,
FILE_OPTIONS_STRING}
@@ -421,7 +424,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if (mode == VIEW_CREATE_NEW)
{
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), view->alias);
- DBUG_RETURN(1);
+ DBUG_RETURN(-1);
}
File_parser *parser= sql_parse_prepare(&path, &thd->mem_root, 0);
@@ -439,14 +442,14 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if (parser->parse((gptr)view, &thd->mem_root,
view_parameters + revision_number_position, 1))
{
- DBUG_RETURN(1);
+ DBUG_RETURN(thd->net.report_error? -1 : 1);
}
}
else
{
my_error(ER_WRONG_OBJECT, MYF(0), (view->db?view->db:thd->db),
view->real_name, "VIEW");
- DBUG_RETURN(1);
+ DBUG_RETURN(-1);
}
}
else
@@ -459,7 +462,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if (mode == VIEW_ALTER)
{
my_error(ER_NO_SUCH_TABLE, MYF(0), view->db, view->alias);
- DBUG_RETURN(1);
+ DBUG_RETURN(-1);
}
}
}
@@ -481,6 +484,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
thd->lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
}
view->algorithm= thd->lex->create_view_algorithm;
+ view->with_check= thd->lex->create_view_check;
if ((view->updatable_view= (can_be_merged &&
view->algorithm != VIEW_ALGORITHM_TMEPTABLE)))
{
@@ -496,10 +500,18 @@ 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));
+ DBUG_RETURN(-1);
+ }
+
if (sql_create_definition_file(&dir, &file, view_file_type,
(gptr)view, view_parameters, 3))
{
- DBUG_RETURN(1);
+ DBUG_RETURN(thd->net.report_error? -1 : 1);
}
DBUG_RETURN(0);
}
@@ -551,7 +563,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
TODO: when VIEWs will be stored in cache, table mem_root should
be used here
*/
- if (parser->parse((gptr)table, &thd->mem_root, view_parameters, 6))
+ if (parser->parse((gptr)table, &thd->mem_root, view_parameters, 7))
goto err;
/*
@@ -706,6 +718,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
DBUG_PRINT("info", ("algorithm: TEMPORARY TABLE"));
lex->select_lex.linkage= DERIVED_TABLE_TYPE;
table->updatable= 0;
+ table->with_check= VIEW_CHECK_NONE;
/* SELECT tree link */
lex->unit.include_down(table->select_lex);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 172ec48fb18..491c03f00bd 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -7556,9 +7556,13 @@ algorithm:
{ Lex->create_view_algorithm= VIEW_ALGORITHM_TMEPTABLE; }
;
check_option:
- /* empty */ {}
- | WITH CHECK_SYM OPTION {}
- | WITH CASCADED CHECK_SYM OPTION {}
- | WITH LOCAL_SYM CHECK_SYM OPTION {}
+ /* empty */
+ { Lex->create_view_check= VIEW_CHECK_NONE; }
+ | WITH CHECK_SYM OPTION
+ { Lex->create_view_check= VIEW_CHECK_LOCAL; }
+ | WITH CASCADED CHECK_SYM OPTION
+ { Lex->create_view_check= VIEW_CHECK_CASCADED; }
+ | WITH LOCAL_SYM CHECK_SYM OPTION
+ { Lex->create_view_check= VIEW_CHECK_LOCAL; }
;
diff --git a/sql/table.cc b/sql/table.cc
index 3e481443801..4797aa1edd0 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1581,27 +1581,47 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds)
if (arena)
thd->set_n_backup_item_arena(arena, &backup);
- if (outer_join)
+
+ if (with_check)
{
- /*
- Store WHERE condition to ON expression for outer join, because we
- can't use WHERE to correctly execute jeft joins on VIEWs and this
- expression will not be moved to WHERE condition (i.e. will be clean
- correctly for PS/SP)
- */
- on_expr= and_conds(on_expr, where);
+ check_option= where->copy_andor_structure(thd);
+ if (with_check == VIEW_CHECK_CASCADED)
+ {
+ check_option= and_conds(check_option, ancestor->check_option);
+ }
}
- else
+
+ if (!no_where_clause)
{
- /*
- It is conds of JOIN, but it will be stored in st_select_lex::prep_where
- for next reexecution
- */
- *conds= and_conds(*conds, where);
+ if (outer_join)
+ {
+ /*
+ Store WHERE condition to ON expression for outer join, because we
+ can't use WHERE to correctly execute jeft joins on VIEWs and this
+ expression will not be moved to WHERE condition (i.e. will be
+ clean correctly for PS/SP)
+ */
+ on_expr= and_conds(on_expr, where);
+ }
+ else
+ {
+ /*
+ It is conds of JOIN, but it will be stored in
+ st_select_lex::prep_where for next reexecution
+ */
+ *conds= and_conds(*conds, where);
+ }
}
if (arena)
thd->restore_backup_item_arena(arena, &backup);
}
+ /*
+ fix_fields do not need tables, because new are only AND operation and we
+ just need recollect statistics
+ */
+ if (check_option && !check_option->fixed &&
+ check_option->fix_fields(thd, 0, &check_option))
+ goto err;
/* full text function moving to current select */
if (view->select_lex.ftfunc_list->elements)
diff --git a/sql/table.h b/sql/table.h
index dd41ab79b7b..89d1b717185 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -182,6 +182,10 @@ struct st_table {
#define VIEW_ALGORITHM_TMEPTABLE 1
#define VIEW_ALGORITHM_MERGE 2
+#define VIEW_CHECK_NONE 0
+#define VIEW_CHECK_LOCAL 1
+#define VIEW_CHECK_CASCADED 2
+
struct st_lex;
typedef struct st_table_list
@@ -215,6 +219,7 @@ typedef struct st_table_list
/* most upper view this table belongs to */
st_table_list *belong_to_view;
Item *where; /* VIEW WHERE clause condition */
+ Item *check_option; /* WITH CHECK OPTION condition */
LEX_STRING query; /* text of (CRETE/SELECT) statement */
LEX_STRING md5; /* md5 of query tesxt */
LEX_STRING source; /* source of CREATE VIEW */
@@ -225,6 +230,7 @@ typedef struct st_table_list
ulonglong updatable_view; /* VIEW can be updated */
ulonglong revision; /* revision control number */
ulonglong algorithm; /* 0 any, 1 tmp tables , 2 merging */
+ ulonglong with_check; /* WITH CHECK OPTION */
uint effective_algorithm; /* which algorithm was really used */
GRANT_INFO grant;
thr_lock_type lock_type;
@@ -236,6 +242,7 @@ typedef struct st_table_list
bool updating; /* for replicate-do/ignore table */
bool force_index; /* prefer index over table scan */
bool ignore_leaves; /* preload only non-leaf nodes */
+ bool no_where_clause; /* do not attach WHERE to SELECT */
table_map dep_tables; /* tables the table depends on */
table_map on_expr_dep_tables; /* tables on expression depends on */
struct st_nested_join *nested_join; /* if the element is a nested join */