unsigned int                    size;
        unsigned int                    offset;
        unsigned int                    is_signed;
+       const char                      *type;
        struct hist_field               *operands[HIST_FIELD_OPERANDS_MAX];
        struct hist_trigger_data        *hist_data;
        struct hist_var                 var;
 
        kfree(hist_field->var.name);
        kfree(hist_field->name);
+       kfree(hist_field->type);
 
        kfree(hist_field);
 }
 
        if (flags & HIST_FIELD_FL_HITCOUNT) {
                hist_field->fn = hist_field_counter;
+               hist_field->size = sizeof(u64);
+               hist_field->type = kstrdup("u64", GFP_KERNEL);
+               if (!hist_field->type)
+                       goto free;
                goto out;
        }
 
                hist_field->fn = hist_field_log2;
                hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL);
                hist_field->size = hist_field->operands[0]->size;
+               hist_field->type = kstrdup(hist_field->operands[0]->type, GFP_KERNEL);
+               if (!hist_field->type)
+                       goto free;
                goto out;
        }
 
        if (flags & HIST_FIELD_FL_TIMESTAMP) {
                hist_field->fn = hist_field_timestamp;
                hist_field->size = sizeof(u64);
+               hist_field->type = kstrdup("u64", GFP_KERNEL);
+               if (!hist_field->type)
+                       goto free;
                goto out;
        }
 
        if (is_string_field(field)) {
                flags |= HIST_FIELD_FL_STRING;
 
+               hist_field->size = MAX_FILTER_STR_VAL;
+               hist_field->type = kstrdup(field->type, GFP_KERNEL);
+               if (!hist_field->type)
+                       goto free;
+
                if (field->filter_type == FILTER_STATIC_STRING)
                        hist_field->fn = hist_field_string;
                else if (field->filter_type == FILTER_DYN_STRING)
                else
                        hist_field->fn = hist_field_pstring;
        } else {
+               hist_field->size = field->size;
+               hist_field->is_signed = field->is_signed;
+               hist_field->type = kstrdup(field->type, GFP_KERNEL);
+               if (!hist_field->type)
+                       goto free;
+
                hist_field->fn = select_value_fn(field->size,
                                                 field->is_signed);
                if (!hist_field->fn) {
        expr->operands[0] = operand1;
        expr->operator = FIELD_OP_UNARY_MINUS;
        expr->name = expr_str(expr, 0);
+       expr->type = kstrdup(operand1->type, GFP_KERNEL);
+       if (!expr->type) {
+               ret = -ENOMEM;
+               goto free;
+       }
 
        return expr;
  free:
        expr->operands[1] = operand2;
        expr->operator = field_op;
        expr->name = expr_str(expr, 0);
+       expr->type = kstrdup(operand1->type, GFP_KERNEL);
+       if (!expr->type) {
+               ret = -ENOMEM;
+               goto free;
+       }
 
        switch (field_op) {
        case FIELD_OP_MINUS: