From 7a7b0e0728fc88a5bf01cedf610def8895fe49b6 Mon Sep 17 00:00:00 2001 From: chenson42 Date: Wed, 28 Jan 2015 22:45:40 +0000 Subject: [PATCH] 0002152: DDL errors on DB2 i5 AS/400 --- .../symmetric/AbstractSymmetricEngine.java | 29 +++---- .../db/platform/AbstractDatabasePlatform.java | 48 ++++++------ .../db/platform/AbstractDdlBuilder.java | 13 +++- .../db/platform/db2/Db2As400DdlBuilder.java | 75 ++++++++++++++++++- .../db/platform/db2/Db2DdlBuilder.java | 2 +- .../platform/firebird/FirebirdDdlBuilder.java | 2 +- .../jumpmind/db/platform/h2/H2DdlBuilder.java | 2 +- .../platform/hsqldb2/HsqlDb2DdlBuilder.java | 7 +- .../db/platform/oracle/OracleDdlBuilder.java | 2 +- .../postgresql/PostgreSqlDdlBuilder.java | 2 +- .../db/platform/AbstractJdbcDdlReader.java | 4 + .../db/platform/db2/Db2As400DdlReader.java | 29 ++++--- .../db/platform/db2/Db2DdlReader.java | 31 +++++--- 13 files changed, 169 insertions(+), 77 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java index f1b6e48072..ccc0f3c223 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java @@ -270,7 +270,8 @@ protected void init() { this.parameterService = new ParameterService(platform, propertiesFactory, properties.get(ParameterConstants.RUNTIME_CONFIG_TABLE_PREFIX, "sym")); - boolean parameterTableExists = this.platform.getTableFromCache(TableConstants.getTableName(properties.get(ParameterConstants.RUNTIME_CONFIG_TABLE_PREFIX), TableConstants.SYM_PARAMETER), false) != null; + boolean parameterTableExists = this.platform.readTableFromDatabase(null, null, + TableConstants.getTableName(properties.get(ParameterConstants.RUNTIME_CONFIG_TABLE_PREFIX), TableConstants.SYM_PARAMETER), true) != null; if (parameterTableExists) { this.parameterService.setDatabaseHasBeenInitialized(true); this.parameterService.rereadParameters(); @@ -716,21 +717,23 @@ public synchronized void stop() { nodeCommunicationService.stop(); } - List infos = getStatisticManager().getProcessInfos(); - for (ProcessInfo processInfo : infos) { - Thread thread = processInfo.getThread(); - if (processInfo.getStatus() != Status.OK && thread.isAlive()) { - log.info("Trying to interrupt thread '{}' ", thread.getName()); - try { - thread.interrupt(); - } catch (Exception e) { - log.info("Caught exception while attempting to interrupt thread", e); + if (statisticManager != null) { + List infos = statisticManager.getProcessInfos(); + for (ProcessInfo processInfo : infos) { + Thread thread = processInfo.getThread(); + if (processInfo.getStatus() != Status.OK && thread.isAlive()) { + log.info("Trying to interrupt thread '{}' ", thread.getName()); + try { + thread.interrupt(); + } catch (Exception e) { + log.info("Caught exception while attempting to interrupt thread", e); + } } } + + Thread.interrupted(); } - Thread.interrupted(); - started = false; starting = false; } @@ -808,7 +811,7 @@ public boolean isConfigured() { false) || StringUtils.isNotBlank(getParameterService().getString( ParameterConstants.AUTO_CONFIGURE_REG_SVR_SQL_SCRIPT))); - Table symNodeTable = symmetricDialect.getPlatform().getTableFromCache( + Table symNodeTable = symmetricDialect.getPlatform().readTableFromDatabase(null, null, TableConstants.getTableName(parameterService.getTablePrefix(), TableConstants.SYM_NODE), true); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java index 0198a6c25b..c21abb8a5c 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java @@ -19,6 +19,8 @@ * under the License. */ +import static org.apache.commons.lang.StringUtils.isNotBlank; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -218,8 +220,8 @@ public Database readDatabase(String catalog, String schema, String[] tableTypes) public Database readFromDatabase(Table... tables) { Database fromDb = new Database(); for (Table tableFromXml : tables) { - Table tableFromDatabase = getTableFromCache(getDefaultCatalog(), - getDefaultSchema(), tableFromXml.getName(), true); + Table tableFromDatabase = getTableFromCache(tableFromXml.getCatalog(), + tableFromXml.getSchema(), tableFromXml.getName(), true); if (tableFromDatabase != null) { fromDb.addTable(tableFromDatabase); } @@ -235,29 +237,34 @@ public Table readTableFromDatabase(String catalogName, String schemaName, String public Table readTableFromDatabase(String catalogName, String schemaName, String tableName, boolean useDefaultSchema) { String originalFullyQualifiedName = Table.getFullyQualifiedTableName(catalogName, schemaName, tableName); - catalogName = catalogName == null && useDefaultSchema ? getDefaultCatalog() : catalogName; - schemaName = schemaName == null && useDefaultSchema ? getDefaultSchema() : schemaName; - Table table = ddlReader.readTable(catalogName, schemaName, tableName); + String defaultedCatalogName = catalogName == null && useDefaultSchema ? getDefaultCatalog() : catalogName; + String defaultedSchemaName = schemaName == null && useDefaultSchema ? getDefaultSchema() : schemaName; + + Table table = ddlReader.readTable(defaultedCatalogName, defaultedSchemaName, tableName); if (table == null && metadataIgnoreCase) { IDdlReader reader = getDdlReader(); - List catalogNames = reader.getCatalogNames(); - if (catalogNames != null) { - for (String name : catalogNames) { - if (name != null && name.equalsIgnoreCase(catalogName)) { - catalogName = name; - break; + if (isNotBlank(catalogName)) { + List catalogNames = reader.getCatalogNames(); + if (catalogNames != null) { + for (String name : catalogNames) { + if (name != null && name.equalsIgnoreCase(catalogName)) { + catalogName = name; + break; + } + } } } - } - - List schemaNames = reader.getSchemaNames(catalogName); - if (schemaNames != null) { - for (String name : schemaNames) { - if (name != null && name.equalsIgnoreCase(schemaName)) { - schemaName = name; - break; + + if (isNotBlank(schemaName)) { + List schemaNames = reader.getSchemaNames(catalogName); + if (schemaNames != null) { + for (String name : schemaNames) { + if (name != null && name.equalsIgnoreCase(schemaName)) { + schemaName = name; + break; + } } } } @@ -308,9 +315,6 @@ public Table getTableFromCache(String catalogName, String schemaName, String tab synchronized (this.getClass()) { try { Table table = readTableFromDatabase(catalogName, schemaName, tableName, true); - if (table == null) { - table = readTableFromDatabase(catalogName, schemaName, tableName, false); - } tableCache.put(key, table); retTable = table; } catch (RuntimeException ex) { diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java index ee669007fd..b179b63704 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDdlBuilder.java @@ -592,6 +592,10 @@ protected void processChange(Database currentModel, Database desiredModel, writeExternalIndexCreateStmt(change.getChangedTable(), change.getNewIndex(), ddl); change.apply(currentModel, delimitedIdentifierModeOn); } + + protected void filterChanges(Collection changes) { + + } /** * Processes the changes to the structure of tables. @@ -605,6 +609,9 @@ protected void processChange(Database currentModel, Database desiredModel, */ protected void processTableStructureChanges(Database currentModel, Database desiredModel, Collection changes, StringBuilder ddl) { + + filterChanges(changes); + LinkedHashMap> changesPerTable = new LinkedHashMap>(); LinkedHashMap> unchangedFKs = new LinkedHashMap>(); boolean caseSensitive = delimitedIdentifierModeOn; @@ -878,7 +885,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi if (change instanceof ColumnDataTypeChange) { ColumnDataTypeChange typeChange = (ColumnDataTypeChange)change; if (typeChange.getNewTypeCode() == Types.BIGINT) { - if (writeAlterColumnDataType(typeChange, ddl)) { + if (writeAlterColumnDataTypeToBigInt(typeChange, ddl)) { it.remove(); } } @@ -898,8 +905,8 @@ protected void processChange(Database currentModel, Database desiredModel, change.apply(currentModel, delimitedIdentifierModeOn); } - - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { return false; } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java index 87a8b5bd85..9f2d47dd8d 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java @@ -1,4 +1,5 @@ package org.jumpmind.db.platform.db2; + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -18,12 +19,80 @@ * under the License. */ +import java.sql.Types; +import java.util.Collection; +import java.util.Iterator; + +import org.jumpmind.db.alter.ColumnDataTypeChange; +import org.jumpmind.db.alter.TableChange; +import org.jumpmind.db.model.Column; +import org.jumpmind.db.model.TypeMap; import org.jumpmind.db.platform.DatabaseNamesConstants; public class Db2As400DdlBuilder extends Db2DdlBuilder { - public Db2As400DdlBuilder() { - this.databaseName = DatabaseNamesConstants.DB2AS400; - } + public Db2As400DdlBuilder() { + this.databaseName = DatabaseNamesConstants.DB2AS400; + databaseInfo.setRequiresAutoCommitForDdl(true); + } + + @Override + protected void filterChanges(Collection changes) { + super.filterChanges(changes); + Iterator i = changes.iterator(); + while (i.hasNext()) { + TableChange tableChange = i.next(); + if (tableChange instanceof ColumnDataTypeChange) { + ColumnDataTypeChange change = (ColumnDataTypeChange)tableChange; + if (change.getNewTypeCode() == Types.LONGVARCHAR && + change.getChangedColumn().getJdbcTypeCode() == Types.VARCHAR) { + log.debug("Not processing the detect type change to LONGVARCHAR because " + + "a create of a long varchar results in a variable length VARCHAR field"); + i.remove(); + } + } + } + } + + @Override + protected void writeCastExpression(Column sourceColumn, Column targetColumn, StringBuilder ddl) { + String sourceNativeType = getBareNativeType(sourceColumn); + String targetNativeType = getBareNativeType(targetColumn); + + if (sourceNativeType.equals(targetNativeType)) { + printIdentifier(getColumnName(sourceColumn), ddl); + } else { + String type = getSqlType(targetColumn); + if ("LONG VARCHAR".equals(type)) { + type = "VARCHAR"; + } + + if ("VARCHAR".equals(type)) { + type = type + "(" + sourceColumn.getSizeAsInt() + ")"; + } + + /* + * DB2 has the limitation that it cannot convert numeric values to + * VARCHAR, though it can convert them to CHAR + */ + if (TypeMap.isNumericType(sourceColumn.getMappedTypeCode()) + && "VARCHAR".equalsIgnoreCase(targetNativeType)) { + Object sizeSpec = targetColumn.getSize(); + + if (sizeSpec == null) { + sizeSpec = databaseInfo.getDefaultSize(targetColumn.getMappedTypeCode()); + } + type = "CHAR(" + sizeSpec.toString() + ")"; + + } + + ddl.append("CAST("); + printIdentifier(getColumnName(sourceColumn), ddl); + ddl.append(" AS "); + ddl.append(type); + ddl.append(")"); + + } + } } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java index c4ada9b957..317a869439 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2DdlBuilder.java @@ -211,7 +211,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi } @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { if (!change.getChangedColumn().isPrimaryKey()) { writeTableAlterStmt(change.getChangedTable(), ddl); ddl.append(" ALTER COLUMN "); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java index 25bf5b2ca4..16d28f2247 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDdlBuilder.java @@ -315,7 +315,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi } @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { Table table = change.getChangedTable(); Column column = change.getChangedColumn(); if (column.isPrimaryKey()) { diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java index 9150ea6cf3..68bf04ee19 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/h2/H2DdlBuilder.java @@ -195,7 +195,7 @@ protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBu } @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { change.getChangedColumn().setTypeCode(change.getNewTypeCode()); writeAlterColumn(change.getChangedTable(), change.getChangedColumn(), ddl); return true; diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java index a47553379b..da0701ada0 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/hsqldb2/HsqlDb2DdlBuilder.java @@ -102,11 +102,6 @@ protected boolean shouldGeneratePrimaryKeys(Column[] primaryKeyColumns) { return true; } } - - @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { - return false; - } @Override protected void processTableStructureChanges(Database currentModel, Database desiredModel, @@ -136,7 +131,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi && dataTypeChange.getNewTypeCode() == Types.LONGVARCHAR) { changeIt.remove(); } else if (dataTypeChange.getNewTypeCode() == Types.BIGINT) { - if (writeAlterColumnDataType(dataTypeChange, ddl)) { + if (writeAlterColumnDataTypeToBigInt(dataTypeChange, ddl)) { changeIt.remove(); } } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java index bbf71c7d9f..c0f1d46ae4 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java @@ -470,7 +470,7 @@ protected void processChange(Database currentModel, Database desiredModel, } @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { writeTableAlterStmt(change.getChangedTable(), ddl); ddl.append("MODIFY ("); Column column = change.getChangedColumn(); diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java index a889ac9f6d..215b7d539f 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDdlBuilder.java @@ -125,7 +125,7 @@ protected void dropTable(Table table, StringBuilder ddl, boolean temporary, bool } @Override - protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) { + protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) { writeTableAlterStmt(change.getChangedTable(), ddl); ddl.append(" ALTER COLUMN "); Column column = change.getChangedColumn(); diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java index 16cc37ac6b..4b2d1518f0 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/AbstractJdbcDdlReader.java @@ -541,6 +541,7 @@ public int compare(Table obj1, Table obj2) { public Table readTable(final String catalog, final String schema, final String table) { try { + log.debug("reading table: " + table); JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate(); return postprocessTableFromDatabase(sqlTemplate.execute(new IConnectionCallback() { public Table execute(Connection connection) throws SQLException { @@ -552,7 +553,9 @@ public Table execute(Connection connection) throws SQLException { ResultSet tableData = null; try { + log.debug("getting table metadata for " + table); tableData = metaData.getTables(getTableNamePattern(table)); + log.debug("done getting table metadata for " + table); if (tableData != null && tableData.next()) { Map values = readMetaData(tableData, initColumnsForTable()); return readTable(connection, metaData, values); @@ -1365,6 +1368,7 @@ public List execute(Connection connection) throws SQLException { DatabaseMetaData meta = connection.getMetaData(); ResultSet rs = null; try { + rs = meta.getSchemas(); while (rs.next()) { int columnCount = rs.getMetaData().getColumnCount(); diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlReader.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlReader.java index 1149556cca..e566ac7fd4 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlReader.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlReader.java @@ -3,11 +3,11 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; -import org.jumpmind.db.model.Column; import org.jumpmind.db.model.IIndex; import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.DatabaseMetaDataWrapper; @@ -29,6 +29,18 @@ protected String getTrueValue() { protected String getSysColumnsSchemaColumn() { return "DBNAME"; } + + @Override + public List getSchemaNames(String catalog) { + try { + return super.getSchemaNames(catalog); + } catch (Exception ex) { + ArrayList list = new ArrayList(); + list.add(platform.getSqlTemplate().queryForObject( + "select CURRENT SCHEMA from sysibm.sysdummy1", String.class)); + return list; + } + } protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) throws SQLException { @@ -58,17 +70,4 @@ protected boolean isInternalPrimaryKeyIndex(Connection connection, return indexMatchesPk; } - protected Table postprocessTableFromDatabase(Table table) { - super.postprocessTableFromDatabase(table); - if (table != null) { - for (int columnIdx = 0; columnIdx < table.getColumnCount(); columnIdx++) { - Column column = table.getColumn(columnIdx); - if (StringUtils.isBlank(column.getDefaultValue())) { - column.setDefaultValue(null); - } - } - } - return table; - } - } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DdlReader.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DdlReader.java index 62e7e64ae5..9829c8035a 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DdlReader.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DdlReader.java @@ -81,9 +81,10 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat Table table = super.readTable(connection, metaData, values); if (table != null) { - // DB2 does not return the auto-increment status via the database - // metadata - String sql = "SELECT NAME FROM " + systemSchemaName + ".SYSCOLUMNS WHERE TBNAME=? AND IDENTITY=?"; + log.debug("about to read additional column data"); + /* DB2 does not return the auto-increment status via the database + metadata */ + String sql = "SELECT NAME, IDENTITY, DEFAULT, DFTVALUE FROM " + systemSchemaName + ".SYSCOLUMNS WHERE TBNAME=?"; if (StringUtils.isNotBlank(metaData.getSchemaPattern())) { sql = sql + " AND "+getSysColumnsSchemaColumn()+"=?"; } @@ -93,9 +94,8 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat try { pstmt = connection.prepareStatement(sql); pstmt.setString(1, table.getName()); - pstmt.setString(2, getTrueValue()); if (StringUtils.isNotBlank(metaData.getSchemaPattern())) { - pstmt.setString(3, metaData.getSchemaPattern()); + pstmt.setString(2, metaData.getSchemaPattern()); } rs = pstmt.executeQuery(); @@ -103,16 +103,25 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat String columnName = rs.getString(1); Column column = table.getColumnWithName(columnName); if (column != null) { - column.setAutoIncrement(true); - } - if (log.isDebugEnabled()) { - log.debug("Found identity column {} on {}", columnName, table.getName()); + String isIdentity = rs.getString(2); + if (isIdentity != null && isIdentity.startsWith("Y")) { + column.setAutoIncrement(true); + if (log.isDebugEnabled()) { + log.debug("Found identity column {} on {}", columnName, + table.getName()); + } + } + String hasDefault = rs.getString(3); + if (hasDefault != null && hasDefault.startsWith("Y")) { + column.setDefaultValue(rs.getString(4)); + } } } } finally { JdbcSqlTemplate.close(rs); JdbcSqlTemplate.close(pstmt); } + log.debug("done reading additional column data"); } return table; } @@ -120,7 +129,7 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat protected String getTrueValue() { return "Y"; } - + @Override protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) throws SQLException { @@ -210,7 +219,9 @@ protected boolean isInternalPrimaryKeyIndex(Connection connection, HashSet pkNames = new HashSet(); try { + log.debug("getting pk info"); pkData = metaData.getPrimaryKeys(table.getName()); + log.debug("done getting pk info"); while (pkData.next()) { Map values = readMetaData(pkData, getColumnsForPK());