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)
}
// 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.
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.
// 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 .
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)
	x.Type.Charset, x.Type.Collate = types.DefaultCharsetForType(x.Type.Tp)
}
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 ) x . Type . Charset , x . Type . Collate = types . DefaultCharsetForType ( x . Type . Tp ) }
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.
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 .
// TODO: We need a better way to set charset/collation