summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/funcs_1/views
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
commit3f619478f796eddbba6e39502fe941b285dd97b1 (patch)
treee2c7b5777f728320e5b5542b6213fd3591ba51e2 /mysql-test/suite/funcs_1/views
parentInitial commit. (diff)
downloadmariadb-upstream.tar.xz
mariadb-upstream.zip
Adding upstream version 1:10.11.6.upstream/1%10.11.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mysql-test/suite/funcs_1/views')
-rw-r--r--mysql-test/suite/funcs_1/views/func_view.inc1365
-rw-r--r--mysql-test/suite/funcs_1/views/fv1.inc5
-rw-r--r--mysql-test/suite/funcs_1/views/fv2.inc5
-rw-r--r--mysql-test/suite/funcs_1/views/fv_cast.inc4
-rw-r--r--mysql-test/suite/funcs_1/views/fv_if1.inc4
-rw-r--r--mysql-test/suite/funcs_1/views/fv_if2.inc4
-rw-r--r--mysql-test/suite/funcs_1/views/fv_ifnull.inc4
-rw-r--r--mysql-test/suite/funcs_1/views/views_master.inc4089
8 files changed, 5480 insertions, 0 deletions
diff --git a/mysql-test/suite/funcs_1/views/func_view.inc b/mysql-test/suite/funcs_1/views/func_view.inc
new file mode 100644
index 00000000..64ba69a0
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/func_view.inc
@@ -0,0 +1,1365 @@
+###################################################
+# #
+# Functions within VIEWs #
+# #
+###################################################
+# 2007-11-09 HHunger enabled all disabled parts belonging to fixed bugs.
+# 2006-12-08 mleich Maintenance + refinements
+# 2005-09-14 mleich Create this test
+#
+# 0. Some notes about this test:
+# #################################################################
+#
+# 0.1 This test is unfinished and incomplete, but already useful.
+# -----------------------------------------------------------------
+# 0.1.1 There will be architectural changes in future.
+# The long sequences with
+# let $col_type= <column to use>;
+# --source suite/funcs_1/views/<file containing the
+# select with function>
+# per every column type do not look very smart.
+#
+# Ugly combinations of functions and data types must be also checked,
+# because an accidental typo like assigning a string column to an
+# numeric parameter could happen and should not result in a server crash.
+#
+# Maybe it is better to change the architecture of this test in such
+# a way:
+# 1. A generator script (this one or written in Perl or SP language)
+# generates an prototype of the the final testscript.
+# 2. Some manual adjustments because of open bugs (depending on
+# storage engine or function) might be needed (I hope not :)
+# 3. The final testscript is pushed to the other regression testscripts.
+# Advantage: The analysis of bugs, extension and maintenance of this
+# test will be much easier.
+# Disadvantage: Much redundant code within the final testscript,
+# but the maintenance of the redundant code will be done
+# by the script generator.
+#
+# 0.1.2 The behaviour of SELECTs on VIEWs could be affected by the SQL mode
+# which was valid during VIEW creation time. This means some variations
+# of the SQL mode are needed.
+# 0.1.3 There are much more functions to be tested.
+# 0.1.4 The result sets of some CAST sub testcases with ugly function parameter
+# column data type combinations must be discussed.
+#
+#
+# 0.2 How to valuate the test results:
+# ---------------------------------------------------------------------------
+# Due to the extreme "greedy bug hunting" architecture (combinatorics
+# + heavy use of sourced scripts) of the following tests, there will be
+# - no abort of the test execution, when one statements gets an return
+# code != 0 (The sub testcases are independend.)
+# But statements, which do not make sense like SELECT on non existent
+# VIEW will be omitted. This decreases the amount of useless output.
+# - a file with expected results, which might contain incorrect server
+# responses
+# There are open bugs and I cannot omit statements which reveal these
+# bugs.
+# But there will be a special messages within the protocol files.
+# Example:
+# "Attention: CAST --> SIGNED INTEGER
+# The file with expected results suffers from Bug 5913";
+# means, the file with expected results contains result sets which
+# are known to be wrong.
+# "Attention: The last <whatever> failed"
+# means, a statement which should be successful (bugfree MySQL)
+# failed.
+#
+# "Passed" : The behaviour of your MySQL version does not differ from the
+# version used to generate the files with expected results.
+# Known bugs affecting these tests could be retrieved by
+# grep "Attention" r/<testcase>.result .
+#
+# "Failed" : The behaviour of your MySQL version differs from the version
+# used to generate the files with expected results.
+# These differences could be result of bug fixes or new bugs.
+# Please compare r/<testcase>.reject and r/<testcase>.result .
+#
+# The test will abort if one of the basic preparation statement fails
+# (except ALTER TABLE ADD ...).
+#
+#
+# 0.3 How to debug sub testcases with "unexpected" results:
+# ---------------------------------------------------------------------------
+# 1. Please execute this test and copy the "reject" file to a save place.
+# Search within the "reject" file for the sub testcase (the SELECT)
+# with the suspicious result set or server response.
+# Now all t1_values records are preloaded.
+# 2. Start the server without the initial cleanup of databases etc.
+# This preserves the content of the table t1_values, which
+# might be needed for replaying the situation.
+# Example:
+# ./mysql-test-run.pl --socket=var/tmp/master.sock --start-dirty
+# 3. Issue the statements needed by using "mysql" or "mysqltest".
+#
+# Maybe an internal routine of this test fails. Please ask me (mleich) or
+# enable the logging of auxiliary queries and try to analyze the
+# problem.
+#
+#
+# 0.4 How to extend the number of functions to be checked:
+# ---------------------------------------------------------------------------
+# Please jump to the paragraphs of the basic preparations
+# 1. Extend t1_values with the columns you need
+# 2. Insert some predefinded rows
+# 3. Add the SELECTs with function which should be used within VIEWs
+# and
+# records which should be used dedicated to the SELECT above
+#
+#
+# 0.5 How to alter the internal routines of this test:
+# ---------------------------------------------------------------------------
+# Please try to achieve a state where the protocol
+# - contains ALL statements, which are needed to replay a problem within
+# the field of functions within VIEWs
+# - does not contain too much auxiliary statements, which are not needed
+# to replay a problem (--> "--disable_query_log")
+# Example:
+# Needed for replay:
+# - DROP/CREATE TABLE t1_values
+# - INSERT of records into t1_values
+# - DROP/CREATE/SELECT/SHOW VIEW v1
+# - SELECT direct on base table
+# Not needed for replay:
+# - SET @<uservariable> = <value>
+# - DROP/CREATE/INSERT/SELECT TABLE t1_selects, t1_modes
+#
+#
+# 0.6 A trick for checking results
+# ---------------------------------------------------------------------------
+# Standard setting for common execution of this test:
+ let $simple_select_result= 1;
+ let $view_select_result= 1;
+# The implementation of some additional function tests may lead to
+# masses of result sets, which have to be checked. The result sets of
+# the simple selects on the base table must equal the result sets of the
+# queries on the VIEWs. This step could be made more comfortable by
+# 1. Edit this file to
+# let $simple_select_result= 1;
+# let $view_select_result= 0;
+# Please execute this test.
+# The script will omit CREATE/DROP/SHOW/SELECT on VIEW.
+# The "reject" file contains only the simple select result sets.
+# 2. Edit this file to
+# let $simple_select_result= 0;
+# let $view_select_result= 1;
+# Please execute this test.
+# The script will work with the VIEWs, but omit the simple selects.
+# The "reject" file contains the view select result sets.
+# 3. Compare the "reject" files of 1. and 2. within a graphical diff tool.
+#
+#
+
+SET timestamp=unix_timestamp('2001-02-03 10:20:30');
+
+--disable_warnings
+DROP TABLE IF EXISTS t1_selects, t1_modes, t1_values;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+
+--disable_query_log
+# Storage for the SELECTs to be used for the VIEW definition
+# Attention: my_select must be no too small because a statement like
+# SELECT LOAD_FILE(< file in MYSQLTEST_VARDIR >)
+# AS my_col,
+# id FROM t1_values';
+# might be a very long
+# Bug#38427 "Data too long" ... tests "<ENGINE>_func_view" fail
+CREATE TABLE t1_selects
+(
+ id BIGINT AUTO_INCREMENT,
+ my_select VARCHAR(1000) NOT NULL,
+ disable_result ENUM('Yes','No') NOT NULL default 'No',
+ PRIMARY KEY(id),
+ UNIQUE (my_select)
+) ENGINE=MyISAM;
+
+# MODES to be checked
+CREATE TABLE t1_modes
+(
+ id BIGINT AUTO_INCREMENT,
+ my_mode VARCHAR(200) NOT NULL,
+ PRIMARY KEY(id),
+ UNIQUE (my_mode)
+) ENGINE=MyISAM;
+--enable_query_log
+
+# The table to be used in the FROM parts of the SELECTs
+--replace_result $type <engine_to_be_tested>
+eval CREATE TABLE t1_values
+(
+ id BIGINT AUTO_INCREMENT,
+ select_id BIGINT,
+ PRIMARY KEY(id)
+) ENGINE = $type;
+
+##### BEGIN Basic preparations #######################################
+#
+# 1. Extend t1_values with the columns you need
+# - the column name must show the data type
+# - do not add NOT NULL columns
+# - do not worry if the intended column data type is not
+# available for some storage engines
+# Please do not forget to assign values for the new columns (paragraph 2.).
+--disable_abort_on_error
+ALTER TABLE t1_values ADD my_char_30 CHAR(30);
+ALTER TABLE t1_values ADD my_varchar_1000 VARCHAR(1000);
+ALTER TABLE t1_values ADD my_binary_30 BINARY(30);
+ALTER TABLE t1_values ADD my_varbinary_1000 VARBINARY(1000);
+ALTER TABLE t1_values ADD my_datetime DATETIME;
+ALTER TABLE t1_values ADD my_date DATE;
+ALTER TABLE t1_values ADD ts_dummy TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
+ALTER TABLE t1_values ADD my_timestamp TIMESTAMP NOT NULL DEFAULT '2001-01-01 10:20:30';
+ALTER TABLE t1_values ADD my_time TIME;
+ALTER TABLE t1_values ADD my_year YEAR;
+ALTER TABLE t1_values ADD my_bigint BIGINT;
+ALTER TABLE t1_values ADD my_double DOUBLE;
+ALTER TABLE t1_values ADD my_decimal DECIMAL(64,30);
+--enable_abort_on_error
+
+#-------------------------------------------------------------------------------
+
+#
+# 2. Insert some predefinded rows
+# Predefined rows
+# - t1_values.select_id IS NULL
+# - will be selected by every SELECT with function to be tested
+# - have to be inserted when sql_mode = 'traditional' is valid, because
+# we do not want to start with "illegal/unexpected/..." values.
+# Such experiments should be done in other testcases.
+# Please be careful
+# - modifying column values of predefined rows they might change many
+# result sets
+# - additional predefined rows should be really useful for the majority of
+# all sub testcases, since they blow up all result sets.
+SET sql_mode = 'traditional';
+#
+# 2.1 record -- everything to NULL
+INSERT INTO t1_values SET id = 0;
+#
+# 2.2 record -- everything to "minimum"
+# numbers, date/time types -> minimum of range
+# strings, blobs, binaries -> ''
+# FIXME enum, set ??
+INSERT INTO t1_values SET
+ my_char_30 = '',
+ my_varchar_1000 = '',
+ my_binary_30 = '',
+ my_varbinary_1000 = '',
+ my_datetime = '0001-01-01 00:00:00',
+ my_date = '0001-01-01',
+ my_timestamp = '1970-01-01 14:00:01',
+ my_time = '-838:59:59',
+ my_year = '1901',
+ my_bigint = -9223372036854775808,
+ my_decimal = -9999999999999999999999999999999999.999999999999999999999999999999 ,
+ my_double = -1.7976931348623E+308;
+# shortened due to bug#32285
+# my_double = -1.7976931348623157E+308;
+#
+# 2.3 record -- everything to "maximum"
+# numbers, date/time types -> maximum of range
+# strings, blobs, binaries -> '<- full length of used data type>'
+# FIXME enum, set ??
+INSERT INTO t1_values SET
+ my_char_30 = '<--------30 characters------->',
+ my_varchar_1000 = CONCAT('<---------1000 characters',
+ RPAD('',965,'-'),'--------->'),
+ my_binary_30 = '<--------30 characters------->',
+ my_varbinary_1000 = CONCAT('<---------1000 characters',
+ RPAD('',965,'-'),'--------->'),
+ my_datetime = '9999-12-31 23:59:59',
+ my_date = '9999-12-31',
+ my_timestamp = '2038-01-01 02:59:59',
+ my_time = '838:59:59',
+ my_year = 2155,
+ my_bigint = 9223372036854775807,
+ my_decimal = +9999999999999999999999999999999999.999999999999999999999999999999 ,
+ my_double = 1.7976931348623E+308;
+# shortened due to bug#32285
+# my_double = -1.7976931348623157E+308;
+#
+# 2.4 record -- everything to "magic" value if available or
+# other interesting value
+# numbers -> 0
+# strings, blobs, binaries -> not full length of used data type, "exotic"
+# characters and preceding and trailing spaces
+# FIXME enum, set ??
+INSERT INTO t1_values SET
+ my_char_30 = ' ---äÖüß@µ*$-- ',
+ my_varchar_1000 = ' ---äÖüß@µ*$-- ',
+ my_binary_30 = ' ---äÖüß@µ*$-- ',
+ my_varbinary_1000 = ' ---äÖüß@µ*$-- ',
+ my_datetime = '2004-02-29 23:59:59',
+ my_date = '2004-02-29',
+ my_timestamp = '2004-02-29 23:59:59',
+ my_time = '13:00:00',
+ my_year = 2000,
+ my_bigint = 0,
+ my_decimal = 0.0,
+ my_double = 0;
+#
+# 2.5 record -- everything to "harmless" value if available
+# numbers -> -1 (logical)
+# strings, blobs, binaries -> '-1' useful for numeric functions
+# FIXME enum, set ??
+INSERT INTO t1_values SET
+ my_char_30 = '-1',
+ my_varchar_1000 = '-1',
+ my_binary_30 = '-1',
+ my_varbinary_1000 = '-1',
+ my_datetime = '2005-06-28 10:00:00',
+ my_date = '2005-06-28',
+ my_timestamp = '2005-06-28 10:00:00',
+ my_time = '10:00:00',
+ my_year = 2005,
+ my_bigint = -1,
+ my_decimal = -1.000000000000000000000000000000,
+ my_double = -0.1E+1;
+
+#-------------------------------------------------------------------------------
+
+#
+# 3. Add the SELECTs with function which should be used within VIEWs
+# and
+# records which should be used dedicated to the SELECT above
+# - Please avoid WHERE clauses
+# - Include the PRIMARY KEY ("id") of the base table t1_values into the
+# select column list
+# - Include the base table column used as function parameter into the
+# select column list, because it is much easier to check the results
+# - Do not forget to escape single quotes
+# Example:
+# SET @my_select = 'SELECT sqrt(my_bigint), my_bigint, id FROM t1_values'
+# SET @my_select = 'SELECT CONCAT(\'A\',my_char_30), id FROM t1_values';
+# - Statements, which reveal open crashing bugs MUST be disabled.
+# - Result sets must not contain data, which might differ between boxes
+# executing this test.
+# Example: current time, absolute path to some files ...
+# - Please derive the functions to be checked from the MySQL manual
+# and use the same order. This means copy the the function names as
+# comment into this test and start to implement a testcase for your
+# most preferred function.
+# This method avoids that we forget a function and gives a better
+# overview.
+#
+# If you have the time to check the result sets do the insert of the
+# SELECT with function via:
+# eval SET @my_select =
+# '<your SELECT>';
+# --source suite/funcs_1/views/fv1.inc
+# fv1.inc sets t1_selects.disable_result to 'No' and the effect will be,
+# that the result set will be logged.
+#
+# If you do not have the time to check the result sets do the insert of the
+# SELECT with function via:
+# eval SET @my_select =
+# '<your SELECT>';
+# --source suite/funcs_1/views/fv2.inc
+# fv2.inc sets t1_selects.disable_result to 'Yes' and the effect will be,
+# that the result set will be not logged.
+# This should be only a temporary solution and it does not remove the
+# need to check the server return codes.
+# That means even when we do not have the time to check the correctness of
+# the result sets, we check if
+# - SELECT <function> or
+# - SELECT * FROM <VIEW with function>
+# crash the server or get suspicious server responses.
+#
+# - the SELECTs will be applied to the rows defined here (3.) +
+# all predefined rows (2.)
+# - the rows dedicated to the SELECT should contain especially interesting
+# column values or combinations of column values, which are not covered
+# by the predefined records
+# - The records have to be inserted when sql_mode = 'traditional' is valid.
+# - Please do not insert records with column values where the allowed
+# range is exceeded. The SQL mode 'traditional' will prevent such
+# inserts. Such experiments should be done in other tests, because
+# they inflate the current test without giving an appropriate value.
+#
+# Example:
+# The function to be tested is "sqrt".
+# The minimum, maximum, default and NULL value are covered by the
+# predefined rows.
+# A value where sqrt(<value>) = <integer value> in strict mathematics
+# would be of interest.
+# --> Add a record with my_bigint = 4
+# --> Just for fun my_bigint = -25 .
+#
+# Some internal stuff
+PREPARE ins_sel_with_result FROM "INSERT INTO t1_selects SET my_select = @my_select,
+disable_result = 'No'" ;
+PREPARE ins_sel_no_result FROM "INSERT INTO t1_selects SET my_select = @my_select,
+disable_result = 'Yes'" ;
+SET sql_mode = 'traditional';
+# --disable_query_log
+
+let $col_type= my_bigint;
+# Example:
+# eval SET @my_select = 'SELECT CONCAT(''A'', $col_type), $col_type, id';
+eval SET @my_select = 'SELECT sqrt($col_type), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+# Content of suite/funcs_1/views/fv1.inc :
+# --disable_query_log
+# EXECUTE ins_sel_with_result;
+# SET @select_id = LAST_INSERT_ID();
+# --enable_query_log
+
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = 4;
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = -25;
+# SELECT * FROM t1_values;
+
+# 1. Cast Functions and Operators
+# 1.1 CAST
+#
+# Note(mleich): I guess the CAST routines are used in many other functions.
+# Therefore check also nearly all "ugly" variants like
+# CAST(<string composed of non digits> AS DECIMAL) here.
+#
+# suite/funcs_1/views/fv_cast.inc contains
+# SELECT CAST($col_type AS $target_type), ...
+#
+#
+# 1.1.1. CAST --> BINARY
+--echo ##### 1.1.1. CAST --> BINARY
+let $target_type= BINARY;
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.2. CAST --> CHAR
+--echo ##### 1.1.2. CAST --> CHAR
+let $target_type= CHAR;
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.3. CAST --> DATE
+--echo ##### 1.1.3. CAST --> DATE
+let $target_type= DATE;
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27';
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27';
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27';
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27';
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = 20050627;
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = +20.050627E+6;
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.4. CAST --> DATETIME
+--echo ##### 1.1.4. CAST --> DATETIME
+let $target_type= DATETIME;
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27 17:58';
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27 17:58';
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27 17:58';
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '2005-06-27 17:58';
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = 200506271758;
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = +0.0200506271758E+13;
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.5. CAST --> TIME
+--echo ##### 1.1.5. CAST --> TIME
+let $target_type= TIME;
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '1 17:58';
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '1 17:58';
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '1 17:58';
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '1 17:58';
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = 1758;
+let $col_type= my_double;
+# Bug#12440: CAST(data type DOUBLE AS TIME) strange results;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = +1.758E+3;
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.6. CAST --> DECIMAL
+--echo ##### 1.1.6. CAST --> DECIMAL
+# Set the following to (37,2) since the default was changed to (10,0) - OBN
+let $target_type= DECIMAL(37,2);
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '-3333.3333';
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '-3333.3333';
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '-3333.3333';
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = '-3333.3333';
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_cast.inc
+# Bug#13349: CAST(1.0E+300 TO DECIMAL) returns wrong result + diff little/big endian;
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ $col_type = -0.33333333E+4;
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.7. CAST --> SIGNED INTEGER
+--echo ##### 1.1.7. CAST --> SIGNED INTEGER
+let $target_type= SIGNED INTEGER;
+#
+let $message=
+"Attention: CAST --> SIGNED INTEGER
+ Bug#5913 Traditional mode: BIGINT range not correctly delimited
+ Status: To be fixed later";
+--source include/show_msg80.inc
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_cast.inc
+# Bug #13344: CAST(1E+300 TO signed int) on little endian CPU, wrong result;
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.1.8. CAST --> UNSIGNED INTEGER
+--echo ##### 1.1.8. CAST --> UNSIGNED INTEGER
+let $target_type= UNSIGNED INTEGER;
+#
+let $message=
+"Attention: CAST --> UNSIGNED INTEGER
+ The file with expected results suffers from Bug 5913";
+--source include/show_msg80.inc
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_cast.inc
+let $message= some statements disabled because of
+Bug#5913 Traditional mode: BIGINT range not correctly delimited;
+--source include/show_msg80.inc
+# Bug#8663 cant use bgint unsigned as input to cast
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_cast.inc
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_cast.inc
+
+
+# 1.2. BINARY
+# Manual: BINARY str is a shorthand for CAST(str AS BINARY).
+# Therefore we do not test it here in the moment.
+# FIXME: Add testcases for str in CHAR and VARCHAR only.
+
+
+# 1.3 CONVERT(expr USING transcoding_name)
+#
+# 1.3.1 CONVERT(expr USING utf8)
+let $target_charset= utf8;
+#
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+#
+# 1.3.2 CONVERT(expr USING koi8r)
+let $target_charset= koi8r;
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT CONVERT($col_type USING $target_charset),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+
+
+# 2. Control Flow Functions
+# 2.1. CASE value WHEN [compare-value] THEN result [WHEN ...] [ELSE result]
+# END or
+# CASE WHEN [condition] THEN result [WHEN ...] [ELSE result] END
+#
+# FIXME: to be implemented
+#
+# 2.2. IF(expr1,expr2,expr3)
+# expr1 is TRUE when (expr1 <> 0 and expr1 <> NULL) is fulfilled
+#
+# 2.2.1 IF(expr1,expr2,expr3) with expr1 = <column>
+#
+# Note(mleich): Strings, which do not contain a number -> FALSE
+#
+# suite/funcs_1/views/fv_if1.inc contains
+# SELECT IF($col_type, 'IS TRUE', 'IS NOT TRUE'), ...
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_if1.inc
+#
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_if1.inc
+
+
+# 2.2.2 IF(expr1,expr2,expr3) with expr1 != <column>
+#
+# suite/funcs_1/views/fv_if2.inc contains
+# SELECT IF($col_type IS NULL, 'IS NULL', 'IS NOT NULL'), ...
+#
+# Note(mleich): July 2005
+# IF($col_type IS NULL, ...) is mapped to a VIEW definition
+# create ... view ... as
+# select if(isnull(`test`.`t1`.`f1`),_latin1'IS NULL',
+# _latin1'IS NOT NULL'),...
+#
+# Bug#11689 success on Create view .. IF(col1 IS NULL,...), col2 ; but SELECT fails
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_if2.inc
+#
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_if2.inc
+
+
+# 2.3. IFNULL(expr1,expr2)
+# If expr1 is not NULL, IFNULL() returns expr1, else it returns expr2.
+#
+# suite/funcs_1/views/fv_ifnull.inc contains
+# SELECT IFNULL($col_type, 'IS_NULL'), ....
+# FIXME: The mixup of non string column values
+# and the string 'IS NULL' within the first column of the
+# result table is extreme ugly.
+# CAST(IFNULL($col_type, 'IS_NULL') AS CHAR) looks better, but
+# it has the disadvantage, that it involves CAST as additional
+# function.
+#
+let $col_type= my_char_30;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_varchar_1000;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_binary_30;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_varbinary_1000;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_bigint;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_decimal;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_double;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_datetime;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_date;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_timestamp;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_time;
+--source suite/funcs_1/views/fv_ifnull.inc
+#
+let $col_type= my_year;
+--source suite/funcs_1/views/fv_ifnull.inc
+
+
+# 2.4. NULLIF(expr1,expr2)
+# Returns NULL if expr1 = expr2 is true, else returns expr1.
+# This is the same as
+# CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.
+#
+# FIXME: to be implemented
+#
+
+
+# 3. String Functions
+# 3.1. ASCII(str)
+# 3.2. BIN(N)
+# FIXME: to be implemented
+#
+# 3.3. BIT_LENGTH(str)
+# Returns the length of the string str in bits.
+#
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT BIT_LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT BIT_LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT BIT_LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT BIT_LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+
+
+# 3.4. CHAR(N,...)
+# 3.5. CHAR_LENGTH(str)
+# 3.6 CHARACTER_LENGTH(str)
+# CHARACTER_LENGTH() is a synonym for CHAR_LENGTH().
+# 3.7. COMPRESS(string_to_compress)
+# 3.8. CONCAT(str1,str2,...)
+# 3.9. CONCAT_WS(separator,str1,str2,...)
+# 3.10. CONV(N,from_base,to_base)
+# 3.11. ELT(N,str1,str2,str3,...)
+# 3.12. EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
+# 3.13. FIELD(str,str1,str2,str3,...)
+# 3.14. FIND_IN_SET(str,strlist)
+# 3.15. HEX(N_or_S
+# 3.16. INSERT(str,pos,len,newstr)
+# 3.17. INSTR(str,substr)
+# This is the same as the two-argument form of LOCATE(),
+# except that the arguments are swapped.
+# The majority of the testcases should be made with LOCATE().
+# Therefore test only one example here.
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT INSTR($col_type, ''char''),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.18. LCASE(str)
+# LCASE() is a synonym for LOWER().
+# The majority of the testcases should be made with LOWER().
+# Therefore test only one example here.
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LCASE($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.19. LEFT(str,len)
+# Returns the leftmost len characters from the string str.
+let $col_type= my_char_30;
+eval SET @my_select =
+'SELECT LEFT($col_type, 2), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select =
+'SELECT LEFT($col_type, 2), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_binary_30;
+eval SET @my_select =
+'SELECT LEFT($col_type, 2), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select =
+'SELECT LEFT($col_type, 2), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+# Bug#11728 string function LEFT, strange undocumented behaviour, strict mode
+# Bug#10963 LEFT string function returns wrong result with large length
+let $col_type= my_bigint;
+eval SET @my_select =
+'SELECT LEFT(''AaBbCcDdEeFfGgHhIiJjÄäÜüÖö'', $col_type), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+let $col_type= my_decimal;
+eval SET @my_select =
+'SELECT LEFT(''AaBbCcDdEeFfGgHhIiJjÄäÜüÖö'', $col_type), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+# Bug#10963 LEFT string function returns wrong result with large length
+let $col_type= my_double;
+eval SET @my_select =
+'SELECT LEFT(''AaBbCcDdEeFfGgHhIiJjÄäÜüÖö'', $col_type), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+
+# 3.20. LENGTH(str)
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT LENGTH($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.21. LOAD_FILE(file_name)
+# Reads the file and returns the file contents as a string.
+# If the file doesn't exist or cannot be read ... ,
+# the function returns NULL.
+# SELECT LOADFILE
+--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+eval SET @my_select =
+'SELECT LOAD_FILE(''$MYSQLTEST_VARDIR/std_data/funcs_1/load_file.txt'')
+ AS my_col,
+ id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
+
+
+# 3.22. LOCATE(substr,str) , LOCATE(substr,str,pos)
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT LOCATE(''char'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LOCATE(''char'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT LOCATE(''char'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOCATE(''char'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+#------------------------------------------------------
+let $col_type1= my_char_30;
+# against all other
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type1 ),
+$col_type1, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varchar_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_binary_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+#------------------------------------------------------
+let $col_type1= my_varchar_1000;
+# against all other
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type1 ),
+$col_type1, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_char_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_binary_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+#------------------------------------------------------
+let $col_type1= my_binary_30;
+# against all other
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type1 ),
+$col_type1, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_char_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varchar_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+#------------------------------------------------------
+let $col_type1= my_varbinary_1000;
+# against all other
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type1 ),
+$col_type1, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_char_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_varchar_1000;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type2= my_binary_30;
+eval SET @my_select = 'SELECT LOCATE($col_type1, $col_type2 ),
+$col_type1, $col_type2 id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+# FIXME How to test exotic or interesting substr values like NULL, '', ' '
+# without getting too much result rows
+# FIXME Testcases with LOCATE(substr,str,pos)
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT LOCATE(''-'', $col_type, 3),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LOCATE(''-'', $col_type, 3),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT LOCATE(''-'', $col_type, 3),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOCATE(''-'', $col_type, 3),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+#--------------------------------------------------------
+let $col_type= my_bigint;
+eval SET @my_select = 'SELECT LOCATE(''-'', '' - -ABC'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_double;
+eval SET @my_select = 'SELECT LOCATE(''-'', '' - -ABC'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_decimal;
+eval SET @my_select = 'SELECT LOCATE(''-'', '' - -ABC'', $col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.23. LOWER(str)
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT LOWER($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LOWER($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT LOWER($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT LOWER($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.24. LPAD(str,len,padstr)
+# 3.25. LTRIM(str)
+let $col_type= my_char_30;
+eval SET @my_select = 'SELECT LTRIM($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varchar_1000;
+eval SET @my_select = 'SELECT LTRIM($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_binary_30;
+eval SET @my_select = 'SELECT LTRIM($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+let $col_type= my_varbinary_1000;
+eval SET @my_select = 'SELECT LTRIM($col_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv2.inc
+
+
+# 3.26. MAKE_SET(bits,str1,str2,...)
+# .....
+# FIXME: to be implemented
+
+################################################################################
+# Please do not add SELECTs and interesting records after this line. #
+# These last SELECTs are mostly for checking the testcase code itself. #
+################################################################################
+eval SET @my_select =
+ 'SELECT CONCAT(''A'',my_char_30), my_char_30, id FROM t1_values'; #
+--source suite/funcs_1/views/fv1.inc
+#
+eval SET @my_select = 'SELECT my_char_30, id FROM t1_values'; #
+--source suite/funcs_1/views/fv2.inc
+eval INSERT INTO t1_values SET select_id = @select_id,
+ my_char_30 = 'Viana do Castelo';
+################################################################################
+SET sql_mode = ''; #
+
+##### END Basic preparations #######################################
+
+
+let $message= "# The basic preparations end and the main test starts here";
+--source include/show_msg80.inc
+
+--disable_ps_protocol
+
+##### The tests start here #####################################################
+
+# Determine the number of different SELECTs to be checked
+--disable_query_log
+SELECT COUNT(*) INTO @num_selects FROM t1_selects;
+--enable_query_log
+# Debug statement
+# SELECT @num_selects AS "number of SELECTS:";
+
+--disable_abort_on_error
+let $select_id= `SELECT @num_selects`;
+while ($select_id)
+{
+ # Determine the SELECT
+ --disable_query_log
+ eval SELECT my_select, disable_result INTO @my_select, @disable_result
+ FROM t1_selects WHERE id = $select_id;
+ let $run_no_result= `SELECT @disable_result = 'Yes'`;
+ --enable_query_log
+ # Debug statement
+ # SELECT @my_select AS "SELECT:";
+ let $my_select= `SELECT @my_select`;
+
+ let $run0= 0;
+ if ($view_select_result)
+ {
+ # Create the VIEW
+ --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+ eval CREATE VIEW v1 AS $my_select;
+ --disable_query_log
+ eval set @got_errno= $mysql_errno ;
+ let $run0= `SELECT @got_errno = 0`;
+ --enable_query_log
+ if (!$run0)
+ {
+ --echo
+ --echo Attention: The last CREATE VIEW failed
+ --echo
+ }
+ }
+
+ # FIXME The loop over the modes will start here.
+
+ if ($simple_select_result)
+ {
+ # Simple SELECT on the base table of the VIEW for comparison
+
+ if ($run_no_result)
+ {
+ --disable_result_log
+ }
+ --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+ eval $my_select
+ WHERE select_id = $select_id OR select_id IS NULL order by id;
+ if ($run_no_result)
+ {
+ --enable_result_log
+ }
+ if ($mysql_errno)
+ {
+ --echo
+ --echo Attention: The last SELECT on the base table failed
+ --echo
+ }
+ }
+
+ # $run0 is 1, if CREATE VIEW was successful.
+ # That means SHOW CREATE VIEW/SELECT/DROP should be executed.
+ if ($run0)
+ {
+ # Check the CREATE VIEW statement
+ --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
+ SHOW CREATE VIEW v1;
+ if ($mysql_errno)
+ {
+ --echo
+ --echo Attention: The last SHOW CREATE VIEW failed
+ --echo
+ }
+
+ # Maybe a Join is faster
+ if ($run_no_result)
+ {
+ --disable_result_log
+ }
+ eval SELECT v1.* FROM v1
+ WHERE v1.id IN (SELECT id FROM t1_values
+ WHERE select_id = $select_id OR select_id IS NULL) order by id;
+ if ($run_no_result)
+ {
+ --enable_result_log
+ }
+ if ($mysql_errno)
+ {
+ --echo
+ --echo Attention: The last SELECT from VIEW failed
+ --echo
+ }
+
+ DROP VIEW v1;
+ }
+
+ # FIXME The loop over the modes will end here.
+
+ # Produce two empty lines as separator between different SELECTS
+ # to be tested.
+ --echo
+ --echo
+
+ dec $select_id ;
+}
+
+--enable_ps_protocol
+
+DROP TABLE t1_selects, t1_modes, t1_values;
+
+SET timestamp=DEFAULT;
diff --git a/mysql-test/suite/funcs_1/views/fv1.inc b/mysql-test/suite/funcs_1/views/fv1.inc
new file mode 100644
index 00000000..3befbdde
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv1.inc
@@ -0,0 +1,5 @@
+--disable_query_log
+EXECUTE ins_sel_with_result;
+SET @select_id = LAST_INSERT_ID();
+--enable_query_log
+
diff --git a/mysql-test/suite/funcs_1/views/fv2.inc b/mysql-test/suite/funcs_1/views/fv2.inc
new file mode 100644
index 00000000..3bdddc64
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv2.inc
@@ -0,0 +1,5 @@
+--disable_query_log
+EXECUTE ins_sel_no_result;
+SET @select_id = LAST_INSERT_ID();
+--enable_query_log
+
diff --git a/mysql-test/suite/funcs_1/views/fv_cast.inc b/mysql-test/suite/funcs_1/views/fv_cast.inc
new file mode 100644
index 00000000..8a878b8f
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv_cast.inc
@@ -0,0 +1,4 @@
+--disable_query_log
+eval SET @my_select = 'SELECT CAST($col_type AS $target_type),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
diff --git a/mysql-test/suite/funcs_1/views/fv_if1.inc b/mysql-test/suite/funcs_1/views/fv_if1.inc
new file mode 100644
index 00000000..39d83203
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv_if1.inc
@@ -0,0 +1,4 @@
+--disable_query_log
+eval SET @my_select = 'SELECT IF($col_type, ''IS TRUE'', ''IS NOT TRUE''),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
diff --git a/mysql-test/suite/funcs_1/views/fv_if2.inc b/mysql-test/suite/funcs_1/views/fv_if2.inc
new file mode 100644
index 00000000..72a3c0a6
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv_if2.inc
@@ -0,0 +1,4 @@
+--disable_query_log
+eval SET @my_select = 'SELECT IF($col_type IS NULL, ''IS NULL'',
+''IS NOT NULL''), $col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
diff --git a/mysql-test/suite/funcs_1/views/fv_ifnull.inc b/mysql-test/suite/funcs_1/views/fv_ifnull.inc
new file mode 100644
index 00000000..60fc066f
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/fv_ifnull.inc
@@ -0,0 +1,4 @@
+--disable_query_log
+eval SET @my_select = 'SELECT IFNULL($col_type,''IS_NULL''),
+$col_type, id FROM t1_values';
+--source suite/funcs_1/views/fv1.inc
diff --git a/mysql-test/suite/funcs_1/views/views_master.inc b/mysql-test/suite/funcs_1/views/views_master.inc
new file mode 100644
index 00000000..526e9e34
--- /dev/null
+++ b/mysql-test/suite/funcs_1/views/views_master.inc
@@ -0,0 +1,4089 @@
+#### suite/funcs_1/views/views_master.test
+#
+# Last Change:
+# 2007-11-15 hhunger WL#4084: Review and fix all disabled tests ...
+
+let $message= ! Attention: The file with the expected results is not
+ | thoroughly checked.
+ ! The server return codes are correct, but
+ | most result sets where the table tb2 is
+ ! involved are not checked.;
+--source include/show_msg80.inc
+
+# As long as
+# Bug#32285: mysqltest, --ps-protocol, strange output, float/double/real with zerofill
+# is not fixed, we must switch the ps-protocol for some statements off (formerly bug#11589).
+# If this bug is fixed, please
+# 1. set the following variable to 0
+# 2. check, if the test passes
+# 3. remove the workarounds
+let $have_bug_32285= 1;
+if ($have_bug_32285)
+{
+ let $message= There are some statements where the ps-protocol is switched off.
+ Bug#32285: mysqltest, --ps-protocol, strange output, float/double/real with zerofill;
+ --source include/show_msg80.inc
+}
+
+# The sub testcases are nearly independend. That is the reason why
+# we do not want to abort after the first error.
+--disable_abort_on_error
+
+
+# 3.3 Views
+# MySQL views are based on a subset of the view requirements described in
+# the following standard SQL document:
+#
+# * ISO/IEC 9075-2:2003 Information technology -- Database languages --
+# SQL -- Part 2: Foundation (SQL/Foundation)
+#
+# MySQL has also added some vendor-specific enhancements to the standard
+# SQL requirements.
+
+# FIXME (mleich)
+# - Alter all object names so that they follow the v/t/..<number> scheme or
+# apply another method which prevents that customer data might be
+# accidently modified
+# - Remove any reference to the preloaded tables tb1 - tb4, if they could
+# be replaced without loss of value.
+# Example: failing CREATE VIEW statements
+# The goal is to split this script into two, where the first one does
+# not need the possibly huge tables.
+
+# Load records needed within the testcases.
+# We load them here and not within the testcases itself, because the
+# removal of any unneeded testcase during bug analysis should not alter
+# result sets.
+# Testcase 3.3.1.1
+insert into test.tb2 (f59,f60) values (76710,226546);
+insert into test.tb2 (f59,f60) values(2760,985654);
+insert into test.tb2 (f59,f60) values(569300,9114376);
+insert into test.tb2 (f59,f60) values(660,876546);
+insert into test.tb2 (f59,f60) values(250,87895654);
+insert into test.tb2 (f59,f60) values(340,9984376);
+insert into test.tb2 (f59,f60) values(3410,996546);
+insert into test.tb2 (f59,f60) values(2550,775654);
+insert into test.tb2 (f59,f60) values(3330,764376);
+insert into test.tb2 (f59,f60) values(441,16546);
+insert into test.tb2 (f59,f60) values(24,51654);
+insert into test.tb2 (f59,f60) values(323,14376);
+# Testcase 3.3.1.45
+insert into test.tb2 (f59,f60) values(34,41);
+insert into test.tb2 (f59,f60) values(04,74);
+insert into test.tb2 (f59,f60) values(15,87);
+insert into test.tb2 (f59,f60) values(22,93);
+# Testcase 3.3.1.46
+insert into test.tb2 (f59,f60) values(394,41);
+insert into test.tb2 (f59,f60) values(094,74);
+insert into test.tb2 (f59,f60) values(195,87);
+insert into test.tb2 (f59,f60) values(292,93);
+# Testcase 3.3.1.47
+insert into test.tb2 (f59,f60) values(0987,41) ;
+insert into test.tb2 (f59,f60) values(7876,74) ;
+# Testcase 3.3.1.52
+INSERT INTO tb2 (f59,f61) VALUES(321,765 );
+INSERT INTO tb2 (f59,f61) VALUES(9112,8771);
+# Testcase 3.3.1.53
+INSERT INTO tb2 (f59,f61) VALUES (500,900 ) ;
+INSERT INTO tb2 (f59,f61) VALUES (500,900 ) ;
+INSERT INTO tb2 (f59,f61) VALUES (500,900 ) ;
+# Testcase 3.3.1.A1
+Insert into tb2 (f59,f60,f61) values (107,105,106) ;
+Insert into tb2 (f59,f60,f61) values (109,108,104) ;
+# Testcase 3.3.1.A2
+Insert into tb2 (f59,f60,f61) values (207,205,206) ;
+Insert into tb2 (f59,f60,f61) values (209,208,204) ;
+# Testcase 3.3.1.A3
+Insert into tb2 (f59,f60,f61) values (27,25,26) ;
+Insert into tb2 (f59,f60,f61) values (29,28,24) ;
+# Testcase 3.3.1.63
+Insert into tb2 (f59,f60,f61) values (17,15,16) ;
+Insert into tb2 (f59,f60,f61) values (19,18,14) ;
+insert into tb2 (f59,f60,f61) values (107,105,106);
+insert into tb2 (f59,f60,f61) values (109,108,104);
+# Testcase 3.3.1.64
+INSERT INTO tb2 (f59,f60) VALUES( 299,899 );
+INSERT INTO tb2 (f59,f60) VALUES( 242,79 );
+INSERT INTO tb2 (f59,f60) VALUES( 424,89 );
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+SELECT * FROM tb2 ORDER BY f59, f60, f61;
+--enable_ps_protocol
+#
+#
+Use test;
+#
+# End of basic preparations.
+#
+##############################################################################
+
+
+
+#==============================================================================
+# 3.3.1 Syntax checks for CREATE VIEW, CREATE OR REPLACE VIEW, ALTER VIEW,
+# and DROP VIEW:
+#==============================================================================
+
+let $message= Testcase 3.3.1.1 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.1: Ensure that all clauses that should be supported
+# are supported.
+###############################################################################
+--disable_warnings
+Drop table if exists t1;
+--enable_warnings
+Create table t1 (f59 INT, f60 INT) ;
+Insert into t1 values (100,4234);
+Insert into t1 values (990,6624);
+Insert into t1 values (710,765);
+Insert into t1 values (300,433334);
+Insert into t1 values (800,9788);
+Insert into t1 values (500,9866);
+
+#(01)
+ --disable_warnings
+ Drop view if exists v1 ;
+ --enable_warnings
+ CREATE VIEW v1 AS select f59,f60,f61
+ FROM test.tb2 where f59=250;
+ select * FROM v1 order by f60,f61 limit 0,10;
+
+#(02)
+ Drop view if exists v1 ;
+ CREATE VIEW v1 AS select f59,f60,f61
+ FROM test.tb2 limit 100;
+ select * FROM v1 order by f59,f60,f61 limit 0,10;
+
+#(03)
+ CREATE or REPLACE VIEW v1 AS select f59,f60,f61
+ FROM test.tb2;
+ select * FROM v1 order by f59,f60,f61 limit 4,3;
+
+#(04)
+ CREATE or REPLACE VIEW v1 AS select distinct f59
+ FROM test.tb2;
+ select * FROM v1 order by f59 limit 4,3;
+
+#(05)
+ ALTER VIEW v1 AS select f59
+ FROM test.tb2;
+ select * FROM v1 order by f59 limit 6,2;
+
+#(06)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 order by f59;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(07)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 order by f59 asc;
+ select * FROM v1 limit 0,10;
+
+#(08)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 order by f59 desc;
+ select * FROM v1 limit 0,10;
+
+#(09)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 group by f59;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(10)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 group by f59 asc;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(11)
+ CREATE or REPLACE VIEW v1 AS select f59
+ from tb2 group by f59 desc;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(12)
+ CREATE or REPLACE VIEW v1 AS (select f59 from tb2)
+ union (select f59 from t1);
+ select * FROM v1 order by f59 limit 0,10;
+
+#(13)
+ CREATE or REPLACE VIEW v1 AS (select f59 FROM tb2)
+ UNION DISTINCT(select f59 FROM t1) ;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(14)
+ CREATE or REPLACE VIEW v1 AS (select f59 FROM tb2)
+ UNION ALL(select f59 FROM t1) ;
+ select * FROM v1 order by f59 limit 0,10;
+
+#(15)
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+ CREATE or REPLACE VIEW v1 AS select *
+ FROM test.tb2 WITH LOCAL CHECK OPTION ;
+ select * FROM v1 order by f59,f60,f61,f62,f63,f64 limit 0,50;
+
+ #(16)
+CREATE or REPLACE VIEW v1 AS select *
+ FROM test.tb2 WITH CASCADED CHECK OPTION ;
+ select * FROM v1 order by f59,f60,f61,f62,f63,f64 limit 0,10;
+--horizontal_results
+--enable_ps_protocol
+
+#(17)
+ CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+ FROM test.tb2 WITH CASCADED CHECK OPTION;
+ SELECT * FROM v1 order by f59,f60 limit 0,10;
+
+
+#(18)
+ CREATE or REPLACE VIEW v1 AS select f59, f60
+ from test.tb2 where f59=3330 ;
+ select * FROM v1 order by f60 limit 0,10;
+
+ DROP VIEW v1 ;
+ DROP TABLE t1 ;
+
+
+let $message= Testcase 3.3.1.2 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.2: Ensure that all clauses that should not be supported are
+# disallowed with an appropriate error message.
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+DROP VIEW IF EXISTS v2 ;
+--enable_warnings
+CREATE TABLE t1 (f1 BIGINT) ;
+
+# User variables and parameters are not supported in VIEWs -> 3.3.1.40
+
+# SELECT INTO is illegal
+SET @x=0;
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
+Select @x;
+
+# Subquery in the FROM clause is illegal
+CREATE or REPLACE VIEW v1 AS Select 1
+FROM (SELECT 1 FROM t1) my_table;
+DROP VIEW v1;
+
+# Triggers cannot be associated with VIEWs
+CREATE VIEW v1 AS SELECT f1 FROM t1;
+# Show that 1. The trigger code basically works and the VIEW is updatable
+# 2. The VIEW is updatable
+# 3. Insert into view causes that the trigger is executed
+CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @a:=1 ;
+SET @a:=0 ;
+SELECT @a ;
+INSERT INTO v1 VALUES (1) ;
+SELECT @a ;
+SELECT * FROM t1;
+DROP TRIGGER tr1 ;
+SET @a:=0 ;
+--error ER_WRONG_OBJECT
+CREATE TRIGGER tr1 BEFORE INSERT ON v1 FOR EACH ROW SET @a:=1 ;
+
+RENAME TABLE v1 TO v2;
+# RENAME VIEW is not available even when we try it via rename table.
+--error ER_PARSE_ERROR
+RENAME VIEW v2 TO v1;
+--error ER_WRONG_OBJECT
+ALTER TABLE v2 RENAME AS v1;
+--error ER_PARSE_ERROR
+ALTER VIEW v1 RENAME AS v2;
+
+# VIEWs cannot contain a PRIMARY KEY or have an Index.
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2 ;
+DROP VIEW IF EXISTS v1 ;
+DROP VIEW IF EXISTS v2 ;
+--enable_warnings
+CREATE TABLE t1 ( f1 DATE, f2 BLOB, f3 DOUBLE );
+CREATE VIEW v1 AS SELECT f1, f2, f3 FROM t1;
+ALTER TABLE t1 ADD PRIMARY KEY(f1);
+--error ER_WRONG_OBJECT
+ALTER TABLE v1 ADD PRIMARY KEY(f1);
+--error ER_PARSE_ERROR
+ALTER VIEW v1 ADD PRIMARY KEY(f1);
+CREATE INDEX t1_idx ON t1(f3);
+--error ER_WRONG_OBJECT
+CREATE INDEX v1_idx ON v1(f3);
+DROP TABLE t1;
+DROP VIEW v1;
+
+
+let $message= Testcase 3.3.1.3 + 3.1.1.4 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.1.1.3: Ensure that all supported clauses are supported only in
+# the correct order.
+# Testcase 3.1.1.4: Ensure that an appropriate error message is returned if
+# a clause is out-of-order in an SQL statement.
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+# REPLACE after VIEW name
+--error ER_PARSE_ERROR
+CREATE VIEW v1 or REPLACE AS Select * from tb2 my_table;
+# CHECK OPTION before AS SELECT
+--error ER_PARSE_ERROR
+CREATE VIEW v1 WITH CASCADED CHECK OPTION AS Select *
+from tb2 my_table limit 50;
+# CHECK OPTION before AS SELECT
+--error ER_PARSE_ERROR
+CREATE VIEW v1 WITH LOCAL CHECK OPTION AS Select *
+from tb2 my_table limit 50;
+# CREATE after SELECT
+--error ER_PARSE_ERROR
+SELECT * FROM tb2 my_table CREATE VIEW As v1;
+# AS forgotten
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1 Select f59, f60
+from test.tb2 my_table where f59 = 250 ;
+# positive case
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table WITH CASCADED CHECK OPTION;
+DROP VIEW v1;
+# REPLACE OR CREATE instead of CREATE OR REPLACE
+--error ER_PARSE_ERROR
+REPLACE OR CREATE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table WITH CASCADED CHECK OPTION;
+# AS after SELECT
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 SELECT AS F59, F60
+FROM test.tb2 my_table WITH CASCADED CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table CASCADED WITH CHECK OPTION;
+# OPTION CHECK instead of CHECK OPTION
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table WITH CASCADED OPTION CHECK;
+# CHECK OPTION before WITH
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table CHECK OPTION WITH CASCADED;
+# CHECK OPTION before AS SELECT
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 WITH CASCADED CHECK OPTION
+AS SELECT F59, F60 FROM test.tb2 my_table;
+# VIEW <viewname> after AS SELECT
+--error ER_PARSE_ERROR
+CREATE OR REPLACE AS SELECT F59, F60
+FROM test.tb2 my_table VIEW v1 WITH CASCADED CHECK OPTION;
+# VIEW <viewname> after CHECK OPTION
+--error ER_PARSE_ERROR
+CREATE OR REPLACE AS SELECT F59, F60
+FROM test.tb2 my_table WITH CASCADED CHECK OPTION VIEW v1;
+
+# Variants with LOCAL CHECK OPTION
+--error ER_PARSE_ERROR
+REPLACE OR CREATE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table WITH LOCAL CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 SELECT AS F59, F60
+FROM test.tb2 my_table WITH LOCAL CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table LOCAL WITH CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table WITH LOCAL OPTION CHECK;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 AS SELECT F59, F60
+FROM test.tb2 my_table CHECK OPTION WITH LOCAL;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE VIEW v1 WITH CASCADED CHECK OPTION
+AS SELECT F59, F60 FROM test.tb2 my_table;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE AS SELECT F59, F60
+FROM test.tb2 my_table VIEW v1 WITH LOCAL CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE OR REPLACE AS SELECT F59, F60
+FROM test.tb2 my_table WITH LOCAL CHECK OPTION VIEW v1;
+
+--disable_warnings
+Drop table if exists t1 ;
+--enable_warnings
+CREATE table t1 (f1 int ,f2 int) ;
+INSERT INTO t1 values (235, 22);
+INSERT INTO t1 values (554, 11);
+# SELECTs of UNION in braces
+--error ER_PARSE_ERROR
+CREATE or REPLACE view v1 as (Select from f59 tb2)
+Union ALL (Select from f1 t1);
+# by before order
+--error ER_PARSE_ERROR
+CREATE or REPLACE view v1 as Select f59, f60
+from tb2 by order f59;
+# by before group
+--error ER_PARSE_ERROR
+CREATE or REPLACE view v1 as Select f59, f60
+from tb2 by group f59 ;
+
+
+let $message= Testcase 3.3.1.5 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.5: Ensure that all clauses that are defined to be mandatory
+# are indeed required to be mandatory by the MySQL server
+# and tools.
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+--error ER_PARSE_ERROR
+CREATE VIEW v1 SELECT * FROM tb2;
+--error ER_PARSE_ERROR
+CREATE v1 AS SELECT * FROM tb2;
+--error ER_PARSE_ERROR
+VIEW v1 AS SELECT * FROM tb2;
+# positive case
+CREATE VIEW v1 AS SELECT 1;
+DROP VIEW v1;
+--error ER_PARSE_ERROR
+ VIEW v1 AS SELECT 1;
+--error ER_PARSE_ERROR
+CREATE v1 AS SELECT 1;
+--error ER_PARSE_ERROR
+CREATE VIEW AS SELECT 1;
+--error ER_PARSE_ERROR
+CREATE VIEW v1 SELECT 1;
+--error ER_PARSE_ERROR
+CREATE VIEW v1 AS ;
+
+
+let $message= Testcase 3.3.1.6 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.6: Ensure that any clauses that are defined to be optional
+# are indeed treated as optional by the MySQL server
+# and tools.
+###############################################################################
+# Note: The positive test in 3.3.1.5 shows, that ALGORITHM ..., CHECK OPTION
+# and any column_list after the VIEW name are optional.
+# Therefore check here:
+# - ALGORITHM = <all possible algorithms>
+# - all possible CHECK OPTIONs
+# - some incomplete or wrong stuff
+--disable_warnings
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+CREATE or REPLACE VIEW v1
+as SELECT * from tb2;
+CREATE or REPLACE ALGORITHM = UNDEFINED VIEW v1
+as SELECT * from tb2;
+CREATE or REPLACE ALGORITHM = MERGE VIEW v1
+as SELECT * from tb2;
+CREATE or REPLACE ALGORITHM = TEMPTABLE VIEW v1
+as SELECT * from tb2;
+CREATE or REPLACE ALGORITHM = TEMPTABLE VIEW v1
+as SELECT * from tb2;
+# negative test cases
+--error ER_PARSE_ERROR
+CREATE or REPLACE = TEMPTABLE VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE ALGORITHM TEMPTABLE VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE ALGORITHM = VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE TEMPTABLE = ALGORITHM VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE TEMPTABLE - ALGORITHM VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE GARBAGE = TEMPTABLE VIEW v1
+as SELECT * from tb2;
+--error ER_PARSE_ERROR
+CREATE or REPLACE ALGORITHM = GARBAGE VIEW v1
+as SELECT * from tb2;
+Drop view if exists v1 ;
+
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1;
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH CHECK OPTION;
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH CASCADED CHECK OPTION;
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH LOCAL CHECK OPTION;
+# negative test cases
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH NO CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 CASCADED CHECK OPTION;
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH CASCADED OPTION;
+--error ER_PARSE_ERROR
+CREATE or REPLACE VIEW v1
+AS SELECT * from tb2 where f59 < 1 WITH CASCADED CHECK ;
+
+
+let $message= Testcase 3.3.1.7 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.7: Ensure that all valid, fully-qualified, and non-qualified,
+# view names are accepted, at creation time, alteration time,
+# and drop time.
+###############################################################################
+# Note(mleich): non-qualified view name means a view name without preceding
+# database name
+--disable_warnings
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+Create view test.v1 AS Select * from test.tb2;
+Alter view test.v1 AS Select F59 from test. tb2 limit 100 ;
+Drop view test.v1 ;
+Create view v1 AS Select * from test.tb2 limit 100 ;
+Alter view v1 AS Select F59 from test.tb2 limit 100 ;
+Drop view v1 ;
+
+
+let $message= Testcase 3.3.1.A0 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.A0: Ensure that view names are treated case sensitive.
+###############################################################################
+# Note(mleich): Maybe this test produces portability problems on Windows.
+# FIXME There should be a test outside this one checking the
+# creation of objects with cases sensitive names.
+# If we have this test the following sub testcase should
+# be deleted.
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+DROP VIEW IF EXISTS V1 ;
+--enable_warnings
+eval CREATE TABLE t1 (f1 NUMERIC(4)) ENGINE = $engine_type;
+INSERT INTO t1 VALUES(1111), (2222);
+CREATE VIEW v1 AS SELECT * FROM t1 WHERE f1 = 1111;
+# We get here the sql code
+# - 0 on OS with cases sensitive view names (Example: UNIX)
+# - ER_TABLE_EXISTS_ERROR on OS without cases sensitive view names (Example: WINDOWS)
+--error 0,ER_TABLE_EXISTS_ERROR
+CREATE VIEW V1 AS SELECT * FROM t1 WHERE f1 = 2222;
+SELECT * FROM v1;
+# SELECT * FROM V1;
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+DROP VIEW IF EXISTS V1 ;
+--enable_warnings
+
+
+let $message= Testcase 3.3.1.8 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.8: Ensure that any invalid view name is never accepted, and
+# that an appropriate error message is returned when the name
+# is rejected.
+###############################################################################
+# Note(mleich): There could be more negative tests here, but I assume that the
+# server routines checking if a table or view name is acceptable
+# are heavily tested in tests checking the creation of tables.
+--error ER_PARSE_ERROR
+Create view select AS Select * from test.tb2 limit 100;
+--error ER_PARSE_ERROR
+Create view as AS Select * from test.tb2 limit 100;
+--error ER_PARSE_ERROR
+Create view where AS Select * from test.tb2 limit 100;
+--error ER_PARSE_ERROR
+Create view from AS Select * from test.tb2 limit 100;
+--error ER_PARSE_ERROR
+Create view while AS Select * from test.tb2 limit 100;
+--error ER_PARSE_ERROR
+Create view asdkj*(&*&&^ as Select * from test.tb2 limit 100 ;
+--disable_warnings
+Drop view if exists test.procedure ;
+--enable_warnings
+Create view test.procedure as Select * from test.tb2 limit 100 ;
+Drop view if exists test.procedure ;
+
+
+let $message= Testcase 3.3.1.9 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.9: Ensure that a reference to a non-existent view is rejected
+# with an appropriate error message
+###############################################################################
+# Note(mleich): The SELECT statement syntax does not contain any functionality
+# to claim, that the object after FROM must be a VIEW. SHOW's will
+# be checked in
+# 3.3.11 Checks on SHOW, EXPLAIN, and DESCRIBE statements.
+# Let's check here a view based on a dropped view or table.
+--disable_warnings
+Drop TABLE IF EXISTS t1 ;
+Drop VIEW IF EXISTS v1;
+Drop VIEW IF EXISTS v2;
+Drop VIEW IF EXISTS v3;
+--enable_warnings
+CREATE TABLE t1 ( f1 char(5));
+INSERT INTO t1 SET f1 = 'abcde';
+CREATE VIEW v1 AS SELECT f1 FROM t1;
+CREATE VIEW v2 AS SELECT * FROM v1;
+
+# Only negative cases, positive cases will be checked later:
+DROP TABLE t1;
+--error ER_VIEW_INVALID
+SELECT * FROM v1;
+--error ER_VIEW_INVALID
+DELETE FROM v1;
+--error ER_VIEW_INVALID
+UPDATE v1 SET f1 = 'aaaaa';
+--error ER_VIEW_INVALID
+INSERT INTO v1 SET f1 = "fffff";
+# v2 is based on v1, which is now invalid
+--error ER_VIEW_INVALID
+SELECT * FROM v2;
+--error ER_VIEW_INVALID
+DELETE FROM v2;
+--error ER_VIEW_INVALID
+UPDATE v2 SET f1 = 'aaaaa';
+--error ER_VIEW_INVALID
+INSERT INTO v2 SET f1 = "fffff";
+DROP VIEW v1;
+# v2 is based on v1, which is now dropped
+--error ER_VIEW_INVALID
+SELECT * FROM v2;
+--error ER_VIEW_INVALID
+DELETE FROM v2;
+--error ER_VIEW_INVALID
+UPDATE v2 SET f1 = 'aaaaa';
+--error ER_VIEW_INVALID
+INSERT INTO v2 SET f1 = "fffff";
+
+DROP VIEW v2;
+
+# A VIEW based on itself is non sense.
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+CREATE TABLE t1 (f1 FLOAT);
+# Create a new VIEW based on itself
+--error ER_NO_SUCH_TABLE
+CREATE VIEW v1 AS SELECT * FROM v1;
+# Replace a valid VIEW with one new based on itself
+CREATE VIEW v1 AS SELECT * FROM t1;
+--error ER_NO_SUCH_TABLE
+CREATE or REPLACE VIEW v1 AS SELECT * FROM v1;
+
+DROP VIEW v1;
+DROP TABLE t1;
+
+let $message= Testcase 3.3.1.10 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.10: Ensure that it is not possible to create two views with
+# the same name in the same database.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+Create view test.v1 AS Select * from test.tb2 ;
+--error ER_TABLE_EXISTS_ERROR
+Create view test.v1 AS Select F59 from test.tb2 ;
+--error ER_TABLE_EXISTS_ERROR
+Create view v1 AS Select F59 from test.tb2 ;
+
+
+let $message= Testcase 3.3.1.11 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.11: Ensure that it is not possible to create a view and a base
+# table with the same name in the same database.
+###############################################################################
+# The VIEW should get the same name like an already existing TABLE.
+--error ER_TABLE_EXISTS_ERROR
+Create view test.tb2 AS Select f59,f60 from test.tb2 limit 100 ;
+--error ER_TABLE_EXISTS_ERROR
+Create view tb2 AS Select f59,f60 from test.tb2 limit 100 ;
+# The TABLE should get the same name like an already existing VIEW.
+--disable_warnings
+Drop view if exists test.v111 ;
+--enable_warnings
+Create view test.v111 as select * from tb2 limit 50;
+--error ER_TABLE_EXISTS_ERROR
+Create table test.v111(f1 int );
+--error ER_TABLE_EXISTS_ERROR
+Create table v111(f1 int );
+DROP VIEW test.v111;
+
+
+let $message= Testcase 3.3.1.12 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.12: Ensure that it is possible to create two or more views and
+# base tables with the same name, providing each resides in
+# a different database.
+###############################################################################
+USE test;
+--disable_warnings
+Drop database if exists test2 ;
+--enable_warnings
+Create database test2 ;
+# Plan of sub tests
+# Object name object type in object type in
+# database test database test2
+# t1 TABLE TABLE
+# t2 TABLE VIEW
+# v1 VIEW TABLE
+# v2 VIEW VIEW
+--disable_warnings
+DROP TABLE IF EXISTS test.t0, test.t1, test.t2;
+DROP VIEW IF EXISTS test.v1;
+DROP VIEW IF EXISTS test.v2;
+--enable_warnings
+CREATE TABLE test.t1 ( f1 VARCHAR(20));
+CREATE TABLE test2.t1 ( f1 VARCHAR(20));
+CREATE TABLE test.t2 ( f1 VARCHAR(20));
+CREATE TABLE test2.v1 ( f1 VARCHAR(20));
+# t0 is an auxiliary table needed for the VIEWs
+CREATE TABLE test.t0 ( f1 VARCHAR(20));
+CREATE TABLE test2.t0 ( f1 VARCHAR(20));
+
+CREATE VIEW test2.t2 AS SELECT * FROM test2.t0;
+CREATE VIEW test.v1 AS SELECT * FROM test.t0;
+CREATE VIEW test.v2 AS SELECT * FROM test.t0;
+CREATE VIEW test2.v2 AS SELECT * FROM test2.t0;
+
+# Some additional tests on the just created objects to show that they are
+# accessible and do have the expected content.
+# INSERTs with full qualified table
+INSERT INTO test.t1 VALUES('test.t1 - 1');
+INSERT INTO test2.t1 VALUES('test2.t1 - 1');
+INSERT INTO test.t2 VALUES('test.t2 - 1');
+INSERT INTO test2.v1 VALUES('test2.v1 - 1');
+INSERT INTO test.t0 VALUES('test.t0 - 1');
+INSERT INTO test2.t0 VALUES('test2.t0 - 1');
+# INSERTs with not full qualified table name.
+USE test;
+INSERT INTO t1 VALUES('test.t1 - 2');
+INSERT INTO t2 VALUES('test.t2 - 2');
+INSERT INTO t0 VALUES('test.t0 - 2');
+USE test2;
+INSERT INTO t1 VALUES('test2.t1 - 2');
+INSERT INTO v1 VALUES('test2.v1 - 2');
+INSERT INTO t0 VALUES('test2.t0 - 2');
+# SELECTs with full qualified table
+SELECT * FROM t1;
+SELECT * FROM t2;
+SELECT * FROM v1;
+SELECT * FROM v2;
+USE test;
+SELECT * FROM t1;
+SELECT * FROM t2;
+SELECT * FROM v1;
+SELECT * FROM v2;
+
+
+let $message= Testcase 3.3.1.13 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.13: Ensure that, if the CREATE OR REPLACE VIEW statement is
+# used to create a view using the name of an existing view,
+# it first cleanly drops the existing view and then creates
+# the new view.
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE TABLE t1 (f1 BIGINT);
+INSERT INTO t1 VALUES(1);
+CREATE VIEW test.v1 AS SELECT * FROM t1 limit 2;
+SHOW CREATE VIEW test.v1;
+--sorted_result
+SELECT * FROM test.v1;
+# Switch the algorithm
+CREATE OR REPLACE ALGORITHM = TEMPTABLE VIEW test.v1
+AS SELECT * FROM t1 limit 2;
+SHOW CREATE VIEW test.v1;
+--sorted_result
+SELECT * FROM test.v1;
+# Switch the base table
+CREATE OR REPLACE VIEW test.v1 AS SELECT * FROM tb2 order by f59 limit 2;
+SHOW CREATE VIEW test.v1;
+if ($have_bug_11589)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.v1 order by f59,f60,f61,f62,f63,f64,f65;
+--horizontal_results
+--enable_ps_protocol
+# Switch the SELECT but not the base table
+CREATE OR REPLACE VIEW test.v1 AS SELECT F59 FROM tb2;
+SHOW CREATE VIEW test.v1;
+SELECT * FROM test.v1 order by F59 limit 10,100;
+Drop table test.t1 ;
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.14 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.14: Ensure that, if the CREATE OR REPLACE VIEW statement is
+# used to create a view using the name of an existing base
+# table, it fails with an appropriate error message.
+###############################################################################
+--error ER_WRONG_OBJECT
+CREATE OR REPLACE VIEW test.tb2 AS SELECT * From tb2 LIMIT 2;
+--error ER_WRONG_OBJECT
+CREATE OR REPLACE VIEW tb2 AS SELECT * From tb2 LIMIT 2;
+
+
+let $message= Testcase 3.3.1.15 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.15: Ensure that, if the CREATE OR REPLACE VIEW statement is
+# used to create a view using a name that does not already
+# belong to an existing view or base table, it cleanly
+# creates the view.
+###############################################################################
+--disable_warnings
+Drop table if exists test.v1 ;
+--enable_warnings
+CREATE OR REPLACE view test.v1 as select * from tb2;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--sorted_result
+SELECT * FROM test.v1;
+--enable_ps_protocol
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.16 + 3.3.1.17 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.16: Ensure that a view with a definition that does not include
+# an explicit column-name list takes its column names from
+# the underlying base table(s).
+# Testcase 3.3.1.17: Ensure that a view with a definition that does include an
+# explicit column-name list uses the explicit names and not
+# the name of the columns from the underlying base tables(s)
+###############################################################################
+--disable_warnings
+Drop table if exists test.v1 ;
+--enable_warnings
+CREATE OR REPLACE VIEW v1 AS SELECT * From tb2;
+# Note(mleich): The empty result is intended, because I want to compare
+# column names only.
+SELECT * FROM tb2 WHERE 1 = 2;
+SELECT * FROM v1 WHERE 1 = 2;
+Drop view v1;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE TABLE t1 (f1 NUMERIC(15,3));
+INSERT INTO t1 VALUES(8.8);
+# 1. no explicit column in VIEW definition or SELECT
+CREATE VIEW v1 AS SELECT * FROM t1;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+# 2. no explicit column in VIEW definition, but in SELECT column_list
+CREATE OR REPLACE VIEW v1 AS SELECT f1 FROM t1;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+# 3. no explicit column in VIEW definition, but alias from SELECT column_list
+CREATE OR REPLACE VIEW v1 AS SELECT f1 As my_column FROM t1;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+# 4. Finally the requirement: explicit column_list in VIEW definition
+CREATE OR REPLACE VIEW v1(column1,column2)
+AS SELECT f1 As my_column, f1 FROM t1;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+CREATE OR REPLACE VIEW test.v1(column1,column2)
+AS SELECT f1 As my_column, f1 FROM test.t1;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+
+
+let $message= Testcase 3.3.1.18 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.18: Ensure that a reference to a view with a definition that
+# includes an explicit column-name fails, with an appropriate
+# error message, if the reference includes columns names
+# from the underlying base table(s) rather than the view
+# column names.
+###############################################################################
+# Note(mleich): The goal is to check the merge algorithm.
+--disable_warnings
+Drop view if exists v1 ;
+Drop view if exists v1_1 ;
+--enable_warnings
+Create view v1
+as Select test.tb2.f59 as NewNameF1, test.tb2.f60
+from test.tb2 limit 0,100 ;
+Create view v1_1
+as Select test.tb2.f59 as NewNameF1, test.tb2.f60 as NewNameF2
+from tb2 limit 0,100 ;
+--error ER_BAD_FIELD_ERROR
+SELECT NewNameF1,f60 FROM test.v1_1 ;
+--error ER_BAD_FIELD_ERROR
+SELECT NewNameF1, v1_1.f60 FROM test.v1_1 ;
+--error ER_BAD_FIELD_ERROR
+SELECT f59, f60 FROM test.v1 ;
+Use test ;
+--error ER_BAD_FIELD_ERROR
+SELECT F59 FROM v1 ;
+
+
+let $message= Testcase 3.3.1.19 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.19: Ensure that every column of a view must have a
+# distinct name
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE TABLE t1( f1 BIGINT, f2 DECIMAL(5,2));
+INSERT INTO t1 VALUES(7, 7.7);
+CREATE TABLE t2( f1 BIGINT, f2 DECIMAL(5,2));
+INSERT INTO t2 VALUES(6, 6.6);
+# positive testcases
+CREATE VIEW v1 AS SELECT * FROM t1;
+SELECT * FROM v1;
+CREATE OR REPLACE VIEW v1 AS SELECT f1, f2 FROM t1;
+SELECT * FROM v1;
+CREATE OR REPLACE VIEW v1 AS SELECT f1 AS my_f1, f2 AS my_f2 FROM t1;
+SELECT * FROM v1;
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2) AS SELECT f1, f2 FROM t1;
+SELECT * FROM v1;
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2) AS SELECT t1.f1, t2.f2 FROM t1, t2;
+SELECT * FROM v1;
+# negative testcases (sometimes including the underlying SELECT)
+# duplicate via alias in SELECT
+SELECT f1, f2 AS f1 FROM t1;
+--error ER_DUP_FIELDNAME
+CREATE OR REPLACE VIEW v1 AS SELECT f1, f2 AS f1 FROM t1;
+# duplicate via JOIN SELECT
+SELECT t1.f1, t2.f1 AS f1 FROM t1, t2;
+--error ER_DUP_FIELDNAME
+CREATE OR REPLACE VIEW v1 AS SELECT t1.f1, t2.f1 AS f1 FROM t1, t2;
+# duplicate via VIEW definition
+--error ER_DUP_FIELDNAME
+CREATE OR REPLACE VIEW v1 (my_col, my_col) AS SELECT * FROM t1;
+
+
+let $message= Testcase 3.3.1.20 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.20: Ensure that, if a column-name list is provided for a
+# view definition, the list contains a name for every column
+# in the view
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+CREATE TABLE t1( f1 BIGINT, f2 DECIMAL(5,2));
+# positive case
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2) AS SELECT * FROM t1;
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2) AS SELECT f1, f2 FROM t1;
+# negative cases, where we assign a wrong number of column names
+--error ER_VIEW_WRONG_LIST
+CREATE OR REPLACE VIEW v1 (my_f1 ) AS SELECT * FROM t1;
+--error ER_VIEW_WRONG_LIST
+CREATE OR REPLACE VIEW v1 (my_f1 ) AS SELECT f1, f2 FROM t1;
+--error ER_VIEW_WRONG_LIST
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2, my_f3) AS SELECT * FROM t1;
+--error ER_VIEW_WRONG_LIST
+CREATE OR REPLACE VIEW v1 (my_f1, my_f2, my_f3) AS SELECT f1, f2 FROM t1;
+
+
+let $message= Testcase 3.3.1.21 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.21: Ensure that a view column can be a direct copy of a
+# column from an underlying table.
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE VIEW test.v1( F59, F60 ) AS SELECT F59, F60 From tb2;
+SELECT * FROM test.v1 order by F59, F60 desc LIMIT 2;
+Drop view if exists test.v1 ;
+
+
+let $message= Testcase 3.3.1.22 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.22: Ensure that a view column can be based on any valid
+# expression, whether or not the expression includes a
+# reference of the column of an underlying table.
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE VIEW test.v1( product ) AS SELECT f59*f60 From tb2 WHERE f59 < 3;
+--sorted_result
+SELECT * FROM test.v1;
+CREATE OR REPLACE VIEW test.v1( product ) AS SELECT 1*2;
+--sorted_result
+SELECT * FROM test.v1;
+CREATE OR REPLACE VIEW test.v1( product ) AS SELECT USER();
+--sorted_result
+SELECT * FROM test.v1;
+Drop view if exists test.v1 ;
+
+
+let $message= Testcase 3.3.1.23 + 3.3.1.24 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.23: Ensure that a view definition that includes a reference to
+# a non-existent table fails, with an appropriate error
+# message, at creation time.
+# Testcase 3.3.1.24: Ensure that a view definition that includes a reference to
+# a non-existent view fails, with an appropriate error
+# message, at creation time.
+###############################################################################
+# Note(mleich): The SELECT statement syntax does not contain any functionality
+# to claim, that the object after FROM must be a VIEW.
+# Testcase 3.3.1.24 should be deleted.
+USE test;
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1;
+DROP VIEW IF EXISTS v2;
+--enable_warnings
+--error ER_NO_SUCH_TABLE
+CREATE VIEW test.v2 AS SELECT * FROM test.t1;
+--error ER_NO_SUCH_TABLE
+CREATE VIEW v2 AS Select * from test.v1;
+DROP VIEW IF EXISTS v2;
+
+
+let $message= Testcase 3.3.1.25 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.25: Ensure that a view cannot be based on one or more
+# temporary tables.
+###############################################################################
+# Note(mleich): A temporary table hides permanent tables which have the same
+# name. So do not forget to drop the temporary table.
+--disable_warnings
+DROP TABLE IF EXISTS t1_temp;
+DROP TABLE IF EXISTS t2_temp;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+Create table t1_temp(f59 char(10),f60 int) ;
+Create temporary table t1_temp(f59 char(10),f60 int) ;
+Insert into t1_temp values('FER',90);
+Insert into t1_temp values('CAR',27);
+--error ER_VIEW_SELECT_TMPTABLE
+Create view v1 as select * from t1_temp ;
+
+Create temporary table t2_temp(f59 char(10),f60 int) ;
+Insert into t2_temp values('AAA',11);
+Insert into t2_temp values('BBB',22);
+--error ER_VIEW_SELECT_TMPTABLE
+Create or replace view v1
+as select t1_temp.f59,t2_temp.f59 from t1_temp,t2_temp ;
+DROP temporary table t1_temp;
+DROP table t1_temp;
+DROP temporary table t2_temp;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+CREATE TABLE t1 (f1 char(10));
+CREATE TEMPORARY TABLE t2 (f2 char(10));
+INSERT INTO t1 VALUES('t1');
+INSERT INTO t1 VALUES('A');
+INSERT INTO t2 VALUES('t2');
+INSERT INTO t2 VALUES('B');
+# simple SELECT
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t2;
+# JOIN - temporary table first
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t2, t1;
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT f2, f1 FROM t2, t1;
+# JOIN - temporary table last
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1, t2;
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT f1, f2 FROM t1, t2;
+# UNION - temporary table first
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t2 UNION SELECT * FROM t1;
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t2 UNION SELECT f1 FROM t1;
+# UNION - temporary table last
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 UNION SELECT * FROM t2;
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT f1 FROM t1 UNION SELECT f2 FROM t2;
+# SUBQUERY - temporary table first
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT 1 FROM t2
+WHERE f2 = ( SELECT f1 FROM t1 );
+# SUBQUERY - temporary table last
+--error ER_VIEW_SELECT_TMPTABLE
+CREATE OR REPLACE VIEW v1 AS SELECT 1 FROM t1
+WHERE f1 = ( SELECT f2 FROM t2 );
+DROP TABLE t1;
+DROP TEMPORARY TABLE t2;
+
+
+let $message= Testcase 3.3.1.26 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.26: Ensure that a view can be based on an underlying table
+# within the same database
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+Create view test.v1 AS Select * from test.tb2;
+if ($have_bug_11589)
+{
+--disable_ps_protocol
+}
+--sorted_result
+Select * from test.v1;
+--enable_ps_protocol
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.27 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.27: Ensure that a view can be based on an underlying view
+# within the same database.
+###############################################################################
+--disable_warnings
+DROP VIEW IF EXISTS test.v1;
+Drop VIEW IF EXISTS test.v1_1 ;
+--enable_warnings
+Create view test.v1 AS Select * from test.tb2;
+Create view test.v1_1 AS Select F59 from test.v1 ;
+Select * from test.v1_1 order by F59 limit 2;
+Drop view test.v1 ;
+Drop view test.v1_1 ;
+
+
+let $message= Testcase 3.3.1.28 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.28: Ensure that a view can be based on an underlying table
+# from another database.
+###############################################################################
+--disable_warnings
+Drop database if exists test2 ;
+--enable_warnings
+create database test2 ;
+Create view test2.v2 AS Select * from test.tb2 limit 50,50;
+use test2 ;
+Create view v1 AS Select * from test.tb2 limit 50 ;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+Select * from v1 order by f59,f60,f61,f62,f63,f64,f65;
+--horizontal_results
+--enable_ps_protocol
+--sorted_result
+Select * from test2.v2 ;
+Drop view if exists test2.v1 ;
+Drop view if exists test2.v2 ;
+Drop database test2 ;
+
+
+let $message= Testcase 3.3.1.29 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.29: Ensure that a view can be based on an underlying view from
+# another database.
+###############################################################################
+--disable_warnings
+Drop database if exists test2 ;
+Drop view if exists test.v1 ;
+--enable_warnings
+create database test2 ;
+
+use test2;
+Create view test.v1 AS Select * from test.tb2 limit 50 ;
+Create view test2.v2 AS Select F59 from test.v1 ;
+Drop view if exists test.v1 ;
+Drop view if exists test2.v2 ;
+
+# Note(mleich): Testcase 3.3.1.30 (identical requirements like 3.3.1.26)
+# --> omitted
+
+let $message= Testcase 3.3.1.31 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.31: Ensure that a view can be based on a join of multiple
+# tables within the same database.
+###############################################################################
+--disable_warnings
+Drop table if exists test.t1 ;
+--enable_warnings
+CREATE TABLE test.t1 ( f59 int, f60 int );
+INSERT INTO test.t1 VALUES( 34, 654 );
+INSERT INTO test.t1 VALUES( 906, 434 );
+INSERT INTO test.t1 VALUES( 445, 765 );
+Create or replace view test.v1
+AS SELECT test.t1.F59, test.tb2.F60
+FROM test.tb2 JOIN test.t1 ON test.tb2.F59 = test.t1.F59 ;
+--sorted_result
+Select * from test.v1;
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.32 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.32: Ensure that a view can be based on a join of multiple
+# tables from another database.
+###############################################################################
+--disable_warnings
+Drop table if exists test.t1 ;
+Drop database if exists test2 ;
+Drop view if exists test.v1 ;
+--enable_warnings
+create database test2 ;
+use test2 ;
+CREATE TABLE t1 ( f59 int, f60 int );
+INSERT INTO t1 VALUES( 34, 654 );
+INSERT INTO t1 VALUES( 906, 434 );
+INSERT INTO t1 VALUES( 445, 765 );
+CREATE VIEW test2.v1
+AS SELECT test.tb2.F59, test.tb2.F60
+FROM test.tb2 INNER JOIN test2.t1 ON tb2.f59 = t1.f59;
+--sorted_result
+Select * from test2.v1;
+
+Use test;
+
+
+let $message= Testcase 3.3.1.33 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.33: Ensure that a view can be based on a join of multiple
+# views within the same database.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1_firstview ;
+Drop view if exists test.v1_secondview ;
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1_firstview AS SELECT * FROM test.tb2;
+CREATE VIEW test.v1_secondview AS SELECT * FROM test.tb2;
+CREATE VIEW test.v1
+AS SELECT test.v1_firstview.f59, test.v1_firstview.f60
+FROM test.v1_firstview INNER JOIN test.v1_secondview
+ON test.v1_firstview.f59 = test.v1_secondview.f59 ;
+SELECT * FROM test.v1 order by f59,f60 limit 0,10;
+Drop view if exists test.v1_firstview ;
+Drop view if exists test.v1_secondview ;
+Drop view if exists test.v1 ;
+
+
+let $message= Testcase 3.3.1.34 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.34: Ensure that a view can be based on a join of multiple
+# views from another database.
+###############################################################################
+--disable_warnings
+Drop database if exists test2 ;
+Drop view if exists test.v1_firstview ;
+Drop view if exists test.v1_secondview ;
+--enable_warnings
+
+create database test2 ;
+use test2 ;
+CREATE VIEW test.v1_firstview AS SELECT * FROM test.tb2 ;
+CREATE VIEW test.v1_secondview AS SELECT * FROM test.tb2 ;
+
+CREATE VIEW v1
+AS SELECT test.v1_firstview.F59, test.v1_firstview.F60
+FROM test.v1_firstview INNER JOIN test.v1_secondview
+ON test.v1_firstview.f59 = test.v1_secondview.f59 ;
+SELECT * FROM v1 order by f59,f60 limit 0,10;
+Drop view v1 ;
+Drop view test.v1_firstview ;
+Drop view test.v1_secondview ;
+
+
+let $message= Testcase 3.3.1.35 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.35: Ensure that a view can be based on a join of multiple
+# tables and/or views within the same database.
+###############################################################################
+use test;
+
+--disable_warnings
+Drop view if exists test.v1;
+Drop view if exists test.v1_firstview;
+--enable_warnings
+
+CREATE VIEW test.v1_firstview AS SELECT * FROM test.tb2;
+
+CREATE VIEW test.v1
+AS SELECT test.v1_firstview.f59, test.v1_firstview.f60
+FROM test.v1_firstview INNER JOIN test.tb2
+ON test.v1_firstview.f59 = test.tb2.f59;
+SELECT * FROM test.v1 order by f59,f60 limit 0,10;
+Drop view test.v1 ;
+Drop view test.v1_firstview;
+
+
+let $message= Testcase 3.3.1.36 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.36: Ensure that a view can be based on a join of multiple
+# tables and/or views from another database.
+###############################################################################
+--disable_warnings
+Drop database if exists test2 ;
+--enable_warnings
+create database test2 ;
+use test2 ;
+
+CREATE VIEW v1_firstview AS SELECT * FROM test.tb2 ;
+CREATE VIEW v1
+AS SELECT v1_firstview.f59, v1_firstview.f60
+FROM v1_firstview INNER JOIN test.tb2 ON v1_firstview.f59 = test.tb2.f59 ;
+SELECT * FROM v1 order by f59,f60 limit 0,10;
+
+Drop database test2 ;
+
+
+let $message= Testcase 3.3.1.37 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.37: Ensure that a view can be based on a join of multiple
+# tables and/or views, some of which reside in the same
+# database and some of which reside in one other database.
+###############################################################################
+use test;
+--disable_warnings
+Drop table if exists t1;
+Drop view if exists test.v1 ;
+Drop view if exists test.v1_1 ;
+Drop view if exists test.v1_1 ;
+Drop view if exists test.v1_main ;
+--enable_warnings
+Create view test.v1 as Select f59, f60 FROM test.tb2;
+Select * from test.v1 order by f59,f60 limit 0,10;
+
+Create table t1(f59 int, f60 int);
+Insert into t1 values (90,507) ;
+
+Create view v1_1 as Select f59,f60 from t1 ;
+Select * from v1_1 ;
+
+Create view v1_main
+as SELECT test.tb2.f59 FROM test.tb2 JOIN test.v1
+ON test.tb2.f59 = test.v1.f59;
+Select * from v1_main order by f59 limit 0,10;
+
+Drop table t1;
+Drop view test.v1 ;
+Drop view test.v1_1 ;
+Drop view test.v1_main ;
+
+
+let $message= Testcase 3.3.1.31 - 3.3.1.37 New Implementation ;
+--source include/show_msg80.inc
+###############################################################################
+# mleich: The testcases 3.3.1.31 - 3.3.1.37 should be tested more systematic.
+# Ensure that a view can be based on a join of multiple
+# Testcase 3.3.1.31: tables within the same database
+# Testcase 3.3.1.32: tables from another database.
+# Testcase 3.3.1.33: views within the same database
+# Testcase 3.3.1.34: views from another database
+# Testcase 3.3.1.35: tables and/or views within the same database
+# Testcase 3.3.1.36: tables and/or views from another database
+# Testcase 3.3.1.37: tables and/or views, some of which reside in
+# the same database and some of which reside in
+# one other database.
+###############################################################################
+USE test;
+--disable_warnings
+DROP DATABASE IF EXISTS test2;
+DROP TABLE IF EXISTS t0,t1;
+DROP VIEW IF EXISTS t3,t4;
+--enable_warnings
+CREATE DATABASE test2;
+
+--disable_warnings
+CREATE TABLE test1.t0 (f1 VARCHAR(20));
+CREATE TABLE test1.t1 (f1 VARCHAR(20));
+--enable_warnings
+CREATE TABLE test2.t0 (f1 VARCHAR(20));
+CREATE TABLE test2.t1 (f1 VARCHAR(20));
+--disable_warnings
+CREATE VIEW test1.t2 AS SELECT * FROM test1.t0;
+CREATE VIEW test1.t3 AS SELECT * FROM test2.t0;
+--enable_warnings
+CREATE VIEW test2.t2 AS SELECT * FROM test2.t0;
+CREATE VIEW test2.t3 AS SELECT * FROM test1.t0;
+INSERT INTO test1.t0 VALUES('test1.t0');
+INSERT INTO test1.t1 VALUES('test1.t1');
+INSERT INTO test2.t0 VALUES('test2.t0');
+INSERT INTO test2.t1 VALUES('test2.t1');
+
+# The extreme simple standard JOIN VIEW is:
+# CREATE OR REPLACE VIEW <database>.v1
+# AS SELECT * FROM <table or view 1>,<table or view 2>
+let $view= test.v1;
+let $tab1= test.t0;
+let $tab2= test.t1;
+# eval CREATE OR REPLACE VIEW $view AS SELECT * FROM $tab1, $tab2;
+# Produce at least all testcases via simple combinatorics, because it is better
+# to check some useless combinations than to forget an important one.
+let $view= test.v1;
+let $num_tab1= 3;
+while ($num_tab1)
+{
+ let $num_tab2= 3;
+ while ($num_tab2)
+ {
+ let $num_db1= 2;
+ while ($num_db1)
+ {
+ let $num_db2= 2;
+ while ($num_db2)
+ {
+ # Maybe somebody needs to check the generated values
+ # --disable_query_log
+ # eval SELECT '$num_db1.$num_tab1,$num_db2.$num_tab2';
+ # --enable_query_log
+ eval CREATE OR REPLACE VIEW $view AS
+ SELECT ta.f1 AS col1,
+ tb.f1 AS col2
+ FROM test$num_db1.t$num_tab1 ta, test$num_db2.t$num_tab2 tb;
+ eval SELECT * FROM $view;
+
+ dec $num_db2;
+ }
+
+ dec $num_db1;
+ }
+
+ dec $num_tab2;
+ }
+
+ dec $num_tab1;
+}
+
+
+let $message= Testcase 3.3.1.38 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.38: Ensure that a view can be based on a join of multiple
+# tables and/or views, some of which reside in the same
+# database and some of which reside two or more other
+# databases.
+###############################################################################
+--disable_warnings
+Drop table if exists test1.t1 ;
+Drop view if exists test.v1 ;
+Drop view if exists test.v1_main;
+Drop view if exists test1.v1_1 ;
+Drop database if exists test3 ;
+--enable_warnings
+Create view test.v1 as Select f59, f60 FROM test.tb2;
+Select * from test.v1 order by f59,f60 limit 20;
+
+Create table test1.t1 (f59 int,f60 int) ;
+Insert into test1.t1 values (199,507) ;
+Create view test1.v1_1 as Select f59,f60 from test1.t1 ;
+Select * from test1.v1_1 ;
+
+--disable_warnings
+--enable_warnings
+Create database test3 ;
+
+Create table test3.t1(f59 int,f60 int) ;
+Insert into test3.t1 values (1023,7670) ;
+Create view test3.v1_2 as Select f59,f60 from test3.t1 ;
+Select * from test3.v1_2 ;
+use test ;
+
+# mleich: FIXME The SELECT should deliver at least one row.
+Create view v1_main
+as SELECT test.tb2.f59 as f1, test1.v1_1.f59 as f2,
+ test3.v1_2.f59 as f3
+FROM (test.tb2,test1.v1_1,test.v1) JOIN test3.v1_2
+ON (test.v1.f59 = test1.v1_1.f59) ;
+Select * from v1_main ;
+
+DROP VIEW test.v1 ;
+DROP VIEW test1.v1_1 ;
+DROP VIEW test.v1_main ;
+DROP DATABASE test3;
+
+
+let $message= Testcase 3.3.1.39 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.39: Ensure that a view definition that includes a subquery in
+# a FROM clause is rejected with an appropriate error
+# message at create time.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1
+AS Select f59 from (Select * FROM tb2 limit 20) tx ;
+DROP VIEW test.v1;
+--error ER_NO_SUCH_TABLE
+SELECT * FROM test.v1 order by f59 ;
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+
+let $message= Testcase 3.3.1.40 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.40: Ensure that a view definition that includes references to
+# one or more user variables is rejected with an appropriate
+# error message at create time.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+Set @var1 = 'ABC' ;
+Set @var2 = 'XYZ' ;
+--error ER_VIEW_SELECT_VARIABLE
+CREATE VIEW test.v1 AS SELECT @var1, @var2 ;
+# System variables (name starts with '@@') are also not allowed
+--error ER_VIEW_SELECT_VARIABLE
+CREATE VIEW test.v1 AS SELECT @@global.sort_buffer_size;
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+
+let $message= Testcase 3.3.1.41 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.41: Ensure that a view definition within a stored procedure
+# definition cannot include references to any of the stored
+# procedures parameters.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+Drop procedure if exists sp1 ;
+--enable_warnings
+
+delimiter //;
+Create procedure sp1() DETERMINISTIC
+ Begin
+ DECLARE x char;
+ Set x = 200 ;
+ Create view test.v1 as SELECT * FROM tb2 WHERE f59 = x ;
+ End //
+delimiter ;//
+--error ER_SP_DOES_NOT_EXIST
+Call sp1() ;
+Drop view if exists test.v1 ;
+Drop procedure sp1 ;
+
+
+let $message= Testcase 3.3.1.42 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.42: Ensure that a view definition that attempts to create a
+# temporary view (e.g. CREATE TEMPORARY VIEW or CREATE OR
+# REPLACE TEMPORARY VIEW) fails, with an appropriate
+# error message.
+###############################################################################
+#(01)
+--disable_warnings
+Drop VIEW if exists test.v1 ;
+--enable_warnings
+--error ER_PARSE_ERROR
+CREATE TEMPORARY VIEW test.v1 AS
+SELECT * FROM test.tb2 limit 2 ;
+#(02)
+--error ER_PARSE_ERROR
+CREATE OR REPLACE TEMPORARY VIEW test.v1 AS
+SELECT * FROM test.tb2 limit 2 ;
+
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+Use test;
+
+
+let $message= Testcase 3.3.1.43 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.43: Ensure that all valid changes (i.e. INSERT, UPDATE, DELETE
+# statements) to a view are shown in the view and are
+# accepted as changes by the underlying table(s).
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+CREATE VIEW test.v1 AS SELECT f59,f60 FROM test.tb2;
+
+INSERT INTO test.v1 values(122,432);
+
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.tb2 where f59 = 122 and f60 = 432 limit 0,20;
+--horizontal_results
+--enable_ps_protocol
+
+UPDATE test.v1 SET f59 = 3000 WHERE test.v1.f59 = 122 ;
+
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.tb2 where f59 = 3000 limit 0,20;
+--horizontal_results
+--enable_ps_protocol
+
+DELETE FROM test.v1
+where test.v1.f59 = 3000 and test.v1.f60 = 432;
+
+SELECT * FROM test.tb2 where f59 = 3000 and f60 = 432;
+
+drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.44 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.44: Ensure that all invalid changes to a view are rejected
+# with an appropriate error message and do not affect the
+# data in the underlying tables(s).
+###############################################################################
+# mleich: Maybe we need some more tests here.
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+# Note(mleich): The modification will fail, because the VIEW contains 'limit'
+CREATE VIEW test.v1 AS SELECT f59,f60 FROM test.tb2 limit 100;
+
+--error ER_NON_INSERTABLE_TABLE
+INSERT INTO test.v1 values(31, 32, 33) ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.45 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.45: Ensure that, for a view with a definition that does not
+# include WITH CHECK OPTION, all changes to the view which
+# violate the view definition do not show in the view but
+# are accepted as changes by the underlying table(s) unless
+# a constraint on an underlying table also makes the change
+# invalid.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT * FROM test.tb2 where f59 = 04;
+
+--enable_info
+UPDATE test.v1 SET f59 = 30 where F59 = 04 ;
+--disable_info
+SELECT * FROM test.v1 where f59 = 30 order by f59;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.tb2 where f59 = 30 ;
+--horizontal_results
+--enable_ps_protocol
+
+--enable_info
+UPDATE tb2 SET f59 = 100 where f59 = 30 ;
+--disable_info
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM tb2 where f59 = 100 ;
+--horizontal_results
+--enable_ps_protocol
+SELECT * FROM test.v1 order by f59 ;
+
+drop view if exists test.v1 ;
+
+--disable_warnings
+Drop TABLE IF EXISTS test.t1 ;
+Drop VIEW IF EXISTS test.v1 ;
+--enable_warnings
+eval CREATE TABLE t1 (f1 BIGINT, f2 VARCHAR(20), PRIMARY KEY(f1))
+ ENGINE = $engine_type;
+INSERT INTO t1 VALUES(1,'one');
+INSERT INTO t1 VALUES(2,'two');
+INSERT INTO t1 VALUES(3,'three');
+INSERT INTO t1 VALUES(5,'five');
+CREATE VIEW v1 AS SELECT * FROM t1 WHERE f1 BETWEEN 2 AND 4;
+
+### SELECTs
+# 1. Searched record is within the scope of the view
+# 1.1 + exists within the base table
+SELECT COUNT(*) FROM v1 WHERE f1 = 2;
+# 1.2 + does not exists within the base table
+SELECT COUNT(*) FROM v1 WHERE f1 = 4;
+# 2. Searched record is outside of the scope of the view
+# 2.1 + exists within the base table
+SELECT COUNT(*) FROM v1 WHERE f1 = 5;
+# 2.2 + does not exists within the base table
+SELECT COUNT(*) FROM v1 WHERE f1 = 10;
+
+INSERT INTO t1 VALUES(4,'four');
+
+### DELETEs
+--enable_info
+# 1. Searched record is within the scope of the view
+# + exists within the base table
+DELETE FROM v1 WHERE f1 = 3;
+# 2. Searched record is outside of the scope of the view
+# + exists within the base table
+DELETE FROM v1 WHERE f1 = 5;
+--disable_info
+SELECT * FROM t1 ORDER BY f1;
+SELECT * FROM v1 ORDER BY f1;
+
+### INSERTs
+--enable_info
+# 1. The record to be inserted will be within the scope of the view.
+# But there is already a record with the PRIMARY KEY f1 = 2 .
+# OBN change for 5.1.21 --error ER_DUP_ENTRY_WITH_KEY_NAME
+--error ER_DUP_ENTRY
+INSERT INTO v1 VALUES(2,'two');
+# 2. The record to be inserted will be within the scope of the view.
+# There is no already existing record with the PRIMARY KEY f1 = 3 .
+INSERT INTO v1 VALUES(3,'three');
+# 3. The record to be inserted will be outside of the scope of the view.
+# There is no already existing record with the PRIMARY KEY f1 = 6 .
+INSERT INTO v1 VALUES(6,'six');
+--disable_info
+SELECT * FROM t1 ORDER BY f1;
+SELECT * FROM v1 ORDER BY f1;
+
+### UPDATEs
+--enable_info
+# 1. The record to be updated is within the scope of the view
+# and will stay inside the scope.
+# But there is already a record with the PRIMARY KEY f1 = 2 .
+# OBN change for 5.1.21 --error ER_DUP_ENTRY_WITH_KEY_NAME
+--error ER_DUP_ENTRY
+UPDATE v1 SET f1 = 2 WHERE f1 = 3;
+# 2. The record to be updated is within the scope of the view
+# and will stay inside the scope.
+UPDATE v1 SET f2 = 'number' WHERE f1 = 3;
+# 3. The record to be updated is within the scope of the view
+# and will leave the scope.
+UPDATE v1 SET f1 = 10 WHERE f1 = 3;
+# 4. The record to be updated is outside of the scope of the view.
+UPDATE v1 SET f2 = 'number' WHERE f1 = 1;
+--disable_info
+
+
+let $message= Testcase 3.3.1.46 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.46: Ensure that, for a view with a definition that does
+# include WITH CHECK OPTION, all changes to the view which
+# violate the view definition are rejected with an
+# appropriate error message and are not accepted as changes
+# by the underlying table(s).
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT f59,f60
+FROM test.tb2 where f59 = 195 WITH CHECK OPTION ;
+
+--error ER_VIEW_CHECK_FAILED
+UPDATE test.v1 SET f59 = 198 where f59=195 ;
+SELECT * FROM test.v1 order by f59 ;
+
+drop view if exists test.v1 ;
+
+
+let $message= Testcase 3.3.1.47 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.47: Ensure that, for a view with a definition that does
+# include WITH LOCAL CHECK OPTION, all changes to the view
+# which violate the view definition are rejected with an
+# appropriate error message and are not accepted as changes
+# by the underlying table(s).
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+Drop view if exists test.v2 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT f59,f60
+FROM test.tb2 where F59 = 0987 WITH LOCAL CHECK OPTION ;
+CREATE VIEW test.v2 as SELECT * FROM test.v1 ;
+
+# This UPDATE violates the definition of VIEW test.v1.
+--error ER_VIEW_CHECK_FAILED
+UPDATE test.v1 SET F59 = 919 where f59 = 0987 ;
+SELECT * FROM test.v1 order by f59 ;
+
+# mleich: This UPDATE violates the definition of VIEW test.v1, but this
+# does not count, because the UPDATE runs on test.v2, which
+# is defined without any CHECK OPTION.
+# FIXME Does this testcase fit to 3.3.1.47 ?
+UPDATE test.v2 SET F59 = 9879 where f59 = 919 ;
+SELECT * FROM tb2 where f59 = 9879 ;
+
+drop view if exists v1 ;
+drop view if exists v2 ;
+
+
+let $message= Testcase 3.3.1.48 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.48: Ensure that, for a view with a definition that does
+# include WITH CASCADED CHECK OPTION, all changes to the
+# view which violate the view definition are rejected with
+# an appropriate error message and are not accepted as
+# changes by the underlying table(s).
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS test.t1;
+DROP VIEW IF EXISTS test.v1;
+--enable_warnings
+eval CREATE TABLE t1 (f1 ENUM('A', 'B', 'C') NOT NULL, f2 INTEGER)
+ ENGINE = $engine_type;
+INSERT INTO t1 VALUES ('A', 1);
+SELECT * FROM t1 order by f1, f2;
+
+CREATE VIEW v1 AS SELECT * FROM t1 WHERE f2 BETWEEN 1 AND 2
+WITH CASCADED CHECK OPTION ;
+SELECT * FROM v1 order by f1, f2;
+--enable_info
+# positive cases
+UPDATE v1 SET f2 = 2 WHERE f2 = 1;
+INSERT INTO v1 VALUES('B',2);
+--disable_info
+# Bug#11771: View over InnoDB table, wrong result SELECT on VIEW,
+# field->query_id wrong
+SELECT * FROM v1 order by f1, f2;
+# negative cases
+--enable_info
+--error ER_VIEW_CHECK_FAILED
+UPDATE v1 SET f2 = 4;
+--error ER_VIEW_CHECK_FAILED
+INSERT INTO v1 VALUES('B',3);
+--disable_info
+# Bug#11771: View over InnoDB table, wrong result SELECT on VIEW,
+# field->query_id wrong
+SELECT * FROM v1 order by f1, f2;
+
+
+let $message= Testcase 3.3.1.49 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.49: Ensure that the WITH [LOCAL | CASCADED] CHECK OPTION
+# constraint is always correctly performed within the
+# correct scope, including in cases where a view is based
+# upon multiple other views whose definitions include every
+# possible combination of the WITH CHECK OPTION variants.
+###############################################################################
+--disable_warnings
+Drop table if exists test.t1 ;
+Drop view if exists test.v1 ;
+Drop view if exists test.v2 ;
+Drop view if exists test.v3 ;
+--enable_warnings
+Create table test.t1 (f59 INT, f60 INT) ;
+
+Insert into test.t1 values (100,4234);
+Insert into test.t1 values (290,6624);
+Insert into test.t1 values (410,765);
+Insert into test.t1 values (300,433334);
+Insert into test.t1 values (800,9788);
+Insert into test.t1 values (501,9866);
+
+Create view test.v1 as select f59
+FROM test.t1 where f59<500 with check option ;
+
+Create view test.v2 as select *
+from test.v1 where f59>0 with local check option ;
+
+--disable_warnings
+--enable_warnings
+
+Create view test.v3 as select *
+from test.v1 where f59>0 with cascaded check option ;
+
+Insert into test.v2 values(23) ;
+Insert into test.v3 values(24) ;
+
+drop view if exists test.v1 ;
+drop view if exists test.v2 ;
+drop view if exists test.v3 ;
+
+let $message= Testcase 3.3.1.49A ;
+--source include/show_msg80.inc
+# Testplan:
+# -----------------------------------------------------------
+# VIEW v1 is based on table t1 (*)
+# VIEW v2 is based on view v1 (*)
+# VIEW v3 is based on view v2 (*)
+#
+# (*) All variants like
+# - without check option
+# - WITH CASCADED CHECK OPTION
+# - WITH CHECK OPTION (default = CASCADED)
+# - WITH LOCAL CHECK OPTION
+#
+# The rules for updating and inserting column values:
+# 1. Top VIEW WITH CASCADED CHECK OPTION
+# --> The WHERE qualifications of all nested VIEWs have to be fulfilled.
+# The CHECK OPTIONS of underlying VIEWs have no effect.
+# 2. Top VIEW WITH LOCAL CHECK OPTION
+# --> Only the WHERE qualification of this VIEW has to be fulfilled.
+# The CHECK OPTIONS of underlying VIEWs have no effect.
+# 3. Top VIEW without any CHECK OPTION
+# --> The WHERE qualifications of all nested VIEWs need not to be fulfilled.
+# The CHECK OPTIONS of underlying VIEWs have no effect.
+#
+# v3 | v2 | v1 | Qualifications to be checked
+# ------------------------------------------------------------------------
+# CASCADED | <any> | <any> | qual_v3 + qual_v2 + qual_v3
+# <default> | <any> | <any> | qual_v3 + qual_v2 + qual_v3
+# LOCAL | <any> | <any> | qual_v3
+# <without> | <any> | <any> |
+#
+# Note: The CHECK OPTION does not influence the retrieval of rows
+# (SELECT/DELETE/UPDATE). All WHERE qualifications will be applied
+# for the retrieval of rows.
+#
+# The annoying redundant
+# eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+# @v3_to_v1_violation,$mysql_errno);
+# could not be put into a file to be sourced because of the closed
+# Bug#10267 mysqltest, wrong number of loops when a script is sourced
+# within a loop
+# To be implemented later.
+
+USE test;
+--disable_warnings
+DROP TABLE IF EXISTS test.t1 ;
+DROP TABLE IF EXISTS test.t1_results ;
+DROP VIEW IF EXISTS test.v1;
+DROP VIEW IF EXISTS test.v2;
+DROP VIEW IF EXISTS test.v3;
+--enable_warnings
+CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20));
+CREATE TABLE t1_results (v3_to_v1_options VARCHAR(100), statement VARCHAR(10),
+ v3_to_v1_violation VARCHAR(20), errno CHAR(10));
+--disable_query_log
+SET @part1= '';
+SET @part2= 'WITH CHECK OPTION';
+SET @part3= 'WITH CASCADED CHECK OPTION';
+SET @part4= 'WITH LOCAL CHECK OPTION';
+--enable_query_log
+
+let $num1= 4;
+while ($num1)
+{
+ --disable_query_log
+ eval SET @v1_part= @part$num1;
+ let $aux= `SELECT CONCAT('CREATE VIEW v1 AS SELECT f1, f2
+ FROM t1 WHERE f1 BETWEEN 0 AND 10 ', @v1_part)` ;
+ --enable_query_log
+ eval $aux ;
+
+ let $num2= 4;
+ while ($num2)
+ {
+ --disable_query_log
+ eval SET @v2_part= @part$num2;
+ let $aux= `SELECT CONCAT('CREATE VIEW v2 AS SELECT f1 AS col1, f2 AS col2
+ FROM v1 WHERE f1 BETWEEN 6 AND 16 ', @v2_part)` ;
+ --enable_query_log
+ eval $aux ;
+
+ let $num3= 4;
+ while ($num3)
+ {
+ --disable_query_log
+ eval SET @v3_part= @part$num3;
+ let $aux= `SELECT CONCAT('CREATE VIEW v3 (my_col1,my_col2) AS SELECT *
+ FROM v2 WHERE col1 MOD 2 = 0 ', @v3_part)` ;
+ eval $aux ;
+ --vertical_results
+ SELECT CONCAT(IF(@v3_part = '',' <nothing> ',
+ @v3_part), ' - ',
+ IF(@v2_part = '',' <nothing> ',
+ @v2_part), ' - ',
+ IF(@v1_part = '',' <nothing> ',
+ @v1_part))
+ AS "option_variant"
+ UNION SELECT RPAD('', 80, '-');
+ SET @v3_to_v1_options = CONCAT(IF(@v3_part = '',' <nothing> ',
+ @v3_part), ' - ',
+ IF(@v2_part = '',' <nothing> ',
+ @v2_part), ' - ',
+ IF(@v1_part = '',' <nothing> ',
+ @v1_part));
+ --horizontal_results
+ --enable_query_log
+ # 1. Visibility of records of t1 via SELECT on the VIEWs
+ # Outside v1 (0 to 10)
+ INSERT INTO t1 VALUES(16, 'sixteen');
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ INSERT INTO t1 VALUES(0, 'zero');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(7, 'seven');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(8, 'eight');
+ SELECT * FROM v1;
+ SELECT * FROM v2;
+ SELECT * FROM v3;
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ # 2. DELETEs within v3
+ # Outside v1 (0 to 10)
+ INSERT INTO t1 VALUES(16, 'sixteen');
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ INSERT INTO t1 VALUES(0, 'zero');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(7, 'seven');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(8, 'eight');
+ --enable_info
+ # Outside v1 (0 to 10)
+ DELETE FROM v3 WHERE my_col1 = 16;
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ DELETE FROM v3 WHERE my_col1 = 0;
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ DELETE FROM v3 WHERE my_col1 = 7;
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ DELETE FROM v3 WHERE my_col1 = 8;
+ --disable_info
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ # 3. UPDATEs within v3 (modify my_col2, which is not part of any
+ # WHERE qualification)
+ # The behaviour should be similar to 3. DELETE.
+ # Outside v1 (0 to 10)
+ INSERT INTO t1 VALUES(16, 'sixteen');
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ INSERT INTO t1 VALUES(0, 'zero');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(7, 'seven');
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ INSERT INTO t1 VALUES(8, 'eight');
+ --enable_info
+ # Outside v1 (0 to 10)
+ UPDATE v3 SET my_col2 = 'whatever' WHERE my_col1 = 16;
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ UPDATE v3 SET my_col2 = 'whatever' WHERE my_col1 = 0;
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ UPDATE v3 SET my_col2 = 'whatever' WHERE my_col1 = 7;
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ UPDATE v3 SET my_col2 = 'whatever' WHERE my_col1 = 8;
+ --disable_info
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ # 4. UPDATEs within v3 (modify my_col1 to values inside and outside
+ # of the WHERE qualifications)
+ --disable_query_log
+ SET @statement = 'UPDATE';
+ --enable_query_log
+ INSERT INTO t1 VALUES(8, 'eight');
+ # Alter to value outside of v3
+ --disable_query_log
+ SET @v3_to_v1_violation = 'v3_ _ ';
+ --enable_query_log
+ --enable_info
+ UPDATE v3 SET my_col1 = 7 WHERE my_col1 = 8;
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ INSERT INTO t1 VALUES(8, 'eight');
+ # Alter to value outside of v2
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _v2_ ';
+ --enable_query_log
+ --enable_info
+ UPDATE v3 SET my_col1 = 0 WHERE my_col1 = 8;
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ INSERT INTO t1 VALUES(8, 'eight');
+ # Alter to value outside of v1
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _ _v1';
+ --enable_query_log
+ --enable_info
+ UPDATE v3 SET my_col1 = 16 WHERE my_col1 = 8;
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ INSERT INTO t1 VALUES(8, 'eight');
+ # Alter to value inside of v1
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _ _ ';
+ --enable_query_log
+ --enable_info
+ UPDATE v3 SET my_col1 = 10 WHERE my_col1 = 8;
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ # 5. INSERTs into v3
+ --disable_query_log
+ SET @statement = 'INSERT';
+ --enable_query_log
+ # Outside v1 (0 to 10)
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _ _v1';
+ --enable_query_log
+ --enable_info
+ INSERT INTO v3 VALUES(16, 'sixteen');
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ # Inside v1 (0 to 10), Outside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _v2_ ';
+ --enable_query_log
+ --enable_info
+ INSERT INTO v3 VALUES(0, 'zero');
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Outside v3 ( value MOD 2 = 0 )
+ --disable_query_log
+ SET @v3_to_v1_violation = 'v3_ _ ';
+ --enable_query_log
+ --enable_info
+ INSERT INTO v3 VALUES(7, 'seven');
+ --disable_info
+ # Inside v1 (0 to 10), Inside v2 ((0 to 10) AND (6 to 16) -> (6 to 10))
+ # Inside v3 ( value MOD 2 = 0 )
+ --disable_query_log
+ SET @v3_to_v1_violation = ' _ _ ';
+ --enable_query_log
+ --enable_info
+ INSERT INTO v3 VALUES(8, 'eight');
+ --disable_info
+ --disable_query_log
+ eval INSERT INTO t1_results VALUES (@v3_to_v1_options,@statement,
+ @v3_to_v1_violation,$mysql_errno);
+ --enable_query_log
+ SELECT * FROM t1;
+ DELETE FROM t1;
+
+ DROP VIEW v3;
+ dec $num3;
+ }
+
+ DROP VIEW v2;
+ dec $num2;
+ }
+
+ DROP VIEW v1;
+ dec $num1;
+}
+
+SELECT * FROM t1_results ORDER BY v3_to_v1_options;
+
+let $message=
+Plausibility checks for INSERTs and UPDATEs ( 4. and 5. above).
+All following SELECTs must give ROW NOT FOUND ;
+--source include/show_msg80.inc
+
+# Plausibility checks for INSERTs and UPDATEs ( 4. and 5. above):
+# 1. There must be NO denied INSERT/UPDATE, when no WHERE qualification
+# is violated. Expect ROW NOT FUND
+SELECT * FROM t1_results
+WHERE v3_to_v1_violation = ' _ _ ' AND errno <> 0
+ORDER BY v3_to_v1_options;
+# 2. There must be NO denied INSERT/UPDATE, when the toplevel VIEW v3 is
+# defined without any CHECK OPTION. Expect ROW NOT FUND
+SELECT * FROM t1_results
+WHERE v3_to_v1_options LIKE ' %' AND errno <> 0
+ORDER BY v3_to_v1_options;
+# 3. There must be NO successful INSERT/UPDATE, when the toplevel VIEW v3 is
+# defined with any CHECK OPTION and the WHERE qualification of this VIEW is
+# violated. Expect ROW NOT FUND
+SELECT * FROM t1_results
+WHERE v3_to_v1_options LIKE 'WITH %'
+ AND v3_to_v1_violation LIKE 'v3_%' AND errno = 0
+ORDER BY v3_to_v1_options;
+# 4. There must be NO successful INSERT/UPDATE, when the toplevel VIEW v3 is
+# defined with any CHECK OPTION and the CHECK OPTION does not contain LOCAL
+# and the WHERE qualification of any VIEW is violated. Expect ROW NOT FUND
+SELECT * FROM t1_results
+WHERE v3_to_v1_options LIKE 'WITH %' AND v3_to_v1_options NOT LIKE 'WITH LOCAL %'
+ AND v3_to_v1_violation NOT LIKE ' _ _ ' AND errno = 0
+ORDER BY v3_to_v1_options;
+# 5. There must be NO failing INSERT/UPDATE getting a
+# sql_errno <> 1369 (ER_VIEW_CHECK_FAILED).
+SELECT * FROM t1_results
+WHERE errno <> 0 AND errno <> 1369
+ORDER BY v3_to_v1_options;
+let $message= End of plausibility checks;
+--source include/show_msg80.inc
+
+DROP TABLE t1_results;
+
+
+let $message= Testcase 3.3.1.50 - 3.3.1.53;
+--source include/show_msg80.inc
+--disable_warnings
+DROP VIEW IF EXISTS test.v1;
+--enable_warnings
+###############################################################################
+# Testcase 3.3.1.50: Ensure that a view that is a subset of every column and
+# every row of a single underlying table, contains the
+# correct row-and-column data; such a view has a definition
+# that is semantically equivalent to CREATE VIEW <view name>
+# AS SELECT * FROM <table name>.
+###############################################################################
+CREATE VIEW test.v1 AS SELECT * FROM test.tb2;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.v1 order by f59,f60,f61 ;
+--horizontal_results
+--enable_ps_protocol
+drop view test.v1 ;
+###############################################################################
+# Testcase 3.3.1.51: Ensure that a view that is a subset of only some columns
+# and every row of a single underlying table, contains the
+# correct row-and-column data; such a view has a definition
+# that is semantically equivalent to CREATE VIEW <view name>
+# AS SELECT col1, col3 FROM <table name>.
+###############################################################################
+CREATE VIEW test.v1 AS SELECT F59,F61 FROM test.tb2;
+SELECT * FROM test.v1 order by F59, F61 limit 50;
+drop view test.v1 ;
+###############################################################################
+# Testcase 3.3.1.52: Ensure that a view that is a subset of every column and
+# some rows of a single underlying table, contains the
+# correct row-and-column data; such a view has a definition
+# that is semantically equivalent to CREATE VIEW <view name>
+# AS SELECT * FROM <table name> WHERE ....
+###############################################################################
+CREATE VIEW test.v1 AS SELECT * FROM test.tb2 order by f59, f60, f61;
+if ($have_bug_11589)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.v1 order by f59,f60,f61 ;
+--horizontal_results
+--enable_ps_protocol
+drop view test.v1 ;
+###############################################################################
+# Testcase 3.3.1.53: Ensure that a view that is a subset of only some columns
+# and some rows of a single underlying table, contains
+# the correct row-and-column data; such a view has a
+# definition that is semantically equivalent to CREATE VIEW
+# <view name> AS SELECT col1, col3 FROM <table name> WHERE ..
+###############################################################################
+CREATE VIEW test.v1 AS SELECT F59,f61 FROM test.tb2;
+SELECT * FROM test.v1 order by f59,f61 desc limit 20;
+drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.54 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.54: Ensure that a view that is a subset of some or all columns
+# and/or column expressions and some or all rows of a single
+# underlying table contains the correct row-and-column data.
+###############################################################################
+USE test;
+--disable_warnings
+drop table if exists test.t1 ;
+drop table if exists test.t2 ;
+drop view if exists test.v1 ;
+--enable_warnings
+Create table t1 (f59 int, f60 int) ;
+Create table t2 (f59 int, f60 int) ;
+
+Insert into t1 values (1,10) ;
+Insert into t1 values (2,20) ;
+Insert into t1 values (47,80) ;
+Insert into t2 values (1,1000) ;
+Insert into t2 values (2,2000) ;
+Insert into t2 values (31,97) ;
+Create view test.v1 as select t1.f59, t1.f60
+from t1,t2 where t1.f59=t2.f59 ;
+Select * from test.v1 order by f59 limit 50 ;
+
+drop table test.t1 ;
+drop table test.t2 ;
+drop view test.v1 ;
+
+
+# FIXME(mleich): Implement an automatic check for 3.3.1.50 - 3.3.1.54
+# CREATE VIEW ... AS <SELECT ... FROM tb2 ...>
+# CREATE TEMPORARY TABLE ... AS <SELECT ... FROM tb2 ...>
+# Comparison of the VIEW with the temporary table
+
+let $message= Testcase 3.3.1.50 - 3.3.1.54 additional implementation;
+--source include/show_msg80.inc
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+#
+#
+# Testplan
+# ------------------------
+#
+# Testcase | all columns | all rows | column expressions
+# ---------------------------------------------------
+# 3.3.1.50 | yes | yes | no
+# 3.3.1.51 | no | yes | no
+# 3.3.1.52 | yes | no | no
+# 3.3.1.53 | no | no | no
+# 3.3.1.54 | no | no | yes
+CREATE TABLE t1 ( f1 BIGINT, f2 char(10), f3 DECIMAL(10,5) );
+INSERT INTO t1 VALUES(1, 'one', 1.1);
+INSERT INTO t1 VALUES(2, 'two', 2.2);
+INSERT INTO t1 VALUES(3, 'three', 3.3);
+# 3.3.1.50
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;
+SELECT * FROM v1;
+# 3.3.1.51
+CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t1;
+SELECT * FROM v1;
+# 3.3.1.52
+CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 WHERE f3 = 2.2;
+SELECT * FROM v1;
+# 3.3.1.53
+CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t1 WHERE f3 = 2.2;
+SELECT * FROM v1;
+# 3.3.1.54
+--vertical_results
+SET sql_mode = 'traditional,ansi';
+# due to bug#32496 "no trailing blanks in identifier".
+CREATE OR REPLACE VIEW v1 AS
+SELECT f3 AS "pure column f3:", f1 + f3 AS "sum of columns f1 + f3 =",
+ 3 * (- 0.11111E+1) AS "product of constants 3 * (- 0.11111E+1):",
+ '->' || CAST(f3 AS CHAR) || '<-'
+ AS "expression with '||'=CONCAT and CAST(DECIMAL column AS CHAR):"
+FROM t1 WHERE f1 = 2;
+# This error is not conformant with ansi (see bug#32496). hhunger
+--error ER_WRONG_COLUMN_NAME
+CREATE OR REPLACE VIEW v1 AS
+SELECT f3 AS "pure column f3: ", f1 + f3 AS "sum of columns f1 + f3 = ",
+ 3 * (- 0.11111E+1) AS "product of constants 3 * (- 0.11111E+1): ",
+ '->' || CAST(f3 AS CHAR) || '<-'
+ AS "expression with '||'=CONCAT and CAST(DECIMAL column AS CHAR): "
+FROM t1 WHERE f1 = 2;
+SELECT * FROM v1;
+SET sql_mode = '';
+--horizontal_results
+
+
+let $message= Testcases 3.3.1.55 - 3.3.1.62 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase: Ensure that a view that is a subset of some or all columns and
+# some or all rows of multiple tables joined with an
+# 3.3.1.55 INNER JOIN
+# 3.3.1.56 CROSS JOIN
+# 3.3.1.57 STRAIGHT JOIN
+# 3.3.1.58 NATURAL JOIN
+# 3.3.1.59 LEFT OUTER JOIN
+# 3.3.1.60 NATURAL LEFT OUTER JOIN
+# 3.3.1.61 RIGHT OUTER
+# 3.3.1.62 NATURAL RIGHT OUTER
+# condition contains the correct row-and-column data.
+###############################################################################
+--disable_warnings
+Drop table if exists t1, t2 ;
+Drop view if exists v1 ;
+--enable_warnings
+Create table t1 (f59 int, f60 char(10), f61 int, a char(1)) ;
+Insert into t1 values (1, 'single', 3, '1') ;
+Insert into t1 values (2, 'double', 6, '2') ;
+Insert into t1 values (3, 'single-f3', 4, '3') ;
+
+Create table t2 (f59 int, f60 char(10), f61 int, b char(1)) ;
+Insert into t2 values (2, 'double', 6, '2') ;
+Insert into t2 values (3, 'single-f3', 6, '3') ;
+Insert into t2 values (4, 'single', 4, '4') ;
+
+# Testcase 3.3.1.55 ;
+create or replace view test.v1 as
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+from t1 inner join t2 where t1.f59 = t2.f59 ;
+select * from test.v1 order by t1_f59 ;
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+from t1 inner join t2 where t1.f59 = t2.f59;
+
+# Testcase 3.3.1.56 ;
+Create or replace view test.v1 as
+Select t1.f59 AS t1_f59, t2.f59 AS t2_f59
+FROM t2 cross join t1;
+Select * from v1 order by t1_f59,t2_f59;
+Select t1.f59 AS t1_f59, t2.f59 AS t2_f59
+FROM t2 cross join t1;
+
+# Testcase 3.3.1.57 ;
+Create or replace view test.v1 as
+Select straight_join t1.f59 AS t1_f59, t2.f59 AS t2_f59
+FROM t2,t1;
+Select * from v1 order by t1_f59,t2_f59;
+Select straight_join t1.f59 AS t1_f59, t2.f59 AS t2_f59
+FROM t2,t1;
+
+# Testcase 3.3.1.58 ;
+Create or replace view test.v1 as
+Select f59, f60, f61, a, b
+FROM t2 natural join t1;
+Select * from v1 order by f59;
+Select f59, f60, f61, a, b
+FROM t2 natural join t1;
+
+# Testcase 3.3.1.59 ;
+Create or replace view test.v1 as
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+FROM t2 left outer join t1 on t2.f59=t1.f59;
+Select * from v1 order by t1_f59;
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+FROM t2 left outer join t1 on t2.f59=t1.f59;
+
+# Testcase 3.3.1.60 ;
+Create or replace view test.v1 as
+Select f59, f60, f61, t1.a, t2.b
+FROM t2 natural left outer join t1;
+Select * from v1 order by f59;
+Select f59, f60, f61, t1.a, t2.b
+FROM t2 natural left outer join t1;
+
+# Testcase 3.3.1.61 ;
+
+set @save_optimizer_switch=@@optimizer_switch;
+set optimizer_switch='outer_join_with_cache=off';
+
+Create or replace view test.v1 as
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+FROM t2 right outer join t1 on t2.f59=t1.f59;
+Select * from v1 order by t1_f59;
+Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60,
+ t1.f61 t1_f61, t2.f61 t2_f61
+FROM t2 right outer join t1 on t2.f59=t1.f59;
+
+# Testcase 3.3.1.62 ;
+Create or replace view test.v1 as
+Select f59, f60, a, b
+FROM t2 natural right outer join t1;
+Select * from v1 order by f59 desc;
+Select f59, f60, a, b
+FROM t2 natural right outer join t1;
+
+set optimizer_switch=@save_optimizer_switch;
+
+drop table t1, t2;
+drop view v1 ;
+
+Use test;
+
+
+let $message= Testcase 3.3.1.A1 - 3.3.1.A3 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase: Ensure that a view that is a subset of some or all columns and/or
+# column expressions and some or all rows of multiple tables joined
+# with the combination of
+# 3.3.1.A1 LEFT JOIN
+# 3.3.1.A2 INNER JOIN
+# 3.3.1.A3 CROSS JOIN
+# condition contains the correct row-and-column data
+###############################################################################
+# Testcase 3.3.1.A1 ;
+--disable_warnings
+Drop table if exists t1 ;
+Drop view if exists v1;
+--enable_warnings
+Create table t1 (f59 int, f60 int, f61 int) ;
+Insert into t1 values (101,201,301) ;
+Insert into t1 values (107,501,601) ;
+Insert into t1 values (901,801,401) ;
+
+Create or replace view test.v1 as
+Select tb2.f59 FROM tb2 LEFT JOIN t1 on tb2.f59 = t1.f59 ;
+Select * from test.v1 order by f59 limit 0,10;
+Drop view if exists test.v1 ;
+
+# Testcase 3.3.1.A2 ;
+--disable_warnings
+Drop table if exists t1 ;
+Drop view if exists v1;
+--enable_warnings
+Create table t1 (f59 int, f60 int, f61 int) ;
+Insert into t1 values (201,201,201) ;
+Insert into t1 values (207,201,201) ;
+Insert into t1 values (201,201,201) ;
+
+Create or replace view test.v1
+as Select tb2.f59 FROM tb2 INNER JOIN t1 on tb2.f59 = t1.f59 ;
+Select * from test.v1 order by f59 limit 0,10;
+Drop view if exists test.v1 ;
+
+# Testcase 3.3.1.A3 ;
+--disable_warnings
+Drop table if exists t1 ;
+Drop view if exists v1;
+--enable_warnings
+Create table t1 (f59 int, f60 int, f61 int) ;
+Insert into t1 values (21,21,21) ;
+Insert into t1 values (27,21,21) ;
+Insert into t1 values (21,21,21) ;
+
+Create or replace view test.v1
+as Select tb2.f59 FROM tb2 CROSS JOIN t1 on tb2.f59 = t1.f59 ;
+Select * from test.v1 order by f59 limit 0,10;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.63 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.63: Ensure that a view that is a subset of some or all columns
+# and/or column expressions and some or all rows of multiple
+# tables joined with every possible combination of JOIN
+# conditions, UNION, UNION ALL and UNION DISTINCT, nested at
+# multiple levels, contains the correct row-and-column data.
+###############################################################################
+--disable_warnings
+Drop table if exists t1 ;
+Drop view if exists test.v1 ;
+--enable_warnings
+
+Create table t1 (f59 int, f60 int, f61 int) ;
+Insert into t1 values (11,21,31) ;
+Insert into t1 values (17,51,61) ;
+Insert into t1 values (91,81,41) ;
+
+Create or replace view test.v1 as (Select f59 FROM tb2 where f59=17 )
+Union ALL (Select f59 from t1 where f59=17 );
+Select * from test.v1 order by f59 limit 0,10;
+
+Create or replace view test.v1 as (Select f59 FROM tb2 where f59=17 )
+Union (Select f59 from t1 where f59=17 );
+Select * from test.v1 order by f59 limit 0,10;
+
+Create or replace view test.v1 as (Select f59 FROM tb2 where f59=17 )
+Union Distinct (Select f59 from t1 where f60=17 );
+Select * from test.v1 order by f59 limit 0,10;
+
+Drop view test.v1 ;
+
+--disable_warnings
+drop table if exists t1;
+drop view if exists test.v1;
+--enable_warnings
+create table t1 (f59 int, f60 int, f61 int);
+
+insert into t1 values (101,201,301);
+insert into t1 values (107,501,601);
+insert into t1 values (901,801,401);
+
+create or replace view test.v1 as
+select tb2.f59 from tb2 join t1 on tb2.f59 = t1.f59;
+select * from test.v1 order by f59 limit 0,10;
+
+create or replace view test.v1 as
+(select f59 from tb2 where f59=107 )
+union all
+(select f59 from t1 where f59=107 );
+select * from test.v1 order by f59 limit 0,10;
+
+create or replace view test.v1 as
+(select f59 from tb2 where f59=107 )
+union
+(select f59 from t1 where f59=107 );
+select * from test.v1 order by f59 limit 0,10;
+
+create or replace view test.v1 as
+(select f59 from tb2 where f59=107 )
+union distinct
+(select f59 from t1 where f59=107 );
+select * from test.v1 order by f59 limit 0,10;
+
+drop view if exists test.v1 ;
+drop table t1;
+
+
+let $message= Testcase 3.3.1.64 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.64: Ensure that all changes to a view definition, executed by
+# the ALTER VIEW statement, are correctly recorded and have
+# the correct effect on the data shown by the view.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT F59
+FROM test.tb2 where test.tb2.F59 = 109;
+
+SELECT * FROM test.v1 order by f59 limit 0,10;
+
+ALTER VIEW test.v1 AS SELECT *
+FROM test.tb2 WHERE test.tb2.f59 = 242 ;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM test.v1 order by f59 limit 0,10;
+--horizontal_results
+--enable_ps_protocol
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.1.65, 3.3.1.A4, 3.3.1.66, 3.3.1.67 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.65: Ensure that the DROP VIEW statement cleanly drops its
+# target view.
+# Testcase 3.3.1.A4: Ensure that the DROP VIEW IF EXISTS statement cleanly
+# drops its target view.
+# Testcase 3.3.1.66: Ensure that DROP VIEW <view name> fails, with an appro-
+# priate error message, if the view named does not exist.
+# Testcase 3.3.1.67: Ensure that DROP VIEW IF EXISTS <view name> does not fail,
+# but merely returns an appropriate warning, if the view
+# named does not exist.
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS test.v1 ;
+--enable_warnings
+eval CREATE TABLE t1 ( f1 VARCHAR(1000) ) ENGINE = $engine_type ;
+CREATE VIEW v1 AS SELECT f1 FROM t1;
+
+# DROP VIEW
+DROP VIEW v1;
+--error ER_UNKNOWN_VIEW
+DROP VIEW v1;
+
+CREATE VIEW v1 AS SELECT f1 FROM t1;
+# DROP VIEW IF EXISTS
+DROP VIEW IF EXISTS v1;
+DROP VIEW IF EXISTS v1;
+
+
+let $message= Testcase 3.3.1.68 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.1.68: Ensure that DROP VIEW <view name>, DROP VIEW <view name>
+# RESTRICT, and DROP VIEW <view name> CASCADE all take
+# exactly the same action, until such time as the RESTRICT
+# and CASCADE keyword actions are implemented by MySQL.
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1_base ;
+DROP VIEW IF EXISTS v1_top ;
+--enable_warnings
+CREATE TABLE t1 ( f1 DOUBLE);
+
+--disable_query_log
+SET @part1= '';
+SET @part2= 'RESTRICT';
+SET @part3= 'CASCADE';
+--enable_query_log
+
+let $num1= 3;
+while ($num1)
+{
+
+ CREATE VIEW v1_base AS SELECT * FROM t1;
+ CREATE VIEW v1_top AS SELECT * FROM v1_base;
+ --disable_query_log
+ let $aux1= `SELECT CONCAT('DROP VIEW v1_top ', @v1_part)` ;
+ let $aux2= `SELECT CONCAT('DROP VIEW v1_base ', @v1_part)` ;
+ eval SET @v1_part= @part$num1;
+ --enable_query_log
+
+ # 1. more non important sub testcase, where the view (v1_top) is not the base of
+ # another object
+ # DROP VIEW v1_top < |RESTRICD|CASCADE> must be successful.
+ eval $aux1 ;
+ # Check, that v1_top really no more exists + cleanup for the second sub test
+ --error ER_UNKNOWN_VIEW
+ DROP VIEW v1_top;
+
+ CREATE VIEW v1_top AS SELECT * FROM v1_base;
+ # 2. more important sub testcase, where the view (v1_base) is the base of
+ # another object (v1_top)
+ # DROP VIEW v1_base < |RESTRICT|CASCADE>
+ # If the RESTRICT and CASCADE keyword actions are implemented by MySQL,
+ # CASCADE will remove v1_base and the dependend view v1_top and
+ # RESTRICT will fail, because there exists the dependend view v1_top
+ eval $aux2 ;
+ # Check, if v1_base and v1_top exist + cleanup for next loop
+ DROP VIEW v1_base;
+ DROP VIEW v1_top;
+
+ dec $num1;
+}
+
+
+let $message= Testcase 3.3.1.69, 3.3.1.70, 3.3.1.A5 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcases : Ensure that, when a view is dropped, its definition no longer
+# appears when a
+# 3.3.1.69 SHOW CREATE VIEW, SHOW CREATE TABLE, SHOW TABLE STATUS,
+# SHOW TABLE
+# 3.3.1.70 CHECK TABLE statement is executed
+# 3.3.1.A5 SHOW COLUMNS, SHOW FIELDS, DESCRIBE, EXPLAIN
+# statement is executed
+###############################################################################
+# Note(mleich): There will be no non failing sub testcases with SHOW here.
+# They will be done in 3.3.11 ff.
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+eval CREATE TABLE t1 (f59 INT, f60 INT, f61 INT) ENGINE = $engine_type;
+CREATE VIEW v1 AS SELECT * FROM t1;
+DROP VIEW v1 ;
+
+# The negative tests:
+# SELECT
+--error ER_NO_SUCH_TABLE
+SELECT * FROM v1 ;
+#
+--error ER_NO_SUCH_TABLE
+SHOW CREATE VIEW v1 ;
+--error ER_NO_SUCH_TABLE
+SHOW CREATE TABLE v1 ;
+# Attention: Like is a filter. So we will get an empty result set here.
+SHOW TABLE STATUS like 'v1' ;
+SHOW TABLES LIKE 'v1';
+--error ER_NO_SUCH_TABLE
+SHOW COLUMNS FROM v1;
+--error ER_NO_SUCH_TABLE
+SHOW FIELDS FROM v1;
+CHECK TABLE v1;
+--error ER_NO_SUCH_TABLE
+DESCRIBE v1;
+--error ER_NO_SUCH_TABLE
+EXPLAIN SELECT * FROM v1;
+
+Use test;
+
+let $message= Testcase 3.3.1.A6 ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcases 3.3.1.A6 : Ensure that nested views up to level @max_level work.
+###############################################################################
+# 1. Simple nested VIEWs
+# Configurable parameter @max_level = nesting level
+# 128 must be good enough, it is already a pathologic value.
+# We currently set it to 32, because of performance issues.
+--disable_query_log
+SET @max_level= 32;
+--enable_query_log
+--disable_warnings
+DROP DATABASE IF EXISTS test3;
+--enable_warnings
+CREATE DATABASE test3;
+eval CREATE TABLE test3.t1 (f1 DECIMAL(5,3)) ENGINE = $engine_type;
+INSERT INTO test3.t1 SET f1 = 1.0;
+CREATE VIEW test3.v0 AS SELECT * FROM test3.t1;
+
+let $level= 1;
+let $run= 1;
+while ($run)
+{
+ --disable_query_log
+ eval SET @aux = $level - 1;
+ --enable_query_log
+ let $sublevel= `SELECT @aux`;
+
+ eval CREATE VIEW test3.v$level AS SELECT * FROM test3.v$sublevel;
+
+ # DEBUG Please set $debug to 1, if the statements on the toplevel VIEW
+ # (direct after the while loop) show suspicious results.
+ let $debug= 0;
+ if ($debug)
+ {
+ eval SHOW CREATE VIEW test3.v$level;
+ eval SELECT * FROM test3.v$level;
+ eval EXPLAIN SELECT * FROM test3.v$level;
+ }
+
+ --disable_query_log
+ eval SET @aux = @max_level > $level;
+ --enable_query_log
+ inc $level;
+ # DEBUG
+ # eval SELECT @aux AS "@aux", $level AS "next level";
+
+ let $run= `SELECT @aux`;
+}
+#--------------------------------------------------------------------------
+# Attention: If the following statements get suspicious/unexpected results
+# and you assume that something with the non toplevel VIEWs might
+# be wrong, please edit the while loop above and set $debug to 1.
+#--------------------------------------------------------------------------
+# 1.1 Check of top level VIEW
+--disable_ps2_protocol
+let $toplevel= `SELECT @max_level`;
+eval SHOW CREATE VIEW test3.v$toplevel;
+eval SELECT * FROM test3.v$toplevel;
+eval EXPLAIN SELECT * FROM test3.v$toplevel;
+
+# 1.2 Check the top level view when a base VIEW is dropped
+DROP VIEW test3.v0;
+eval SHOW CREATE VIEW test3.v$toplevel;
+--error ER_VIEW_INVALID
+eval SELECT * FROM test3.v$toplevel;
+--error ER_VIEW_INVALID
+eval EXPLAIN SELECT * FROM test3.v$toplevel;
+--enable_ps2_protocol
+
+# 2. Complicated nested VIEWs
+# parameter @max_level = nesting level
+# There is a limit(@join_limit = 61) for the number of tables which
+# could be joined. This limit will be reached, when we set
+# @max_level = @join_limit - 1 .
+--disable_query_log
+#++++++++++++++++++++++++++++++++++++++++++++++
+# OBN - Reduced the value of join limit to 30
+# Above seems to hang - FIXME
+# mleich - Reason unclear why it hangs for OBN on innodb and memory.
+# Hypothesis: Maybe the consumption of virtual memory is high
+# and OBN's box performs excessive paging.
+# (RAM: OBN ~384MB RAM, mleich 1 GB)
+#++++++++++++++++++++++++++++++++++++++++++++++
+let $message= FIXME - Setting join_limit to 28 - hangs for higher values;
+--source include/show_msg.inc
+#SET @join_limit = 61;
+SET @join_limit = 28; # OBN - see above
+SET @max_level = @join_limit - 1;
+--enable_query_log
+
+--disable_warnings
+DROP DATABASE IF EXISTS test3;
+DROP TABLE IF EXISTS test1.t1;
+DROP TABLE IF EXISTS test2.t1;
+let $level= `SELECT @max_level + 1`;
+while ($level)
+{
+ dec $level;
+
+ eval DROP VIEW IF EXISTS test1.v$level;
+}
+--enable_warnings
+CREATE DATABASE test3;
+
+# Testplan for the content of the tables:
+# ---------------------------------------------------------
+# Records test1.t1 test2.t1 test3.t1
+# NULL, 'numeric column is NULL' yes yes yes
+# 0 , NULL yes yes yes
+# 5 , 'five' yes yes yes
+# 1 , 'one' yes yes no
+# 2 , 'two' yes no yes
+# 3 , 'three' no yes yes
+
+USE test1;
+eval CREATE TABLE t1 (f1 BIGINT, f2 CHAR(50)) ENGINE = $engine_type ;
+INSERT INTO t1 VALUES (NULL, 'numeric column is NULL');
+INSERT INTO t1 VALUES (0, NULL);
+INSERT INTO t1 VALUES (5, 'five');
+
+INSERT INTO t1 VALUES (1, 'one');
+INSERT INTO t1 VALUES (2, 'two');
+
+USE test2;
+eval CREATE TABLE t1 (f1 DECIMAL(64,30), f2 VARCHAR(50)) ENGINE = $engine_type;
+INSERT INTO t1 VALUES (NULL, 'numeric column is NULL');
+INSERT INTO t1 VALUES (0.000000000000000000000000000000, NULL);
+INSERT INTO t1 VALUES (5.000000000000000000000000000000, 'five');
+
+INSERT INTO t1 VALUES (+1.000000000000000000000000000000, 'one');
+INSERT INTO t1 VALUES (3.000000000000000, 'three');
+
+USE test3;
+eval CREATE TABLE t1 (f1 DOUBLE, f2 VARBINARY(50)) ENGINE = $engine_type;
+INSERT INTO t1 VALUES (NULL, 'numeric column is NULL');
+INSERT INTO t1 VALUES (+0.0E-35, NULL);
+INSERT INTO t1 VALUES (+0.5E+1, 'five');
+
+INSERT INTO t1 VALUES (20.0E-1, 'two');
+INSERT INTO t1 VALUES (0.0300E2, 'three');
+
+USE test;
+
+CREATE OR REPLACE VIEW test1.v0 AS SELECT * FROM test2.t1;
+
+--disable_query_log
+SET @max_level = IFNULL(@limit1,@max_level);
+--enable_query_log
+let $level= 1;
+let $run= 1;
+while ($run)
+{
+ --disable_query_log
+ eval SET @aux = $level - 1;
+ let $sublevel= `SELECT @aux`;
+ eval SET @AUX = $level MOD 3 + 1;
+ let $dbnum= `SELECT @AUX`;
+ --enable_query_log
+
+ eval CREATE OR REPLACE VIEW test1.v$level AS SELECT f1, f2
+ FROM test$dbnum.t1 tab1 NATURAL JOIN test1.v$sublevel tab2;
+
+ # DEBUG Please set $debug to 1, if the statements on the toplevel VIEW
+ # (direct after the while loop) show suspicious results.
+ let $debug= 0;
+ if ($debug)
+ {
+ eval SHOW CREATE VIEW test1.v$level;
+ eval SELECT * FROM test1.v$level;
+ eval SELECT f1, f2
+ FROM test$dbnum.t1 tab1 NATURAL JOIN test1.v$sublevel tab2;
+ eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$level;
+ eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$level;
+ }
+
+ --disable_query_log
+ eval SET @aux = @max_level > $level;
+ --enable_query_log
+ inc $level;
+ # DEBUG
+ # eval SELECT @aux AS "@aux", $level AS "next level";
+
+ let $run= `SELECT @aux`;
+}
+
+#--------------------------------------------------------------------------
+# Atention: If the following statements get suspicious/unexpected results
+# and you assume that something with the non toplevel VIEWs might
+# be wrong, please edit the while loop above and set $debug to 1.
+#--------------------------------------------------------------------------
+# 2.1 Check of top level VIEW
+let $toplevel= `SELECT @max_level`;
+# Show should be easy
+eval SHOW CREATE VIEW test1.v$toplevel;
+# SELECT is much more complicated
+--disable_ps2_protocol
+eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+--enable_ps2_protocol
+let $message= The output of following EXPLAIN is deactivated, because the result
+ differs on some platforms
+ FIXME Is this a bug ? ;
+--source include/show_msg80.inc
+if (1)
+{
+--disable_result_log
+}
+# EXPLAIN might be the hell
+eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+if (1)
+{
+--enable_result_log
+}
+
+# 2.2 Check of top level VIEW when join limit is exceeded
+# Exceed the limit for the number of tables which could be joined.
+let $level= `SELECT @max_level + 1`;
+let $sublevel= `SELECT @max_level`;
+eval CREATE VIEW test1.v$level AS SELECT f1, f2
+ FROM test3.t1 tab1 NATURAL JOIN test1.v$sublevel tab2;
+eval SHOW CREATE VIEW test1.v$level;
+# the following line as written as '--eror ER_TOO_MANY_TABLES' and the command
+# is successful so assuming no expected error was intended
+# --error ER_TOO_MANY_TABLES
+eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$level;
+let $message= The output of following EXPLAIN is deactivated, because the result
+ differs on some platforms
+ FIXME Is this a bug ? ;
+--source include/show_msg80.inc
+if (1)
+{
+--disable_result_log
+}
+# the following line as written as '--eror ER_TOO_MANY_TABLES' and the command
+# is successful so assuming no expected error was intended
+# --error ER_TOO_MANY_TABLES
+eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$level;
+if (1)
+{
+--enable_result_log
+}
+eval DROP VIEW IF EXISTS test1.v$level;
+
+# 2.3 Create a logical wrong (data type "garbage") base for the upper views
+# and check the behaviour of the top level view.
+# 2.3.1 Exchange numeric and string column
+--disable_result_log
+CREATE OR REPLACE VIEW test1.v0 AS
+SELECT f1 as f2, f2 as f1 FROM test2.t1;
+# 2.3.2 DATE instead of numeric
+CREATE OR REPLACE VIEW test2.v0 AS
+SELECT CAST('0001-01-01' AS DATE) as f1, f2 FROM test3.t1;
+eval SHOW CREATE VIEW test1.v$toplevel;
+eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+# 2.3.3 UCS2 string instead of common string
+CREATE OR REPLACE VIEW test3.v0 AS
+SELECT f1 , CONVERT('ßÄäÖöÜü§' USING UCS2) as f2 FROM test1.t1;
+eval SHOW CREATE VIEW test1.v$toplevel;
+eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+
+# 2.3.4 UCS2 string instead of numeric
+CREATE OR REPLACE VIEW test3.v0 AS
+SELECT CONVERT('ßÄäÖöÜü§' USING UCS2) as f1, f2 FROM test1.t1;
+eval SHOW CREATE VIEW test1.v$toplevel;
+eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1,
+ CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;
+--enable_result_log
+
+# Cleanup
+let $level= `SELECT @max_level + 1`;
+while ($level)
+{
+ dec $level;
+
+eval DROP VIEW IF EXISTS test1.v$level;
+
+}
+DROP DATABASE test3;
+DROP TABLE test1.t1;
+DROP TABLE test2.t1;
+
+#==============================================================================
+# 3.3.2 Updatable and Insertable-into views:
+#==============================================================================
+Use test;
+
+let $message= Testcase 3.3.2.1;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.1: Ensure that every view which may theoretically accept new
+# rows via the INSERT statement does, in fact, do so.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+Create View test.v1 AS SELECT f59,f60 FROM tb2 where f59 = 1995 ;
+--enable_info
+INSERT INTO test.v1 (f59,f60) values (879,700) ;
+--disable_info
+SELECT f59,f60 FROM test.v1 where f59 = 879 and f60 = 700 ;
+DELETE FROM tb2 where f59 = 879 and f60 = 700 ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.2.2;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.2: Ensure that, for every row inserted into a view,
+# the correct new data also appears in every relevant
+# underlying table.
+###############################################################################
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+Create view test.v1 AS SELECT f59,f60,f61 FROM tb2 ;
+--enable_info
+INSERT INTO test.v1 ( f59 , f60 ) values (2005,0101) ;
+--disable_info
+
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM tb2 where f59 = 2005 and f60 = 0101 ;
+--horizontal_results
+--enable_ps_protocol
+SELECT f59,f60 FROM test.v1 where f59 = 2005 and f60 = 0101 ;
+DELETE FROM tb2 where f59 = 2005 and f60 = 0101 ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.2.3;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.3: Ensure that every view which may theoretically accept data
+# changes via the UPDATE statement does, in fact, do so.
+###############################################################################
+Insert into tb2 (f59,f60,f61) values (780,105,106) ;
+
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+
+CREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 ;
+--enable_info
+UPDATE test.v1 SET f59 = 8 WHERE f59 = 780 and f60 = 105;
+--disable_info
+
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM tb2 where f59 = 8 and f60 = 105;
+--horizontal_results
+--enable_ps_protocol
+SELECT f59,f60 FROM test.v1 where f59 = 8 and f60 = 105 ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.2.4;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.4: Ensure that, for data values updated within a view, the
+# correct new data also appears in every relevant
+# underlying table.
+###############################################################################
+Insert into tb2 (f59,f60,f61) values (781,105,106) ;
+
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 ;
+--enable_info
+UPDATE test.v1 SET f59 = 891 WHERE f60 = 105 ;
+--disable_info
+
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM tb2 where f59 = 891 and f60 = 105;
+--horizontal_results
+--enable_ps_protocol
+SELECT f59,f60 FROM test.v1 where f59 = 891 and f60 = 105 ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.2.5;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.5: Ensure that every view which may theoretically accept data
+# deletions via the DELETE statement does, in fact, do so.
+###############################################################################
+Insert into tb2 (f59,f60,f61) values (789,105,106) ;
+
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 where f59 = 789 ;
+--enable_info
+DELETE FROM test.v1 where f59 = 789 ;
+--disable_info
+SELECT * FROM tb2 where f59 = 789 ;
+SELECT f59,f60 FROM test.v1 where f59 = 789 order by f60 ;
+
+Drop view test.v1 ;
+
+
+let $message= Testcase 3.3.2.6;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.6: Ensure that, for data rows deleted from a view, the correct
+# rows have also been deleted from every relevant
+# underlying table.
+###############################################################################
+Insert into tb2 (f59,f60,f61) values (711,105,106) ;
+
+--disable_warnings
+Drop view if exists test.v1 ;
+--enable_warnings
+CREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 where f59 = 711 ;
+--enable_info
+DELETE FROM test.v1 where f59 = 711 ;
+--disable_info
+
+SELECT * FROM tb2 where f59 = 711 ;
+SELECT f59,f60 FROM test.v1 where f59 = 711 order by f60 ;
+
+Drop view test.v1 ;
+
+let $message= Testcase 3.3.2.1 - 3.3.2.6 alternative implementation;
+--source include/show_msg80.inc
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+
+CREATE TABLE t1 ( f1 BIGINT DEFAULT 0, f2 CHAR(20), f3 NUMERIC(7,4),
+ f4 CHAR, PRIMARY KEY(f1));
+
+# VIEW including the base table PRIMARY KEY, but not all base table columns (f4)
+# no additional columns
+CREATE VIEW v1 AS SELECT f1, f2, f3 FROM t1;
+
+# Incomplete INSERT 1
+# - f2 missing
+# - PRIMARY KEY f1 included
+# f2 gets the default NULL
+INSERT INTO v1 SET f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+
+# Incomplete INSERT 2
+# - f2 included
+# - PRIMARY KEY f1 missing
+# f1 gets the default 0, because we are in the native sql_mode
+INSERT INTO v1 SET f2 = 'ABC';
+# f1 gets the default 0, but this value is already exists
+# OBN change for 5.1.21 --error ER_DUP_ENTRY_WITH_KEY_NAME
+--error ER_DUP_ENTRY
+INSERT INTO v1 SET f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+
+# Testplan for DELETE:
+#
+# Column within WHERE qualification
+# f1 (PK)
+# f2 (non PK)
+# none
+#
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f1
+DELETE FROM v1 WHERE f1 = 1;
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f2
+DELETE FROM v1 WHERE f2 = 'ABC';
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE none
+DELETE FROM v1;
+SELECT * from t1;
+
+# Testplan for UPDATE:
+# Column to modify Column within WHERE qualification
+# f1 (PK) f1(PK + same column to modify)
+# f1 (PK) f2
+# f1 (PK) none
+# f2 (non PK) f1(PK)
+# f2 (non PK) f2(non PK + same column to modify)
+# f2 (non PK) f3(non PK)
+# f2 (non PK) none
+# f1,f2 f1,f2
+#
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - f1
+UPDATE v1 SET f1 = 2 WHERE f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - f2
+UPDATE v1 SET f1 = 2 WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - none
+UPDATE v1 SET f1 = 2;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f1
+UPDATE v1 SET f2 = 'NNN' WHERE f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f2
+UPDATE v1 SET f2 = 'NNN' WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f3
+UPDATE v1 SET f2 = 'NNN' WHERE f3 = -1.2E-3;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - none
+UPDATE v1 SET f2 = 'NNN';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1,f2 - f1,f2
+UPDATE v1 SET f1 = 2, f2 = 'NNN' WHERE f1 = 1 AND f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+
+
+DROP VIEW v1;
+# VIEW without the PRIMARY KEY f1 of the base table
+# no additional columns
+CREATE VIEW v1 AS SELECT f2, f3 FROM t1;
+
+# INSERT
+# - PRIMARY KEY f1 missing in VIEW definition
+# f1 gets the default 0, because we are in the native sql_mode
+INSERT INTO v1 SET f2 = 'ABC';
+# f1 gets the default 0 and this value is already exists
+# OBN change for 5.1.21 --error ER_DUP_ENTRY_WITH_KEY_NAME
+--error ER_DUP_ENTRY
+INSERT INTO v1 SET f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+
+# Testplan for DELETE:
+#
+# Column within WHERE qualification
+# f2 (non PK)
+# none
+#
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f2
+DELETE FROM v1 WHERE f2 = 'ABC';
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE none
+DELETE FROM v1;
+SELECT * from t1;
+
+# Testplan for UPDATE:
+#
+# Column to modify Column within WHERE qualification
+# f2 (non PK) f2(non PK + same column to modify)
+# f2 (non PK) f3(non PK)
+# f2 (non PK) none
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f2
+UPDATE v1 SET f2 = 'NNN' WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f3
+UPDATE v1 SET f2 = 'NNN' WHERE f3 = -1.2E-3;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - none
+UPDATE v1 SET f2 = 'NNN';
+SELECT * from t1;
+DELETE FROM t1;
+
+
+DROP VIEW v1;
+# VIEW with the PRIMARY KEY f1 of the base table
+# but additional constant column
+CREATE VIEW v1 AS SELECT f1, f2, f3, 'HELLO' AS my_greeting FROM t1;
+
+# Maybe the SQL standard allows the following INSERT.
+# But it would be a very sophisticated DBMS.
+--error ER_NON_INSERTABLE_TABLE
+INSERT INTO v1 SET f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+# The next INSERTs should never work, because my_greeting is a constant.
+--error ER_NON_INSERTABLE_TABLE
+INSERT INTO v1 SET f1 = 1, my_greeting = 'HELLO';
+SELECT * from t1;
+DELETE FROM t1;
+
+# Testplan for DELETE:
+#
+# Column within WHERE qualification
+# f1 (PK)
+# f2 (non PK)
+# my_greeting(non base table column)
+# none
+#
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f1
+DELETE FROM v1 WHERE f1 = 1;
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f2
+DELETE FROM v1 WHERE f2 = 'ABC';
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE my_greeting
+DELETE FROM v1 WHERE my_greeting = 'HELLO';
+SELECT * from t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE none
+DELETE FROM v1;
+SELECT * from t1;
+
+
+# Testplan for UPDATE:
+#
+# Column to modify Column within WHERE qualification
+# f1 (PK) f1(PK + same column to modify)
+# f1 (PK) f2
+# f1 (PK) my_greeting(non base table column)
+# f1 (PK) none
+# f2 (non PK) f1(PK)
+# f2 (non PK) f2(non PK + same column to modify)
+# f2 (non PK) f3(non PK)
+# f2 (non PK) my_greeting(non base table column)
+# f2 (non PK) none
+# my_greeting(non base table column) f1(PK)
+# my_greeting(non base table column) f2(non PK)
+# my_greeting(non base table column) my_greeting(same non base table column)
+# my_greeting(non base table column) none
+# f1,f2 f1,f2
+#
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - f1
+UPDATE v1 SET f1 = 2 WHERE f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - f2
+UPDATE v1 SET f1 = 2 WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - my_greeting
+UPDATE v1 SET f1 = 2 WHERE my_greeting = 'HELLO';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - none
+UPDATE v1 SET f1 = 2;
+SELECT * from t1;
+DELETE FROM t1;
+#------------------------------------------------
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f1
+UPDATE v1 SET f2 = 'NNN' WHERE f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f2
+UPDATE v1 SET f2 = 'NNN' WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - f3
+UPDATE v1 SET f2 = 'NNN' WHERE f3 = -1.2E-3;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - my_greeting
+UPDATE v1 SET f2 = 'NNN' WHERE my_greeting = 'HELLO';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f2 - none
+UPDATE v1 SET f2 = 'NNN';
+SELECT * from t1;
+DELETE FROM t1;
+#------------------------------------------------
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE my_greeting - f1
+--error ER_NONUPDATEABLE_COLUMN
+UPDATE v1 SET my_greeting = 'Hej' WHERE f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE my_greeting - f2
+--error ER_NONUPDATEABLE_COLUMN
+UPDATE v1 SET my_greeting = 'Hej' WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE my_greeting - my_greeting
+--error ER_NONUPDATEABLE_COLUMN
+UPDATE v1 SET my_greeting = 'Hej' WHERE my_greeting = 'HELLO';
+SELECT * from t1;
+DELETE FROM t1;
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE my_greeting - none
+--error ER_NONUPDATEABLE_COLUMN
+UPDATE v1 SET my_greeting = 'Hej';
+SELECT * from t1;
+DELETE FROM t1;
+#------------------------------------------------
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1, f2 - f1, f2
+UPDATE v1 SET f1 = 2, f2 = 'NNN' WHERE f1 = 1 AND f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+
+
+DROP TABLE t1;
+SET sql_mode = 'traditional';
+CREATE TABLE t1 ( f1 BIGINT, f2 CHAR(20), f3 NUMERIC(7,4) NOT NULL,
+ f4 CHAR, PRIMARY KEY(f1));
+# VIEW including the base table PRIMARY KEY, but not the NOT NULL
+# base table column (f3)
+# no additional columns
+DROP VIEW v1;
+CREATE VIEW v1 AS SELECT f1, f2, f4 FROM t1;
+
+# This INSERT must fail
+--error ER_NO_DEFAULT_FOR_VIEW_FIELD
+INSERT INTO v1 SET f1 = 1;
+SELECT * from t1;
+DELETE FROM t1;
+
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# DELETE f1
+DELETE FROM v1 WHERE f1 = 1;
+
+INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');
+# UPDATE f1 - f2
+UPDATE v1 SET f4 = 'Y' WHERE f2 = 'ABC';
+SELECT * from t1;
+DELETE FROM t1;
+
+# Switch back to the native SQL mode
+SET sql_mode = '';
+
+
+
+let $message= Testcases 3.3.2.7 - 3.3.2.9,
+ 3.3.2.10 - 3.3.2.11 omitted because of missing
+ features EXCEPT and INTERSECT ;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.7: Ensure that a view with a definition that includes
+# UNION
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.8: Ensure that a view with a definition that includes
+# UNION DISTINCT
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.9: Ensure that a view with a definition that includes
+# UNION ALL
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.10: Ensure that a view with a definition that includes
+# EXCEPT
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# (Note: MySQL does not support EXCEPT at this time;
+# this test is for the future.)
+# Testcase 3.3.2.11: Ensure that a view with a definition that includes
+# INTERSECT
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# (Note: MySQL does not support INTERSECT at this time;
+# this test is for the future.)
+#
+# Summary of 3.3.2.7 - 3.3.2.11
+# Ensure that a view with a definition that includes
+# UNION or UNION DISTINCT or UNION ALL or EXCEPT or INTERSECT
+# rejects any INSERT or UPDATE or DELETE statement with an
+# appropriate error message
+#
+# mleich: I assume the type of the storage engine does not play any role.
+###############################################################################
+INSERT INTO tb2 (f59,f60,f61) VALUES (77,185,126) ;
+INSERT INTO tb2 (f59,f60,f61) VALUES (59,58,54) ;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1 ;
+DROP VIEW IF EXISTS v1 ;
+--enable_warnings
+CREATE TABLE t1 (f59 INT, f60 INT, f61 INT) ;
+INSERT INTO t1 VALUES (19,41,32) ;
+INSERT INTO t1 VALUES (59,54,71) ;
+INSERT INTO t1 VALUES (21,91,99) ;
+
+SET @variant1 = 'UNION ';
+SET @variant2 = 'UNION ALL ';
+SET @variant3 = 'UNION DISTINCT ';
+SET @variant4 = 'EXCEPT ';
+SET @variant5 = 'INTERSECT ';
+
+# Attention: Set $num to 5, when EXCEPT and INTERSECT is supported
+let $num= 3;
+while ($num)
+{
+ --disable_query_log
+ eval SET @variant= @variant$num;
+ let $aux= `SELECT CONCAT('CREATE VIEW v1 AS ',
+ 'SELECT f61 FROM tb2 WHERE f59=59 ',
+ @variant,
+ 'SELECT f61 FROM t1 WHERE f59=19')`;
+ --enable_query_log
+ # $aux contains the CREATE VIEW statement
+ eval $aux;
+ --error ER_NON_INSERTABLE_TABLE
+ INSERT INTO v1 VALUES (3000);
+ --error ER_NON_UPDATABLE_TABLE
+ UPDATE v1 SET f61 = 100 WHERE f61 = 32;
+ --error ER_NON_UPDATABLE_TABLE
+ DELETE FROM v1;
+ DROP VIEW v1 ;
+
+ dec $num;
+}
+
+
+let $message= Testcases 3.3.2.12 - 3.3.2.20;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.2.12: Ensure that a view with a definition that includes
+# DISTINCT
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.13: Ensure that a view with a definition that includes
+# DISTINCTROW
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.14: Ensure that a view with a definition that includes
+# a set function
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.15: Ensure that a view with a definition that includes
+# GROUP BY
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.16: Ensure that a view with a definition that includes
+# HAVING
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.17: Ensure that a view with a definition that includes
+# a subquery in the select list
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.18: Ensure that a view with a definition that includes
+# a reference to a non-updatable view
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.19: Ensure that a view with a definition that includes
+# a WHERE clause subquery that refers to a table also
+# referenced in a FROM clause
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+# Testcase 3.3.2.20: Ensure that a view with a definition that includes
+# ALGORITHM = TEMPTABLE
+# rejects all INSERT, UPDATE, or DELETE attempts
+# with an appropriate error message.
+#
+# Summary of 3.3.2.12 - 3.3.2.20:
+# Ensure that a view with a definition that includes
+# DISTINCT 3.3.2.12
+# DISTINCTROW 3.3.2.13
+# SET 3.3.2.14
+# GROUP BY 3.3.2.15
+# HAVING 3.3.2.16
+# a sub query in the select list 3.3.2.17
+# a reference to a non-updateable view 3.3.2.18
+# a WHERE clause sub query that refers to a table also referenced in a
+# FROM clause 3.3.2.19
+# ALGORITHM = TEMPTABLE 3.3.2.20
+# rejects
+# any INSERT or UPDATE or DELETE statement
+# with an appropriate error message.
+#
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2 ;
+DROP VIEW IF EXISTS test.v1 ;
+Drop view if exists v2 ;
+--enable_warnings
+
+CREATE TABLE t1 (f59 int, f60 int, f61 int) ;
+INSERT INTO t1 VALUES (19,41,32) ;
+INSERT INTO t1 VALUES (59,54,71) ;
+INSERT INTO t1 VALUES (21,91,99) ;
+CREATE TABLE t2 (f59 int, f60 int, f61 int) ;
+INSERT INTO t2 VALUES (19,41,32) ;
+INSERT INTO t2 VALUES (59,54,71) ;
+INSERT INTO t2 VALUES (21,91,99) ;
+CREATE VIEW v2 AS SELECT f59, f60, f61 FROM t2 LIMIT 5;
+
+# For DISTINCT 3.3.2.12
+SET @variant1= 'CREATE VIEW v1 AS SELECT DISTINCT(f61) FROM t1';
+# For DISTINCTROW 3.3.2.13
+SET @variant2= 'CREATE VIEW v1 AS SELECT DISTINCTROW(f61) FROM t1';
+# For SET 3.3.2.14
+SET @variant3= 'CREATE VIEW v1 AS SELECT SUM(f59) AS f61 FROM t1';
+# For GROUP BY 3.3.2.15
+SET @variant4= 'CREATE VIEW v1 AS SELECT f61 FROM t1 GROUP BY f61';
+# For HAVING 3.3.2.16
+SET @variant5= 'CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0';
+# For a WHERE clause sub query that refers to a table also referenced in a
+# FROM clause 3.3.2.18
+SET @variant6= 'CREATE VIEW v1 AS SELECT f61 FROM v2';
+SET @variant7= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)';
+# For ALGORITHM = TEMPTABLE 3.3.2.20
+SET @variant8= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1';
+
+let $num= 8;
+while ($num)
+{
+ --disable_abort_on_error
+ --disable_query_log
+ eval SET @variant= @variant$num;
+ let $aux= `SELECT @variant`;
+ --enable_query_log
+
+ # CREATE VIEW v1 ...
+ eval $aux;
+
+ --error ER_NON_INSERTABLE_TABLE
+ INSERT INTO v1 VALUES (1002);
+ # --error ER_NON_UPDATABLE_TABLE, ER_UPDATE_TABLE_USED
+
+ --error ER_NON_UPDATABLE_TABLE
+ UPDATE v1 SET f61=1007;
+ --error ER_NON_UPDATABLE_TABLE
+ DELETE FROM v1;
+ DROP VIEW v1;
+ dec $num;
+}
+# For a sub query in the select list 3.3.2.17
+CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1;
+--error ER_NON_INSERTABLE_TABLE
+INSERT INTO v1 VALUES (1002);
+--error ER_NONUPDATEABLE_COLUMN
+UPDATE v1 SET f61=1007;
+# no error ER_NON_UPDATABLE_TABLE, because we can find columns for deleting
+DELETE FROM v1;
+DROP VIEW v1;
+
+Drop TABLE t1, t2 ;
+Drop VIEW v2 ;
+
+
+let $message= Testcases 3.3.A1;
+--source include/show_msg80.inc
+###############################################################################
+# Testcase 3.3.A1: Check the effects of base table modifications on an already
+# existing VIEW
+#
+# Attention: Many modifications are logical non sense.
+# The consequence is in many cases a "garbage in garbage out" effect.
+#
+# There is no specification of the intended behaviour within
+# the MySQL manual. That means I assume the observed effects are
+# no bug as long we do not get a crash or obviously non
+# reasonable results.
+###############################################################################
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+DROP VIEW IF EXISTS v1;
+DROP VIEW IF EXISTS v2;
+--enable_warnings
+
+eval CREATE TABLE t1 (f1 BIGINT, f2 DATE DEFAULT NULL, f4 CHAR(5),
+ report char(10)) ENGINE = $engine_type;
+CREATE VIEW v1 AS SELECT * FROM t1;
+INSERT INTO t1 SET f1 = -1, f4 = 'ABC', report = 't1 0';
+INSERT INTO v1 SET f1 = -1, f4 = 'ABC', report = 'v1 0';
+
+# 0. Initial state
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 1. Name of one base table column is altered
+ALTER TABLE t1 CHANGE COLUMN f4 f4x CHAR(5);
+INSERT INTO t1 SET f1 = 0, f4x = 'ABC', report = 't1 1';
+--error ER_VIEW_INVALID
+INSERT INTO v1 SET f1 = 0, f4 = 'ABC', report = 'v1 1';
+--error ER_BAD_FIELD_ERROR
+INSERT INTO v1 SET f1 = 0, f4x = 'ABC', report = 'v1 1a';
+--error ER_VIEW_INVALID
+INSERT INTO v1 SET f1 = 0, report = 'v1 1b';
+DESCRIBE t1;
+# Bug#12533 crash on DESCRIBE <view> after renaming base table column;
+--error ER_VIEW_INVALID
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+--error ER_VIEW_INVALID
+SELECT * FROM v1 order by f1, report;
+ALTER TABLE t1 CHANGE COLUMN f4x f4 CHAR(5);
+#
+# 2. Length of one base table column is increased
+ALTER TABLE t1 CHANGE COLUMN f4 f4 CHAR(10);
+INSERT INTO t1 SET f1 = 2, f4 = '<-- 10 -->', report = 't1 2';
+INSERT INTO v1 SET f1 = 2, f4 = '<-- 10 -->', report = 'v1 2';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 3. Length of one base table column is reduced
+# We have to mangle within warnings the row numbers, because they are not
+# always deterministic in engines
+--replace_regex /at row [0-9]/at row <some number>/
+ALTER TABLE t1 CHANGE COLUMN f4 f4 CHAR(8);
+INSERT INTO t1 SET f1 = 3, f4 = '<-- 10 -->', report = 't1 3';
+INSERT INTO v1 SET f1 = 3, f4 = '<-- 10 -->', report = 'v1 3';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 4. Type of one base table column is altered string -> string
+ALTER TABLE t1 CHANGE COLUMN f4 f4 VARCHAR(20);
+INSERT INTO t1 SET f1 = 4, f4 = '<------ 20 -------->', report = 't1 4';
+INSERT INTO v1 SET f1 = 4, f4 = '<------ 20 -------->', report = 'v1 4';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 5. Type of one base table column altered numeric -> string
+ALTER TABLE t1 CHANGE COLUMN f1 f1 VARCHAR(30);
+INSERT INTO t1 SET f1 = '<------------- 30 ----------->',
+ f4 = '<------ 20 -------->', report = 't1 5';
+INSERT INTO v1 SET f1 = '<------------- 30 ----------->',
+ f4 = '<------ 20 -------->', report = 'v1 5';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 6. DROP of one base table column
+ALTER TABLE t1 DROP COLUMN f2;
+INSERT INTO t1 SET f1 = 'ABC', f4 = '<------ 20 -------->', report = 't1 6';
+--error ER_VIEW_INVALID
+INSERT INTO v1 SET f1 = 'ABC', f4 = '<------ 20 -------->', report = 'v1 6';
+DESCRIBE t1;
+--error ER_VIEW_INVALID
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+--error ER_VIEW_INVALID
+SELECT * FROM v1 order by f1, report;
+#
+# 7. Recreation of dropped base table column with the same data type like before
+ALTER TABLE t1 ADD COLUMN f2 DATE DEFAULT NULL;
+INSERT INTO t1 SET f1 = 'ABC', f2 = '1500-12-04',
+ f4 = '<------ 20 -------->', report = 't1 7';
+INSERT INTO v1 SET f1 = 'ABC', f2 = '1500-12-04',
+ f4 = '<------ 20 -------->', report = 'v1 7';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 8. Recreation of dropped base table column with a different data type
+# like before
+ALTER TABLE t1 DROP COLUMN f2;
+ALTER TABLE t1 ADD COLUMN f2 FLOAT;
+INSERT INTO t1 SET f1 = 'ABC', f2 = -3.3E-4,
+ f4 = '<------ 20 -------->', report = 't1 8';
+INSERT INTO v1 SET f1 = 'ABC', f2 = -3.3E-4,
+ f4 = '<------ 20 -------->', report = 'v1 8';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 9. Add a column to the base table
+ALTER TABLE t1 ADD COLUMN f3 NUMERIC(7,2);
+INSERT INTO t1 SET f1 = 'ABC', f2 = -3.3E-4,
+ f3 = -2.2, f4 = '<------ 20 -------->', report = 't1 9';
+--error ER_BAD_FIELD_ERROR
+INSERT INTO v1 SET f1 = 'ABC', f2 = -3.3E-4,
+ f3 = -2.2, f4 = '<------ 20 -------->', report = 'v1 9';
+INSERT INTO v1 SET f1 = 'ABC', f2 = -3.3E-4,
+ f4 = '<------ 20 -------->', report = 'v1 9a';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, report;
+SELECT * FROM v1 order by f1, report;
+#
+# 10. VIEW with numeric function is "victim" of data type change
+DROP TABLE t1;
+DROP VIEW v1;
+eval CREATE TABLE t1 (f1 CHAR(10), f2 BIGINT) ENGINE = $engine_type;
+INSERT INTO t1 SET f1 = 'ABC', f2 = 3;
+CREATE VIEW v1 AS SELECT f1, SQRT(f2) my_sqrt FROM t1;
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, f2;
+SELECT * FROM v1 order by 2;
+ALTER TABLE t1 CHANGE COLUMN f2 f2 VARCHAR(30);
+INSERT INTO t1 SET f1 = 'ABC', f2 = 'DEF';
+DESCRIBE t1;
+DESCRIBE v1;
+SELECT * FROM t1 order by f1, f2;
+SELECT * FROM v1 order by 2;
+# Some statements for comparison
+# - the ugly SQRT('DEF') as constant
+SELECT SQRT('DEF');
+# - Will a VIEW based on the same definition show the same result ?
+CREATE VIEW v2 AS SELECT SQRT('DEF');
+SELECT * FROM v2 order by 1;
+# - Will a VIEW v2 created after the base table column recreation show the same
+# result set like v1 ?
+CREATE OR REPLACE VIEW v2 AS SELECT f1, SQRT(f2) my_sqrt FROM t1;
+DESCRIBE v2;
+SELECT * FROM v2 order by 2;
+# - What will be the content of base table created with AS SELECT ?
+CREATE TABLE t2 AS SELECT f1, SQRT(f2) my_sqrt FROM t1;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM t2 order by 2;
+--horizontal_results
+--enable_ps_protocol
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT * FROM v1;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM t2 order by 2;
+--horizontal_results
+--enable_ps_protocol
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT * FROM v2;
+if ($have_bug_32285)
+{
+--disable_ps_protocol
+}
+--vertical_results
+SELECT * FROM t2 order by 2;
+--horizontal_results
+--enable_ps_protocol
+#
+DROP TABLE t1;
+DROP TABLE t2;
+DROP VIEW v1;
+DROP VIEW v2;
+
+
+
+# Clean up
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+DROP VIEW IF EXISTS v1;
+DROP VIEW IF EXISTS v1_1;
+DROP VIEW IF EXISTS v1_2;
+DROP VIEW IF EXISTS v1_firstview;
+DROP VIEW IF EXISTS v1_secondview;
+DROP VIEW IF EXISTS v2;
+DROP DATABASE IF EXISTS test2;
+DROP DATABASE IF EXISTS test3;
+--enable_warnings
+
+# FIXME sub testcases, which might be included, if they fit good into
+# the requirements and the completeness of the tests is increased
+# Bug#10970 Views: dependence on temporary table allowed
+# Bug#4663 constant function in WHERE clause evaluated in view definition
+# Bug#6808 Views: CREATE VIEW v ... FROM t AS v fails
+# Bug#10977 Views: no warning if column name is truncated
+# Bug#9505: Views: privilege needed on underlying function
+
+# --source suite/funcs_1/Views/Views_403x406.test
+# --source suite/funcs_1/Views/Views_407.test
+# --source suite/funcs_1/Views/Views_408x411.test
+
+
+