package com.zendesk.maxwell.schema.ddl; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.zendesk.maxwell.MaxwellTestWithIsolatedServer; import com.zendesk.maxwell.schema.Schema; import com.zendesk.maxwell.schema.SchemaCapturer; import com.zendesk.maxwell.schema.columndef.StringColumnDef; public class DDLResolverTest extends MaxwellTestWithIsolatedServer { @BeforeClass public static void setUp() throws Exception { server.executeQuery("create database already_there"); } private <T extends SchemaChange> T parse(String sql, String database, Class<T> type) { List<SchemaChange> changeList = SchemaChange.parse(database, sql); return type.cast(changeList.get(0)); } private Schema getSchema() throws Exception { SchemaCapturer capturer = new SchemaCapturer(server.getConnection(), buildContext().getCaseSensitivity()); return capturer.capture(); } @Test public void testDatabaseCreateResolveCharset() throws Exception { server.executeQuery("set global character_set_server = 'latin1'"); server.resetConnection(); Schema topSchema = getSchema(); assertEquals("latin1", topSchema.getCharset()); DatabaseCreate c = parse("CREATE DATABASE `foofoo`", null, DatabaseCreate.class); assertThat(c.charset, is(nullValue())); ResolvedDatabaseCreate resolved = c.resolve(topSchema); assertThat(resolved.charset, is("latin1")); } @Test public void testDatabaseCreateResolveIfNotExists2() throws Exception { Schema schema = getSchema(); DatabaseCreate c = parse("CREATE DATABASE if not exists already_there", null, DatabaseCreate.class); assertThat(c.resolve(schema), is(nullValue())); ResolvedDatabaseCreate resolved = parse("CREATE DATABASE if not exists not_there", null, DatabaseCreate.class).resolve(schema); } @Test public void testDatabaseDropResolveIfExists2() throws Exception { DatabaseDrop d = parse("DROP DATABASE if exists not_totally_there", null, DatabaseDrop.class); assertThat(d.resolve(getSchema()), is(nullValue())); } @Test public void testCreateTableResolveIfNotExists() throws Exception { server.executeQuery("create table test.table_already_there ( id int )"); TableCreate c = parse("CREATE TABLE if not exists `table_already_there` ( id int(10) )", "test", TableCreate.class); assertThat(c.resolve(getSchema()), is(nullValue())); } @Test public void testCreateTableResolveCharset() throws Exception { server.executeQuery("create database test_enc character set 'latin2'"); TableCreate c = parse("CREATE TABLE `test_enc`.`te` ( c varchar, d varchar character set 'utf8' )", "test_enc", TableCreate.class); ResolvedTableCreate rc = c.resolve(getSchema()); assertThat(rc.def.charset, is("latin2")); assertThat(((StringColumnDef) rc.def.getColumnList().get(0)).charset, is("latin2")); assertThat(((StringColumnDef) rc.def.getColumnList().get(1)).charset, is("utf8")); } @Test public void testCreateTableResolveLike() throws Exception { server.executeQuery("alter database `test` character set 'utf8'"); server.executeQuery("create table `test`.`test_alike` ( ii int, aa char, PRIMARY KEY (ii))"); TableCreate c = parse("CREATE TABLE alike_2 like `test`.`test_alike`", "test", TableCreate.class); ResolvedTableCreate rc = c.resolve(getSchema()); assertThat(rc.def.getColumnList().size(), is(2)); assertThat(rc.def.getPKList().get(0), is("ii")); assertThat(((StringColumnDef) rc.def.getColumnList().get(1)).charset, is("utf8")); } @Test public void testDropTableResolve() throws Exception { TableDrop t = parse("drop table if exists `flkj`.`lakjsdflaj`", null, TableDrop.class); assertThat(t.resolve(getSchema()), is(nullValue())); } }