|
|
#### suite/funcs_1/views/views_master.test
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#11589: mysqltest, --ps-protocol, strange output, float/double/real with zerofill# is not fixed, we must switch the ps-protocol for some statements off.# 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_11589= 1;if ($have_bug_11589){ let $message= There are some statements where the ps-protocol is switched off. Bug#11589: mysqltest, --ps-protocol, strange output, float/double/real with zerofill; --source include/show_msg80.inc}
let $message= ! Attention: The file with the expected results suffers fromBug#10713: mysqldump includes database in create view and referenced tables;--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 (ML)# - 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.1insert 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.45insert 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.46insert 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.47insert into test.tb2 (f59,f60) values(0987,41) ;insert into test.tb2 (f59,f60) values(7876,74) ;# Testcase 3.3.1.52INSERT INTO tb2 (f59,f61) VALUES(321,765 );INSERT INTO tb2 (f59,f61) VALUES(9112,8771);# Testcase 3.3.1.53INSERT 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.A1Insert into tb2 (f59,f60,f61) values (107,105,106) ;Insert into tb2 (f59,f60,f61) values (109,108,104) ;# Testcase 3.3.1.A2Insert into tb2 (f59,f60,f61) values (207,205,206) ;Insert into tb2 (f59,f60,f61) values (209,208,204) ;# Testcase 3.3.1.A3Insert into tb2 (f59,f60,f61) values (27,25,26) ;Insert into tb2 (f59,f60,f61) values (29,28,24) ;# Testcase 3.3.1.63Insert 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.64INSERT INTO tb2 (f59,f60) VALUES( 299,899 );INSERT INTO tb2 (f59,f60) VALUES( 242,79 );INSERT INTO tb2 (f59,f60) VALUES( 424,89 );##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_warningsDrop table if exists t1;--enable_warningsCreate 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 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 limit 0,10;
#(03) CREATE or REPLACE VIEW v1 AS select f59,f60,f61 FROM test.tb2 limit 4,3; select * FROM v1 limit 0,10;
#(04) CREATE or REPLACE VIEW v1 AS select distinct f59 FROM test.tb2 limit 4,3; select * FROM v1 limit 0,10;
#(05) ALTER VIEW v1 AS select f59 FROM test.tb2 limit 6,2; select * FROM v1 limit 0,10;
#(06) CREATE or REPLACE VIEW v1 AS select f59 from tb2 order by f59 limit 100; select * FROM v1 limit 0,10;
#(07) CREATE or REPLACE VIEW v1 AS select f59 from tb2 order by f59 asc limit 100; select * FROM v1 limit 0,10;
#(08) CREATE or REPLACE VIEW v1 AS select f59 from tb2 order by f59 desc limit 100; select * FROM v1 limit 0,10;
#(09) CREATE or REPLACE VIEW v1 AS select f59 from tb2 group by f59 limit 100; select * FROM v1 limit 0,10;
#(10) CREATE or REPLACE VIEW v1 AS select f59 from tb2 group by f59 asc limit 100; select * FROM v1 limit 0,10;
#(11) CREATE or REPLACE VIEW v1 AS select f59 from tb2 group by f59 desc limit 100; select * FROM v1 limit 0,10;
#(12) CREATE or REPLACE VIEW v1 AS (select f59 from tb2) union (select f59 from t1) limit 100; select * FROM v1 limit 0,10;
#(13) CREATE or REPLACE VIEW v1 AS (select f59 FROM tb2) UNION DISTINCT(select f59 FROM t1) ; select * FROM v1 limit 0,10;
#(14) CREATE or REPLACE VIEW v1 AS (select f59 FROM tb2) UNION ALL(select f59 FROM t1) ; select * FROM v1 limit 0,10;
#(15)if ($have_bug_11589){--disable_ps_protocol} CREATE or REPLACE VIEW v1 AS select * FROM test.tb2 WITH LOCAL CHECK OPTION ; select * FROM v1 limit 0,50;
#(16)CREATE or REPLACE VIEW v1 AS select * FROM test.tb2 WITH CASCADED CHECK OPTION ; select * FROM v1 limit 0,10;--enable_ps_protocol
#(17) CREATE OR REPLACE VIEW v1 AS SELECT F59, F60 FROM test.tb2 WITH CASCADED CHECK OPTION; SELECT * FROM v1 limit 0,10;
#(18) CREATE or REPLACE VIEW v1 AS select f59, f60 from test.tb2 where f59=3330 ; select * FROM v1 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_warningsDROP TABLE IF EXISTS t1 ;DROP VIEW IF EXISTS v1 ;DROP VIEW IF EXISTS v2 ;--enable_warningsCREATE TABLE t1 (f1 BIGINT) ;
# User variables and parameters are not supported in VIEWs -> 3.3.1.40
# SELECT INTO is illegalSET @x=0;--error 1350CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;Select @x;
# Subquery in the FROM clause is illegal--error 1349CREATE or REPLACE VIEW v1 AS Select 1FROM (SELECT 1 FROM t1) my_table;
# Triggers cannot be associated with VIEWsCREATE 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 executedCREATE 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 1347CREATE TRIGGER tr1 BEFORE INSERT ON v1 FOR EACH ROW SET @a:=1 ;
# RENAME VIEW is not available even when we try it via rename table.# FIXME: Write a bug report for the ugly error message# 1017: Can't find file: './test/v1.frm' (errno: 2),# because the much more beautiful# 1347: 'test.v1' is not BASE TABLE# exists.--replace_result '\\' '/'# MLML --error 1017RENAME TABLE v1 TO v2;--error 1064RENAME VIEW v2 TO v1;#--error 1347ALTER TABLE v2 RENAME AS v1;--error 1064ALTER VIEW v1 RENAME AS v2;
# VIEWs cannot contain a PRIMARY KEY or have an Index.--disable_warningsDROP TABLE IF EXISTS t1, t2 ;DROP VIEW IF EXISTS v1 ;DROP VIEW IF EXISTS v2 ;--enable_warningsCREATE 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 1347ALTER TABLE v1 ADD PRIMARY KEY(f1);--error 1064ALTER VIEW v1 ADD PRIMARY KEY(f1);CREATE INDEX t1_idx ON t1(f3);--error 1347CREATE 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_warningsDROP VIEW IF EXISTS v1 ;--enable_warnings# REPLACE after VIEW name--error 1064CREATE VIEW v1 or REPLACE AS Select * from tb2 my_table limit 50;# CHECK OPTION before AS SELECT--error 1064CREATE VIEW v1 WITH CASCADED CHECK OPTION AS Select *from tb2 my_table limit 50;# CHECK OPTION before AS SELECT--error 1064CREATE VIEW v1 WITH LOCAL CHECK OPTION AS Select *from tb2 my_table limit 50;# CREATE after SELECT--error 1064SELECT * FROM tb2 my_table CREATE VIEW As v1 limit 100 ;# AS forgotten--error 1064CREATE or REPLACE VIEW v1 Select f59, f60from test.tb2 my_table where f59 = 250 ;# positive caseCREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table WITH CASCADED CHECK OPTION;DROP VIEW v1;# REPLACE OR CREATE instead of CREATE OR REPLACE--error 1064REPLACE OR CREATE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table WITH CASCADED CHECK OPTION;# AS after SELECT--error 1064CREATE OR REPLACE VIEW v1 SELECT AS F59, F60FROM test.tb2 my_table WITH CASCADED CHECK OPTION;--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table CASCADED WITH CHECK OPTION;# OPTION CHECK instead of CHECK OPTION--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table WITH CASCADED OPTION CHECK;# CHECK OPTION before WITH--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table CHECK OPTION WITH CASCADED;# CHECK OPTION before AS SELECT--error 1064CREATE OR REPLACE VIEW v1 WITH CASCADED CHECK OPTIONAS SELECT F59, F60 FROM test.tb2 my_table;# VIEW <viewname> after AS SELECT--error 1064CREATE OR REPLACE AS SELECT F59, F60FROM test.tb2 my_table VIEW v1 WITH CASCADED CHECK OPTION;# VIEW <viewname> after CHECK OPTION--error 1064CREATE OR REPLACE AS SELECT F59, F60FROM test.tb2 my_table WITH CASCADED CHECK OPTION VIEW v1;
# Variants with LOCAL CHECK OPTION--error 1064REPLACE OR CREATE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table WITH LOCAL CHECK OPTION;--error 1064CREATE OR REPLACE VIEW v1 SELECT AS F59, F60FROM test.tb2 my_table WITH LOCAL CHECK OPTION;--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table LOCAL WITH CHECK OPTION;--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table WITH LOCAL OPTION CHECK;--error 1064CREATE OR REPLACE VIEW v1 AS SELECT F59, F60FROM test.tb2 my_table CHECK OPTION WITH LOCAL;--error 1064CREATE OR REPLACE VIEW v1 WITH CASCADED CHECK OPTIONAS SELECT F59, F60 FROM test.tb2 my_table;--error 1064CREATE OR REPLACE AS SELECT F59, F60FROM test.tb2 my_table VIEW v1 WITH LOCAL CHECK OPTION;--error 1064CREATE OR REPLACE AS SELECT F59, F60FROM test.tb2 my_table WITH LOCAL CHECK OPTION VIEW v1;
--disable_warningsDrop table if exists t1 ;--enable_warningsCREATE table t1 (f1 int ,f2 int) ;INSERT INTO t1 values (235, 22);INSERT INTO t1 values (554, 11);# SELECTs of UNION in braces--error 1064CREATE or REPLACE view v1 as (Select from f59 tb2)Union ALL (Select from f1 t1);# by before order--error 1064CREATE or REPLACE view v1 as Select f59, f60from tb2 by order f59 limit 100 ;# by before group--error 1064CREATE or REPLACE view v1 as Select f59, f60from 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_warningsDROP VIEW IF EXISTS v1 ;--enable_warnings--error 1064CREATE VIEW v1 SELECT * FROM tb2 limit 100 ;--error 1064CREATE v1 AS SELECT * FROM tb2 limit 100 ;--error 1064VIEW v1 AS SELECT * FROM tb2 limit 100 ;# positive caseCREATE VIEW v1 AS SELECT 1;DROP VIEW v1;--error 1064 VIEW v1 AS SELECT 1;--error 1064CREATE v1 AS SELECT 1;--error 1064CREATE VIEW AS SELECT 1;--error 1064CREATE VIEW v1 SELECT 1;--error 1064CREATE 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_warningsDROP VIEW IF EXISTS v1 ;--enable_warningsCREATE or REPLACE VIEW v1as SELECT * from tb2 limit 100 ;CREATE or REPLACE ALGORITHM = UNDEFINED VIEW v1as SELECT * from tb2 limit 100 ;CREATE or REPLACE ALGORITHM = MERGE VIEW v1as SELECT * from tb2 limit 100 ;CREATE or REPLACE ALGORITHM = TEMPTABLE VIEW v1as SELECT * from tb2 limit 100 ;CREATE or REPLACE ALGORITHM = TEMPTABLE VIEW v1as SELECT * from tb2 limit 100 ;# negative test cases--error 1064CREATE or REPLACE = TEMPTABLE VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE ALGORITHM TEMPTABLE VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE ALGORITHM = VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE TEMPTABLE = ALGORITHM VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE TEMPTABLE - ALGORITHM VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE GARBAGE = TEMPTABLE VIEW v1as SELECT * from tb2 limit 100 ;--error 1064CREATE or REPLACE ALGORITHM = GARBAGE VIEW v1as SELECT * from tb2 limit 100 ;Drop view if exists v1 ;
CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1;CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 WITH CHECK OPTION;CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 WITH CASCADED CHECK OPTION;CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 WITH LOCAL CHECK OPTION;# negative test cases--error 1064CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 WITH NO CHECK OPTION;--error 1064CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 CASCADED CHECK OPTION;--error 1064CREATE or REPLACE VIEW v1AS SELECT * from tb2 where f59 < 1 WITH CASCADED OPTION;--error 1064CREATE or REPLACE VIEW v1AS 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(ML): non-qualified view name means a view name without preceeding# database name--disable_warningsDROP VIEW IF EXISTS v1 ;--enable_warningsCreate view test.v1 AS Select * from test.tb2 limit 100 ;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(ML): 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_warningsDROP TABLE IF EXISTS t1 ;DROP VIEW IF EXISTS v1 ;DROP VIEW IF EXISTS V1 ;--enable_warningseval 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)# - 1050 on OS without cases sensitive view names (Example: WINDOWS)--error 0,1050CREATE VIEW V1 AS SELECT * FROM t1 WHERE f1 = 2222;SELECT * FROM v1;# SELECT * FROM V1;--disable_warningsDROP 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(ML): 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 1064Create view select AS Select * from test.tb2 limit 100;--error 1064Create view as AS Select * from test.tb2 limit 100;--error 1064Create view where AS Select * from test.tb2 limit 100;--error 1064Create view from AS Select * from test.tb2 limit 100;--error 1064Create view while AS Select * from test.tb2 limit 100;--error 1064Create view asdkj*(&*&&^ as Select * from test.tb2 limit 100 ;--disable_warningsDrop view if exists test.procedure ;--enable_warningsCreate 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(ML): 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_warningsDrop TABLE IF EXISTS t1 ;Drop VIEW IF EXISTS v1;Drop VIEW IF EXISTS v2;Drop VIEW IF EXISTS v3;--enable_warningsCREATE 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 1356SELECT * FROM v1;--error 1356DELETE FROM v1;--error 1356UPDATE v1 SET f1 = 'aaaaa';--error 1356INSERT INTO v1 SET f1 = "fffff";# v2 is based on v1, which is now invalid--error 1356SELECT * FROM v2;--error 1356DELETE FROM v2;--error 1356UPDATE v2 SET f1 = 'aaaaa';--error 1356INSERT INTO v2 SET f1 = "fffff";DROP VIEW v1;# v2 is based on v1, which is now dropped--error 1356SELECT * FROM v2;--error 1356DELETE FROM v2;--error 1356UPDATE v2 SET f1 = 'aaaaa';--error 1356INSERT INTO v2 SET f1 = "fffff";
DROP VIEW v2;
# A VIEW based on itself is non sense.--disable_warningsDROP TABLE IF EXISTS t1 ;DROP VIEW IF EXISTS v1 ;--enable_warningsCREATE TABLE t1 (f1 FLOAT);# Create a new VIEW based on itself--error 1146CREATE VIEW v1 AS SELECT * FROM v1;# Replace a valid VIEW with one new based on itselfCREATE VIEW v1 AS SELECT * FROM t1;--error 1146CREATE 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_warningsDrop view if exists test.v1 ;--enable_warningsCreate view test.v1 AS Select * from test.tb2 ;--error 1050Create view test.v1 AS Select F59 from test.tb2 ;--error 1050Create 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 1050Create view test.tb2 AS Select f59,f60 from test.tb2 limit 100 ;--error 1050Create view tb2 AS Select f59,f60 from test.tb2 limit 100 ;# The TABLE should get the same name like an already existing VIEW.--disable_warningsDrop view if exists test.v111 ;--enable_warningsCreate view test.v111 as select * from tb2 limit 50;--error 1050Create table test.v111(f1 int );--error 1050Create 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_warningsDrop database if exists test2 ;--enable_warningsCreate 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_warningsDROP TABLE IF EXISTS test.t0, test.t1, test.t2;DROP VIEW IF EXISTS test.v1;DROP VIEW IF EXISTS test.v2;--enable_warningsCREATE 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 VIEWsCREATE 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# accessable and do have the expected content.# INSERTs with full qualified tableINSERT 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 tableSELECT * 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_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1;--enable_warningsCREATE TABLE t1 (f1 BIGINT);INSERT INTO t1 VALUES(1);CREATE VIEW test.v1 AS SELECT * FROM t1 limit 2;SHOW CREATE VIEW test.v1;SELECT * FROM test.v1;# Switch the algorithmCREATE OR REPLACE ALGORITHM = TEMPTABLE VIEW test.v1AS SELECT * FROM t1 limit 2;SHOW CREATE VIEW test.v1;SELECT * FROM test.v1;# Switch the base tableCREATE OR REPLACE VIEW test.v1 AS SELECT * FROM tb2 limit 2;SHOW CREATE VIEW test.v1;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.v1 ;--enable_ps_protocol# Switch the SELECT but not the base tableCREATE OR REPLACE VIEW test.v1 AS SELECT F59 FROM tb2 limit 10,100;SHOW CREATE VIEW test.v1;SELECT * FROM test.v1;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 1347CREATE OR REPLACE VIEW test.tb2 AS SELECT * From tb2 LIMIT 2;--error 1347CREATE 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_warningsDrop table if exists test.v1 ;--enable_warningsCREATE OR REPLACE view test.v1 as select * from tb2 LIMIT 2;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.v1;--enable_ps_protocolDrop 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_warningsDrop table if exists test.v1 ;--enable_warningsCREATE OR REPLACE VIEW v1 AS SELECT * From tb2;# Note(ML): The empty result is intended, because I want to compare# column names onlySELECT * FROM tb2 WHERE 1 = 2;SELECT * FROM v1 WHERE 1 = 2;Drop view v1;
--disable_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1;--enable_warningsCREATE TABLE t1 (f1 NUMERIC(15,3));INSERT INTO t1 VALUES(8.8);# 1. no explicit column in VIEW definition or SELECTCREATE VIEW v1 AS SELECT * FROM t1;SHOW CREATE VIEW v1;SELECT * FROM v1;# 2. no explicit column in VIEW definition, but in SELECT column_listCREATE 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_listCREATE 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 definitionCREATE 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(ML): The goal is to check the merge algorithm.--disable_warningsDrop view if exists v1 ;Drop view if exists v1_1 ;--enable_warningsCreate view v1as Select test.tb2.f59 as NewNameF1, test.tb2.f60from test.tb2 limit 0,100 ;Create view v1_1as Select test.tb2.f59 as NewNameF1, test.tb2.f60 as NewNameF2from tb2 limit 0,100 ;--error 1054SELECT NewNameF1,f60 FROM test.v1_1 ;--error 1054SELECT NewNameF1, v1_1.f60 FROM test.v1_1 ;--error 1054SELECT f59, f60 FROM test.v1 ;Use test ;--error 1054SELECT 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_warningsDROP TABLE IF EXISTS t1, t2;DROP VIEW IF EXISTS v1;--enable_warningsCREATE 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 testcasesCREATE 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 SELECTSELECT f1, f2 AS f1 FROM t1;--error 1060CREATE OR REPLACE VIEW v1 AS SELECT f1, f2 AS f1 FROM t1;# duplicate via JOIN SELECTSELECT t1.f1, t2.f1 AS f1 FROM t1, t2;--error 1060CREATE OR REPLACE VIEW v1 AS SELECT t1.f1, t2.f1 AS f1 FROM t1, t2;# duplicate via VIEW definition--error 1060CREATE 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_warningsDROP TABLE IF EXISTS t1;--enable_warningsCREATE TABLE t1( f1 BIGINT, f2 DECIMAL(5,2));# positive caseCREATE 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 1353CREATE OR REPLACE VIEW v1 (my_f1 ) AS SELECT * FROM t1;--error 1353CREATE OR REPLACE VIEW v1 (my_f1 ) AS SELECT f1, f2 FROM t1;--error 1353CREATE OR REPLACE VIEW v1 (my_f1, my_f2, my_f3) AS SELECT * FROM t1;--error 1353CREATE 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_warningsDROP VIEW IF EXISTS v1;--enable_warningsCREATE VIEW test.v1( F59, F60 ) AS SELECT F59, F60 From tb2 LIMIT 2;SELECT * FROM test.v1;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_warningsDROP VIEW IF EXISTS v1;--enable_warningsCREATE VIEW test.v1( product ) AS SELECT f59*f60 From tb2 LIMIT 2;SELECT * FROM test.v1;CREATE OR REPLACE VIEW test.v1( product ) AS SELECT 1*2;SELECT * FROM test.v1;CREATE OR REPLACE VIEW test.v1( product ) AS SELECT USER();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(ML): 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_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1;DROP VIEW IF EXISTS v2;--enable_warnings--error 1146CREATE VIEW test.v2 AS SELECT * FROM test.t1;--error 1146CREATE 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(ML): A temporary table hides permanent tables which have the same name.# So do not forget to drop the temporary table.--disable_warningsDROP TABLE IF EXISTS t1_temp;DROP TABLE IF EXISTS t2_temp;DROP VIEW IF EXISTS v1;--enable_warningsCreate 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 1352Create 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 1352Create or replace view v1as 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_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1;--enable_warningsCREATE 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 1352CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t2;# JOIN - temporary table first--error 1352CREATE OR REPLACE VIEW v1 AS SELECT * FROM t2, t1;--error 1352CREATE OR REPLACE VIEW v1 AS SELECT f2, f1 FROM t2, t1;# JOIN - temporary table last--error 1352CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1, t2;--error 1352CREATE OR REPLACE VIEW v1 AS SELECT f1, f2 FROM t1, t2;# UNION - temporary table first--error 1352CREATE OR REPLACE VIEW v1 AS SELECT * FROM t2 UNION SELECT * FROM t1;--error 1352CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t2 UNION SELECT f1 FROM t1;# UNION - temporary table last--error 1352CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 UNION SELECT * FROM t2;--error 1352CREATE OR REPLACE VIEW v1 AS SELECT f1 FROM t1 UNION SELECT f2 FROM t2;# SUBQUERY - temporary table first--error 1352CREATE OR REPLACE VIEW v1 AS SELECT 1 FROM t2WHERE f2 = ( SELECT f1 FROM t1 );# SUBQUERY - temporary table last--error 1352CREATE OR REPLACE VIEW v1 AS SELECT 1 FROM t1WHERE 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_warningsDROP VIEW IF EXISTS v1;--enable_warningsCreate view test.v1 AS Select * from test.tb2 limit 2 ;if ($have_bug_11589){--disable_ps_protocol}Select * from test.v1;--enable_ps_protocolDrop 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_warningsDROP VIEW IF EXISTS test.v1;Drop VIEW IF EXISTS test.v1_1 ;--enable_warningsCreate view test.v1 AS Select * from test.tb2 limit 2 ;Create view test.v1_1 AS Select F59 from test.v1 ;Select * from test.v1_1 limit 20 ;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_warningsDrop database if exists test2 ;--enable_warningscreate 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_11589){--disable_ps_protocol}Select * from v1 ;--enable_ps_protocolSelect * 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_warningsDrop database if exists test2 ;Drop view if exists test.v1 ;--enable_warningscreate 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(ML): 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_warningsDrop table if exists test.t1 ;--enable_warningsCREATE 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.v1AS SELECT test.t1.F59, test.tb2.F60FROM test.tb2 JOIN test.t1 ON test.tb2.F59 = test.t1.F59 ;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_warningsDrop table if exists test.t1 ;Drop database if exists test2 ;Drop view if exists test.v1 ;--enable_warningscreate 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.v1AS SELECT test.tb2.F59, test.tb2.F60FROM test.tb2 INNER JOIN test2.t1 ON tb2.f59 = t1.f59;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_warningsDrop view if exists test.v1_firstview ;Drop view if exists test.v1_secondview ;Drop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1_firstview AS SELECT * FROM test.tb2;CREATE VIEW test.v1_secondview AS SELECT * FROM test.tb2;CREATE VIEW test.v1AS SELECT test.v1_firstview.f59, test.v1_firstview.f60FROM test.v1_firstview INNER JOIN test.v1_secondviewON test.v1_firstview.f59 = test.v1_secondview.f59 ;SELECT * FROM test.v1 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_warningsDrop 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 v1AS SELECT test.v1_firstview.F59, test.v1_firstview.F60FROM test.v1_firstview INNER JOIN test.v1_secondviewON test.v1_firstview.f59 = test.v1_secondview.f59 ;SELECT * FROM v1 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_warningsDrop 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.v1AS SELECT test.v1_firstview.f59, test.v1_firstview.f60FROM test.v1_firstview INNER JOIN test.tb2ON test.v1_firstview.f59 = test.tb2.f59;SELECT * FROM test.v1 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_warningsDrop database if exists test2 ;--enable_warningscreate database test2 ;use test2 ;
CREATE VIEW v1_firstview AS SELECT * FROM test.tb2 ;CREATE VIEW v1AS SELECT v1_firstview.f59, v1_firstview.f60FROM v1_firstview INNER JOIN test.tb2 ON v1_firstview.f59 = test.tb2.f59 ;SELECT * FROM v1 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.################################################################################ (Bug Associated)# FIXME: ??? Bug number# FIXME: reimplement this test
use test;--disable_warningsDrop 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_warningsCreate view test.v1 as Select f59, f60 FROM test.tb2;Select * from test.v1 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_mainas SELECT test.tb2.f59 FROM test.tb2 JOIN test.v1ON test.tb2.f59 = test.v1.f59;Select * from v1_main 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################################################################################ ML: 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_warningsDROP DATABASE IF EXISTS test2;DROP TABLE IF EXISTS t0,t1;DROP VIEW IF EXISTS t3,t4;--enable_warningsCREATE DATABASE test2;
--disable_warningsCREATE TABLE test1.t0 (f1 VARCHAR(20));CREATE TABLE test1.t1 (f1 VARCHAR(20));--enable_warningsCREATE TABLE test2.t0 (f1 VARCHAR(20));CREATE TABLE test2.t1 (f1 VARCHAR(20));--disable_warningsCREATE VIEW test1.t2 AS SELECT * FROM test1.t0;CREATE VIEW test1.t3 AS SELECT * FROM test2.t0;--enable_warningsCREATE 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_warningsDrop 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_warningsCreate view test.v1 as Select f59, f60 FROM test.tb2 limit 20 ;Select * from test.v1 ;
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_warningsCreate 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 ;
# ML: FIXME The SELECT should deliver at least one row.Create view v1_mainas SELECT test.tb2.f59 as f1, test1.v1_1.f59 as f2, test3.v1_2.f59 as f3FROM (test.tb2,test1.v1_1,test.v1) JOIN test3.v1_2ON (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_warningsDrop view if exists test.v1 ;--enable_warnings--error 1349CREATE VIEW test.v1AS Select f59 from (Select * FROM tb2 limit 20) tx ;--error 1146SELECT * FROM test.v1 ;--disable_warningsDrop 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_warningsDrop view if exists test.v1 ;--enable_warningsSet @var1 = 'ABC' ;Set @var2 = 'XYZ' ;--error 1351CREATE VIEW test.v1 AS SELECT @var1, @var2 ;# System variables (name starts with '@@') are also not allowed--error 1351CREATE VIEW test.v1 AS SELECT @@global.sort_buffer_size;--disable_warningsDrop 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# procedure’s parameters.###############################################################################--disable_warningsDrop 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_EXISTCall 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_warningsDrop VIEW if exists test.v1 ;--enable_warnings--error 1064CREATE TEMPORARY VIEW test.v1 ASSELECT * FROM test.tb2 limit 2 ;#(02)--error 1064CREATE OR REPLACE TEMPORARY VIEW test.v1 ASSELECT * FROM test.tb2 limit 2 ;
--disable_warningsDrop 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_warningsDrop 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_11589){--disable_ps_protocol}SELECT * FROM test.tb2 where f59 = 122 and f60 = 432 limit 0,20;--enable_ps_protocol
UPDATE test.v1 SET f59 = 3000 WHERE test.v1.f59 = 122 ;
if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.tb2 where f59 = 3000 limit 0,20;--enable_ps_protocol
DELETE FROM test.v1where 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).################################################################################ ML: Maybe we need some more tests here.--disable_warningsDrop view if exists test.v1 ;--enable_warnings
# Note(ML): 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_TABLEINSERT 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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT * FROM test.tb2 where f59 = 04;
--enable_infoUPDATE test.v1 SET f59 = 30 where F59 = 04 ;--disable_infoSELECT * FROM test.v1 where f59 = 30 ;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.tb2 where f59 = 30 ;--enable_ps_protocol
--enable_infoUPDATE tb2 SET f59 = 100 where f59 = 30 ;--disable_infoif ($have_bug_11589){--disable_ps_protocol}SELECT * FROM tb2 where f59 = 100 ;--enable_ps_protocolSELECT * FROM test.v1 ;
drop view if exists test.v1 ;
--disable_warningsDrop TABLE IF EXISTS test.t1 ;Drop VIEW IF EXISTS test.v1 ;--enable_warningseval 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 tableSELECT COUNT(*) FROM v1 WHERE f1 = 2;# 1.2 + does not exists within the base tableSELECT COUNT(*) FROM v1 WHERE f1 = 4;# 2. Searched record is outside of the scope of the view# 2.1 + exists within the base tableSELECT COUNT(*) FROM v1 WHERE f1 = 5;# 2.2 + does not exists within the base tableSELECT 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 tableDELETE FROM v1 WHERE f1 = 3;# 2. Searched record is outside of the scope of the view# + exists within the base tableDELETE FROM v1 WHERE f1 = 5;--disable_infoSELECT * 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 .--error 1062INSERT 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_infoSELECT * 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 .--error 1062UPDATE 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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT f59,f60FROM test.tb2 where f59 = 195 WITH CHECK OPTION ;
--error 1369UPDATE test.v1 SET f59 = 198 where f59=195 ;SELECT * FROM test.v1 ;
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_warningsDrop view if exists test.v1 ;Drop view if exists test.v2 ;--enable_warningsCREATE VIEW test.v1 AS SELECT f59,f60FROM 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 1369UPDATE test.v1 SET F59 = 919 where f59 = 0987 ;SELECT * FROM test.v1 ;
# ML: 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_warningsDROP TABLE IF EXISTS test.t1;DROP VIEW IF EXISTS test.v1;--enable_warningseval CREATE TABLE t1 (f1 ENUM('A', 'B', 'C') NOT NULL, f2 INTEGER) ENGINE = $engine_type;INSERT INTO t1 VALUES ('A', 1);SELECT * FROM t1;
CREATE VIEW v1 AS SELECT * FROM t1 WHERE f2 BETWEEN 1 AND 2WITH CASCADED CHECK OPTION ;SELECT * FROM v1;--enable_info# positive casesUPDATE 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 wrongSELECT * FROM v1;# negative cases--enable_info--error 1369UPDATE v1 SET f2 = 4;--error 1369INSERT INTO v1 VALUES('B',3);--disable_info# Bug#11771: View over InnoDB table, wrong result SELECT on VIEW,# field->query_id wrongSELECT * FROM v1;
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_warningsDrop table if exists test.t1 ;Drop view if exists test.v1 ;Drop view if exists test.v2 ;Drop view if exists test.v3 ;--enable_warningsCreate 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 f59FROM 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 # Bug#10267 mysqltest, wrong number of loops when a script is sourced# within a loop#
USE test;--disable_warningsDROP 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_warningsCREATE 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_logSET @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 FUNDSELECT * FROM t1_resultsWHERE v3_to_v1_violation = ' _ _ ' AND errno <> 0ORDER 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 FUNDSELECT * FROM t1_resultsWHERE v3_to_v1_options LIKE ' %' AND errno <> 0ORDER 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 FUNDSELECT * FROM t1_resultsWHERE v3_to_v1_options LIKE 'WITH %' AND v3_to_v1_violation LIKE 'v3_%' AND errno = 0ORDER 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 FUNDSELECT * FROM t1_resultsWHERE v3_to_v1_options LIKE 'WITH %' AND v3_to_v1_options NOT LIKE 'WITH LOCAL %' AND v3_to_v1_violation NOT LIKE ' _ _ ' AND errno = 0ORDER BY v3_to_v1_options;# 5. There must be NO failing INSERT/UPDATE getting a sql_errno <> 1369.SELECT * FROM t1_resultsWHERE errno <> 0 AND errno <> 1369ORDER 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_warningsDROP 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 limit 5 ;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.v1 ;--enable_ps_protocoldrop 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 limit 50 ;SELECT * FROM test.v1 ;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 limit 20 ;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.v1;--enable_ps_protocoldrop 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 limit 20 ;SELECT * FROM test.v1 limit 50;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_warningsdrop table if exists test.t1 ;drop table if exists test.t2 ;drop view if exists test.v1 ;--enable_warningsCreate 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.f60from t1,t2 where t1.f59=t2.f59 ;Select * from test.v1 limit 50 ;
drop table test.t1 ;drop table test.t2 ;drop view test.v1 ;
# FIXME(ML): 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_warningsDROP 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 | yesCREATE 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.50CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;SELECT * FROM v1;# 3.3.1.51CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t1;SELECT * FROM v1;# 3.3.1.52CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 WHERE f3 = 2.2;SELECT * FROM v1;# 3.3.1.53CREATE OR REPLACE VIEW v1 AS SELECT f2 FROM t1 WHERE f3 = 2.2;SELECT * FROM v1;# 3.3.1.54--vertical_resultsSET sql_mode = 'traditional,ansi';CREATE OR REPLACE VIEW v1 ASSELECT 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_warningsDrop table if exists t1, t2 ;Drop view if exists v1 ;--enable_warningsCreate 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 asSelect t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61from t1 inner join t2 where t1.f59 = t2.f59 ;select * from test.v1;Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61from t1 inner join t2 where t1.f59 = t2.f59;
# Testcase 3.3.1.56 ;Create or replace view test.v1 asSelect t1.f59 AS t1_f59, t2.f59 AS t2_f59FROM t2 cross join t1;Select * from v1;Select t1.f59 AS t1_f59, t2.f59 AS t2_f59FROM t2 cross join t1;
# Testcase 3.3.1.57 ;Create or replace view test.v1 asSelect straight_join t1.f59 AS t1_f59, t2.f59 AS t2_f59FROM t2,t1;Select * from v1;Select straight_join t1.f59 AS t1_f59, t2.f59 AS t2_f59FROM t2,t1;
# Testcase 3.3.1.58 ;Create or replace view test.v1 asSelect f59, f60, f61, a, bFROM t2 natural join t1;Select * from v1;Select f59, f60, f61, a, bFROM t2 natural join t1;
# Testcase 3.3.1.59 ;Create or replace view test.v1 asSelect t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61FROM t2 left outer join t1 on t2.f59=t1.f59;Select * from v1;Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61FROM t2 left outer join t1 on t2.f59=t1.f59;
# Testcase 3.3.1.60 ;Create or replace view test.v1 asSelect f59, f60, f61, t1.a, t2.bFROM t2 natural left outer join t1;Select * from v1;Select f59, f60, f61, t1.a, t2.bFROM t2 natural left outer join t1;
# Testcase 3.3.1.61 ;Create or replace view test.v1 asSelect t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61FROM t2 right outer join t1 on t2.f59=t1.f59;Select * from v1;Select t1.f59 t1_f59, t2.f59 t2_f59, t1.f60 t1_f60, t2.f60 t2_f60, t1.f61 t1_f61, t2.f61 t2_f61FROM t2 right outer join t1 on t2.f59=t1.f59;
# Testcase 3.3.1.62 ;Create or replace view test.v1 asSelect f59, f60, a, bFROM t2 natural right outer join t1;Select * from v1;Select f59, f60, a, bFROM t2 natural right outer join t1;
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_warningsDrop table if exists t1 ;Drop view if exists v1;--enable_warningsCreate 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 asSelect tb2.f59 FROM tb2 LEFT JOIN t1 on tb2.f59 = t1.f59 ;Select * from test.v1 limit 0,10;Drop view if exists test.v1 ;
# Testcase 3.3.1.A2 ;--disable_warningsDrop table if exists t1 ;Drop view if exists v1;--enable_warningsCreate 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.v1as Select tb2.f59 FROM tb2 INNER JOIN t1 on tb2.f59 = t1.f59 ;Select * from test.v1 limit 0,10;Drop view if exists test.v1 ;
# Testcase 3.3.1.A3 ;--disable_warningsDrop table if exists t1 ;Drop view if exists v1;--enable_warningsCreate 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.v1as Select tb2.f59 FROM tb2 CROSS JOIN t1 on tb2.f59 = t1.f59 ;Select * from test.v1 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_warningsDrop 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 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 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 limit 0,10;
Drop view test.v1 ;
--disable_warningsdrop table if exists t1;drop view if exists test.v1;--enable_warningscreate 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 asselect tb2.f59 from tb2 join t1 on tb2.f59 = t1.f59;select * from test.v1 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 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 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 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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT F59FROM test.tb2 where test.tb2.F59 = 109;
SELECT * FROM test.v1 limit 0,10;
ALTER VIEW test.v1 AS SELECT *FROM test.tb2 WHERE test.tb2.f59 = 242 ;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM test.v1 limit 0,10;--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_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS test.v1 ;--enable_warningseval CREATE TABLE t1 ( f1 VARCHAR(1000) ) ENGINE = $engine_type ;CREATE VIEW v1 AS SELECT f1 FROM t1;
# DROP VIEWDROP VIEW v1;--error 1051DROP VIEW v1;
CREATE VIEW v1 AS SELECT f1 FROM t1;# DROP VIEW IF EXISTSDROP 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_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1_base ;DROP VIEW IF EXISTS v1_top ;--enable_warningsCREATE TABLE t1 ( f1 DOUBLE);
--disable_query_logSET @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 1051 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(ML): There will be no non failing sub testcases with SHOW here.# They will be done in 3.3.11 ff.--disable_warningsDROP TABLE IF EXISTS t1 ;DROP VIEW IF EXISTS v1 ;--enable_warningseval 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 1146SELECT * FROM v1 ;#--error 1146SHOW CREATE VIEW v1 ;--error 1146SHOW 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 1146SHOW COLUMNS FROM v1;--error 1146SHOW FIELDS FROM v1;CHECK TABLE v1;--error 1146DESCRIBE v1;--error 1146EXPLAIN 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_logSET @max_level= 32;--enable_query_log--disable_warningsDROP DATABASE IF EXISTS test3;--enable_warningsCREATE 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 VIEWlet $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 droppedDROP VIEW test3.v0;eval SHOW CREATE VIEW test3.v$toplevel;--error 1356eval SELECT * FROM test3.v$toplevel;--error 1356eval EXPLAIN SELECT * FROM test3.v$toplevel;
# 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# ML - 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, ML 1 GB)#++++++++++++++++++++++++++++++++++++++++++++++let $message= FIXME - Setting join_limit to 30 - hangs for higher values;--source include/show_msg.inc#SET @join_limit = 61;SET @join_limit = 30;SET @max_level = @join_limit - 1;--enable_query_log
--disable_warningsDROP 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_warningsCREATE 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_logSET @max_level = IFNULL(@limit1,@max_level);--enable_query_loglet $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 VIEWlet $toplevel= `SELECT @max_level`;# Show should be easyeval SHOW CREATE VIEW test1.v$toplevel;# SELECT is much more complicatedeval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel;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.incif (1){--disable_result_log}# EXPLAIN might be the helleval 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 1116' and the command# is successful so assuming no expected error was intended# --error 1116eval 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.incif (1){--disable_result_log}# the following line as written as '--eror 1116' and the command# is successful so assuming no expected error was intended# --error 1116eval 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_logCREATE OR REPLACE VIEW test1.v0 AS SELECT f1 as f2, f2 as f1 FROM test2.t1;# 2.3.2 DATE instead of numericCREATE 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 stringCREATE OR REPLACE VIEW test3.v0 ASSELECT 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 numericCREATE OR REPLACE VIEW test3.v0 ASSELECT 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
# Cleanuplet $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_warningsDrop view if exists test.v1 ;--enable_warnings
Create View test.v1 AS SELECT f59,f60 FROM tb2 where f59 = 1995 ;--enable_infoINSERT INTO test.v1 (f59,f60) values (879,700) ;--disable_infoSELECT 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_warningsDrop view if exists test.v1 ;--enable_warnings
Create view test.v1 AS SELECT f59,f60,f61 FROM tb2 ;--enable_infoINSERT INTO test.v1 ( f59 , f60 ) values (2005,0101) ;--disable_info
if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM tb2 where f59 = 2005 and f60 = 0101 ;--enable_ps_protocolSELECT 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_warningsDrop view if exists test.v1 ;--enable_warnings
CREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 ;--enable_infoUPDATE test.v1 SET f59 = 8 WHERE f59 = 780 and f60 = 105;--disable_info
if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM tb2 where f59 = 8 and f60 = 105;--enable_ps_protocolSELECT 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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 ;--enable_infoUPDATE test.v1 SET f59 = 891 WHERE f60 = 105 ;--disable_info
if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM tb2 where f59 = 891 and f60 = 105;--enable_ps_protocolSELECT 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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 where f59 = 789 ;--enable_infoDELETE FROM test.v1 where f59 = 789 ;--disable_infoSELECT * FROM tb2 where f59 = 789 ;SELECT f59,f60 FROM test.v1 where f59 = 789;
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_warningsDrop view if exists test.v1 ;--enable_warningsCREATE VIEW test.v1 AS SELECT f59,f60,f61 FROM tb2 where f59 = 711 ;--enable_infoDELETE FROM test.v1 where f59 = 711 ;--disable_info
SELECT * FROM tb2 where f59 = 711 ;SELECT f59,f60 FROM test.v1 where f59 = 711;
Drop view test.v1 ;
let $message= Testcase 3.3.2.1 - 3.3.2.6 alternative implementation;--source include/show_msg80.inc
--disable_warningsDROP TABLE IF EXISTS t1;DROP VIEW IF EXISTS v1;--enable_warnings
CREATE TABLE t1 ( f1 BIGINT, 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 columnsCREATE VIEW v1 AS SELECT f1, f2, f3 FROM t1;
# Incomplete INSERT 1# - f2 missing# - PRIMARY KEY f1 included# f2 gets the default NULLINSERT 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_modeINSERT INTO v1 SET f2 = 'ABC';# f1 gets the default 0, but this value is already exists--error 1062INSERT 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 f1DELETE FROM v1 WHERE f1 = 1;SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE f2DELETE FROM v1 WHERE f2 = 'ABC';SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE noneDELETE 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 - f1UPDATE 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 - f2UPDATE 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 - noneUPDATE v1 SET f1 = 2;SELECT * from t1;DELETE FROM t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# UPDATE f2 - f1UPDATE 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 - f2UPDATE 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 - f3UPDATE 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 - noneUPDATE v1 SET f2 = 'NNN';SELECT * from t1;DELETE FROM t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# UPDATE f1,f2 - f1,f2UPDATE 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 columnsCREATE 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_modeINSERT INTO v1 SET f2 = 'ABC';# f1 gets the default 0 and this value is already exists--error 1062INSERT 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 f2DELETE FROM v1 WHERE f2 = 'ABC';SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE noneDELETE 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) noneINSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# UPDATE f2 - f2UPDATE 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 - f3UPDATE 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 - noneUPDATE 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 columnCREATE 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_TABLEINSERT 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_TABLEINSERT 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 f1DELETE FROM v1 WHERE f1 = 1;SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE f2DELETE FROM v1 WHERE f2 = 'ABC';SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE my_greetingDELETE FROM v1 WHERE my_greeting = 'HELLO';SELECT * from t1;INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE noneDELETE 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 - f1UPDATE 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 - f2UPDATE 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_greetingUPDATE 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 - noneUPDATE v1 SET f1 = 2;SELECT * from t1;DELETE FROM t1;#------------------------------------------------INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# UPDATE f2 - f1UPDATE 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 - f2UPDATE 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 - f3UPDATE 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_greetingUPDATE 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 - noneUPDATE 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 1348UPDATE 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 1348UPDATE 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 1348UPDATE 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 1348UPDATE 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, f2UPDATE 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 columnsDROP VIEW v1;CREATE VIEW v1 AS SELECT f1, f2, f4 FROM t1;
# This INSERT must fail--error 1423INSERT INTO v1 SET f1 = 1;SELECT * from t1;DELETE FROM t1;
INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# DELETE f1DELETE FROM v1 WHERE f1 = 1;
INSERT INTO t1 VALUES(1, 'ABC', -1.2E-3, 'X');# UPDATE f1 - f2UPDATE v1 SET f4 = 'Y' WHERE f2 = 'ABC';SELECT * from t1;DELETE FROM t1;
# Switch back to the native SQL modeSET 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## ML: 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_warningsDROP TABLE IF EXISTS t1 ;DROP VIEW IF EXISTS v1 ;--enable_warningsCREATE 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 supportedlet $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 1288 UPDATE v1 SET f61 = 100 WHERE f61 = 32; --error 1288 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_warningsDROP 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.12SET @variant1= 'CREATE VIEW v1 AS SELECT DISTINCT(f61) FROM t1';# For DISTINCTROW 3.3.2.13SET @variant2= 'CREATE VIEW v1 AS SELECT DISTINCTROW(f61) FROM t1';# For SET 3.3.2.14SET @variant3= 'CREATE VIEW v1 AS SELECT SUM(f59) AS f61 FROM t1';# For GROUP BY 3.3.2.15SET @variant4= 'CREATE VIEW v1 AS SELECT f61 FROM t1 GROUP BY f61';# For HAVING 3.3.2.16SET @variant5= 'CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0';# For a sub query in the select list 3.3.2.17SET @variant6= 'CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1';# For a WHERE clause sub query that refers to a table also referenced in a# FROM clause 3.3.2.18SET @variant7= 'CREATE VIEW v1 AS SELECT f61 FROM v2';# Attention: The attempt to UPDATE the next VIEW fails like expected,# but the error message# ERROR 1093 (HY000) : You can't specify target table 'v1' for# update in FORM clause"# is wrong. The server must deliver ERROR 1288.# Bug#10773 Incorrect message is displayed while updating a view# ML FIXME (remove the comment above, replace --error 1288,1093 with # --error 1288 and update the file with expected results)# when Bug#10773 is solved# For a reference to a non-updateable view 3.3.2.19let $message= Some server responses suffer from Bug#10773 Incorrect message is displayed while updating a view;--source include/show_msg80.incSET @variant8= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)';# For ALGORITHM = TEMPTABLE 3.3.2.20SET @variant9= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1';
let $num= 9;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 1288, 1093 UPDATE v1 SET f61=1007; --error 1288 DELETE FROM v1;
# The following "--error 0" will be no more needed, when # Bug#12471: mysqltest, --error within loop affects wrong statement # is fixed. --error 0 DROP VIEW v1;
dec $num;}
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_warningsDROP 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 stateDESCRIBE t1;DESCRIBE v1;SELECT * FROM t1;SELECT * FROM v1;## 1. Name of one base table column is alteredALTER TABLE t1 CHANGE COLUMN f4 f4x CHAR(5);INSERT INTO t1 SET f1 = 0, f4x = 'ABC', report = 't1 1';--error 1356INSERT INTO v1 SET f1 = 0, f4 = 'ABC', report = 'v1 1';--error 1054INSERT INTO v1 SET f1 = 0, f4x = 'ABC', report = 'v1 1a';--error 1356INSERT INTO v1 SET f1 = 0, report = 'v1 1b';DESCRIBE t1;# Bug#12533 crash on DESCRIBE <view> after renaming base table column;--error 1356DESCRIBE v1;SELECT * FROM t1;--error 1356SELECT * FROM v1;ALTER TABLE t1 CHANGE COLUMN f4x f4 CHAR(5);## 2. Length of one base table column is increasedALTER 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;SELECT * FROM v1;## 3. Length of one base table column is reducedALTER 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;SELECT * FROM v1;## 4. Type of one base table column is altered string -> stringALTER 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;SELECT * FROM v1;## 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;SELECT * FROM v1;## 6. DROP of one base table columnALTER TABLE t1 DROP COLUMN f2;INSERT INTO t1 SET f1 = 'ABC', f4 = '<------ 20 -------->', report = 't1 6';--error 1356INSERT INTO v1 SET f1 = 'ABC', f4 = '<------ 20 -------->', report = 'v1 6';DESCRIBE t1;--error 1356DESCRIBE v1;SELECT * FROM t1;--error 1356SELECT * FROM v1;## 7. Recreation of dropped base table column with the same data type like beforeALTER 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;SELECT * FROM v1;## 8. Recreation of dropped base table column with a different data type# like beforeALTER 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;SELECT * FROM v1;## 9. Add a column to the base tableALTER 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 1054INSERT 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;SELECT * FROM v1;## 10. VIEW with numeric function is "victim" of data type changeDROP 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;SELECT * FROM v1;ALTER TABLE t1 CHANGE COLUMN f2 f2 VARCHAR(30);INSERT INTO t1 SET f1 = 'ABC', f2 = 'DEF';DESCRIBE t1;DESCRIBE v1;SELECT * FROM t1;SELECT * FROM v1;# Some statements for comparison# - the ugly SQRT('DEF) as constantSELECT SQRT('DEF');# - Will a VIEW based on the same definition show the same result ?CREATE VIEW v2 AS SELECT SQRT('DEF');SELECT * FROM v2;# - 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;# - 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_11589){--disable_ps_protocol}SELECT * FROM t2;--enable_ps_protocolDROP TABLE t2;CREATE TABLE t2 AS SELECT * FROM v1;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM t2;--enable_ps_protocolDROP TABLE t2;CREATE TABLE t2 AS SELECT * FROM v2;if ($have_bug_11589){--disable_ps_protocol}SELECT * FROM t2;--enable_ps_protocol#DROP TABLE t1;DROP TABLE t2;DROP VIEW v1;DROP VIEW v2;
# Clean up--disable_warningsDROP 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
|