package com.alibaba.druid.bvt.sql.mysql.createTable;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.MysqlTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.repository.SchemaRepository;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;

import java.sql.Types;
import java.util.List;

public class MySqlCreateTableTest115 extends MysqlTest {
    public void test_0() throws Exception {
        String sql = "CREATE TABLE IF NOT EXISTS `schema`.`Employee` (\n" +
                "   id int(10),\n" +
                "   `Employee_id` VARCHAR(45) NOT NULL ,\n" +
                "   `Name` VARCHAR(255) NULL ,\n" +
                "   `idAddresses` VARCHAR(45) NULL ,\n" +
                "   PRIMARY KEY (`Employee_id`) ,\n" +
                "   INDEX `employee_id` USING BTREE (id(5)),\n" +
                "   CONSTRAINT `fkEmployee_Addresses`\n" +
                "   FOREIGN KEY `fkEmployee_Addresses` (`idAddresses`)\n" +
                "   REFERENCES `schema`.`Addresses` (`idAddresses`)\n" +
                "   ON DELETE NO ACTION\n" +
                "   ON UPDATE NO ACTION\n" +
                " ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin";

        MySqlStatementParser parser = new MySqlStatementParser(sql);
        List<SQLStatement> statementList = parser.parseStatementList();
        MySqlCreateTableStatement stmt = (MySqlCreateTableStatement) statementList.get(0);

        assertEquals(1, statementList.size());
        assertEquals(7, stmt.getTableElementList().size());

        assertEquals("CREATE TABLE IF NOT EXISTS `schema`.`Employee` (\n" +
                "\tid int(10),\n" +
                "\t`Employee_id` VARCHAR(45) NOT NULL,\n" +
                "\t`Name` VARCHAR(255) NULL,\n" +
                "\t`idAddresses` VARCHAR(45) NULL,\n" +
                "\tPRIMARY KEY (`Employee_id`),\n" +
                "\tINDEX `employee_id` USING BTREE(id(5)),\n" +
                "\tCONSTRAINT `fkEmployee_Addresses` FOREIGN KEY `fkEmployee_Addresses` (`idAddresses`) REFERENCES `schema`.`Addresses` (`idAddresses`) ON DELETE NO ACTION ON UPDATE NO ACTION\n" +
                ") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin", stmt.toString());

        SchemaStatVisitor v = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL);
        stmt.accept(v);

        assertEquals(5, v.getColumns().size());
        SQLColumnDefinition column = stmt.findColumn("Employee_id");
        assertNotNull(column);
        assertEquals(1, column.getConstraints().size());
        assertTrue(column.isPrimaryKey());
        assertEquals(Types.VARCHAR, column.jdbcType());

        assertEquals("CREATE TABLE IF NOT EXISTS `schema`.`Employee` (\n" +
                "\tid int(10),\n" +
                "\t`Employee_id` VARCHAR(45) NOT NULL,\n" +
                "\t`Name` VARCHAR(255) NULL,\n" +
                "\t`idAddresses` VARCHAR(45) NULL,\n" +
                "\tPRIMARY KEY (`Employee_id`),\n" +
                "\tINDEX `employee_id` USING BTREE(id(5)),\n" +
                "\tFOREIGN KEY `fkEmployee_Addresses` (`idAddresses`) REFERENCES `schema`.`Addresses` (`idAddresses`) ON DELETE NO ACTION ON UPDATE NO ACTION\n" +
                ") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin", stmt.clone().toString());

        SchemaRepository repository = new SchemaRepository(DbType.mysql);
        repository.acceptDDL(sql);
        assertEquals("CREATE TABLE IF NOT EXISTS `Employee` (\n" +
                "\tid int(10),\n" +
                "\t`Employee_id` VARCHAR(45) NOT NULL,\n" +
                "\t`Name` VARCHAR(255) NULL,\n" +
                "\t`idAddresses` VARCHAR(45) NULL,\n" +
                "\tPRIMARY KEY (`Employee_id`),\n" +
                "\tINDEX `employee_id` USING BTREE(id(5)),\n" +
                "\tFOREIGN KEY `fkEmployee_Addresses` (`idAddresses`) REFERENCES `schema`.`Addresses` (`idAddresses`) ON DELETE NO ACTION ON UPDATE NO ACTION\n" +
                ") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin", repository
                .findTable("Employee")
                .getStatement()
                .toString());
    }

}