Maybe I'm missing something, but I was just suggesting to get rid of the extra if statements and incorporate the logic in the ones above, like this:

    ColumnDef(ColumnDefName columnDefName, String sqlTypeName, boolean isNull, Integer maxLength,
            Integer scale, boolean isPK) {
        this.columnDefName = columnDefName;
        this.dataType = PDataType.fromSqlTypeName(SchemaUtil.normalizeIdentifier(sqlTypeName));
        this.isNull = isNull;
        if (this.dataType == PDataType.CHAR) {
            if (maxLength == null) {
                throw new IllegalArgumentException(sqlTypeName + " must declare a length");
            }
        } else if (this.dataType == PDataType.DECIMAL) {
            maxLength = maxLength == null ? PDataType.MAX_PRECISION : maxLength;
            // If scale is not specify, it's set to the precision. Otherwise, if scale is bigger
            // maxLength, just set it to the maxLength;
            scale = scale == null || scale > maxLength ? maxLength : scale; 
        } else if (this.dataType != PDataType.VARCHAR) {// Ignore maxLength unless CHAR or VARCHAR for now
            maxLength = null;
            scale = null;
        } else {
            scale = null;
        }
        this.maxLength = maxLength;
        this.scale = scale;
        this.isPK = isPK;
    }