Skip to content

Commit 00801a7

Browse files
SunRunAwaysre-bot
authored andcommitted
expression: remove the NotNullFlag for aggregation func MAX/MIN when inferring type (#11343) (#11641)
1 parent b066cba commit 00801a7

File tree

4 files changed

+53
-32
lines changed

4 files changed

+53
-32
lines changed

cmd/explaintest/r/tpch.result

+33-32
Original file line numberDiff line numberDiff line change
@@ -182,38 +182,39 @@ s_name,
182182
p_partkey
183183
limit 100;
184184
id count task operator info
185-
Projection_36 100.00 root tpch.supplier.s_acctbal, tpch.supplier.s_name, tpch.nation.n_name, tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_comment
186-
└─TopN_39 100.00 root tpch.supplier.s_acctbal:desc, tpch.nation.n_name:asc, tpch.supplier.s_name:asc, tpch.part.p_partkey:asc, offset:0, count:100
187-
└─HashRightJoin_44 155496.00 root inner join, inner:HashLeftJoin_50, equal:[eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) eq(tpch.partsupp.ps_supplycost, min(ps_supplycost))]
188-
├─HashLeftJoin_50 155496.00 root inner join, inner:TableReader_73, equal:[eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)]
189-
│ ├─HashRightJoin_53 8155010.44 root inner join, inner:HashRightJoin_55, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)]
190-
│ │ ├─HashRightJoin_55 100000.00 root inner join, inner:HashRightJoin_61, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)]
191-
│ │ │ ├─HashRightJoin_61 5.00 root inner join, inner:TableReader_66, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)]
192-
│ │ │ │ ├─TableReader_66 1.00 root data:Selection_65
193-
│ │ │ │ │ └─Selection_65 1.00 cop eq(tpch.region.r_name, "ASIA")
194-
│ │ │ │ │ └─TableScan_64 5.00 cop table:region, range:[-inf,+inf], keep order:false
195-
│ │ │ │ └─TableReader_63 25.00 root data:TableScan_62
196-
│ │ │ │ └─TableScan_62 25.00 cop table:nation, range:[-inf,+inf], keep order:false
197-
│ │ │ └─TableReader_68 500000.00 root data:TableScan_67
198-
│ │ │ └─TableScan_67 500000.00 cop table:supplier, range:[-inf,+inf], keep order:false
199-
│ │ └─TableReader_70 40000000.00 root data:TableScan_69
200-
│ │ └─TableScan_69 40000000.00 cop table:partsupp, range:[-inf,+inf], keep order:false
201-
│ └─TableReader_73 155496.00 root data:Selection_72
202-
│ └─Selection_72 155496.00 cop eq(tpch.part.p_size, 30), like(tpch.part.p_type, "%STEEL", 92)
203-
│ └─TableScan_71 10000000.00 cop table:part, range:[-inf,+inf], keep order:false
204-
└─HashAgg_76 8155010.44 root group by:tpch.partsupp.ps_partkey, funcs:min(tpch.partsupp.ps_supplycost), firstrow(tpch.partsupp.ps_partkey)
205-
└─HashRightJoin_80 8155010.44 root inner join, inner:HashRightJoin_82, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)]
206-
├─HashRightJoin_82 100000.00 root inner join, inner:HashRightJoin_88, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)]
207-
│ ├─HashRightJoin_88 5.00 root inner join, inner:TableReader_93, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)]
208-
│ │ ├─TableReader_93 1.00 root data:Selection_92
209-
│ │ │ └─Selection_92 1.00 cop eq(tpch.region.r_name, "ASIA")
210-
│ │ │ └─TableScan_91 5.00 cop table:region, range:[-inf,+inf], keep order:false
211-
│ │ └─TableReader_90 25.00 root data:TableScan_89
212-
│ │ └─TableScan_89 25.00 cop table:nation, range:[-inf,+inf], keep order:false
213-
│ └─TableReader_95 500000.00 root data:TableScan_94
214-
│ └─TableScan_94 500000.00 cop table:supplier, range:[-inf,+inf], keep order:false
215-
└─TableReader_97 40000000.00 root data:TableScan_96
216-
└─TableScan_96 40000000.00 cop table:partsupp, range:[-inf,+inf], keep order:false
185+
Projection_37 100.00 root tpch.supplier.s_acctbal, tpch.supplier.s_name, tpch.nation.n_name, tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_comment
186+
└─TopN_40 100.00 root tpch.supplier.s_acctbal:desc, tpch.nation.n_name:asc, tpch.supplier.s_name:asc, tpch.part.p_partkey:asc, offset:0, count:100
187+
└─HashRightJoin_45 155496.00 root inner join, inner:HashLeftJoin_51, equal:[eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) eq(tpch.partsupp.ps_supplycost, min(ps_supplycost))]
188+
├─HashLeftJoin_51 155496.00 root inner join, inner:TableReader_74, equal:[eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)]
189+
│ ├─HashRightJoin_54 8155010.44 root inner join, inner:HashRightJoin_56, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)]
190+
│ │ ├─HashRightJoin_56 100000.00 root inner join, inner:HashRightJoin_62, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)]
191+
│ │ │ ├─HashRightJoin_62 5.00 root inner join, inner:TableReader_67, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)]
192+
│ │ │ │ ├─TableReader_67 1.00 root data:Selection_66
193+
│ │ │ │ │ └─Selection_66 1.00 cop eq(tpch.region.r_name, "ASIA")
194+
│ │ │ │ │ └─TableScan_65 5.00 cop table:region, range:[-inf,+inf], keep order:false
195+
│ │ │ │ └─TableReader_64 25.00 root data:TableScan_63
196+
│ │ │ │ └─TableScan_63 25.00 cop table:nation, range:[-inf,+inf], keep order:false
197+
│ │ │ └─TableReader_69 500000.00 root data:TableScan_68
198+
│ │ │ └─TableScan_68 500000.00 cop table:supplier, range:[-inf,+inf], keep order:false
199+
│ │ └─TableReader_71 40000000.00 root data:TableScan_70
200+
│ │ └─TableScan_70 40000000.00 cop table:partsupp, range:[-inf,+inf], keep order:false
201+
│ └─TableReader_74 155496.00 root data:Selection_73
202+
│ └─Selection_73 155496.00 cop eq(tpch.part.p_size, 30), like(tpch.part.p_type, "%STEEL", 92)
203+
│ └─TableScan_72 10000000.00 cop table:part, range:[-inf,+inf], keep order:false
204+
└─Selection_75 6524008.35 root not(isnull(min(ps_supplycost)))
205+
└─HashAgg_78 8155010.44 root group by:tpch.partsupp.ps_partkey, funcs:min(tpch.partsupp.ps_supplycost), firstrow(tpch.partsupp.ps_partkey)
206+
└─HashRightJoin_82 8155010.44 root inner join, inner:HashRightJoin_84, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)]
207+
├─HashRightJoin_84 100000.00 root inner join, inner:HashRightJoin_90, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)]
208+
│ ├─HashRightJoin_90 5.00 root inner join, inner:TableReader_95, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)]
209+
│ │ ├─TableReader_95 1.00 root data:Selection_94
210+
│ │ │ └─Selection_94 1.00 cop eq(tpch.region.r_name, "ASIA")
211+
│ │ │ └─TableScan_93 5.00 cop table:region, range:[-inf,+inf], keep order:false
212+
│ │ └─TableReader_92 25.00 root data:TableScan_91
213+
│ │ └─TableScan_91 25.00 cop table:nation, range:[-inf,+inf], keep order:false
214+
│ └─TableReader_97 500000.00 root data:TableScan_96
215+
│ └─TableScan_96 500000.00 cop table:supplier, range:[-inf,+inf], keep order:false
216+
└─TableReader_99 40000000.00 root data:TableScan_98
217+
└─TableScan_98 40000000.00 cop table:partsupp, range:[-inf,+inf], keep order:false
217218
/*
218219
Q3 Shipping Priority Query
219220
This query retrieves the 10 unshipped orders with the highest value.

expression/aggregation/base_func.go

+4
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ func (a *baseFuncDesc) typeInfer4MaxMin(ctx sessionctx.Context) {
184184
a.Args[0] = expression.BuildCastFunction(ctx, a.Args[0], tp)
185185
}
186186
a.RetTp = a.Args[0].GetType()
187+
if (a.Name == ast.AggFuncMax || a.Name == ast.AggFuncMin) && a.RetTp.Tp != mysql.TypeBit {
188+
a.RetTp = a.Args[0].GetType().Clone()
189+
a.RetTp.Flag &^= mysql.NotNullFlag
190+
}
187191
if a.RetTp.Tp == mysql.TypeEnum || a.RetTp.Tp == mysql.TypeSet {
188192
a.RetTp = &types.FieldType{Tp: mysql.TypeString, Flen: mysql.MaxFieldCharLength}
189193
}

expression/aggregation/base_func_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,14 @@ func (s *testBaseFuncSuite) TestClone(c *check.C) {
3939
c.Assert(desc.Args[0], check.Equals, col)
4040
c.Assert(desc.equal(s.ctx, cloned), check.IsFalse)
4141
}
42+
43+
func (s *testBaseFuncSuite) TestMaxMin(c *check.C) {
44+
col := &expression.Column{
45+
UniqueID: 0,
46+
RetType: types.NewFieldType(mysql.TypeLonglong),
47+
}
48+
col.RetType.Flag |= mysql.NotNullFlag
49+
desc, err := newBaseFuncDesc(s.ctx, ast.AggFuncMax, []expression.Expression{col})
50+
c.Assert(err, check.IsNil)
51+
c.Assert(mysql.HasNotNullFlag(desc.RetTp.Flag), check.IsFalse)
52+
}

expression/integration_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -2760,6 +2760,11 @@ func (s *testIntegrationSuite) TestControlBuiltin(c *C) {
27602760
result = tk.MustQuery("select ifnull(null, null)")
27612761
result.Check(testkit.Rows("<nil>"))
27622762

2763+
tk.MustExec("drop table if exists t1")
2764+
tk.MustExec("create table t1(a bigint not null)")
2765+
result = tk.MustQuery("select ifnull(max(a),0) from t1")
2766+
result.Check(testkit.Rows("0"))
2767+
27632768
tk.MustExec("drop table if exists t1")
27642769
tk.MustExec("drop table if exists t2")
27652770
tk.MustExec("create table t1(a decimal(20,4))")

0 commit comments

Comments
 (0)