Search in sources :

Example 16 with MySQLDatabase

use of liquibase.database.core.MySQLDatabase in project liquibase by liquibase.

the class SqlUtil method parseValue.

public static Object parseValue(Database database, Object val, DataType type) {
    if (!(val instanceof String)) {
        return val;
    }
    int typeId = Integer.MIN_VALUE;
    if (type.getDataTypeId() != null) {
        typeId = type.getDataTypeId();
    }
    String typeName = type.getTypeName();
    LiquibaseDataType liquibaseDataType = DataTypeFactory.getInstance().from(type, database);
    String stringVal = (String) val;
    if (stringVal.isEmpty()) {
        if (liquibaseDataType instanceof CharType) {
            return "";
        } else {
            return null;
        }
    }
    if (database instanceof OracleDatabase && !stringVal.startsWith("'") && !stringVal.endsWith("'")) {
        //oracle returns functions without quotes
        Object maybeDate = null;
        if (liquibaseDataType instanceof DateType || typeId == Types.DATE) {
            if (stringVal.endsWith("'HH24:MI:SS')")) {
                maybeDate = DataTypeFactory.getInstance().fromDescription("time", database).sqlToObject(stringVal, database);
            } else {
                maybeDate = DataTypeFactory.getInstance().fromDescription("date", database).sqlToObject(stringVal, database);
            }
        } else if (liquibaseDataType instanceof DateTimeType || typeId == Types.TIMESTAMP) {
            maybeDate = DataTypeFactory.getInstance().fromDescription("datetime", database).sqlToObject(stringVal, database);
        } else if (!stringVal.matches("\\d+\\.?\\d*")) {
            //not just a number
            return new DatabaseFunction(stringVal);
        }
        if (maybeDate != null) {
            if (maybeDate instanceof java.util.Date) {
                return maybeDate;
            } else {
                return new DatabaseFunction(stringVal);
            }
        }
    }
    boolean strippedSingleQuotes = false;
    if (stringVal.startsWith("'") && stringVal.endsWith("'")) {
        stringVal = stringVal.substring(1, stringVal.length() - 1);
        strippedSingleQuotes = true;
    } else if (stringVal.startsWith("((") && stringVal.endsWith("))")) {
        stringVal = stringVal.substring(2, stringVal.length() - 2);
    } else if (stringVal.startsWith("('") && stringVal.endsWith("')")) {
        stringVal = stringVal.substring(2, stringVal.length() - 2);
    } else if (stringVal.startsWith("(") && stringVal.endsWith(")")) {
        return new DatabaseFunction(stringVal.substring(1, stringVal.length() - 1));
    }
    Scanner scanner = new Scanner(stringVal.trim());
    if (typeId == Types.ARRAY) {
        return new DatabaseFunction(stringVal);
    } else if ((liquibaseDataType instanceof BigIntType || typeId == Types.BIGINT)) {
        if (scanner.hasNextBigInteger()) {
            return scanner.nextBigInteger();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (typeId == Types.BINARY) {
        return new DatabaseFunction(stringVal.trim());
    } else if (typeId == Types.BIT) {
        if (stringVal.startsWith("b'") || stringVal.startsWith("B'")) {
            //mysql returns boolean values as b'0' and b'1'
            stringVal = stringVal.replaceFirst("b'", "").replaceFirst("B'", "").replaceFirst("'$", "");
        }
        stringVal = stringVal.trim();
        if (database instanceof MySQLDatabase) {
            return stringVal.equals("1") || stringVal.equalsIgnoreCase("true");
        }
        Object value;
        if (scanner.hasNextBoolean()) {
            value = scanner.nextBoolean();
        } else {
            value = Integer.valueOf(stringVal);
        }
        return value;
    } else if (liquibaseDataType instanceof BlobType || typeId == Types.BLOB) {
        if (strippedSingleQuotes) {
            return stringVal;
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if ((liquibaseDataType instanceof BooleanType || typeId == Types.BOOLEAN)) {
        if (scanner.hasNextBoolean()) {
            return scanner.nextBoolean();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (liquibaseDataType instanceof CharType || typeId == Types.CHAR) {
        return stringVal;
    } else if (liquibaseDataType instanceof ClobType || typeId == Types.CLOB) {
        return stringVal;
    } else if (typeId == Types.DATALINK) {
        return new DatabaseFunction(stringVal);
    } else if (liquibaseDataType instanceof DateType || typeId == Types.DATE) {
        if (typeName.equalsIgnoreCase("year")) {
            return stringVal.trim();
        }
        return DataTypeFactory.getInstance().fromDescription("date", database).sqlToObject(stringVal, database);
    } else if ((liquibaseDataType instanceof DecimalType || typeId == Types.DECIMAL)) {
        if (scanner.hasNextBigDecimal()) {
            return scanner.nextBigDecimal();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (typeId == Types.DISTINCT) {
        return new DatabaseFunction(stringVal);
    } else if ((liquibaseDataType instanceof DoubleType || typeId == Types.DOUBLE)) {
        if (scanner.hasNextDouble()) {
            return scanner.nextDouble();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if ((liquibaseDataType instanceof FloatType || typeId == Types.FLOAT)) {
        if (scanner.hasNextFloat()) {
            return scanner.nextFloat();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if ((liquibaseDataType instanceof IntType || typeId == Types.INTEGER)) {
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (typeId == Types.JAVA_OBJECT) {
        return new DatabaseFunction(stringVal);
    } else if (typeId == Types.LONGNVARCHAR) {
        return stringVal;
    } else if (typeId == Types.LONGVARBINARY) {
        return new DatabaseFunction(stringVal);
    } else if (typeId == Types.LONGVARCHAR) {
        return stringVal;
    } else if (liquibaseDataType instanceof NCharType || typeId == Types.NCHAR || liquibaseDataType.getName().equalsIgnoreCase("NCLOB")) {
        return stringVal;
    } else if (typeId == Types.NCLOB) {
        return stringVal;
    } else if (typeId == Types.NULL) {
        return null;
    } else if ((liquibaseDataType instanceof NumberType || typeId == Types.NUMERIC)) {
        if (scanner.hasNextBigDecimal()) {
            if (database instanceof MSSQLDatabase && stringVal.endsWith(".0") || stringVal.endsWith(".00") || stringVal.endsWith(".000")) {
                //MSSQL can store the value with the decimal digits. return it directly to avoid unexpected differences
                return new DatabaseFunction(stringVal);
            }
            return scanner.nextBigDecimal();
        } else {
            if (stringVal.equals("")) {
                //can have numeric default '' on sql server
                return new DatabaseFunction("''");
            }
            return new DatabaseFunction(stringVal);
        }
    } else if (liquibaseDataType instanceof NVarcharType || typeId == Types.NVARCHAR) {
        return stringVal;
    } else if (typeId == Types.OTHER) {
        if (database instanceof DB2Database && typeName.equalsIgnoreCase("DECFLOAT")) {
            return new BigDecimal(stringVal);
        }
        return new DatabaseFunction(stringVal);
    } else if (typeId == Types.REAL) {
        return new BigDecimal(stringVal.trim());
    } else if (typeId == Types.REF) {
        return new DatabaseFunction(stringVal);
    } else if (typeId == Types.ROWID) {
        return new DatabaseFunction(stringVal);
    } else if ((liquibaseDataType instanceof SmallIntType || typeId == Types.SMALLINT)) {
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (typeId == Types.SQLXML) {
        return new DatabaseFunction(stringVal);
    } else if (typeId == Types.STRUCT) {
        return new DatabaseFunction(stringVal);
    } else if (liquibaseDataType instanceof TimeType || typeId == Types.TIME) {
        return DataTypeFactory.getInstance().fromDescription("time", database).sqlToObject(stringVal, database);
    } else if (liquibaseDataType instanceof DateTimeType || liquibaseDataType instanceof TimestampType || typeId == Types.TIMESTAMP) {
        return DataTypeFactory.getInstance().fromDescription("datetime", database).sqlToObject(stringVal, database);
    } else if ((liquibaseDataType instanceof TinyIntType || typeId == Types.TINYINT)) {
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        } else {
            return new DatabaseFunction(stringVal);
        }
    } else if (typeId == Types.VARBINARY) {
        return new DatabaseFunction(stringVal);
    } else if (liquibaseDataType instanceof VarcharType || typeId == Types.VARCHAR) {
        return stringVal;
    } else if (database instanceof MySQLDatabase && typeName.toLowerCase().startsWith("enum")) {
        return stringVal;
    } else {
        if (stringVal.equals("")) {
            return stringVal;
        }
        LogFactory.getLogger().info("Unknown default value: value '" + stringVal + "' type " + typeName + " (" + type + "). Calling it a function so it's not additionally quoted");
        if (strippedSingleQuotes) {
            //put quotes back
            return new DatabaseFunction("'" + stringVal + "'");
        }
        return new DatabaseFunction(stringVal);
    }
}
Also used : DB2Database(liquibase.database.core.DB2Database) Scanner(java.util.Scanner) DatabaseFunction(liquibase.statement.DatabaseFunction) MSSQLDatabase(liquibase.database.core.MSSQLDatabase) LiquibaseDataType(liquibase.datatype.LiquibaseDataType) MySQLDatabase(liquibase.database.core.MySQLDatabase) BigDecimal(java.math.BigDecimal) OracleDatabase(liquibase.database.core.OracleDatabase)

Example 17 with MySQLDatabase

use of liquibase.database.core.MySQLDatabase in project liquibase by liquibase.

the class ChangeLogIteratorTest method runChangeSet_doubleFilterIterator.

@Test
public void runChangeSet_doubleFilterIterator() throws Exception {
    TestChangeSetVisitor testChangeLogVisitor = new TestChangeSetVisitor();
    ChangeLogIterator iterator = new ChangeLogIterator(changeLog, new ContextChangeSetFilter(new Contexts("test1")), new DbmsChangeSetFilter(new MySQLDatabase()));
    iterator.run(testChangeLogVisitor, new RuntimeEnvironment(null, null, null));
    assertEquals(3, testChangeLogVisitor.visitedChangeSets.size());
    assertEquals("1", testChangeLogVisitor.visitedChangeSets.get(0).getId());
    assertEquals("4", testChangeLogVisitor.visitedChangeSets.get(1).getId());
    assertEquals("5", testChangeLogVisitor.visitedChangeSets.get(2).getId());
}
Also used : RuntimeEnvironment(liquibase.RuntimeEnvironment) ContextChangeSetFilter(liquibase.changelog.filter.ContextChangeSetFilter) MySQLDatabase(liquibase.database.core.MySQLDatabase) DbmsChangeSetFilter(liquibase.changelog.filter.DbmsChangeSetFilter) Contexts(liquibase.Contexts) Test(org.junit.Test)

Example 18 with MySQLDatabase

use of liquibase.database.core.MySQLDatabase in project liquibase by liquibase.

the class MissingTableChangeGenerator method fixMissing.

@Override
public Change[] fixMissing(DatabaseObject missingObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
    Table missingTable = (Table) missingObject;
    PrimaryKey primaryKey = missingTable.getPrimaryKey();
    //        if (control.diffResult.getReferenceSnapshot().getDatabase().isLiquibaseTable(missingTable.getSchema().toCatalogAndSchema(), missingTable.getName())) {
    //            continue;
    //        }
    CreateTableChange change = createCreateTableChange();
    change.setTableName(missingTable.getName());
    if (control.getIncludeCatalog()) {
        change.setCatalogName(missingTable.getSchema().getCatalogName());
    }
    if (control.getIncludeSchema()) {
        change.setSchemaName(missingTable.getSchema().getName());
    }
    if (missingTable.getRemarks() != null) {
        change.setRemarks(missingTable.getRemarks());
    }
    for (Column column : missingTable.getColumns()) {
        ColumnConfig columnConfig = new ColumnConfig();
        columnConfig.setName(column.getName());
        LiquibaseDataType ldt = DataTypeFactory.getInstance().from(column.getType(), referenceDatabase);
        DatabaseDataType ddt = ldt.toDatabaseDataType(comparisonDatabase);
        String typeString = ddt.toString();
        if (comparisonDatabase instanceof MSSQLDatabase) {
            typeString = comparisonDatabase.unescapeDataTypeString(typeString);
        }
        columnConfig.setType(typeString);
        if (column.isAutoIncrement()) {
            columnConfig.setAutoIncrement(true);
        }
        ConstraintsConfig constraintsConfig = null;
        // In MySQL, the primary key must be specified at creation for an autoincrement column
        if (column.isAutoIncrement() && primaryKey != null && primaryKey.getColumns().size() == 1 && primaryKey.getColumnNamesAsList().contains(column.getName())) {
            if (referenceDatabase instanceof MSSQLDatabase && primaryKey.getBackingIndex() != null && primaryKey.getBackingIndex().getClustered() != null && !primaryKey.getBackingIndex().getClustered()) {
            // have to handle PK as a separate statement
            } else if (referenceDatabase instanceof PostgresDatabase && primaryKey.getBackingIndex() != null && primaryKey.getBackingIndex().getClustered() != null && primaryKey.getBackingIndex().getClustered()) {
            // have to handle PK as a separate statement
            } else {
                constraintsConfig = new ConstraintsConfig();
                if (shouldAddPrimarykeyToConstraints(missingObject, control, referenceDatabase, comparisonDatabase)) {
                    constraintsConfig.setPrimaryKey(true);
                    constraintsConfig.setPrimaryKeyTablespace(primaryKey.getTablespace());
                    // MySQL sets some primary key names as PRIMARY which is invalid
                    if (comparisonDatabase instanceof MySQLDatabase && "PRIMARY".equals(primaryKey.getName())) {
                        constraintsConfig.setPrimaryKeyName(null);
                    } else {
                        constraintsConfig.setPrimaryKeyName(primaryKey.getName());
                    }
                    control.setAlreadyHandledMissing(primaryKey);
                    control.setAlreadyHandledMissing(primaryKey.getBackingIndex());
                } else {
                    constraintsConfig.setNullable(false);
                }
            }
        } else if (column.isNullable() != null && !column.isNullable()) {
            constraintsConfig = new ConstraintsConfig();
            constraintsConfig.setNullable(false);
        }
        if (constraintsConfig != null) {
            columnConfig.setConstraints(constraintsConfig);
        }
        setDefaultValue(columnConfig, column, referenceDatabase);
        if (column.getRemarks() != null) {
            columnConfig.setRemarks(column.getRemarks());
        }
        if (column.getAutoIncrementInformation() != null) {
            BigInteger startWith = column.getAutoIncrementInformation().getStartWith();
            BigInteger incrementBy = column.getAutoIncrementInformation().getIncrementBy();
            if (startWith != null && !startWith.equals(BigInteger.ONE)) {
                columnConfig.setStartWith(startWith);
            }
            if (incrementBy != null && !incrementBy.equals(BigInteger.ONE)) {
                columnConfig.setIncrementBy(incrementBy);
            }
        }
        change.addColumn(columnConfig);
        control.setAlreadyHandledMissing(column);
    }
    return new Change[] { change };
}
Also used : Table(liquibase.structure.core.Table) ColumnConfig(liquibase.change.ColumnConfig) LiquibaseDataType(liquibase.datatype.LiquibaseDataType) PrimaryKey(liquibase.structure.core.PrimaryKey) MySQLDatabase(liquibase.database.core.MySQLDatabase) Change(liquibase.change.Change) CreateTableChange(liquibase.change.core.CreateTableChange) PostgresDatabase(liquibase.database.core.PostgresDatabase) DatabaseDataType(liquibase.datatype.DatabaseDataType) Column(liquibase.structure.core.Column) CreateTableChange(liquibase.change.core.CreateTableChange) ConstraintsConfig(liquibase.change.ConstraintsConfig) BigInteger(java.math.BigInteger) MSSQLDatabase(liquibase.database.core.MSSQLDatabase)

Example 19 with MySQLDatabase

use of liquibase.database.core.MySQLDatabase in project liquibase by liquibase.

the class AddColumnGeneratorTest method isValid.

@Override
public void isValid() throws Exception {
    super.isValid();
    AddColumnStatement addPKColumn = new AddColumnStatement(null, null, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, null, new PrimaryKeyConstraint("pk_name"));
    assertFalse(generatorUnderTest.validate(addPKColumn, new OracleDatabase(), new MockSqlGeneratorChain()).hasErrors());
    assertTrue(generatorUnderTest.validate(addPKColumn, new H2Database(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a primary key column"));
    assertTrue(generatorUnderTest.validate(addPKColumn, new DB2Database(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a primary key column"));
    assertTrue(generatorUnderTest.validate(addPKColumn, new DerbyDatabase(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a primary key column"));
    assertTrue(generatorUnderTest.validate(addPKColumn, new SQLiteDatabase(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a primary key column"));
    assertTrue(generatorUnderTest.validate(new AddColumnStatement(null, null, null, null, null, null, new AutoIncrementConstraint()), new MySQLDatabase(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a non-primary key identity column"));
    assertTrue(generatorUnderTest.validate(new AddColumnStatement(null, null, null, null, null, null, new AutoIncrementConstraint()), new MySQLDatabase(), new MockSqlGeneratorChain()).getErrorMessages().contains("Cannot add a non-primary key identity column"));
    assertTrue(generatorUnderTest.validate(new AddColumnStatement(new AddColumnStatement(null, null, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, null), new AddColumnStatement(null, null, "other_table", "other_column", COLUMN_TYPE, null)), new MySQLDatabase(), new MockSqlGeneratorChain()).getErrorMessages().contains("All columns must be targeted at the same table"));
}
Also used : OracleDatabase(liquibase.database.core.OracleDatabase) DB2Database(liquibase.database.core.DB2Database) AutoIncrementConstraint(liquibase.statement.AutoIncrementConstraint) SQLiteDatabase(liquibase.database.core.SQLiteDatabase) DerbyDatabase(liquibase.database.core.DerbyDatabase) MySQLDatabase(liquibase.database.core.MySQLDatabase) H2Database(liquibase.database.core.H2Database) AddColumnStatement(liquibase.statement.core.AddColumnStatement) PrimaryKeyConstraint(liquibase.statement.PrimaryKeyConstraint) MockSqlGeneratorChain(liquibase.sqlgenerator.MockSqlGeneratorChain)

Example 20 with MySQLDatabase

use of liquibase.database.core.MySQLDatabase in project liquibase by liquibase.

the class CreateTableGeneratorTest method testAutoIncrementMySQLDatabase.

@Test
public void testAutoIncrementMySQLDatabase() throws Exception {
    for (Database database : TestContext.getInstance().getAllDatabases()) {
        if (database instanceof MySQLDatabase) {
            CreateTableStatement statement = new CreateTableStatement(CATALOG_NAME, SCHEMA_NAME, TABLE_NAME);
            statement.addColumn(COLUMN_NAME1, DataTypeFactory.getInstance().fromDescription("BIGINT{autoIncrement:true}", database), new AutoIncrementConstraint(COLUMN_NAME1));
            Sql[] generatedSql = this.generatorUnderTest.generateSql(statement, database, null);
            assertEquals("CREATE TABLE CATALOG_NAME.TABLE_NAME (COLUMN1_NAME BIGINT AUTO_INCREMENT NULL)", generatedSql[0].toSql());
        }
    }
}
Also used : AutoIncrementConstraint(liquibase.statement.AutoIncrementConstraint) CreateTableStatement(liquibase.statement.core.CreateTableStatement) SQLiteDatabase(liquibase.database.core.SQLiteDatabase) DerbyDatabase(liquibase.database.core.DerbyDatabase) DB2Database(liquibase.database.core.DB2Database) H2Database(liquibase.database.core.H2Database) MSSQLDatabase(liquibase.database.core.MSSQLDatabase) MySQLDatabase(liquibase.database.core.MySQLDatabase) PostgresDatabase(liquibase.database.core.PostgresDatabase) OracleDatabase(liquibase.database.core.OracleDatabase) SybaseDatabase(liquibase.database.core.SybaseDatabase) SybaseASADatabase(liquibase.database.core.SybaseASADatabase) Database(liquibase.database.Database) HsqlDatabase(liquibase.database.core.HsqlDatabase) MySQLDatabase(liquibase.database.core.MySQLDatabase) Sql(liquibase.sql.Sql) AbstractSqlGeneratorTest(liquibase.sqlgenerator.AbstractSqlGeneratorTest) Test(org.junit.Test)

Aggregations

MySQLDatabase (liquibase.database.core.MySQLDatabase)21 Test (org.junit.Test)14 OracleDatabase (liquibase.database.core.OracleDatabase)9 MSSQLDatabase (liquibase.database.core.MSSQLDatabase)7 Sql (liquibase.sql.Sql)7 H2Database (liquibase.database.core.H2Database)6 AbstractSqlGeneratorTest (liquibase.sqlgenerator.AbstractSqlGeneratorTest)6 Database (liquibase.database.Database)5 DB2Database (liquibase.database.core.DB2Database)5 PostgresDatabase (liquibase.database.core.PostgresDatabase)5 DerbyDatabase (liquibase.database.core.DerbyDatabase)4 SQLiteDatabase (liquibase.database.core.SQLiteDatabase)4 MockSqlGeneratorChain (liquibase.sqlgenerator.MockSqlGeneratorChain)4 AutoIncrementConstraint (liquibase.statement.AutoIncrementConstraint)4 CreateTableStatement (liquibase.statement.core.CreateTableStatement)4 HsqlDatabase (liquibase.database.core.HsqlDatabase)3 SybaseASADatabase (liquibase.database.core.SybaseASADatabase)3 SybaseDatabase (liquibase.database.core.SybaseDatabase)3 LiquibaseDataType (liquibase.datatype.LiquibaseDataType)3 AddColumnStatement (liquibase.statement.core.AddColumnStatement)3