summaryrefslogtreecommitdiff
path: root/sql/sql_class.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2009-11-11 20:31:28 -0800
committerIgor Babaev <igor@askmonty.org>2009-11-11 20:31:28 -0800
commite4e1ae0d13da399d53bd91df791b149f3eae796b (patch)
tree850b7b3404210b6bad604ad33b5c9a7437253dbe /sql/sql_class.cc
parent99d8d4402080270289f00465309c7c40c2e5d566 (diff)
parentd749c7e60061fd328e95f74d2d77fc59312da3b1 (diff)
downloadmariadb-git-e4e1ae0d13da399d53bd91df791b149f3eae796b.tar.gz
Merge of the patch introducing virtual columns into maria-5.2
Diffstat (limited to 'sql/sql_class.cc')
-rw-r--r--sql/sql_class.cc53
1 files changed, 53 insertions, 0 deletions
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 141be7802d4..6e876bb3a96 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -194,6 +194,59 @@ bool foreign_key_prefix(Key *a, Key *b)
#endif
}
+/*
+ @brief
+ Check if the foreign key options are compatible with the specification
+ of the columns on which the key is created
+
+ @retval
+ FALSE The foreign key options are compatible with key columns
+ @retval
+ TRUE Otherwise
+*/
+bool Foreign_key::validate(List<Create_field> &table_fields)
+{
+ Create_field *sql_field;
+ Key_part_spec *column;
+ List_iterator<Key_part_spec> cols(columns);
+ List_iterator<Create_field> it(table_fields);
+ DBUG_ENTER("Foreign_key::validate");
+ while ((column= cols++))
+ {
+ it.rewind();
+ while ((sql_field= it++) &&
+ my_strcasecmp(system_charset_info,
+ column->field_name,
+ sql_field->field_name)) {}
+ if (!sql_field)
+ {
+ my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name);
+ DBUG_RETURN(TRUE);
+ }
+ if (type == Key::FOREIGN_KEY && sql_field->vcol_info)
+ {
+ if (delete_opt == FK_OPTION_SET_NULL)
+ {
+ my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
+ "ON DELETE SET NULL");
+ DBUG_RETURN(TRUE);
+ }
+ if (update_opt == FK_OPTION_SET_NULL)
+ {
+ my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
+ "ON UPDATE SET NULL");
+ DBUG_RETURN(TRUE);
+ }
+ if (update_opt == FK_OPTION_CASCADE)
+ {
+ my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
+ "ON UPDATE CASCADE");
+ DBUG_RETURN(TRUE);
+ }
+ }
+ }
+ DBUG_RETURN(FALSE);
+}
/****************************************************************************
** Thread specific functions