protected Object readDefaultValue(
      CachedRow columnMetadataResultSet, Column columnInfo, Database database)
      throws SQLException, DatabaseException {
    if (database instanceof MSSQLDatabase) {
      Object defaultValue = columnMetadataResultSet.get("COLUMN_DEF");

      if (defaultValue != null && defaultValue instanceof String) {
        if (defaultValue.equals("(NULL)")) {
          columnMetadataResultSet.set("COLUMN_DEF", null);
        }
      }
    }

    if (database instanceof OracleDatabase) {
      if (columnMetadataResultSet.get("COLUMN_DEF") == null) {
        columnMetadataResultSet.set("COLUMN_DEF", columnMetadataResultSet.get("DATA_DEFAULT"));

        if (columnMetadataResultSet.get("COLUMN_DEF") != null
            && ((String) columnMetadataResultSet.get("COLUMN_DEF")).equalsIgnoreCase("NULL")) {
          columnMetadataResultSet.set("COLUMN_DEF", null);
        }

        Object columnDef = columnMetadataResultSet.get("COLUMN_DEF");
        if (columnInfo.getType().getTypeName().equalsIgnoreCase("CHAR")
            && columnDef instanceof String
            && !((String) columnDef).startsWith("'")
            && !((String) columnDef).endsWith("'")) {
          return new DatabaseFunction((String) columnDef);
        }

        if (columnMetadataResultSet.get("VIRTUAL_COLUMN").equals("YES")) {
          Object column_def = columnMetadataResultSet.get("COLUMN_DEF");
          if (column_def != null && !column_def.equals("null")) {
            columnMetadataResultSet.set("COLUMN_DEF", "GENERATED ALWAYS AS (" + column_def + ")");
          }
        }
      }
    }

    return SqlUtil.parseValue(
        database, columnMetadataResultSet.get("COLUMN_DEF"), columnInfo.getType());
  }