]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5471 support default value in boolean and varchar columns
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Wed, 7 Dec 2016 09:44:50 +0000 (10:44 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 12 Dec 2016 12:05:19 +0000 (13:05 +0100)
22 files changed:
sonar-db/src/main/java/org/sonar/db/version/AbstractColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/AddColumnsBuilder.java
sonar-db/src/main/java/org/sonar/db/version/AlterColumnsBuilder.java
sonar-db/src/main/java/org/sonar/db/version/BigIntegerColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/BlobColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/BooleanColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/ClobColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/ColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/CreateTableBuilder.java
sonar-db/src/main/java/org/sonar/db/version/DecimalColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/IntegerColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/TinyIntColumnDef.java
sonar-db/src/main/java/org/sonar/db/version/VarcharColumnDef.java
sonar-db/src/test/java/org/sonar/db/version/AddColumnsBuilderTest.java
sonar-db/src/test/java/org/sonar/db/version/AlterColumnsBuilderTest.java
sonar-db/src/test/java/org/sonar/db/version/BooleanColumnDefTest.java
sonar-db/src/test/java/org/sonar/db/version/ClobColumnDefTest.java
sonar-db/src/test/java/org/sonar/db/version/CreateTableBuilderTest.java
sonar-db/src/test/java/org/sonar/db/version/DecimalColumnDefTest.java
sonar-db/src/test/java/org/sonar/db/version/IntegerColumnDefTest.java
sonar-db/src/test/java/org/sonar/db/version/TinyIntColumnDefTest.java
sonar-db/src/test/java/org/sonar/db/version/VarcharColumnDefTest.java

index 3d1c3d5539d1ffa33cb092eedd85d095ec179b89..d9aae31fb292d1afb70aef9c13856c47328dbd3c 100644 (file)
  */
 package org.sonar.db.version;
 
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 public abstract class AbstractColumnDef implements ColumnDef {
   private final String columnName;
   private final boolean isNullable;
+  @CheckForNull
+  private final Object defaultValue;
 
-  public AbstractColumnDef(String columnName, boolean isNullable) {
+  public AbstractColumnDef(String columnName, boolean isNullable, @Nullable Object defaultValue) {
     this.columnName = columnName;
     this.isNullable = isNullable;
+    this.defaultValue = defaultValue;
   }
 
   @Override
@@ -37,4 +43,9 @@ public abstract class AbstractColumnDef implements ColumnDef {
   public boolean isNullable() {
     return isNullable;
   }
+
+  @Override
+  public Object getDefaultValue() {
+    return defaultValue;
+  }
 }
index f61a30dd3df1985cd95b278c84133dcc24fa5759..3806cca6c4afccb64c137b7bf857eb09793ae9ef 100644 (file)
@@ -25,6 +25,7 @@ import org.sonar.db.dialect.MsSql;
 import org.sonar.db.dialect.PostgreSql;
 
 import static com.google.common.collect.Lists.newArrayList;
+import static java.lang.String.format;
 import static org.sonar.db.version.Validations.validateTableName;
 
 /**
@@ -80,6 +81,18 @@ public class AddColumnsBuilder {
 
   private void addColumn(StringBuilder sql, ColumnDef columnDef) {
     sql.append(columnDef.getName()).append(" ").append(columnDef.generateSqlType(dialect));
+    Object defaultValue = columnDef.getDefaultValue();
+    if (defaultValue != null) {
+      sql.append(" DEFAULT ");
+      // TODO remove duplication with CreateTableBuilder
+      if (defaultValue instanceof String) {
+        sql.append(format("'%s'", defaultValue));
+      } else if (defaultValue instanceof Boolean) {
+        sql.append((boolean) defaultValue ? dialect.getTrueSqlValue() : dialect.getFalseSqlValue());
+      } else {
+        sql.append(defaultValue);
+      }
+    }
     sql.append(columnDef.isNullable() ? " NULL" : " NOT NULL");
   }
 
index da9765e428feecbc76b9ccd13ddd62bd046cc711..81e571d6b27ccfece144e569b6ae33f25e89380d 100644 (file)
@@ -28,6 +28,7 @@ import org.sonar.db.dialect.MySql;
 import org.sonar.db.dialect.Oracle;
 import org.sonar.db.dialect.PostgreSql;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -54,6 +55,8 @@ public class AlterColumnsBuilder {
   }
 
   public AlterColumnsBuilder updateColumn(ColumnDef columnDef) {
+    // limitation of Oracle, only attribute changes must be defined in ALTER.
+    checkArgument(columnDef.getDefaultValue()==null, "Default value is not supported on alter of column '%s'", columnDef.getName());
     columnDefs.add(columnDef);
     return this;
   }
@@ -137,6 +140,7 @@ public class AlterColumnsBuilder {
     if (addNotNullableProperty) {
       sql.append(columnDef.isNullable() ? " NULL" : " NOT NULL");
     }
+
   }
 
 }
index dc62060e71c2a033af860238562bd169a97d82c7..c5eea2195ae25f1a5aaab666f57b0b8c551f2910 100644 (file)
@@ -28,7 +28,7 @@ import static org.sonar.db.version.Validations.validateColumnName;
 public class BigIntegerColumnDef extends AbstractColumnDef {
 
   private BigIntegerColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
   }
 
   public static Builder newBigIntegerColumnDefBuilder() {
index 31e51fb98979e6dce889dcf34bf2520d303f0e4a..9d94c404d30e4a02b8fc13098e667948e490f820 100644 (file)
@@ -31,7 +31,7 @@ import static org.sonar.db.version.Validations.validateColumnName;
 
 public class BlobColumnDef extends AbstractColumnDef {
   public BlobColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
   }
 
   @Override
index c2cd7d17789c6c5f6f6b4e92cf42f0c586fa834b..6503b89127e514dbdf5a3c72a260fd124f6a11ac 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.version;
 
+import javax.annotation.Nullable;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.H2;
 import org.sonar.db.dialect.MsSql;
@@ -32,8 +33,9 @@ import static org.sonar.db.version.Validations.validateColumnName;
  * Used to define VARCHAR column
  */
 public class BooleanColumnDef extends AbstractColumnDef {
+
   private BooleanColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, builder.defaultValue);
   }
 
   public static Builder newBooleanColumnDefBuilder() {
@@ -59,7 +61,7 @@ public class BooleanColumnDef extends AbstractColumnDef {
 
   public static class Builder {
     private String columnName;
-
+    private Boolean defaultValue = null;
     private boolean isNullable = true;
 
     public Builder setColumnName(String columnName) {
@@ -72,6 +74,11 @@ public class BooleanColumnDef extends AbstractColumnDef {
       return this;
     }
 
+    public Builder setDefaultValue(@Nullable Boolean b) {
+      this.defaultValue = b;
+      return this;
+    }
+
     public BooleanColumnDef build() {
       validateColumnName(columnName);
       return new BooleanColumnDef(this);
index a57f0043a2e6a236d0e0f7e2ab0b65be5cfb60ec..93e342bafe501c1507455bd0c856a3f57e3a7d27 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.db.version;
 
-import javax.annotation.CheckForNull;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.H2;
 import org.sonar.db.dialect.MsSql;
@@ -31,13 +30,11 @@ import static org.sonar.db.version.Validations.validateColumnName;
 
 /**
  * Used to define CLOB columns
- *
- * Warning, for the moment it's only supporting MsSQL
  */
 public class ClobColumnDef extends AbstractColumnDef {
 
   private ClobColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
   }
 
   public static Builder newClobColumnDefBuilder() {
@@ -63,9 +60,7 @@ public class ClobColumnDef extends AbstractColumnDef {
   }
 
   public static class Builder {
-    @CheckForNull
     private String columnName;
-
     private boolean isNullable = true;
 
     public Builder setColumnName(String columnName) {
index 91d987e1838bd1fd6d126b66888e2b0ae0f2d48d..7fc8e4bd013de7d63e9798444acdac244cbeffe7 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.version;
 
+import javax.annotation.CheckForNull;
 import org.sonar.db.dialect.Dialect;
 
 public interface ColumnDef {
@@ -29,4 +30,6 @@ public interface ColumnDef {
 
   String generateSqlType(Dialect dialect);
 
+  @CheckForNull
+  Object getDefaultValue();
 }
index 84b34fda5b4d913b49b95ee28e031f7ea77b74a7..f771b94e07a74ba5d2e360f67ac9147afcb534c9 100644 (file)
@@ -39,6 +39,7 @@ import org.sonar.db.dialect.PostgreSql;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
+import static java.lang.String.format;
 import static java.util.Objects.requireNonNull;
 import static java.util.stream.Stream.of;
 import static org.sonar.db.version.Validations.validateConstraintName;
@@ -134,6 +135,7 @@ public class CreateTableBuilder {
       res.append(columnDef.getName());
       res.append(' ');
       appendDataType(res, dialect, columnDef);
+      appendDefaultValue(res, columnDef);
       appendNullConstraint(res, columnDef);
       appendColumnFlags(res, dialect, columnDef);
       if (columnDefIterator.hasNext()) {
@@ -169,6 +171,21 @@ public class CreateTableBuilder {
     }
   }
 
+  private void appendDefaultValue(StringBuilder sql, ColumnDef columnDef) {
+    Object defaultValue = columnDef.getDefaultValue();
+    if (defaultValue != null) {
+      sql.append(" DEFAULT ");
+
+      if (defaultValue instanceof String) {
+        sql.append(format("'%s'", defaultValue));
+      } else if (defaultValue instanceof Boolean) {
+        sql.append((boolean) defaultValue ? dialect.getTrueSqlValue() : dialect.getFalseSqlValue());
+      } else {
+        sql.append(defaultValue);
+      }
+    }
+  }
+
   private void appendColumnFlags(StringBuilder res, Dialect dialect, ColumnDef columnDef) {
     Collection<ColumnFlag> columnFlags = this.flagsByColumn.get(columnDef);
     if (columnFlags != null && columnFlags.contains(ColumnFlag.AUTO_INCREMENT)) {
index ba4c46358ef4fa14c7e97f8b82c7d016bf248684..69c466958de4d535452456c34bd862600a60ff0c 100644 (file)
@@ -38,7 +38,7 @@ public class DecimalColumnDef extends AbstractColumnDef {
   private final int scale;
 
   private DecimalColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
     this.precision = builder.precision;
     this.scale = builder.scale;
   }
index 8b41a8a4ed8cb52c72b1c1994d60f65706e060e9..5b2098572fe8dd73566b76431687ad02ff1f1430 100644 (file)
@@ -32,7 +32,7 @@ import static org.sonar.db.version.Validations.validateColumnName;
 public class IntegerColumnDef extends AbstractColumnDef {
 
   private IntegerColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
   }
 
   public static Builder newIntegerColumnDefBuilder() {
index 81fe6d06eb474f780bce2638097cebbd9cf57e73..caf02b08d2b250a4a7d36e0b868650b09fe7c6e8 100644 (file)
@@ -35,7 +35,7 @@ import static org.sonar.db.version.Validations.validateColumnName;
 public class TinyIntColumnDef extends AbstractColumnDef {
 
   private TinyIntColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, null);
   }
 
   @Override
index cfab9db27e51c65f9ccf339727b94ea3ce431044..319f6869004f52fa1cdf440f047e48cdf6a81638 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.db.version;
 
 import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.MsSql;
 
@@ -42,7 +43,7 @@ public class VarcharColumnDef extends AbstractColumnDef {
   private final int columnSize;
 
   private VarcharColumnDef(Builder builder) {
-    super(builder.columnName, builder.isNullable);
+    super(builder.columnName, builder.isNullable, builder.defaultValue);
     this.columnSize = builder.columnSize;
   }
 
@@ -71,6 +72,9 @@ public class VarcharColumnDef extends AbstractColumnDef {
 
     private boolean isNullable = true;
 
+    @CheckForNull
+    public String defaultValue = null;
+
     public Builder setColumnName(String columnName) {
       this.columnName = validateColumnName(columnName);
       return this;
@@ -86,6 +90,11 @@ public class VarcharColumnDef extends AbstractColumnDef {
       return this;
     }
 
+    public Builder setDefaultValue(@Nullable String s) {
+      this.defaultValue = s;
+      return this;
+    }
+
     public VarcharColumnDef build() {
       validateColumnName(columnName);
       requireNonNull(columnSize, "Limit cannot be null");
index d2df1bec86f66319c37fb05b23f7c07d9fdfe57e..5587b107edfd101297f77572635145fe94a8d524 100644 (file)
@@ -30,41 +30,44 @@ import org.sonar.db.dialect.Oracle;
 import org.sonar.db.dialect.PostgreSql;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.db.version.BooleanColumnDef.newBooleanColumnDefBuilder;
+import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder;
 
 public class AddColumnsBuilderTest {
 
-  static final String TABLE_NAME = "issues";
+  private static final String TABLE_NAME = "issues";
+
   @Rule
   public ExpectedException thrown = ExpectedException.none();
 
   @Test
   public void add_columns_on_h2() {
     assertThat(createSampleBuilder(new H2()).build())
-      .isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL)");
+      .isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL, col_with_default BOOLEAN DEFAULT false NOT NULL, varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL)");
   }
 
   @Test
   public void add_columns_on_mysql() {
     assertThat(createSampleBuilder(new MySql()).build())
-      .isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL)");
+      .isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL, col_with_default TINYINT(1) DEFAULT false NOT NULL, varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL)");
   }
 
   @Test
   public void add_columns_on_oracle() {
     assertThat(createSampleBuilder(new Oracle()).build())
-      .isEqualTo("ALTER TABLE issues ADD (date_in_ms NUMBER (38) NULL, name VARCHAR (10) NOT NULL)");
+      .isEqualTo("ALTER TABLE issues ADD (date_in_ms NUMBER (38) NULL, name VARCHAR (10) NOT NULL, col_with_default NUMBER(1) DEFAULT 0 NOT NULL, varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL)");
   }
 
   @Test
   public void add_columns_on_postgresql() {
     assertThat(createSampleBuilder(new PostgreSql()).build())
-      .isEqualTo("ALTER TABLE issues ADD COLUMN date_in_ms BIGINT NULL, ADD COLUMN name VARCHAR (10) NOT NULL");
+      .isEqualTo("ALTER TABLE issues ADD COLUMN date_in_ms BIGINT NULL, ADD COLUMN name VARCHAR (10) NOT NULL, ADD COLUMN col_with_default BOOLEAN DEFAULT false NOT NULL, ADD COLUMN varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL");
   }
 
   @Test
   public void add_columns_on_mssql() {
     assertThat(createSampleBuilder(new MsSql()).build())
-      .isEqualTo("ALTER TABLE issues ADD date_in_ms BIGINT NULL, name NVARCHAR (10) NOT NULL");
+      .isEqualTo("ALTER TABLE issues ADD date_in_ms BIGINT NULL, name NVARCHAR (10) NOT NULL, col_with_default BIT DEFAULT 0 NOT NULL, varchar_col_with_default NVARCHAR (3) DEFAULT 'foo' NOT NULL");
   }
 
   @Test
@@ -78,6 +81,10 @@ public class AddColumnsBuilderTest {
   private AddColumnsBuilder createSampleBuilder(Dialect dialect) {
     return new AddColumnsBuilder(dialect, TABLE_NAME)
       .addColumn(new BigIntegerColumnDef.Builder().setColumnName("date_in_ms").setIsNullable(true).build())
-      .addColumn(new VarcharColumnDef.Builder().setColumnName("name").setLimit(10).setIsNullable(false).build());
+      .addColumn(new VarcharColumnDef.Builder().setColumnName("name").setLimit(10).setIsNullable(false).build())
+
+      // columns with default values
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("col_with_default").setDefaultValue(false).setIsNullable(false).build())
+      .addColumn(newVarcharColumnDefBuilder().setColumnName("varchar_col_with_default").setLimit(3).setDefaultValue("foo").setIsNullable(false).build());
   }
 }
index f38f225be97196e71864128b61ed89ae4dfc6b30..d8369c3913b7a0c52eb57f1f5e4b04d0032135bd 100644 (file)
@@ -30,12 +30,13 @@ import org.sonar.db.dialect.Oracle;
 import org.sonar.db.dialect.PostgreSql;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.db.version.BooleanColumnDef.newBooleanColumnDefBuilder;
 import static org.sonar.db.version.DecimalColumnDef.newDecimalColumnDefBuilder;
 import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder;
 
 public class AlterColumnsBuilderTest {
 
-  static final String TABLE_NAME = "issues";
+  private static final String TABLE_NAME = "issues";
   @Rule
   public ExpectedException thrown = ExpectedException.none();
 
@@ -115,6 +116,25 @@ public class AlterColumnsBuilderTest {
     new AlterColumnsBuilder(new H2(), TABLE_NAME).build();
   }
 
+  /**
+   * As we want DEFAULT value to be removed from all tables, it is supported
+   * only on creation of tables and columns, not on alter.
+   */
+  @Test
+  public void updateColumn_throws_IAE_if_default_value_is_defined() {
+    BooleanColumnDef column = newBooleanColumnDefBuilder()
+      .setColumnName("enabled")
+      .setIsNullable(false)
+      .setDefaultValue(false)
+      .build();
+    AlterColumnsBuilder alterColumnsBuilder = new AlterColumnsBuilder(new H2(), TABLE_NAME);
+
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("Default value is not supported on alter of column 'enabled'");
+
+    alterColumnsBuilder.updateColumn(column);
+  }
+
   private AlterColumnsBuilder createSampleBuilder(Dialect dialect) {
     return new AlterColumnsBuilder(dialect, TABLE_NAME)
       .updateColumn(
index 76928a423ec225aa581e9e88bdabbc8877f99414..cb0486a39e8a6c9536ce064693aed461b94f1fa4 100644 (file)
@@ -41,20 +41,23 @@ public class BooleanColumnDefTest {
     BooleanColumnDef def = new BooleanColumnDef.Builder()
       .setColumnName("enabled")
       .setIsNullable(false)
+      .setDefaultValue(true)
       .build();
 
     assertThat(def.getName()).isEqualTo("enabled");
     assertThat(def.isNullable()).isFalse();
+    assertThat(def.getDefaultValue()).isEqualTo(true);
   }
 
   @Test
-  public void build_column_def_with_default_values() throws Exception {
+  public void build_column_def_with_only_required_attributes() throws Exception {
     BooleanColumnDef def = new BooleanColumnDef.Builder()
       .setColumnName("enabled")
       .build();
 
     assertThat(def.getName()).isEqualTo("enabled");
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test
index 6843b81711aa769650c91ea051269fc63e7e836e..0479e27869814f6d2798aa46ed8fe0b0f73198fc 100644 (file)
@@ -43,16 +43,18 @@ public class ClobColumnDefTest {
   public void build_string_column_def() throws Exception {
     assertThat(underTest.getName()).isEqualTo("issues");
     assertThat(underTest.isNullable()).isTrue();
+    assertThat(underTest.getDefaultValue()).isNull();
   }
 
   @Test
-  public void build_string_column_def_with_default_values() throws Exception {
+  public void build_string_column_def_with_only_required_attributes() throws Exception {
     ClobColumnDef def = new ClobColumnDef.Builder()
       .setColumnName("issues")
       .build();
 
     assertThat(def.getName()).isEqualTo("issues");
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test
index 12b32882f056f73813cf89488d304766959b7a1e..e9b765af1d1dfd30d95ec1a6e510ca101c4473b3 100644 (file)
@@ -509,6 +509,70 @@ public class CreateTableBuilderTest {
       });
   }
 
+  @Test
+  public void build_adds_DEFAULT_clause_on_varchar_column_on_H2() {
+    verifyDefaultClauseOnVarcharColumn(H2, "CREATE TABLE table_42 (status VARCHAR (1) DEFAULT 'P' NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_varchar_column_on_MSSQL() {
+    verifyDefaultClauseOnVarcharColumn(MS_SQL, "CREATE TABLE table_42 (status NVARCHAR (1) DEFAULT 'P' NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_varchar_column_on_MySQL() {
+    verifyDefaultClauseOnVarcharColumn(MY_SQL, "CREATE TABLE table_42 (status VARCHAR (1) DEFAULT 'P' NOT NULL) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_varchar_column_on_Oracle() {
+    verifyDefaultClauseOnVarcharColumn(ORACLE, "CREATE TABLE table_42 (status VARCHAR (1) DEFAULT 'P' NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_varchar_column_on_PostgreSQL() {
+    verifyDefaultClauseOnVarcharColumn(POSTGRESQL, "CREATE TABLE table_42 (status VARCHAR (1) DEFAULT 'P' NOT NULL)");
+  }
+
+  private static void verifyDefaultClauseOnVarcharColumn(Dialect dialect, String expectedSql) {
+    List<String> stmts = new CreateTableBuilder(dialect, TABLE_NAME)
+      .addColumn(newVarcharColumnDefBuilder().setColumnName("status").setLimit(1).setIsNullable(false).setDefaultValue("P").build())
+      .build();
+    assertThat(stmts).containsExactly(expectedSql);
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_boolean_column_on_H2() {
+    verifyDefaultClauseOnBooleanColumn(H2, "CREATE TABLE table_42 (enabled BOOLEAN DEFAULT true NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_boolean_column_on_MSSQL() {
+    verifyDefaultClauseOnBooleanColumn(MS_SQL, "CREATE TABLE table_42 (enabled BIT DEFAULT 1 NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_boolean_column_on_MySQL() {
+    verifyDefaultClauseOnBooleanColumn(MY_SQL, "CREATE TABLE table_42 (enabled TINYINT(1) DEFAULT true NOT NULL) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_boolean_column_on_Oracle() {
+    verifyDefaultClauseOnBooleanColumn(ORACLE, "CREATE TABLE table_42 (enabled NUMBER(1) DEFAULT 1 NOT NULL)");
+  }
+
+  @Test
+  public void build_adds_DEFAULT_clause_on_boolean_column_on_PostgreSQL() {
+    verifyDefaultClauseOnBooleanColumn(POSTGRESQL, "CREATE TABLE table_42 (enabled BOOLEAN DEFAULT true NOT NULL)");
+  }
+
+  private static void verifyDefaultClauseOnBooleanColumn(Dialect dialect, String expectedSql) {
+    List<String> stmts = new CreateTableBuilder(dialect, TABLE_NAME)
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("enabled").setIsNullable(false).setDefaultValue(true).build())
+      .build();
+    assertThat(stmts).containsExactly(expectedSql);
+  }
+
   private static String bigIntSqlType(Dialect dialect) {
     return Oracle.ID.equals(dialect.getId()) ? "NUMBER (38)" : "BIGINT";
   }
index bf16b4f3914763932832857c7404b6da8085aaf0..e5f70681fa611c7d42108e49504d5560cdf6a011 100644 (file)
@@ -51,6 +51,7 @@ public class DecimalColumnDefTest {
     assertThat(def.getPrecision()).isEqualTo(30);
     assertThat(def.getScale()).isEqualTo(20);
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test
@@ -94,7 +95,7 @@ public class DecimalColumnDefTest {
   }
 
   @Test
-  public void create_builder_with_default_values() throws Exception {
+  public void create_builder_with_only_required_attributes() throws Exception {
     DecimalColumnDef def = new DecimalColumnDef.Builder()
       .setColumnName("issues")
       .build();
@@ -102,6 +103,7 @@ public class DecimalColumnDefTest {
     assertThat(def.getPrecision()).isEqualTo(38);
     assertThat(def.getScale()).isEqualTo(20);
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test
index 935fb96cfd8948b41253ec211712de78dad181e2..d36bb8c8b1352d94419c634b6965dfdf643450b1 100644 (file)
@@ -75,6 +75,11 @@ public class IntegerColumnDefTest {
     assertThat(newIntegerColumnDefBuilder().setColumnName("a").build().getName()).isEqualTo("a");
   }
 
+  @Test
+  public void getDefaultValue_always_returns_null() {
+    assertThat(newIntegerColumnDefBuilder().setColumnName("a").build().getDefaultValue()).isNull();
+  }
+
   @Test
   public void generateSqlType_for_MsSql() {
     assertThat(underTest.generateSqlType(new MsSql())).isEqualTo("INT");
index 406536629e9fc874fbeb583e5bc139f580a16514..65cfbe3bec6927e7bf9dc89840f3038cb1922060 100644 (file)
@@ -47,6 +47,7 @@ public class TinyIntColumnDefTest {
 
     assertThat(def.getName()).isEqualTo("foo");
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test
index 9eaa199fd5141727b679432da73397a9ae636e8f..1cf4fe54289f2b5fd2117af6ee056b97ff1129b4 100644 (file)
@@ -41,15 +41,17 @@ public class VarcharColumnDefTest {
       .setColumnName("issues")
       .setLimit(10)
       .setIsNullable(true)
+      .setDefaultValue("foo")
       .build();
 
     assertThat(def.getName()).isEqualTo("issues");
     assertThat(def.getColumnSize()).isEqualTo(10);
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isEqualTo("foo");
   }
 
   @Test
-  public void build_string_column_def_with_default_values() throws Exception {
+  public void build_string_column_def_with_only_required_attributes() throws Exception {
     VarcharColumnDef def = new VarcharColumnDef.Builder()
       .setColumnName("issues")
       .setLimit(10)
@@ -58,6 +60,7 @@ public class VarcharColumnDefTest {
     assertThat(def.getName()).isEqualTo("issues");
     assertThat(def.getColumnSize()).isEqualTo(10);
     assertThat(def.isNullable()).isTrue();
+    assertThat(def.getDefaultValue()).isNull();
   }
 
   @Test