/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package my.test.command.ddl; import my.test.TestBase; public class CreateViewTest extends TestBase { public static void main(String[] args) throws Exception { new CreateViewTest().start(); System.out.println(Integer.bitCount(3)); System.out.println(Integer.bitCount(1)); System.out.println(Integer.bitCount(2)); System.out.println(Integer.bitCount(7)); } // 测试org.h2.command.Parser.parseCreateView(boolean, boolean) // org.h2.command.ddl.CreateView @Override public void startInternal() throws Exception { executeUpdate("drop table IF EXISTS CreateViewTest CASCADE"); executeUpdate("create table IF NOT EXISTS CreateViewTest(id int, name varchar(500), b boolean)"); executeUpdate("CREATE INDEX IF NOT EXISTS CreateViewTestIndex ON CreateViewTest(name)"); executeUpdate("insert into CreateViewTest(id, name, b) values(1, 'a1', true)"); executeUpdate("insert into CreateViewTest(id, name, b) values(1, 'b1', true)"); executeUpdate("insert into CreateViewTest(id, name, b) values(2, 'a2', false)"); executeUpdate("insert into CreateViewTest(id, name, b) values(2, 'b2', true)"); executeUpdate("insert into CreateViewTest(id, name, b) values(3, 'a3', false)"); executeUpdate("insert into CreateViewTest(id, name, b) values(3, 'b3', true)"); // executeUpdate("DROP VIEW IF EXISTS my_view"); sql = "CREATE OR REPLACE FORCE VIEW IF NOT EXISTS my_view COMMENT IS 'my view'(f1,f2) " // + "AS SELECT id,name FROM CreateViewTest"; executeUpdate(); sql = "CREATE OR REPLACE FORCE VIEW my_view COMMENT IS 'my view'(f1,f2) " // + "AS SELECT id,name FROM CreateViewTest"; // select字段个数比view字段多的情况,多出来的按select字段原来的算 // 这里实际是f1、name sql = "CREATE OR REPLACE FORCE VIEW my_view COMMENT IS 'my view'(f1) " // + "AS SELECT id,name FROM CreateViewTest"; // select字段个数比view字段少的情况,view中少的字段被忽略 // 这里实际是f1,而f2被忽略了,也不提示错误 sql = "CREATE OR REPLACE FORCE VIEW my_view COMMENT IS 'my view'(f1, f2) " // + "AS SELECT id FROM CreateViewTest"; // 不管加不加FORCE,跟上面也一样 sql = "CREATE OR REPLACE VIEW my_view COMMENT IS 'my view'(f1, f2) " // + "AS SELECT id FROM CreateViewTest"; sql = "CREATE OR REPLACE FORCE VIEW my_view COMMENT IS 'my view'(f1,f2) " // + "AS SELECT id,name FROM CreateViewTest"; executeUpdate("CREATE OR REPLACE FORCE VIEW view1 AS SELECT f1 FROM my_view"); executeUpdate("CREATE OR REPLACE FORCE VIEW view2 AS SELECT f2 FROM my_view"); // sql = "CREATE OR REPLACE FORCE VIEW my_view COMMENT IS 'my view'(f1,f2) " // // + "AS SELECT top 2 id,name FROM CreateViewTest order by id"; // // 如果是这种情况,接下来要查视图时也要按CreateViewTest的字段名来查 // sql = "CREATE OR REPLACE FORCE VIEW IF NOT EXISTS my_view " // // + "AS SELECT id,name FROM CreateViewTest"; // 目前不支持参数: // org.h2.jdbc.JdbcSQLException: Feature not supported: "parameters in views"; SQL statement: // sql = // "CREATE OR REPLACE FORCE VIEW IF NOT EXISTS my_view (f1,f2) AS SELECT id,name FROM CreateViewTest where id=?"; // ps = conn.prepareStatement(sql); // ps.setInt(1, 2); // ps.executeUpdate(); executeUpdate(sql); sql = "select * from my_view where f1 > 2"; sql = "select * from my_view where f2 > 'b1'"; sql = "select * from my_view where f2 between 'b1' and 'b2'"; // executeUpdate("SET BATCH_JOINS 1"); sql = "select * from my_view where f1=2 and f2 between 'b1' and 'b2'"; executeQuery(); // sql = "select name from (select id,name from CreateViewTest where id=? and name=?) where name='b2'"; // ps = conn.prepareStatement(sql); // ps.setInt(1, 2); // ps.setString(2, "b2"); // ps.executeQuery(); // sql = "select * from CreateViewTest"; // 测试org.h2.command.Parser.parserWith() // executeUpdate("CREATE LOCAL TEMPORARY TABLE IF NOT EXISTS my_tmp_table(f1 int)"); // executeUpdate("DROP VIEW IF EXISTS my_tmp_table"); // executeUpdate("CREATE OR REPLACE FORCE VIEW my_tmp_table AS SELECT f2 FROM my_view"); // sql = // "WITH RECURSIVE my_tmp_table(f1,f2) AS(select id,name from CreateViewTest) select f1, f2 from my_tmp_table"; // sql = "WITH my_tmp_table(f1,f2) AS(select id,name from CreateViewTest) select f1, f2 from my_tmp_table"; // AS里面必须是UNION ALL sql = "WITH RECURSIVE my_tmp_table(f1,f2) " // + "AS(select id,name from CreateViewTest UNION ALL select 1, 2)" // + "select f1, f2 from my_tmp_table"; executeQuery(); sql = "WITH RECURSIVE my_tmp_table(f1,f2) " // + "AS(select id,name from CreateViewTest UNION ALL select id,name from CreateViewTest)" // + "select f1, f2 from my_tmp_table"; executeQuery(); executeUpdate("drop table IF EXISTS tb"); executeUpdate("create table IF NOT EXISTS tb(id varchar(3) , pid varchar(3) , name varchar(10))"); executeUpdate("insert into tb values('002' , 0 , '浙江省')"); executeUpdate("insert into tb values('001' , 0 , '广东省')"); executeUpdate("insert into tb values('006' , '002' , '嘉兴市')"); executeUpdate("insert into tb values('004' , '002' , '杭州市')"); executeUpdate("insert into tb values('014' , '004' , '上城区')"); executeUpdate("insert into tb values('015' , '004' , '下城区')"); executeUpdate("insert into tb values('019' , '001' , '广州市')"); executeUpdate("insert into tb values('020' , '001' , '深圳市')"); sql = "WITH RECURSIVE cte (id,name)" // + " AS(select a.id,a.name,a.pid from tb a where id='002'" // + " union all select k.id,k.name,k.pid from tb k inner join cte c on c.id = k.pid)" // + " select id,name from cte"; executeQuery(); sql = "WITH RECURSIVE cte (id,name) " // + " AS(select a.id,cast(a.name as varchar(100)) from tb a where id='002'" // + " union all "// + " select k.id,cast(c.name||'>'||k.name as varchar(100)) as name "// + " from tb k inner join cte c on c.id = k.pid)" // + " select id,name from cte"; executeQuery(); // 必须在from后面加括号,此时from后面的被认为是一个临时视图 sql = "select f1, f2 from (select id,name from CreateViewTest)"; // f1,f2找不到 sql = "select id,name from (select id,name from CreateViewTest)"; executeQuery(); // 这条不会使得parameters.size>0 sql = "CREATE OR REPLACE FORCE VIEW IF NOT EXISTS my_view2(f1,f2) " // + "AS select id,name from (select id,name from CreateViewTest) where id=? and name=?"; ps = conn.prepareStatement(sql); ps.setInt(1, 2); ps.setString(2, "b2"); try { ps.executeUpdate(); } catch (Exception e) { System.out.println(e.getMessage()); } // 这条可以 sql = "CREATE OR REPLACE FORCE VIEW IF NOT EXISTS my_view2(f1,f2) " // + "AS select id,name from (select id,name from CreateViewTest where id=? and name=?)"; ps = conn.prepareStatement(sql); ps.setInt(1, 2); ps.setString(2, "b2"); try { ps.executeUpdate(); } catch (Exception e) { System.out.println(e.getMessage()); } sql = "select id,name from (select id,name from CreateViewTest where id=? and name=?)"; ps = conn.prepareStatement(sql); ps.setInt(1, 2); ps.setString(2, "b2"); rs = ps.executeQuery(); printResultSet(rs); sql = "select * from my_view"; sql = "select * from my_view where f1=2 and f2 between 'b1' and 'b2'"; stmt.setFetchSize(2); executeQuery(); executeUpdate("alter view my_view RECOMPILE"); executeUpdate("CREATE OR REPLACE FORCE VIEW view5 AS SELECT f1 FROM my_view"); tryExecuteUpdate("drop view IF EXISTS my_view RESTRICT"); executeUpdate("drop view IF EXISTS my_view CASCADE"); } }