Github user anubhav100 commented on the issue:

    https://github.com/apache/carbondata/pull/1795
  
    @jackylk  
    
    **here is the root reason**
    
    **when we apply the alter table command with default value i;e
           "alter table customer1 add columns (intfield int) TBLPROPERTIES 
('DEFAULT.VALUE.intfield'='10')")
    
    that value is always return as the long object in restructure util thats 
why compaction failed because the column value for newly added column is long 
but the column type is int**
    
    
    it is wrongly written in restructure util  this code is wrong
    
      public static Object getMeasureDefaultValue(ColumnSchema columnSchema, 
byte[] defaultValue) {
        Object measureDefaultValue = null;
        if (!isDefaultValueNull(defaultValue)) {
          String value = null;
          DataType dataType = columnSchema.getDataType();
          if (dataType == DataTypes.SHORT || dataType == DataTypes.INT || 
dataType == DataTypes.LONG) {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            measureDefaultValue = Long.parseLong(value);
          } else if (DataTypes.isDecimal(dataType)) {
            BigDecimal decimal = DataTypeUtil.byteToBigDecimal(defaultValue);
            if (columnSchema.getScale() > decimal.scale()) {
              decimal = decimal.setScale(columnSchema.getScale(), 
RoundingMode.HALF_UP);
            }
            measureDefaultValue = decimal;
          } else {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            Double parsedValue = Double.valueOf(value);
            if (!Double.isInfinite(parsedValue) && !Double.isNaN(parsedValue)) {
              measureDefaultValue = parsedValue;
            }
          }
        }
        return measureDefaultValue;
      }
    
    this code is always returning a long value objetc that is wrong
    
    i corrected it as 
    
      */
      public static Object getMeasureDefaultValue(ColumnSchema columnSchema, 
byte[] defaultValue) {
        Object measureDefaultValue = null;
        if (!isDefaultValueNull(defaultValue)) {
          String value = null;
          DataType dataType = columnSchema.getDataType();
          if (dataType == DataTypes.SHORT) {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            measureDefaultValue = new Short(value);
          }
         else if (dataType == DataTypes.LONG) {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            measureDefaultValue = Long.parseLong(value);
          }
         else if (dataType == DataTypes.INT) {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            measureDefaultValue = Integer.parseInt(value);
          }
          else if (DataTypes.isDecimal(dataType)) {
            BigDecimal decimal = DataTypeUtil.byteToBigDecimal(defaultValue);
            if (columnSchema.getScale() > decimal.scale()) {
              decimal = decimal.setScale(columnSchema.getScale(), 
RoundingMode.HALF_UP);
            }
            measureDefaultValue = decimal;
          } else {
            value = new String(defaultValue, 
Charset.forName(CarbonCommonConstants.DEFAULT_CHARSET));
            Double parsedValue = Double.valueOf(value);
            if (!Double.isInfinite(parsedValue) && !Double.isNaN(parsedValue)) {
              measureDefaultValue = parsedValue;
            }
          }
        }
        return measureDefaultValue;
      }
    
    please review i corrected it


---

Reply via email to