]> source.dussan.org Git - iciql.git/commitdiff
Adjust CREATE TABLE column constraint syntax for MySQL 5.7 strict mode
authorJames Moger <james.moger@gitblit.com>
Wed, 1 Feb 2017 00:38:17 +0000 (19:38 -0500)
committerJames Moger <james.moger@gitblit.com>
Wed, 1 Feb 2017 00:38:17 +0000 (19:38 -0500)
src/main/java/com/iciql/SQLDialect.java
src/main/java/com/iciql/SQLDialectDefault.java
src/main/java/com/iciql/SQLDialectDerby.java
src/test/java/com/iciql/test/ModelsTest.java

index 081b7e6cbe830509497508485a5eaab30f8fa98b..76450cda7f2408a1fc63fe0c7932064c5bd36cfd 100644 (file)
@@ -20,6 +20,7 @@ package com.iciql;
 
 import com.iciql.Iciql.DataTypeAdapter;
 import com.iciql.TableDefinition.IndexDefinition;
+import com.iciql.util.StatementBuilder;
 
 import java.sql.ResultSet;
 
@@ -206,4 +207,18 @@ public interface SQLDialect {
 
     <T, A> void prepareBitwiseXor(SQLStatement stat, Query<T> query, A x, A y);
 
+    /**
+     * Specifies the syntax for a column constraint.
+     *
+     * @param isAutoIncrement
+     * @param isPrimaryKey
+     * @param isNullable
+     * @param fieldType
+     * @param dataType
+     * @param defaultValue
+     * @return the column constraint
+     */
+    String prepareColumnConstraint(boolean isAutoIncrement, boolean isPrimaryKey, boolean isNullable,
+                                   Class<?> fieldType, String dataType, String defaultValue);
+
 }
index 98f63c45580760fd1d811905ffa69162f3f69452..cd9eeaf722f0f0a223c339f14c8d9752c27889bc 100644 (file)
@@ -172,21 +172,9 @@ public class SQLDialectDefault implements SQLDialect {
                 hasIdentityColumn |= prepareColumnDefinition(buff, convertSqlType(dataType),
                         field.isAutoIncrement, field.isPrimaryKey);
             }
-
-            // default values
-            if (!field.isAutoIncrement && !field.isPrimaryKey) {
-                String dv = field.defaultValue;
-                if (!StringUtils.isNullOrEmpty(dv)) {
-                    if (ModelUtils.isProperlyFormattedDefaultValue(dv)
-                            && ModelUtils.isValidDefaultValue(field.field.getType(), dv)) {
-                        buff.append(" DEFAULT " + dv);
-                    }
-                }
-            }
-
-            if (!field.nullable) {
-                buff.append(" NOT NULL");
-            }
+            
+            buff.append(prepareColumnConstraint(field.isAutoIncrement, field.isPrimaryKey, field.nullable, field.field.getType(),
+                    field.dataType, field.defaultValue));
         }
 
         // if table does not have identity column then specify primary key
@@ -368,6 +356,27 @@ public class SQLDialectDefault implements SQLDialect {
         return false;
     }
 
+    @Override
+    public String prepareColumnConstraint(boolean isAutoIncrement, boolean isPrimaryKey, boolean nullable, Class<?> fieldType, String dataType, String defaultValue) {
+        StringBuilder sb = new StringBuilder();
+        if (!isAutoIncrement && !isPrimaryKey) {
+
+            if (nullable && (defaultValue == null || ((dataType.equals("TIMESTAMP") || dataType.equals("DATETIME")) && StringUtils.isNullOrEmpty(defaultValue)))) {
+                sb.append(" NULL");
+            } else if (!StringUtils.isNullOrEmpty(defaultValue)) {
+                if (ModelUtils.isProperlyFormattedDefaultValue(defaultValue)
+                        && ModelUtils.isValidDefaultValue(fieldType, defaultValue)) {
+                    sb.append(" DEFAULT ").append(defaultValue);
+                }
+            }
+        }
+
+        if (!nullable) {
+            sb.append(" NOT NULL");
+        }
+        return sb.toString();
+    }
+    
     @Override
     public void prepareCreateIndex(SQLStatement stat, String schemaName, String tableName,
                                    IndexDefinition index) {
index fcaee1e1dd7aa73fbb3df6303d901d58c2fae7b7..8ee395a8bdbb282b18c1570a776706ab509c3e00 100644 (file)
@@ -17,6 +17,7 @@
 package com.iciql;\r
 \r
 import com.iciql.util.StatementBuilder;\r
+import com.iciql.util.StringUtils;\r
 \r
 /**\r
  * Derby database dialect.\r
@@ -61,6 +62,27 @@ public class SQLDialectDerby extends SQLDialectDefault {
         return false;\r
     }\r
 \r
+    @Override\r
+    public String prepareColumnConstraint(boolean isAutoIncrement, boolean isPrimaryKey, boolean nullable, Class<?> fieldType, String dataType, String defaultValue) {\r
+        StringBuilder sb = new StringBuilder();\r
+        if (!isAutoIncrement && !isPrimaryKey) {\r
+\r
+            if (nullable && (defaultValue == null || ((dataType.equals("TIMESTAMP") || dataType.equals("DATETIME")) && StringUtils.isNullOrEmpty(defaultValue)))) {\r
+                sb.append(" DEFAULT NULL");\r
+            } else if (!StringUtils.isNullOrEmpty(defaultValue)) {\r
+                if (ModelUtils.isProperlyFormattedDefaultValue(defaultValue)\r
+                        && ModelUtils.isValidDefaultValue(fieldType, defaultValue)) {\r
+                    sb.append(" DEFAULT ").append(defaultValue);\r
+                }\r
+            }\r
+        }\r
+\r
+        if (!nullable) {\r
+            sb.append(" NOT NULL");\r
+        }\r
+        return sb.toString();\r
+    }\r
+\r
     @Override\r
     public <T> void prepareDropTable(SQLStatement stat, TableDefinition<T> def) {\r
         StatementBuilder buff = new StatementBuilder("DROP TABLE "\r
index 9fef979e8f2a22c5b32af592dc8ede96c88f1618..5f77e9703d80d5eaf9d1348409a344ab32ee6851 100644 (file)
@@ -133,7 +133,7 @@ public class ModelsTest {
         } else if (dbName.equals("Apache Derby")) {
             // Derby uses java.sql.Timestamp not java.util.Date
             // Derby uses username as schema name
-            assertEquals(1601, models.get(0).length());
+            assertEquals(1643, models.get(0).length());
         } else if (dbName.equals("PostgreSQL")) {
             assertEquals(1643, models.get(0).length());
         } else if (dbName.equals("MySQL")) {