You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/12/22 13:39:53 UTC

[2/4] cayenne git commit: Fix DataMapMerger case sensitivity issues - can miss relationship and attribute change if name in mixed upper- and lowercase - fix test failures caused by lower- and uppercase names - additional tests - fix test failures for

Fix DataMapMerger case sensitivity issues
 - can miss relationship and attribute change if name in mixed upper- and lowercase
 - fix test failures caused by lower- and uppercase names
 - additional tests
 - fix test failures for Postgres (and partially for Oracle and SQLServer but tests needed)


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/4d14b718
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/4d14b718
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/4d14b718

Branch: refs/heads/master
Commit: 4d14b7182dad5389c80721c64fefd5895d5290b5
Parents: 65233b2
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 22 15:09:35 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 22 15:09:35 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/DbAttributeMerger.java |  5 ++
 .../merge/token/db/SetColumnTypeToDb.java       |  8 +++
 .../dbsync/reverse/dbload/DbLoadDataStore.java  |  8 +++
 .../cayenne/dbsync/merge/DataMapMergerTest.java | 74 ++++++++++++++++++++
 .../apache/cayenne/dbsync/merge/MergeCase.java  | 43 +++++++++++-
 .../merge/builders/DbAttributeBuilder.java      |  5 ++
 .../dbsync/reverse/dbload/BaseLoaderIT.java     | 10 ++-
 .../dbsync/reverse/dbload/DbLoaderIT.java       | 17 +++--
 .../reverse/dbload/ExportedKeyLoaderIT.java     | 19 +++--
 .../reverse/dbload/PrimaryKeyLoaderIT.java      |  8 +--
 .../cayenne/unit/OracleUnitDbAdapter.java       | 10 +++
 .../cayenne/unit/PostgresUnitDbAdapter.java     |  4 ++
 .../cayenne/unit/SQLServerUnitDbAdapter.java    |  5 ++
 .../org/apache/cayenne/unit/UnitDbAdapter.java  | 12 ++++
 .../dbimport/testDbAttributeChange.map.xml      | 12 +++-
 .../testDbAttributeChange.map.xml-result        | 11 ++-
 .../tools/dbimport/testDbAttributeChange.sql    |  8 ++-
 17 files changed, 234 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
index 8cdbd16..fcf859d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
@@ -122,6 +122,11 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
      */
     private boolean needUpdateType(DbAttribute original, DbAttribute imported) {
         if(original.getType() != imported.getType()) {
+            // Decimal and NUMERIC types are effectively equal so skip their interchange
+            if( (original.getType() == Types.DECIMAL || original.getType() == Types.NUMERIC) &&
+                (imported.getType() == Types.DECIMAL || imported.getType() == Types.NUMERIC)) {
+                return false;
+            }
             return true;
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
index 331d550..f03e929 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
@@ -110,4 +110,12 @@ public class SetColumnTypeToDb extends AbstractToDbToken.Entity {
     public MergerToken createReverse(MergerTokenFactory factory) {
         return factory.createSetColumnTypeToModel(getEntity(), columnNew, columnOriginal);
     }
+
+    public DbAttribute getColumnNew() {
+        return columnNew;
+    }
+
+    public DbAttribute getColumnOriginal() {
+        return columnOriginal;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
index ec06163..c1a6e4c 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
@@ -43,16 +43,24 @@ public class DbLoadDataStore extends DataMap {
 
     private Map<String, Set<ExportedKey>> exportedKeys = new HashMap<>();
 
+    private Map<String, DbEntity> upperCaseNames = new HashMap<>();
+
     DbLoadDataStore() {
         super("__generated_by_dbloader__");
     }
 
     @Override
+    public DbEntity getDbEntity(String dbEntityName) {
+        return upperCaseNames.get(dbEntityName.toUpperCase());
+    }
+
+    @Override
     public void addDbEntity(DbEntity entity) {
         if(!(entity instanceof DetectedDbEntity)) {
             throw new IllegalArgumentException("Only DetectedDbEntity can be inserted in this map");
         }
         super.addDbEntity(entity);
+        upperCaseNames.put(entity.getName().toUpperCase(), entity);
     }
 
     DbEntity addDbEntitySafe(DbEntity entity) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
index 5196fa9..aced949 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
@@ -315,6 +315,64 @@ public class DataMapMergerTest {
     }
 
     @Test
+    public void testTableNameUppercaseRelationship() throws Exception {
+        DataMap existing = dataMap().with(
+                dbEntity("TABLE1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "TABLE1.attr01", "table2.attr01").build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.attr01", "table2.attr01").build();
+
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(0, tokens.size());
+    }
+
+    @Test
+    public void testAttributeNameUppercaseRelationship() throws Exception {
+        DataMap existing = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("ATTR01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.ATTR01", "table2.attr01").build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.attr01", "table2.attr01").build();
+
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(0, tokens.size());
+    }
+
+    @Test
     public void testRemoveRelationship() throws Exception {
         DataMap existing = dataMap().with(
             dbEntity("table1").attributes(
@@ -371,6 +429,22 @@ public class DataMapMergerTest {
     }
 
     @Test
+    public void testChangeGeneratedStatus() {
+        DataMap existing = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeVarchar(10)
+                )).build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt().generated()
+                )).build();
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(2, tokens.size());
+    }
+
+    @Test
     public void testNoChanges() throws Exception {
         DataMap dataMap1 = dataMap().with(
                 dbEntity("table1").attributes(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index 5c6053e..ef262ee 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -22,11 +22,13 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.dbsync.merge.context.MergerContext;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
@@ -128,7 +130,46 @@ public abstract class MergeCase extends DbSyncCase {
         }
 
         List<MergerToken> tokens = merger().filters(filters).build().createMergeTokens(map, dbImport);
-        return filterEmpty(tokens);
+        return filter(tokens);
+    }
+
+    private List<MergerToken> filter(List<MergerToken> tokens) {
+        return filterEmptyTypeChange(filterEmpty(tokens));
+    }
+
+    /**
+     * Filter out tokens for db attribute type change when types is same for specific DB
+     */
+    private List<MergerToken> filterEmptyTypeChange(List<MergerToken> tokens) {
+        List<MergerToken> tokensOut = new ArrayList<>();
+        for(MergerToken token : tokens) {
+            if(!(token instanceof SetColumnTypeToDb)) {
+                tokensOut.add(token);
+                continue;
+            }
+            SetColumnTypeToDb setColumnToDb = (SetColumnTypeToDb)token;
+            int toType = setColumnToDb.getColumnNew().getType();
+            int fromType = setColumnToDb.getColumnOriginal().getType();
+            // filter out conversions between date/time types
+            if(accessStackAdapter.onlyGenericDateType()) {
+                if(isDateTimeType(toType) && isDateTimeType(fromType)){
+                    continue;
+                }
+            }
+            // filter out conversions between numeric types
+            if(accessStackAdapter.onlyGenericNumberType()) {
+                if(TypesMapping.isNumeric(toType) && TypesMapping.isNumeric(fromType)) {
+                    continue;
+                }
+            }
+            tokensOut.add(token);
+        }
+
+        return tokensOut;
+    }
+
+    private static boolean isDateTimeType(int type) {
+        return type == Types.DATE || type == Types.TIME || type == Types.TIMESTAMP;
     }
 
     private List<MergerToken> filterEmpty(List<MergerToken> tokens) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
index 2d600f3..99739da 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
@@ -94,6 +94,11 @@ public class DbAttributeBuilder extends DefaultBuilder<DbAttribute> {
         return this;
     }
 
+    public DbAttributeBuilder generated() {
+        obj.setGenerated(true);
+        return this;
+    }
+
     @Override
     public DbAttribute build() {
         if (isEmpty(obj.getName())) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
index 1edc938..a3cf117 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
@@ -72,7 +72,7 @@ public class BaseLoaderIT extends ServerCase {
     void createDbEntities() {
         String[] names = {"ARTIST", "BLOB_TEST", "CLOB_TEST", "GENERATED_COLUMN_TEST"};
         for(String name : names) {
-            createEntity(name);
+            createEntity(nameForDb(name));
         }
     }
 
@@ -88,4 +88,12 @@ public class BaseLoaderIT extends ServerCase {
         }
         return de;
     }
+
+    String nameForDb(String name) {
+        if(accessStackAdapter.isLowerCaseNames()) {
+            return name.toLowerCase();
+        } else {
+            return name.toUpperCase();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
index d2e87a5..bc8365c 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
@@ -82,16 +82,16 @@ public class DbLoaderIT extends ServerCase {
         assertNotNull(artist);
 
         // DbAttribute
-        DbAttribute id = artist.getAttribute("ARTIST_ID");
+        DbAttribute id = getDbAttribute(artist, "ARTIST_ID");
         assertNotNull(id);
         assertTrue(id.isMandatory());
         assertTrue(id.isPrimaryKey());
 
-        DbAttribute name = artist.getAttribute("ARTIST_NAME");
+        DbAttribute name = getDbAttribute(artist,"ARTIST_NAME");
         assertNotNull(name);
         assertTrue(name.isMandatory());
 
-        DbAttribute date = artist.getAttribute("DATE_OF_BIRTH");
+        DbAttribute date = getDbAttribute(artist,"DATE_OF_BIRTH");
         assertNotNull(date);
         assertFalse(date.isMandatory());
 
@@ -100,11 +100,20 @@ public class DbLoaderIT extends ServerCase {
 
         DbRelationship exhibits = artist.getRelationship("artistExhibits");
         assertNotNull(exhibits);
-        assertEquals("ARTIST_EXHIBIT", exhibits.getTargetEntityName());
+        assertEquals("ARTIST_EXHIBIT", exhibits.getTargetEntityName().toUpperCase());
         DbEntity target = exhibits.getTargetEntity();
         assertNotNull(target);
     }
 
+    private DbAttribute getDbAttribute(DbEntity ent, String name) {
+        DbAttribute da = ent.getAttribute(name);
+        // sometimes table names get converted to lowercase
+        if (da == null) {
+            da = ent.getAttribute(name.toLowerCase());
+        }
+
+        return da;
+    }
 
     @Before
     public void before() throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
index 9e74d8c..73ba353 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
@@ -38,9 +38,9 @@ public class ExportedKeyLoaderIT extends BaseLoaderIT {
             return;
         }
 
-        createEntity("ARTIST");
-        createEntity("GALLERY");
-        createEntity("PAINTING");
+        createEntity(nameForDb("ARTIST"));
+        createEntity(nameForDb("GALLERY"));
+        createEntity(nameForDb("PAINTING"));
         DbEntity artist = getDbEntity("ARTIST");
         DbAttribute artistId = new DbAttribute("ARTIST_ID");
         artist.addAttribute(artistId);
@@ -65,21 +65,20 @@ public class ExportedKeyLoaderIT extends BaseLoaderIT {
         ExportedKey artistIdFk = findArtistExportedKey();
         assertNotNull(artistIdFk);
 
-        assertEquals("ARTIST", artistIdFk.getPk().getTable());
-        assertEquals("ARTIST_ID", artistIdFk.getPk().getColumn());
+        assertEquals("ARTIST", artistIdFk.getPk().getTable().toUpperCase());
+        assertEquals("ARTIST_ID", artistIdFk.getPk().getColumn().toUpperCase());
 
-        assertEquals("PAINTING", artistIdFk.getFk().getTable());
-        assertEquals("ARTIST_ID", artistIdFk.getFk().getColumn());
+        assertEquals("PAINTING", artistIdFk.getFk().getTable().toUpperCase());
+        assertEquals("ARTIST_ID", artistIdFk.getFk().getColumn().toUpperCase());
     }
 
-    ExportedKey findArtistExportedKey() {
+    private ExportedKey findArtistExportedKey() {
         for(Map.Entry<String, Set<ExportedKey>> entry : store.getExportedKeysEntrySet()) {
-            if(entry.getKey().endsWith(".ARTIST_ID")) {
+            if(entry.getKey().toUpperCase().endsWith(".ARTIST_ID")) {
                 return entry.getValue().iterator().next();
             }
         }
 
         return null;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
index 56be301..ae56185 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
@@ -34,10 +34,10 @@ public class PrimaryKeyLoaderIT extends BaseLoaderIT {
     @Test
     public void testPrimaryKeyLoad() throws Exception {
         createDbEntities();
-        DbEntity artist = getDbEntity("ARTIST");
-        DbAttribute artistId = new DbAttribute("ARTIST_ID");
-        DbAttribute artistName = new DbAttribute("ARTIST_NAME");
-        DbAttribute artistId1 = new DbAttribute("ARTIST_ID1");
+        DbEntity artist = getDbEntity(nameForDb("ARTIST"));
+        DbAttribute artistId = new DbAttribute(nameForDb("ARTIST_ID"));
+        DbAttribute artistName = new DbAttribute(nameForDb("ARTIST_NAME"));
+        DbAttribute artistId1 = new DbAttribute(nameForDb("ARTIST_ID1"));
 
         artist.addAttribute(artistId);
         artist.addAttribute(artistName);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
index f0ebb94..9cb93fb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
@@ -120,4 +120,14 @@ public class OracleUnitDbAdapter extends UnitDbAdapter {
             proc.setReturningValue(true);
         }
     }
+
+    @Override
+    public boolean onlyGenericDateType() {
+        return true;
+    }
+
+    @Override
+    public boolean onlyGenericNumberType() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
index 4182054..1843bc2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
@@ -62,6 +62,10 @@ public class PostgresUnitDbAdapter extends UnitDbAdapter {
         }
     }
 
+    public boolean isLowerCaseNames() {
+        return true;
+    }
+
     @Override
     public boolean supportsGeneratedKeysDrop() {
         return true;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
index 5315d12..6c03130 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
@@ -63,6 +63,11 @@ public class SQLServerUnitDbAdapter extends SybaseUnitDbAdapter {
         return true;
     }
 
+    @Override
+    public boolean onlyGenericDateType() {
+        return true;
+    }
+
     // The code below was used with SQLServer <= 2005 to turn of autogenerated
     // keys.
     // Modern SQLServer driver supports autogen keys just fine.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
index 2bf63e0..445de16 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
@@ -347,6 +347,18 @@ public class UnitDbAdapter {
         return constraintMap;
     }
 
+    public boolean isLowerCaseNames() {
+        return false;
+    }
+
+    public boolean onlyGenericNumberType() {
+        return false;
+    }
+
+    public boolean onlyGenericDateType() {
+        return false;
+    }
+
     public boolean supportsNullBoolean() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
index dc09869..759090a 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
@@ -35,7 +35,7 @@
         <db-attribute name="COL4" type="VARCHAR" length="25"/>
         <db-attribute name="COL5" type="DATE" length="10"/>
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
+        <db-attribute name="parent_id" type="CHAR" length="25"/>
     </db-entity>
     <obj-entity name="Child" className="Child" dbEntityName="CHILD">
         <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
@@ -49,4 +49,14 @@
         <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
         <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
     </obj-entity>
+
+    <db-relationship name="parent" source="CHILD" target="parent" toMany="false">
+        <db-attribute-pair source="parent_id" target="ID"/>
+    </db-relationship>
+    <db-relationship name="children" source="parent" target="CHILD" toMany="true">
+        <db-attribute-pair source="ID" target="parent_id"/>
+    </db-relationship>
+
+    <obj-relationship name="parent" source="Child" target="Parent" deleteRule="Nullify" db-relationship-path="parent"/>
+    <obj-relationship name="children" source="Parent" target="Child" deleteRule="Deny" db-relationship-path="children"/>
 </data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
index 441b533..c53bde2 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
@@ -28,9 +28,9 @@
         <db-attribute name="COL4" type="VARCHAR" length="25"/>
         <db-attribute name="COL5" type="DATE" length="10"/>
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
         <db-attribute name="col1" type="DOUBLE" length="52"/>
         <db-attribute name="col2" type="CHAR" length="25"/>
+        <db-attribute name="parent_id" type="INTEGER" length="10"/>
     </db-entity>
     <db-entity name="parent" schema="SCHEMA_01">
         <db-attribute name="COL2" type="CHAR" length="20"/>
@@ -51,5 +51,12 @@
         <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
         <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
     </obj-entity>
-
+    <db-relationship name="parent" source="CHILD" target="parent" toMany="false">
+        <db-attribute-pair source="parent_id" target="ID"/>
+    </db-relationship>
+    <db-relationship name="children" source="parent" target="CHILD" toMany="true">
+        <db-attribute-pair source="ID" target="parent_id"/>
+    </db-relationship>
+    <obj-relationship name="parent" source="Child" target="Parent" deleteRule="Nullify" db-relationship-path="parent"/>
+    <obj-relationship name="children" source="Parent" target="Child" deleteRule="Deny" db-relationship-path="children"/>
 </data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
index 6a2800e..c93c802 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
@@ -31,7 +31,7 @@ CREATE TABLE schema_01.parent (
 
 CREATE TABLE schema_01.child (
   id INTEGER NOT NULL,
-  Parent_id CHAR(25),
+  parent_id INTEGER,
   COL1 FLOAT,
   COL2 CHAR(25),
   COL3 DECIMAL(5,1),
@@ -39,4 +39,8 @@ CREATE TABLE schema_01.child (
   COL5 DATE,
 
   PRIMARY KEY (id)
-);
\ No newline at end of file
+);
+
+ALTER TABLE schema_01.child
+    ADD FOREIGN KEY (parent_id)
+    REFERENCES schema_01.parent (id);
\ No newline at end of file