/*
* 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 AlterTableAlterColumnTest extends TestBase {
public static void main(String[] args) throws Exception {
new AlterTableAlterColumnTest().start();
}
@Override
public void startInternal() throws Exception {
executeUpdate("DROP TABLE IF EXISTS mytable_view");
// executeUpdate("DROP TABLE IF EXISTS mytable3");
// executeUpdate("DROP TABLE IF EXISTS mytable2");
executeUpdate("DROP TABLE IF EXISTS mytable");
executeUpdate("CREATE TABLE IF NOT EXISTS mytable (f1 int, f2 int not null, ch varchar(10))");
parseAlterTable();
}
void parseAlterTable() throws Exception {
// ALTER TABLE命令就分下面5大类:
// 增加约束、增加列、重命名表、DROP约束和列、修改列
// parseAlterTableAddConstraintIf();
// parseAlterTableAddColumn();
// renameTest();
// dropTest();
// alterColumnTest();
// ALTER_TABLE_ALTER_COLUMN_NOT_NULL();
// ALTER_TABLE_ALTER_COLUMN_NULL();
ALTER_TABLE_ALTER_COLUMN_DEFAULT();
// ALTER_TABLE_ALTER_COLUMN_CHANGE_TYPE();
// ALTER_TABLE_ADD_COLUMN();
// ALTER_TABLE_DROP_COLUMN();
// ALTER_TABLE_ALTER_COLUMN_SELECTIVITY();
// ALTER_TABLE_ALTER_COLUMN_DROP();
// ALTER_TABLE_MODIFY_COLUMN();
// ALTER_TABLE_ALTER_COLUMN_TYPE();
// ALTER_TABLE_ALTER_COLUMN_SET_DATA_TYPE();
// ALTER_TABLE_ALTER_COLUMN();
}
void parseAlterTableAddConstraintIf() throws Exception {
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c0 COMMENT IS 'haha0' PRIMARY KEY HASH(f1,f2) INDEX myindex";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c1 COMMENT IS 'haha1' INDEX myindex(f1,f2)";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c2 COMMENT IS 'haha2' INDEX(f1,f2)";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c3 COMMENT IS 'haha3' CHECK f1>0 and f2<10 CHECK";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c4 COMMENT IS 'haha4' UNIQUE KEY INDEX myunique(f1,f2) NOCHECK";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c5 COMMENT IS 'haha5' FOREIGN KEY(f1) REFERENCES(f2)";
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c6 COMMENT IS 'haha6' FOREIGN KEY(f1) REFERENCES mytable(f2)"
+ "ON DELETE CASCADE ON UPDATE RESTRICT ON DELETE NO ACTION ON UPDATE SET NULL ON DELETE SET DEFAULT NOT DEFERRABLE";
executeUpdate();
}
void parseAlterTableAddColumn() throws Exception {
sql = "ALTER TABLE mytable ADD (f3 int, f4 int)";
sql = "ALTER TABLE mytable ADD COLUMN(f3 int, f4 int)";
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f0 int BEFORE f1";
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int AFTER f2";
// sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f1 int";
// ADD COLUMN时不能加约束,比如这个是错的:
// ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int PRIMARY KEY
// 但是要表示特殊的PRIMARY KEY约束可以加IDENTITY
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int IDENTITY AFTER f2";
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int AUTO_INCREMENT AFTER f2";
executeUpdate();
}
void renameTest() throws Exception {
sql = "ALTER TABLE mytable SET REFERENTIAL_INTEGRITY TRUE CHECK";
sql = "ALTER TABLE mytable RENAME TO mytable2 HIDDEN";
executeUpdate();
}
void dropTest() throws Exception {
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c3 COMMENT IS 'haha3' CHECK f1>0 and f2<10 CHECK";
executeUpdate();
sql = "ALTER TABLE mytable DROP CONSTRAINT c3";
executeUpdate();
sql = "ALTER TABLE mytable ADD CONSTRAINT IF NOT EXISTS c0 COMMENT IS 'haha0' PRIMARY KEY HASH(f2) INDEX myindex";
executeUpdate();
sql = "ALTER TABLE mytable DROP PRIMARY KEY";
executeUpdate();
sql = "ALTER TABLE mytable DROP COLUMN f1";
sql = "ALTER TABLE mytable DROP f1";
executeUpdate();
}
void alterColumnTest() throws Exception {
sql = "ALTER TABLE mytable ALTER COLUMN f1 RENAME TO f0";
sql = "ALTER TABLE mytable ALTER COLUMN f1 DROP DEFAULT";
sql = "ALTER TABLE mytable ALTER COLUMN f2 DROP NOT NULL";
sql = "ALTER TABLE mytable ALTER COLUMN f1 TYPE long";
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET DATA TYPE long";
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET NULL";
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET NOT NULL";
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET DEFAULT 100";
sql = "ALTER TABLE mytable ALTER COLUMN f1 TYPE int AUTO_INCREMENT";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 RESTART WITH 10";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f2 SELECTIVITY 20";
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_NOT_NULL() throws Exception {
executeUpdate("INSERT INTO mytable(f1, f2) VALUES(null, 2)");
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET NOT NULL";
tryExecuteUpdate();
executeUpdate("delete from mytable where f2=2");
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET NOT NULL";
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_NULL() throws Exception {
executeUpdate("CREATE PRIMARY KEY mytableindex1 ON mytable(f2)");
sql = "ALTER TABLE mytable ALTER COLUMN f2 SET NULL";
tryExecuteUpdate();
executeUpdate("DROP INDEX mytableindex1");
executeUpdate("CREATE HASH INDEX mytableindex2 ON mytable(f2)");
sql = "ALTER TABLE mytable ALTER COLUMN f2 SET NULL";
tryExecuteUpdate();
executeUpdate("DROP INDEX mytableindex2");
sql = "ALTER TABLE mytable ALTER COLUMN f2 SET NULL";
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_DEFAULT() throws Exception {
sql = "ALTER TABLE mytable ALTER COLUMN f2 TYPE int AUTO_INCREMENT";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f2 SET DEFAULT 100";
executeUpdate();
executeUpdate("DROP SEQUENCE IF EXISTS myseq");
executeUpdate("CREATE SEQUENCE IF NOT EXISTS myseq START WITH 1000 INCREMENT BY 1 CACHE 20");
sql = "ALTER TABLE mytable ADD COLUMN f6 int SEQUENCE myseq";
executeUpdate();
sql = "ALTER TABLE mytable ADD COLUMN f7 int SEQUENCE myseq";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f6 SET DEFAULT 100";
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_CHANGE_TYPE() throws Exception {
sql = "ALTER TABLE mytable ALTER COLUMN ch SET DATA TYPE varchar(20)";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN ch SET DATA TYPE varchar(5)";
executeUpdate();
}
void ALTER_TABLE_ADD_COLUMN() throws Exception {
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f1 int";
executeUpdate();
// 增加多列时不能用before
sql = "ALTER TABLE mytable ADD (f0 int before f1, f4 int)";
tryExecuteUpdate();
sql = "ALTER TABLE mytable ADD COLUMN(f5 int AUTO_INCREMENT, f6 int)";
executeUpdate();
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f0 int BEFORE f1";
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int AFTER f2";
// sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f1 int";
// ADD COLUMN时不能加约束,比如这个是错的:
// ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int PRIMARY KEY
// 但是要表示特殊的PRIMARY KEY约束可以加IDENTITY
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int IDENTITY AFTER f2";
sql = "ALTER TABLE mytable ADD COLUMN IF NOT EXISTS f3 int AUTO_INCREMENT AFTER f2";
executeUpdate();
// 测试org.h2.command.ddl.AlterTableAlterColumn.checkDefaultReferencesTable(Expression)
sql = "ALTER TABLE mytable ADD (f7 int, f8 int default f2*2)";
tryExecuteUpdate();
sql = "ALTER TABLE mytable ADD (f7 int, f8 int default EXISTS(select f1 from mytable where f1=1))";
tryExecuteUpdate();
sql = "CREATE OR REPLACE FORCE VIEW mytable_view (v_f5) " //
+ "AS SELECT f5 FROM mytable";
executeUpdate();
sql = "ALTER TABLE mytable DROP f5";
tryExecuteUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f3 RESTART WITH 1";
executeUpdate();
executeUpdate("INSERT INTO mytable(f1, f2, f3) VALUES(1, 2, null)");
stmt.executeUpdate("DROP SEQUENCE IF EXISTS myseq10");
stmt.executeUpdate("CREATE SEQUENCE IF NOT EXISTS myseq10 START WITH 1000 INCREMENT BY 1 CACHE 20");
sql = "ALTER TABLE mytable ADD COLUMN f10 int SEQUENCE myseq10";
executeUpdate();
stmt.executeUpdate("DROP INDEX IF EXISTS mytable_index0");
stmt.executeUpdate("CREATE INDEX mytable_index0 ON mytable(f10)");
sql = "ALTER TABLE mytable DROP COLUMN f3";
executeUpdate();
}
void ALTER_TABLE_DROP_COLUMN() throws Exception {
sql = "ALTER TABLE mytable DROP COLUMN f1";
executeUpdate();
sql = "ALTER TABLE mytable DROP f2";
executeUpdate();
sql = "ALTER TABLE mytable DROP IF EXISTS f2";
executeUpdate();
sql = "ALTER TABLE mytable DROP f2";
tryExecuteUpdate();
sql = "ALTER TABLE mytable DROP ch"; // 不能删除最后一列
tryExecuteUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_SELECTIVITY() throws Exception {
sql = "ALTER TABLE mytable ALTER COLUMN f2 SELECTIVITY -10"; // 小于0时还是0
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f2 SELECTIVITY 20";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f2 SELECTIVITY 120"; // 大于100时还是100
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN_DROP() throws Exception {
// "ALTER COLUMN"可以简写成"ALTER"
sql = "ALTER TABLE mytable ALTER f1 DROP DEFAULT";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 DROP DEFAULT";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 DROP NOT NULL";
executeUpdate();
}
// MySQL compatibility
void ALTER_TABLE_MODIFY_COLUMN() throws Exception {
// "MODIFY COLUMN"可以简写成"MODIFY"
sql = "ALTER TABLE mytable MODIFY f1 long";
executeUpdate();
sql = "ALTER TABLE mytable MODIFY COLUMN f1 int NOT NULL";
executeUpdate();
}
// PostgreSQL compatibility
void ALTER_TABLE_ALTER_COLUMN_TYPE() throws Exception {
sql = "ALTER TABLE mytable ALTER f1 TYPE long";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 TYPE int NOT NULL";
executeUpdate();
}
// Derby compatibility
void ALTER_TABLE_ALTER_COLUMN_SET_DATA_TYPE() throws Exception {
sql = "ALTER TABLE mytable ALTER f1 SET DATA TYPE long";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 SET DATA TYPE int NOT NULL";
executeUpdate();
}
void ALTER_TABLE_ALTER_COLUMN() throws Exception {
sql = "ALTER TABLE mytable ALTER f1 long";
executeUpdate();
sql = "ALTER TABLE mytable ALTER COLUMN f1 int NOT NULL";
executeUpdate();
}
}