in modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java [104:228]
public void ddl() throws Exception {
IgniteSql sql = CLUSTER_NODES.get(0).sql();
Session ses = sql.createSession();
// CREATE TABLE
checkDdl(true, ses, "CREATE TABLE TEST(ID INT PRIMARY KEY, VAL0 INT)");
checkError(
TableAlreadyExistsException.class,
"Table already exists [name=\"PUBLIC\".\"TEST\"]",
ses,
"CREATE TABLE TEST(ID INT PRIMARY KEY, VAL0 INT)"
);
checkError(
IgniteException.class,
"Can't create table with duplicate columns: ID, VAL, VAL",
ses,
"CREATE TABLE TEST1(ID INT PRIMARY KEY, VAL INT, VAL INT)"
);
checkDdl(false, ses, "CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, VAL VARCHAR)");
// ADD COLUMN
checkDdl(true, ses, "ALTER TABLE TEST ADD COLUMN VAL1 VARCHAR");
checkError(
TableNotFoundException.class,
"The table does not exist [name=\"PUBLIC\".\"NOT_EXISTS_TABLE\"]",
ses,
"ALTER TABLE NOT_EXISTS_TABLE ADD COLUMN VAL1 VARCHAR"
);
checkDdl(false, ses, "ALTER TABLE IF EXISTS NOT_EXISTS_TABLE ADD COLUMN VAL1 VARCHAR");
checkError(
ColumnAlreadyExistsException.class,
"Column already exists [name=\"VAL1\"]",
ses,
"ALTER TABLE TEST ADD COLUMN VAL1 INT"
);
// CREATE INDEX
checkDdl(true, ses, "CREATE INDEX TEST_IDX ON TEST(VAL0)");
checkError(
IndexAlreadyExistsException.class,
"Index already exists [name=\"PUBLIC\".\"TEST_IDX\"]",
ses,
"CREATE INDEX TEST_IDX ON TEST(VAL1)"
);
checkDdl(false, ses, "CREATE INDEX IF NOT EXISTS TEST_IDX ON TEST(VAL1)");
// TODO: IGNITE-19150 We are waiting for schema synchronization to avoid races to create and destroy indexes
waitForIndexBuild("TEST", "TEST_IDX");
checkDdl(true, ses, "DROP INDEX TESt_iDX");
checkDdl(true, ses, "CREATE INDEX TEST_IDX1 ON TEST(VAL0)");
checkDdl(true, ses, "CREATE INDEX TEST_IDX2 ON TEST(VAL0)");
checkDdl(true, ses, "CREATE INDEX TEST_IDX3 ON TEST(ID, VAL0, VAL1)");
checkError(
SqlException.class,
"Can't create index on duplicate columns: VAL0, VAL0",
ses,
"CREATE INDEX TEST_IDX4 ON TEST(VAL0, VAL0)"
);
checkError(
SqlException.class,
"Can`t delete column(s). Column VAL1 is used by indexes [TEST_IDX3].",
ses,
"ALTER TABLE TEST DROP COLUMN val1"
);
SqlException ex = IgniteTestUtils.cause(assertThrows(Throwable.class,
() -> await(ses.executeAsync(null, "ALTER TABLE TEST DROP COLUMN (val0, val1)"))), SqlException.class);
assertNotNull(ex);
assertEquals(STMT_VALIDATION_ERR, ex.code());
String msg = ex.getMessage();
String explainMsg = "Unexpected error message: " + msg;
assertTrue(msg.contains("Column VAL0 is used by indexes ["), explainMsg);
assertTrue(msg.contains("TEST_IDX1") && msg.contains("TEST_IDX2") && msg.contains("TEST_IDX3"), explainMsg);
assertTrue(msg.contains("Column VAL1 is used by indexes [TEST_IDX3]"), explainMsg);
checkError(
SqlException.class,
"Can`t delete column, belongs to primary key: [name=ID]",
ses,
"ALTER TABLE TEST DROP COLUMN id"
);
// TODO: IGNITE-19150 We are waiting for schema synchronization to avoid races to create and destroy indexes
waitForIndexBuild("TEST", "TEST_IDX3");
checkDdl(true, ses, "DROP INDEX TESt_iDX3");
// DROP COLUMNS
checkDdl(true, ses, "ALTER TABLE TEST DROP COLUMN VAL1");
checkError(
TableNotFoundException.class,
"The table does not exist [name=\"PUBLIC\".\"NOT_EXISTS_TABLE\"]",
ses,
"ALTER TABLE NOT_EXISTS_TABLE DROP COLUMN VAL1"
);
checkDdl(false, ses, "ALTER TABLE IF EXISTS NOT_EXISTS_TABLE DROP COLUMN VAL1");
checkError(
ColumnNotFoundException.class,
"Column does not exist [tableName=\"PUBLIC\".\"TEST\", columnName=\"VAL1\"]",
ses,
"ALTER TABLE TEST DROP COLUMN VAL1"
);
// DROP TABLE
checkDdl(false, ses, "DROP TABLE IF EXISTS NOT_EXISTS_TABLE");
checkDdl(true, ses, "DROP TABLE TEST");
checkError(
TableNotFoundException.class,
"The table does not exist [name=\"PUBLIC\".\"TEST\"]",
ses,
"DROP TABLE TEST"
);
checkDdl(false, ses, "DROP INDEX IF EXISTS TEST_IDX");
checkError(
IndexNotFoundException.class,
"Index does not exist [name=\"PUBLIC\".\"TEST_IDX\"]", ses,
"DROP INDEX TEST_IDX"
);
}