code: func (v *typeInferrer) handleCaseExpr(x *ast.CaseExpr) {
  	var currType types.FieldType
  	for _, w := range x.WhenClauses {
  		t := w.Result.GetType()
  		if currType.Tp == mysql.TypeUnspecified {
  			currType = *t
  			continue
  		}
  		mtp := types.MergeFieldType(currType.Tp, t.Tp)
  		if mtp == t.Tp && mtp != currType.Tp {
  			currType.Charset = t.Charset
  			currType.Collate = t.Collate
  		}
  		currType.Tp = mtp
  
  	}
  	if x.ElseClause != nil {
  		t := x.ElseClause.GetType()
  		if currType.Tp == mysql.TypeUnspecified {
  			currType = *t
  		} else {
  			mtp := types.MergeFieldType(currType.Tp, t.Tp)
  			if mtp == t.Tp && mtp != currType.Tp {
  				currType.Charset = t.Charset
  				currType.Collate = t.Collate
  			}
  			currType.Tp = mtp
  		}
  	}
  	x.SetType(&currType)
  	// TODO: We need a better way to set charset/collation
  	x.Type.Charset, x.Type.Collate = types.DefaultCharsetForType(x.Type.Tp)
  }
docs: // The return type of a CASE expression is the compatible aggregated type of all return values,
  // but also depends on the context in which it is used.
  // If used in a string context, the result is returned as a string.
  // If used in a numeric context, the result is returned as a decimal, real, or integer value.