Skip to content

Commit

Permalink
expression: NotNullFlag is not set correctly for some expression (pin…
Browse files Browse the repository at this point in the history
  • Loading branch information
windtalker authored and sre-bot committed May 6, 2020
1 parent b310048 commit ff19bea
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
8 changes: 8 additions & 0 deletions types/field_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ func AggFieldType(tps []*FieldType) *FieldType {
}
mtp := MergeFieldType(currType.Tp, t.Tp)
currType.Tp = mtp
currType.Flag = mergeTypeFlag(currType.Flag, t.Flag)
}

return &currType
Expand Down Expand Up @@ -267,6 +268,13 @@ func MergeFieldType(a byte, b byte) byte {
return fieldTypeMergeRules[ia][ib]
}

// mergeTypeFlag merges two MySQL type flag to a new one
// currently only NotNullFlag is checked
// todo more flag need to be checked, for example: UnsignedFlag
func mergeTypeFlag(a, b uint) uint {
return a & (b&mysql.NotNullFlag | ^mysql.NotNullFlag)
}

func getFieldTypeIndex(tp byte) int {
itp := int(tp)
if itp < fieldTypeTearFrom {
Expand Down
26 changes: 26 additions & 0 deletions types/field_type_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,32 @@ func (s *testFieldTypeSuite) TestAggFieldType(c *C) {
}
}
}
func (s *testFieldTypeSuite) TestAggFieldTypeForTypeFlag(c *C) {
types := []*FieldType{
NewFieldType(mysql.TypeLonglong),
NewFieldType(mysql.TypeLonglong),
}

aggTp := AggFieldType(types)
c.Assert(aggTp.Tp, Equals, mysql.TypeLonglong)
c.Assert(aggTp.Flag, Equals, uint(0))

types[0].Flag = mysql.NotNullFlag
aggTp = AggFieldType(types)
c.Assert(aggTp.Tp, Equals, mysql.TypeLonglong)
c.Assert(aggTp.Flag, Equals, uint(0))

types[0].Flag = 0
types[1].Flag = mysql.NotNullFlag
aggTp = AggFieldType(types)
c.Assert(aggTp.Tp, Equals, mysql.TypeLonglong)
c.Assert(aggTp.Flag, Equals, uint(0))

types[0].Flag = mysql.NotNullFlag
aggTp = AggFieldType(types)
c.Assert(aggTp.Tp, Equals, mysql.TypeLonglong)
c.Assert(aggTp.Flag, Equals, mysql.NotNullFlag)
}

func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) {
defer testleak.AfterTest(c)()
Expand Down

0 comments on commit ff19bea

Please sign in to comment.