diff --git a/org.adempiere.base.process/src/org/compiere/process/ColumnSync.java b/org.adempiere.base.process/src/org/compiere/process/ColumnSync.java index a44119b38e..040ad59e62 100644 --- a/org.adempiere.base.process/src/org/compiere/process/ColumnSync.java +++ b/org.adempiere.base.process/src/org/compiere/process/ColumnSync.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; +import java.sql.Types; import java.util.logging.Level; import org.compiere.model.MColumn; @@ -110,6 +111,21 @@ public class ColumnSync extends SvrProcess // update existing column boolean notNull = DatabaseMetaData.columnNoNulls == rs.getInt("NULLABLE"); sql = column.getSQLModify(table, column.isMandatory() != notNull); + if (DB.isOracle()) { + // IDEMPIERE-3842 problem with oracle alter CLOB or BLOB + int actualType = rs.getInt("DATA_TYPE"); + if (actualType == Types.CLOB) { + if (sql.contains(" MODIFY " + column.getColumnName() + " CLOB")) { + // trying to make CLOB a column that is already a CLOB + sql = sql.replaceFirst(" MODIFY " + column.getColumnName() + " CLOB", " MODIFY " + column.getColumnName()); + } + } else if (actualType == Types.BLOB) { + if (sql.contains(" MODIFY " + column.getColumnName() + " BLOB")) { + // trying to make BLOB a column that is already a BLOB + sql = sql.replaceFirst(" MODIFY " + column.getColumnName() + " BLOB", " MODIFY " + column.getColumnName()); + } + } + } break; } DB.close(rs); diff --git a/org.adempiere.base/src/org/compiere/model/MColumn.java b/org.adempiere.base/src/org/compiere/model/MColumn.java index 93dd0e0a67..f7a302758b 100644 --- a/org.adempiere.base/src/org/compiere/model/MColumn.java +++ b/org.adempiere.base/src/org/compiere/model/MColumn.java @@ -763,7 +763,7 @@ public class MColumn extends X_AD_Column foreignTable = "M_AttributeSetInstance"; } else if (DisplayType.Assignment == refid) { foreignTable = "S_ResourceAssignment"; - } else if (DisplayType.Image == refid) { + } else if (DisplayType.Image == refid && !"BinaryData".equals(getColumnName())) { foreignTable = "AD_Image"; } else if (DisplayType.Chart == refid) { foreignTable = "AD_Chart"; diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ColumnElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ColumnElementHandler.java index 763e77c17b..9c4f70f105 100644 --- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ColumnElementHandler.java +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ColumnElementHandler.java @@ -20,6 +20,7 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.List; import java.util.logging.Level; @@ -245,10 +246,23 @@ public class ColumnElementHandler extends AbstractElementHandler { if (rsc.next()) { if (doAlter) { // update existing column - boolean notNull = DatabaseMetaData.columnNoNulls == rsc - .getInt("NULLABLE"); - sql = column.getSQLModify(table, - column.isMandatory() != notNull); + boolean notNull = DatabaseMetaData.columnNoNulls == rsc.getInt("NULLABLE"); + sql = column.getSQLModify(table, column.isMandatory() != notNull); + if (DB.isOracle()) { + // IDEMPIERE-3842 problem with oracle alter CLOB or BLOB + int actualType = rsc.getInt("DATA_TYPE"); + if (actualType == Types.CLOB) { + if (sql.contains(" MODIFY " + column.getColumnName() + " CLOB")) { + // trying to make CLOB a column that is already a CLOB + sql = sql.replaceFirst(" MODIFY " + column.getColumnName() + " CLOB", " MODIFY " + column.getColumnName()); + } + } else if (actualType == Types.BLOB) { + if (sql.contains(" MODIFY " + column.getColumnName() + " BLOB")) { + // trying to make BLOB a column that is already a BLOB + sql = sql.replaceFirst(" MODIFY " + column.getColumnName() + " BLOB", " MODIFY " + column.getColumnName()); + } + } + } } } else { // No existing column diff --git a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java index 2cdf30439a..df59d4f924 100644 --- a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java +++ b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java @@ -369,6 +369,9 @@ public class DB_Oracle implements AdempiereDatabase public String convertStatement (String oraStatement) { Convert.logMigrationScript(oraStatement, null); + if ("true".equals(System.getProperty("org.idempiere.db.oracle.debug"))) { + log.warning("Oracle -> " + oraStatement); + } return oraStatement; } // convertStatement diff --git a/org.compiere.db.oracle.provider/src/org/compiere/dbPort/Convert_Oracle.java b/org.compiere.db.oracle.provider/src/org/compiere/dbPort/Convert_Oracle.java index 25ddc18bd4..18389ad410 100644 --- a/org.compiere.db.oracle.provider/src/org/compiere/dbPort/Convert_Oracle.java +++ b/org.compiere.db.oracle.provider/src/org/compiere/dbPort/Convert_Oracle.java @@ -2,14 +2,22 @@ package org.compiere.dbPort; import java.util.ArrayList; +import org.compiere.util.CLogger; + public class Convert_Oracle extends Convert { + /** Logger */ + private static CLogger log = CLogger.getCLogger(Convert_Oracle.class); + public Convert_Oracle() {} @Override protected ArrayList convertStatement(String sqlStatement) { ArrayList result = new ArrayList(); result.add(sqlStatement); + if ("true".equals(System.getProperty("org.idempiere.db.oracle.debug"))) { + log.warning("Oracle -> " + sqlStatement); + } return result; }