diff --git a/dbcon/mysql/ha_mcs_impl.cpp b/dbcon/mysql/ha_mcs_impl.cpp index bd9eb2ba2..64a8a1bdf 100644 --- a/dbcon/mysql/ha_mcs_impl.cpp +++ b/dbcon/mysql/ha_mcs_impl.cpp @@ -2663,18 +2663,14 @@ int ha_mcs_impl_write_row(const uchar* buf, TABLE* table, uint64_t rows_changed) // Error out INSERT on VIEW. It's currently not supported. // @note INSERT on VIEW works natually (for simple cases at least), but we choose to turn it off // for now - ZZ. - TABLE_LIST* tables = thd->lex->query_tables; - for (; tables; tables = tables->next_local) + if (thd->lex->query_tables->view) { - if (tables->view) - { - Message::Args args; - args.add("Insert"); - string emsg = logging::IDBErrorInfo::instance()->errorMsg(ERR_DML_VIEW, args); - setError(current_thd, ER_CHECK_NOT_IMPLEMENTED, emsg); - return ER_CHECK_NOT_IMPLEMENTED; - } + Message::Args args; + args.add("Insert"); + string emsg = logging::IDBErrorInfo::instance()->errorMsg(ERR_DML_VIEW, args); + setError(current_thd, ER_CHECK_NOT_IMPLEMENTED, emsg); + return ER_CHECK_NOT_IMPLEMENTED; } if (get_fe_conn_info_ptr() == nullptr) diff --git a/mysql-test/columnstore/basic/r/mcs63_crossengine_views.result b/mysql-test/columnstore/basic/r/mcs63_crossengine_views.result index 939effc20..fcb1a4bdc 100644 --- a/mysql-test/columnstore/basic/r/mcs63_crossengine_views.result +++ b/mysql-test/columnstore/basic/r/mcs63_crossengine_views.result @@ -112,5 +112,86 @@ NULL NULL NULL NULL NULL NULL 9 kkkk NULL NULL 11 mm NULL NULL 13 n +DROP VIEW v0, v1, v2, v3, v4, v5, v6, v7; +DROP TABLE t1, t2; +# +# MCOL-4687 Insert from view regression +# +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'Greg'); +CREATE VIEW v1 as SELECT * FROM t1; +SELECT * FROM v1; +id fname +1 Greg +CREATE TABLE t2 (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +INSERT INTO t2 SELECT * FROM (SELECT * FROM v1) t; +SELECT * FROM t2; +id fname +1 Greg +INSERT INTO t2 SELECT * FROM v1; +SELECT * FROM t2; +id fname +1 Greg +1 Greg +DROP TABLE t2; +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'Greg'); +INSERT INTO t1 VALUES (1,'Roman'); +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +CREATE VIEW v1 as SELECT id, MAX(fname) FROM t1 GROUP BY id; +CREATE VIEW v2 as SELECT MIN(id), GROUP_CONCAT(fname) FROM t1; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +id fname +1 Roman +TRUNCATE TABLE tt; +INSERT INTO tt SELECT * FROM v2; +SELECT * FROM tt; +id fname +1 Greg,Roman +DROP VIEW v1,v2; +DROP TABLE tt,t1; +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (1,'Greg'); +INSERT INTO t1 VALUES (1,'Roman'); +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +CREATE VIEW v1 as SELECT id, MAX(fname) FROM t1 GROUP BY id; +CREATE VIEW v2 as SELECT MIN(id), GROUP_CONCAT(fname) FROM t1; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +id fname +1 Roman +TRUNCATE TABLE tt; +INSERT INTO tt SELECT * FROM v2; +SELECT * FROM tt; +id fname +1 Greg,Roman +DROP VIEW v1,v2; +DROP TABLE tt,t1; +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'One'),(2,'Two'); +CREATE TABLE t2 (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO t2 VALUES (1,'Uno'),(2,'Due'); +CREATE VIEW v1 AS SELECT t1.id*100+t2.id,CONCAT(t1.fname,'-',t2.fname) FROM t1,t2 WHERE t1.id=t2.id; +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +id fname +101 One-Uno +202 Two-Due +DROP VIEW v1; +CREATE VIEW v1 AS SELECT * FROM t1; +CREATE VIEW v2 AS SELECT * FROM t2; +INSERT INTO tt SELECT v1.id*100+v1.id, CONCAT(v1.fname,'+',v2.fname) FROM v1,v2 WHERE v1.id=v2.id; +SELECT * FROM tt; +id fname +101 One-Uno +202 Two-Due +101 One+Uno +202 Two+Due +DROP VIEW v1,v2; +DROP TABLE tt,t2,t1; DROP USER 'cejuser'@'localhost'; DROP DATABASE mcs63_db; diff --git a/mysql-test/columnstore/basic/t/mcs63_crossengine_views.test b/mysql-test/columnstore/basic/t/mcs63_crossengine_views.test index 92ce7e1a7..7b2373228 100644 --- a/mysql-test/columnstore/basic/t/mcs63_crossengine_views.test +++ b/mysql-test/columnstore/basic/t/mcs63_crossengine_views.test @@ -64,6 +64,82 @@ CREATE VIEW v7 AS SELECT * FROM t1 RIGHT JOIN t2 ON t1.t1_int = t2.t2_int AND t2 SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v7' AND TABLE_SCHEMA='mcs63_db'; SELECT * FROM v7; +DROP VIEW v0, v1, v2, v3, v4, v5, v6, v7; +DROP TABLE t1, t2; + +--echo # +--echo # MCOL-4687 Insert from view regression +--echo # + +# Tesing a simple view on an InnoDB table (as a data source) +# This is the original script reported in MCOL-4687 +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'Greg'); +CREATE VIEW v1 as SELECT * FROM t1; +SELECT * FROM v1; +CREATE TABLE t2 (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +INSERT INTO t2 SELECT * FROM (SELECT * FROM v1) t; +SELECT * FROM t2; +INSERT INTO t2 SELECT * FROM v1; +SELECT * FROM t2; +DROP TABLE t2; +DROP VIEW v1; +DROP TABLE t1; + +# Testing views on an InnoDB table with aggregates and GROUP + +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'Greg'); +INSERT INTO t1 VALUES (1,'Roman'); +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +CREATE VIEW v1 as SELECT id, MAX(fname) FROM t1 GROUP BY id; +CREATE VIEW v2 as SELECT MIN(id), GROUP_CONCAT(fname) FROM t1; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +TRUNCATE TABLE tt; +INSERT INTO tt SELECT * FROM v2; +SELECT * FROM tt; +DROP VIEW v1,v2; +DROP TABLE tt,t1; + + +# Testing view on a ColumnStore table with aggregates and GROUP + +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (1,'Greg'); +INSERT INTO t1 VALUES (1,'Roman'); +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=Columnstore; +CREATE VIEW v1 as SELECT id, MAX(fname) FROM t1 GROUP BY id; +CREATE VIEW v2 as SELECT MIN(id), GROUP_CONCAT(fname) FROM t1; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +TRUNCATE TABLE tt; +INSERT INTO tt SELECT * FROM v2; +SELECT * FROM tt; +DROP VIEW v1,v2; +DROP TABLE tt,t1; + +# Testing a view containing a join between an InnoDB table and a ColumnStore table + +CREATE TABLE t1 (id INT, fname VARCHAR(20)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'One'),(2,'Two'); +CREATE TABLE t2 (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO t2 VALUES (1,'Uno'),(2,'Due'); +CREATE VIEW v1 AS SELECT t1.id*100+t2.id,CONCAT(t1.fname,'-',t2.fname) FROM t1,t2 WHERE t1.id=t2.id; +CREATE TABLE tt (id INT, fname VARCHAR(20)) ENGINE=ColumnStore; +INSERT INTO tt SELECT * FROM v1; +SELECT * FROM tt; +DROP VIEW v1; + +# Testing a join between a view on an InnoDB table and a view on a ColumnStore table + +CREATE VIEW v1 AS SELECT * FROM t1; +CREATE VIEW v2 AS SELECT * FROM t2; +INSERT INTO tt SELECT v1.id*100+v1.id, CONCAT(v1.fname,'+',v2.fname) FROM v1,v2 WHERE v1.id=v2.id; +SELECT * FROM tt; +DROP VIEW v1,v2; +DROP TABLE tt,t2,t1; + # Clean UP DROP USER 'cejuser'@'localhost'; DROP DATABASE mcs63_db;