diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 02b98f8c86..f459e6fb25 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -803,36 +803,30 @@ func (c *dayOfMonthFunctionClass) getFunction(args []Expression, ctx context.Con if err := c.verifyArgs(args); err != nil { return nil, errors.Trace(err) } - sig := &builtinDayOfMonthSig{newBaseBuiltinFunc(args, ctx)} + bf, err := newBaseBuiltinFuncWithTp(args, ctx, tpInt, tpTime) + if err != nil { + return nil, errors.Trace(err) + } + bf.tp.Flen = 2 + sig := &builtinDayOfMonthSig{baseIntBuiltinFunc{bf}} return sig.setSelf(sig), nil } type builtinDayOfMonthSig struct { - baseBuiltinFunc + baseIntBuiltinFunc } -// eval evals a builtinDayOfMonthSig. +// evalInt evals a builtinDayOfMonthSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofmonth -func (b *builtinDayOfMonthSig) eval(row []types.Datum) (d types.Datum, err error) { - args, err := b.evalArgs(row) - if err != nil { - return d, errors.Trace(err) +func (b *builtinDayOfMonthSig) evalInt(row []types.Datum) (int64, bool, error) { + arg, isNull, err := b.args[0].EvalTime(row, b.ctx.GetSessionVars().StmtCtx) + if isNull || err != nil { + return 0, true, errors.Trace(handleInvalidTimeError(b.ctx, err)) } - // TODO: some invalid format like 2000-00-00 will return 0 too. - d, err = convertToTime(b.ctx.GetSessionVars().StmtCtx, args[0], mysql.TypeDate) - if err != nil || d.IsNull() { - return d, errors.Trace(err) + if arg.IsZero() { + return 0, true, errors.Trace(handleInvalidTimeError(b.ctx, types.ErrInvalidTimeFormat)) } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetInt64(int64(0)) - return - } - - d.SetInt64(int64(t.Time.Day())) - return + return int64(arg.Time.Day()), false, nil } type dayOfWeekFunctionClass struct { @@ -843,37 +837,32 @@ func (c *dayOfWeekFunctionClass) getFunction(args []Expression, ctx context.Cont if err := c.verifyArgs(args); err != nil { return nil, errors.Trace(err) } - sig := &builtinDayOfWeekSig{newBaseBuiltinFunc(args, ctx)} + bf, err := newBaseBuiltinFuncWithTp(args, ctx, tpInt, tpTime) + if err != nil { + return nil, errors.Trace(err) + } + bf.tp.Flen = 1 + sig := &builtinDayOfWeekSig{baseIntBuiltinFunc{bf}} return sig.setSelf(sig), nil } type builtinDayOfWeekSig struct { - baseBuiltinFunc + baseIntBuiltinFunc } -// eval evals a builtinDayOfWeekSig. +// evalInt evals a builtinDayOfWeekSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofweek -func (b *builtinDayOfWeekSig) eval(row []types.Datum) (d types.Datum, err error) { - args, err := b.evalArgs(row) - if err != nil { - return d, errors.Trace(err) +func (b *builtinDayOfWeekSig) evalInt(row []types.Datum) (int64, bool, error) { + sc := b.ctx.GetSessionVars().StmtCtx + arg, isNull, err := b.args[0].EvalTime(row, sc) + if isNull || err != nil { + return 0, true, errors.Trace(handleInvalidTimeError(b.ctx, err)) } - d, err = convertToTime(b.ctx.GetSessionVars().StmtCtx, args[0], mysql.TypeDate) - if err != nil || d.IsNull() { - return d, errors.Trace(err) + if arg.InvalidZero() { + return 0, true, errors.Trace(handleInvalidTimeError(b.ctx, types.ErrInvalidTimeFormat)) } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetNull() - // TODO: log warning or return error? - return - } - // 1 is Sunday, 2 is Monday, .... 7 is Saturday - d.SetInt64(int64(t.Time.Weekday() + 1)) - return + return int64(arg.Time.Weekday() + 1), false, nil } type dayOfYearFunctionClass struct { @@ -884,36 +873,31 @@ func (c *dayOfYearFunctionClass) getFunction(args []Expression, ctx context.Cont if err := c.verifyArgs(args); err != nil { return nil, errors.Trace(err) } - sig := &builtinDayOfYearSig{newBaseBuiltinFunc(args, ctx)} + bf, err := newBaseBuiltinFuncWithTp(args, ctx, tpInt, tpTime) + if err != nil { + return nil, errors.Trace(err) + } + bf.tp.Flen = 3 + sig := &builtinDayOfYearSig{baseIntBuiltinFunc{bf}} return sig.setSelf(sig), nil } type builtinDayOfYearSig struct { - baseBuiltinFunc + baseIntBuiltinFunc } -// eval evals a builtinDayOfYearSig. +// evalInt evals a builtinDayOfYearSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofyear -func (b *builtinDayOfYearSig) eval(row []types.Datum) (d types.Datum, err error) { - args, err := b.evalArgs(row) - if err != nil { - return d, errors.Trace(err) +func (b *builtinDayOfYearSig) evalInt(row []types.Datum) (int64, bool, error) { + arg, isNull, err := b.args[0].EvalTime(row, b.ctx.GetSessionVars().StmtCtx) + if isNull || err != nil { + return 0, isNull, errors.Trace(handleInvalidTimeError(b.ctx, err)) } - d, err = convertToTime(b.ctx.GetSessionVars().StmtCtx, args[0], mysql.TypeDate) - if err != nil || d.IsNull() { - return d, errors.Trace(err) + if arg.InvalidZero() { + return 0, true, errors.Trace(handleInvalidTimeError(b.ctx, types.ErrInvalidTimeFormat)) } - t := d.GetMysqlTime() - if t.InvalidZero() { - // TODO: log warning or return error? - d.SetNull() - return - } - - yd := int64(t.Time.YearDay()) - d.SetInt64(yd) - return + return int64(arg.Time.YearDay()), false, nil } type weekFunctionClass struct { diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index 3984edf153..7fbbbc6733 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -170,8 +170,8 @@ func (s *testEvaluatorSuite) TestDate(c *C) { YearWeek interface{} }{ {nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil}, - {"0000-00-00 00:00:00", nil, nil, nil, int64(0), nil, nil, nil, nil, nil, nil, nil}, - {"0000-00-00", nil, nil, nil, int64(0), nil, nil, nil, nil, nil, nil, nil}, + {"0000-00-00 00:00:00", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil}, + {"0000-00-00", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil}, } dtblNil := tblToDtbl(tblNil) @@ -258,6 +258,111 @@ func (s *testEvaluatorSuite) TestDate(c *C) { } } +func (s *testEvaluatorSuite) TestDayOfWeek(c *C) { + defer testleak.AfterTest(c)() + cases := []struct { + args interface{} + expected int64 + isNil bool + getErr bool + }{ + {"2017-12-01", 6, false, false}, + {"0000-00-00", 1, true, false}, + {"2018-00-00", 1, true, false}, + {"2017-00-00 12:12:12", 1, true, false}, + {"0000-00-00 12:12:12", 1, true, false}, + } + for _, t := range cases { + f, err := newFunctionForTest(s.ctx, ast.DayOfWeek, primitiveValsToConstants([]interface{}{t.args})...) + c.Assert(err, IsNil) + d, err := f.Eval(nil) + if t.getErr { + c.Assert(err, NotNil) + } else { + c.Assert(err, IsNil) + if t.isNil { + c.Assert(d.Kind(), Equals, types.KindNull) + } else { + c.Assert(d.GetInt64(), Equals, t.expected) + } + } + } + + f, err := funcs[ast.DayOfWeek].getFunction([]Expression{Zero}, s.ctx) + c.Assert(err, IsNil) + c.Assert(f.isDeterministic(), IsTrue) +} + +func (s *testEvaluatorSuite) TestDayOfMonth(c *C) { + defer testleak.AfterTest(c)() + cases := []struct { + args interface{} + expected int64 + isNil bool + getErr bool + }{ + {"2017-12-01", 1, false, false}, + {"0000-00-00", 1, true, false}, + {"2018-00-00", 0, false, false}, + {"2017-00-00 12:12:12", 0, false, false}, + {"0000-00-00 12:12:12", 0, false, false}, + } + for _, t := range cases { + f, err := newFunctionForTest(s.ctx, ast.DayOfMonth, primitiveValsToConstants([]interface{}{t.args})...) + c.Assert(err, IsNil) + d, err := f.Eval(nil) + if t.getErr { + c.Assert(err, NotNil) + } else { + c.Assert(err, IsNil) + if t.isNil { + c.Assert(d.Kind(), Equals, types.KindNull) + } else { + c.Assert(d.GetInt64(), Equals, t.expected) + } + } + } + + f, err := funcs[ast.DayOfMonth].getFunction([]Expression{Zero}, s.ctx) + c.Assert(err, IsNil) + c.Assert(f.isDeterministic(), IsTrue) +} + +func (s *testEvaluatorSuite) TestDayOfYear(c *C) { + defer testleak.AfterTest(c)() + cases := []struct { + args interface{} + expected int64 + isNil bool + getErr bool + }{ + {"2017-12-01", 335, false, false}, + {"0000-00-00", 1, true, false}, + {"2018-00-00", 0, true, false}, + {"2017-00-00 12:12:12", 0, true, false}, + {"0000-00-00 12:12:12", 0, true, false}, + } + for _, t := range cases { + f, err := newFunctionForTest(s.ctx, ast.DayOfYear, primitiveValsToConstants([]interface{}{t.args})...) + c.Assert(err, IsNil) + d, err := f.Eval(nil) + if t.getErr { + c.Assert(err, NotNil) + } else { + c.Assert(err, IsNil) + if t.isNil { + c.Assert(d.Kind(), Equals, types.KindNull) + } else { + c.Assert(d.GetInt64(), Equals, t.expected) + } + } + } + + f, err := funcs[ast.DayOfYear].getFunction([]Expression{Zero}, s.ctx) + c.Assert(err, IsNil) + c.Assert(f.isDeterministic(), IsTrue) +} + func (s *testEvaluatorSuite) TestDateFormat(c *C) { defer testleak.AfterTest(c)() diff --git a/expression/integration_test.go b/expression/integration_test.go index 57b8cc65ba..aaa55f095e 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -19,6 +19,7 @@ import ( "time" "github.com/juju/errors" + "github.com/ngaut/log" . "github.com/pingcap/check" "github.com/pingcap/tidb" "github.com/pingcap/tidb/context" @@ -1130,6 +1131,46 @@ func (s *testIntegrationSuite) TestTimeBuiltin(c *C) { result.Check(testkit.Rows("")) result = tk.MustQuery("SELECT TIME_FORMAT(123, '%H:%i:%s %p');") result.Check(testkit.Rows("00:01:23 AM")) + + // for dayOfWeek, dayOfMonth, dayOfYear + result = tk.MustQuery(`select dayOfWeek(null), dayOfWeek("2017-08-12"), dayOfWeek("0000-00-00"), dayOfWeek("2017-00-00"), dayOfWeek("0000-00-00 12:12:12"), dayOfWeek("2017-00-00 12:12:12")`) + result.Check(testkit.Rows(" 7 ")) + result = tk.MustQuery(`select dayOfYear(null), dayOfYear("2017-08-12"), dayOfYear("0000-00-00"), dayOfYear("2017-00-00"), dayOfYear("0000-00-00 12:12:12"), dayOfYear("2017-00-00 12:12:12")`) + result.Check(testkit.Rows(" 224 ")) + result = tk.MustQuery(`select dayOfMonth(null), dayOfMonth("2017-08-12"), dayOfMonth("0000-00-00"), dayOfMonth("2017-00-00"), dayOfMonth("0000-00-00 12:12:12"), dayOfMonth("2017-00-00 12:12:12")`) + result.Check(testkit.Rows(" 12 0 0 0")) + + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a bigint)`) + tk.MustExec(`insert into t value(1)`) + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") + + _, err = tk.Exec("insert into t value(dayOfWeek('0000-00-00'))") + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`update t set a = dayOfWeek("0000-00-00")`) + log.Warning(err, IsNil) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`delete from t where a = dayOfWeek(123)`) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + + _, err = tk.Exec("insert into t value(dayOfMonth('2017-00-00'))") + c.Assert(err, IsNil) + _, err = tk.Exec("insert into t value(dayOfMonth('0000-00-00'))") + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`update t set a = dayOfMonth("0000-00-00")`) + log.Warning(err, IsNil) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`delete from t where a = dayOfMonth(123)`) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + + _, err = tk.Exec("insert into t value(dayOfYear('0000-00-00'))") + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`update t set a = dayOfYear("0000-00-00")`) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + _, err = tk.Exec(`delete from t where a = dayOfYear(123)`) + c.Assert(terror.ErrorEqual(err, types.ErrInvalidTimeFormat), IsTrue) + + tk.MustExec("set sql_mode = ''") } func (s *testIntegrationSuite) TestOpBuiltin(c *C) { diff --git a/plan/typeinfer_test.go b/plan/typeinfer_test.go index bb449f13fc..7d7c8583ef 100644 --- a/plan/typeinfer_test.go +++ b/plan/typeinfer_test.go @@ -1002,6 +1002,124 @@ func (s *testPlanSuite) createTestCase4TimeFuncs() []typeInferTestCase { {"to_seconds(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, {"to_days(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, + {"hour(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"hour(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + + {"minute(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"minute(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + + {"second(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"second(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + + {"microsecond(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + {"microsecond(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, + + {"dayofmonth(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + {"dayofmonth(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, + + {"dayofyear(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + {"dayofyear(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, + + {"dayofweek(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_time )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_timestamp)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_varbinary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"dayofweek(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"hour(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, {"hour(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, {"hour(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0},