github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/dbs/memristed/memex/distsql_builtin_test.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package memex
    15  
    16  import (
    17  	"time"
    18  
    19  	. "github.com/whtcorpsinc/check"
    20  	"github.com/whtcorpsinc/BerolinaSQL/charset"
    21  	"github.com/whtcorpsinc/BerolinaSQL/allegrosql"
    22  	"github.com/whtcorpsinc/milevadb/stochastikctx/stmtctx"
    23  	"github.com/whtcorpsinc/milevadb/types"
    24  	"github.com/whtcorpsinc/milevadb/types/json"
    25  	"github.com/whtcorpsinc/milevadb/soliton/chunk"
    26  	"github.com/whtcorpsinc/milevadb/soliton/codec"
    27  	"github.com/whtcorpsinc/milevadb/soliton/defCauslate"
    28  	"github.com/whtcorpsinc/fidelpb/go-fidelpb"
    29  )
    30  
    31  var _ = Suite(&testEvalSuite{})
    32  var _ = SerialSuites(&testEvalSerialSuite{})
    33  
    34  type testEvalSuite struct {
    35  	defCausID int64
    36  }
    37  
    38  type testEvalSerialSuite struct {
    39  }
    40  
    41  func (s *testEvalSerialSuite) TestPBToExprWithNewDefCauslation(c *C) {
    42  	sc := new(stmtctx.StatementContext)
    43  	fieldTps := make([]*types.FieldType, 1)
    44  
    45  	cases := []struct {
    46  		name    string
    47  		expName string
    48  		id      int32
    49  		pbID    int32
    50  	}{
    51  		{"utf8_general_ci", "utf8_general_ci", 33, 33},
    52  		{"UTF8MB4_BIN", "utf8mb4_bin", 46, 46},
    53  		{"utf8mb4_bin", "utf8mb4_bin", 46, 46},
    54  		{"utf8mb4_general_ci", "utf8mb4_general_ci", 45, 45},
    55  		{"", "utf8mb4_bin", 46, 46},
    56  		{"some_error_defCauslation", "utf8mb4_bin", 46, 46},
    57  		{"utf8_unicode_ci", "utf8_unicode_ci", 192, 192},
    58  		{"utf8mb4_unicode_ci", "utf8mb4_unicode_ci", 224, 224},
    59  	}
    60  
    61  	for _, cs := range cases {
    62  		ft := types.NewFieldType(allegrosql.TypeString)
    63  		ft.DefCauslate = cs.name
    64  		expr := new(fidelpb.Expr)
    65  		expr.Tp = fidelpb.ExprType_String
    66  		expr.FieldType = toPBFieldType(ft)
    67  		c.Assert(expr.FieldType.DefCauslate, Equals, cs.pbID)
    68  
    69  		e, err := PBToExpr(expr, fieldTps, sc)
    70  		c.Assert(err, IsNil)
    71  		cons, ok := e.(*Constant)
    72  		c.Assert(ok, IsTrue)
    73  		c.Assert(cons.Value.DefCauslation(), Equals, cs.expName)
    74  	}
    75  	defCauslate.SetNewDefCauslationEnabledForTest(true)
    76  	defer defCauslate.SetNewDefCauslationEnabledForTest(false)
    77  
    78  	for _, cs := range cases {
    79  		ft := types.NewFieldType(allegrosql.TypeString)
    80  		ft.DefCauslate = cs.name
    81  		expr := new(fidelpb.Expr)
    82  		expr.Tp = fidelpb.ExprType_String
    83  		expr.FieldType = toPBFieldType(ft)
    84  		c.Assert(expr.FieldType.DefCauslate, Equals, -cs.pbID)
    85  
    86  		e, err := PBToExpr(expr, fieldTps, sc)
    87  		c.Assert(err, IsNil)
    88  		cons, ok := e.(*Constant)
    89  		c.Assert(ok, IsTrue)
    90  		c.Assert(cons.Value.DefCauslation(), Equals, cs.expName)
    91  	}
    92  }
    93  
    94  func (s *testEvalSuite) SetUpSuite(c *C) {
    95  	s.defCausID = 0
    96  }
    97  
    98  func (s *testEvalSuite) allocDefCausID() int64 {
    99  	s.defCausID++
   100  	return s.defCausID
   101  }
   102  
   103  func (s *testEvalSuite) TearDownTest(c *C) {
   104  	s.defCausID = 0
   105  }
   106  
   107  func (s *testEvalSuite) TestPBToExpr(c *C) {
   108  	sc := new(stmtctx.StatementContext)
   109  	fieldTps := make([]*types.FieldType, 1)
   110  	ds := []types.Causet{types.NewIntCauset(1), types.NewUintCauset(1), types.NewFloat64Causet(1),
   111  		types.NewDecimalCauset(newMyDecimal(c, "1")), types.NewDurationCauset(newDuration(time.Second))}
   112  
   113  	for _, d := range ds {
   114  		expr := datumExpr(c, d)
   115  		expr.Val = expr.Val[:len(expr.Val)/2]
   116  		_, err := PBToExpr(expr, fieldTps, sc)
   117  		c.Assert(err, NotNil)
   118  	}
   119  
   120  	expr := &fidelpb.Expr{
   121  		Tp: fidelpb.ExprType_ScalarFunc,
   122  		Children: []*fidelpb.Expr{
   123  			{
   124  				Tp: fidelpb.ExprType_ValueList,
   125  			},
   126  		},
   127  	}
   128  	_, err := PBToExpr(expr, fieldTps, sc)
   129  	c.Assert(err, IsNil)
   130  
   131  	val := make([]byte, 0, 32)
   132  	val = codec.EncodeInt(val, 1)
   133  	expr = &fidelpb.Expr{
   134  		Tp: fidelpb.ExprType_ScalarFunc,
   135  		Children: []*fidelpb.Expr{
   136  			{
   137  				Tp:  fidelpb.ExprType_ValueList,
   138  				Val: val[:len(val)/2],
   139  			},
   140  		},
   141  	}
   142  	_, err = PBToExpr(expr, fieldTps, sc)
   143  	c.Assert(err, NotNil)
   144  
   145  	expr = &fidelpb.Expr{
   146  		Tp: fidelpb.ExprType_ScalarFunc,
   147  		Children: []*fidelpb.Expr{
   148  			{
   149  				Tp:  fidelpb.ExprType_ValueList,
   150  				Val: val,
   151  			},
   152  		},
   153  		Sig:       fidelpb.ScalarFuncSig_AbsInt,
   154  		FieldType: ToPBFieldType(newIntFieldType()),
   155  	}
   156  	_, err = PBToExpr(expr, fieldTps, sc)
   157  	c.Assert(err, NotNil)
   158  }
   159  
   160  // TestEval test expr.Eval().
   161  func (s *testEvalSuite) TestEval(c *C) {
   162  	event := chunk.MutEventFromCausets([]types.Causet{types.NewCauset(100)}).ToEvent()
   163  	fieldTps := make([]*types.FieldType, 1)
   164  	fieldTps[0] = types.NewFieldType(allegrosql.TypeLonglong)
   165  	tests := []struct {
   166  		expr   *fidelpb.Expr
   167  		result types.Causet
   168  	}{
   169  		// Causets.
   170  		{
   171  			datumExpr(c, types.NewFloat32Causet(1.1)),
   172  			types.NewFloat32Causet(1.1),
   173  		},
   174  		{
   175  			datumExpr(c, types.NewFloat64Causet(1.1)),
   176  			types.NewFloat64Causet(1.1),
   177  		},
   178  		{
   179  			datumExpr(c, types.NewIntCauset(1)),
   180  			types.NewIntCauset(1),
   181  		},
   182  		{
   183  			datumExpr(c, types.NewUintCauset(1)),
   184  			types.NewUintCauset(1),
   185  		},
   186  		{
   187  			datumExpr(c, types.NewBytesCauset([]byte("abc"))),
   188  			types.NewBytesCauset([]byte("abc")),
   189  		},
   190  		{
   191  			datumExpr(c, types.NewStringCauset("abc")),
   192  			types.NewStringCauset("abc"),
   193  		},
   194  		{
   195  			datumExpr(c, types.Causet{}),
   196  			types.Causet{},
   197  		},
   198  		{
   199  			datumExpr(c, types.NewDurationCauset(types.Duration{Duration: time.Hour})),
   200  			types.NewDurationCauset(types.Duration{Duration: time.Hour}),
   201  		},
   202  		{
   203  			datumExpr(c, types.NewDecimalCauset(types.NewDecFromFloatForTest(1.1))),
   204  			types.NewDecimalCauset(types.NewDecFromFloatForTest(1.1)),
   205  		},
   206  		// DeferredCausets.
   207  		{
   208  			defCausumnExpr(0),
   209  			types.NewIntCauset(100),
   210  		},
   211  		// Scalar Functions.
   212  		{
   213  			scalarFunctionExpr(fidelpb.ScalarFuncSig_JsonDepthSig,
   214  				toPBFieldType(newIntFieldType()),
   215  				jsonCausetExpr(c, `true`),
   216  			),
   217  			types.NewIntCauset(1),
   218  		},
   219  		{
   220  			scalarFunctionExpr(fidelpb.ScalarFuncSig_JsonDepthSig,
   221  				toPBFieldType(newIntFieldType()),
   222  				jsonCausetExpr(c, `[10, {"a": 20}]`),
   223  			),
   224  			types.NewIntCauset(3),
   225  		},
   226  		{
   227  			scalarFunctionExpr(fidelpb.ScalarFuncSig_JsonStorageSizeSig,
   228  				toPBFieldType(newIntFieldType()),
   229  				jsonCausetExpr(c, `[{"a":{"a":1},"b":2}]`),
   230  			),
   231  			types.NewIntCauset(25),
   232  		},
   233  		{
   234  			scalarFunctionExpr(fidelpb.ScalarFuncSig_JsonSearchSig,
   235  				toPBFieldType(newJSONFieldType()),
   236  				jsonCausetExpr(c, `["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]`),
   237  				datumExpr(c, types.NewBytesCauset([]byte(`all`))),
   238  				datumExpr(c, types.NewBytesCauset([]byte(`10`))),
   239  				datumExpr(c, types.NewBytesCauset([]byte(`\`))),
   240  				datumExpr(c, types.NewBytesCauset([]byte(`$**.k`))),
   241  			),
   242  			newJSONCauset(c, `"$[1][0].k"`),
   243  		},
   244  		{
   245  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsInt,
   246  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(2333))),
   247  			types.NewIntCauset(2333),
   248  		},
   249  		{
   250  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsInt,
   251  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(2333))),
   252  			types.NewIntCauset(2333),
   253  		},
   254  		{
   255  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsInt,
   256  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringCauset("2333"))),
   257  			types.NewIntCauset(2333),
   258  		},
   259  		{
   260  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsInt,
   261  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2333")))),
   262  			types.NewIntCauset(2333),
   263  		},
   264  		{
   265  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsReal,
   266  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewIntCauset(2333))),
   267  			types.NewFloat64Causet(2333),
   268  		},
   269  		{
   270  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsReal,
   271  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(2333))),
   272  			types.NewFloat64Causet(2333),
   273  		},
   274  		{
   275  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsReal,
   276  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewStringCauset("2333"))),
   277  			types.NewFloat64Causet(2333),
   278  		},
   279  		{
   280  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsReal,
   281  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2333")))),
   282  			types.NewFloat64Causet(2333),
   283  		},
   284  		{
   285  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsString,
   286  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewStringCauset("2333"))),
   287  			types.NewStringCauset("2333"),
   288  		},
   289  		{
   290  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsString,
   291  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewIntCauset(2333))),
   292  			types.NewStringCauset("2333"),
   293  		},
   294  		{
   295  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsString,
   296  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewFloat64Causet(2333))),
   297  			types.NewStringCauset("2333"),
   298  		},
   299  		{
   300  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsString,
   301  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2333")))),
   302  			types.NewStringCauset("2333"),
   303  		},
   304  		{
   305  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsDecimal,
   306  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2333")))),
   307  			types.NewDecimalCauset(newMyDecimal(c, "2333")),
   308  		},
   309  		{
   310  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsDecimal,
   311  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntCauset(2333))),
   312  			types.NewDecimalCauset(newMyDecimal(c, "2333")),
   313  		},
   314  		{
   315  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsDecimal,
   316  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewFloat64Causet(2333))),
   317  			types.NewDecimalCauset(newMyDecimal(c, "2333")),
   318  		},
   319  		{
   320  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsDecimal,
   321  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewStringCauset("2333"))),
   322  			types.NewDecimalCauset(newMyDecimal(c, "2333")),
   323  		},
   324  		{
   325  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEInt,
   326  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(2)), datumExpr(c, types.NewIntCauset(1))),
   327  			types.NewIntCauset(1),
   328  		},
   329  		{
   330  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEInt,
   331  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   332  			types.NewIntCauset(1),
   333  		},
   334  		{
   335  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEInt,
   336  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   337  			types.NewIntCauset(1),
   338  		},
   339  		{
   340  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQInt,
   341  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewCauset(nil))),
   342  			types.NewIntCauset(1),
   343  		},
   344  		{
   345  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEReal,
   346  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(2)), datumExpr(c, types.NewFloat64Causet(1))),
   347  			types.NewIntCauset(1),
   348  		},
   349  		{
   350  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEReal,
   351  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   352  			types.NewIntCauset(1),
   353  		},
   354  		{
   355  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LTReal,
   356  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   357  			types.NewIntCauset(1),
   358  		},
   359  		{
   360  			scalarFunctionExpr(fidelpb.ScalarFuncSig_EQReal,
   361  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(1))),
   362  			types.NewIntCauset(1),
   363  		},
   364  		{
   365  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEReal,
   366  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   367  			types.NewIntCauset(1),
   368  		},
   369  		{
   370  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQReal,
   371  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewCauset(nil))),
   372  			types.NewIntCauset(1),
   373  		},
   374  		{
   375  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEDecimal,
   376  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   377  			types.NewIntCauset(1),
   378  		},
   379  		{
   380  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEDecimal,
   381  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   382  			types.NewIntCauset(1),
   383  		},
   384  		{
   385  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LTDecimal,
   386  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   387  			types.NewIntCauset(1),
   388  		},
   389  		{
   390  			scalarFunctionExpr(fidelpb.ScalarFuncSig_EQDecimal,
   391  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   392  			types.NewIntCauset(1),
   393  		},
   394  		{
   395  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEDecimal,
   396  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   397  			types.NewIntCauset(1),
   398  		},
   399  		{
   400  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQDecimal,
   401  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewCauset(nil))),
   402  			types.NewIntCauset(1),
   403  		},
   404  		{
   405  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEDuration,
   406  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*2))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   407  			types.NewIntCauset(1),
   408  		},
   409  		{
   410  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GTDuration,
   411  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*2))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   412  			types.NewIntCauset(1),
   413  		},
   414  		{
   415  			scalarFunctionExpr(fidelpb.ScalarFuncSig_EQDuration,
   416  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   417  			types.NewIntCauset(1),
   418  		},
   419  		{
   420  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEDuration,
   421  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*2)))),
   422  			types.NewIntCauset(1),
   423  		},
   424  		{
   425  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEDuration,
   426  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*2)))),
   427  			types.NewIntCauset(1),
   428  		},
   429  		{
   430  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQDuration,
   431  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewCauset(nil))),
   432  			types.NewIntCauset(1),
   433  		},
   434  		{
   435  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEString,
   436  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringCauset("1")), datumExpr(c, types.NewStringCauset("1"))),
   437  			types.NewIntCauset(1),
   438  		},
   439  		{
   440  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEString,
   441  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringCauset("1")), datumExpr(c, types.NewStringCauset("1"))),
   442  			types.NewIntCauset(1),
   443  		},
   444  		{
   445  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEString,
   446  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringCauset("2")), datumExpr(c, types.NewStringCauset("1"))),
   447  			types.NewIntCauset(1),
   448  		},
   449  		{
   450  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQString,
   451  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewCauset(nil))),
   452  			types.NewIntCauset(1),
   453  		},
   454  		{
   455  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GTJson,
   456  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[2]"), jsonCausetExpr(c, "[1]")),
   457  			types.NewIntCauset(1),
   458  		},
   459  		{
   460  			scalarFunctionExpr(fidelpb.ScalarFuncSig_GEJson,
   461  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[2]"), jsonCausetExpr(c, "[1]")),
   462  			types.NewIntCauset(1),
   463  		},
   464  		{
   465  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LTJson,
   466  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[1]"), jsonCausetExpr(c, "[2]")),
   467  			types.NewIntCauset(1),
   468  		},
   469  		{
   470  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LEJson,
   471  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[1]"), jsonCausetExpr(c, "[2]")),
   472  			types.NewIntCauset(1),
   473  		},
   474  		{
   475  			scalarFunctionExpr(fidelpb.ScalarFuncSig_EQJson,
   476  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[1]"), jsonCausetExpr(c, "[1]")),
   477  			types.NewIntCauset(1),
   478  		},
   479  		{
   480  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NEJson,
   481  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[1]"), jsonCausetExpr(c, "[2]")),
   482  			types.NewIntCauset(1),
   483  		},
   484  		{
   485  			scalarFunctionExpr(fidelpb.ScalarFuncSig_NullEQJson,
   486  				toPBFieldType(newIntFieldType()), jsonCausetExpr(c, "[1]"), jsonCausetExpr(c, "[1]")),
   487  			types.NewIntCauset(1),
   488  		},
   489  		{
   490  			scalarFunctionExpr(fidelpb.ScalarFuncSig_DecimalIsNull,
   491  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil))),
   492  			types.NewIntCauset(1),
   493  		},
   494  		{
   495  			scalarFunctionExpr(fidelpb.ScalarFuncSig_DurationIsNull,
   496  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil))),
   497  			types.NewIntCauset(1),
   498  		},
   499  		{
   500  			scalarFunctionExpr(fidelpb.ScalarFuncSig_RealIsNull,
   501  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil))),
   502  			types.NewIntCauset(1),
   503  		},
   504  		{
   505  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LeftShift,
   506  				ToPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(1)), datumExpr(c, types.NewIntCauset(1))),
   507  			types.NewIntCauset(2),
   508  		},
   509  		{
   510  			scalarFunctionExpr(fidelpb.ScalarFuncSig_AbsInt,
   511  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(-1))),
   512  			types.NewIntCauset(1),
   513  		},
   514  		{
   515  			scalarFunctionExpr(fidelpb.ScalarFuncSig_AbsUInt,
   516  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewUintCauset(1))),
   517  			types.NewIntCauset(1),
   518  		},
   519  		{
   520  			scalarFunctionExpr(fidelpb.ScalarFuncSig_AbsReal,
   521  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(-1.23))),
   522  			types.NewFloat64Causet(1.23),
   523  		},
   524  		{
   525  			scalarFunctionExpr(fidelpb.ScalarFuncSig_AbsDecimal,
   526  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "-1.23")))),
   527  			types.NewDecimalCauset(newMyDecimal(c, "1.23")),
   528  		},
   529  		{
   530  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LogicalAnd,
   531  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(1))),
   532  			types.NewIntCauset(1),
   533  		},
   534  		{
   535  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LogicalOr,
   536  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(0))),
   537  			types.NewIntCauset(1),
   538  		},
   539  		{
   540  			scalarFunctionExpr(fidelpb.ScalarFuncSig_LogicalXor,
   541  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(0))),
   542  			types.NewIntCauset(1),
   543  		},
   544  		{
   545  			scalarFunctionExpr(fidelpb.ScalarFuncSig_BitAndSig,
   546  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(1))),
   547  			types.NewIntCauset(1),
   548  		},
   549  		{
   550  			scalarFunctionExpr(fidelpb.ScalarFuncSig_BitOrSig,
   551  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(0))),
   552  			types.NewIntCauset(1),
   553  		},
   554  		{
   555  			scalarFunctionExpr(fidelpb.ScalarFuncSig_BitXorSig,
   556  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(0))),
   557  			types.NewIntCauset(1),
   558  		},
   559  		{
   560  			scalarFunctionExpr(fidelpb.ScalarFuncSig_BitNegSig,
   561  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(0))),
   562  			types.NewIntCauset(-1),
   563  		},
   564  		{
   565  			scalarFunctionExpr(fidelpb.ScalarFuncSig_InReal,
   566  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(1))),
   567  			types.NewIntCauset(1),
   568  		},
   569  		{
   570  			scalarFunctionExpr(fidelpb.ScalarFuncSig_InDecimal,
   571  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   572  			types.NewIntCauset(1),
   573  		},
   574  		{
   575  			scalarFunctionExpr(fidelpb.ScalarFuncSig_InString,
   576  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringCauset("1")), datumExpr(c, types.NewStringCauset("1"))),
   577  			types.NewIntCauset(1),
   578  		},
   579  		//{
   580  		//	scalarFunctionExpr(fidelpb.ScalarFuncSig_InTime,
   581  		//		toPBFieldType(newIntFieldType()), datumExpr(c, types.NewTimeCauset(types.ZeroDate)), datumExpr(c, types.NewTimeCauset(types.ZeroDate))),
   582  		//	types.NewIntCauset(1),
   583  		//},
   584  		{
   585  			scalarFunctionExpr(fidelpb.ScalarFuncSig_InDuration,
   586  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second))), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   587  			types.NewIntCauset(1),
   588  		},
   589  		{
   590  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfNullInt,
   591  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewIntCauset(1))),
   592  			types.NewIntCauset(1),
   593  		},
   594  		{
   595  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfInt,
   596  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   597  			types.NewIntCauset(2),
   598  		},
   599  		{
   600  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfNullReal,
   601  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewFloat64Causet(1))),
   602  			types.NewFloat64Causet(1),
   603  		},
   604  		{
   605  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfReal,
   606  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   607  			types.NewFloat64Causet(2),
   608  		},
   609  		{
   610  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfNullDecimal,
   611  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   612  			types.NewDecimalCauset(newMyDecimal(c, "1")),
   613  		},
   614  		{
   615  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfDecimal,
   616  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   617  			types.NewDecimalCauset(newMyDecimal(c, "2")),
   618  		},
   619  		{
   620  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfNullString,
   621  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewStringCauset("1"))),
   622  			types.NewStringCauset("1"),
   623  		},
   624  		{
   625  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfString,
   626  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewStringCauset("2"))),
   627  			types.NewStringCauset("2"),
   628  		},
   629  		{
   630  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfNullDuration,
   631  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewCauset(nil)), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   632  			types.NewDurationCauset(newDuration(time.Second)),
   633  		},
   634  		{
   635  			scalarFunctionExpr(fidelpb.ScalarFuncSig_IfDuration,
   636  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*2)))),
   637  			types.NewDurationCauset(newDuration(time.Second * 2)),
   638  		},
   639  
   640  		{
   641  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsDuration,
   642  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewIntCauset(1))),
   643  			types.NewDurationCauset(newDuration(time.Second * 1)),
   644  		},
   645  		{
   646  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsDuration,
   647  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   648  			types.NewDurationCauset(newDuration(time.Second * 1)),
   649  		},
   650  		{
   651  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsDuration,
   652  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   653  			types.NewDurationCauset(newDuration(time.Second * 1)),
   654  		},
   655  		{
   656  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDurationAsDuration,
   657  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second*1)))),
   658  			types.NewDurationCauset(newDuration(time.Second * 1)),
   659  		},
   660  		{
   661  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsDuration,
   662  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewStringCauset("1"))),
   663  			types.NewDurationCauset(newDuration(time.Second * 1)),
   664  		},
   665  		{
   666  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastTimeAsTime,
   667  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewTimeCauset(newDateTime(c, "2000-01-01")))),
   668  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   669  		},
   670  		{
   671  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastIntAsTime,
   672  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewIntCauset(20000101))),
   673  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   674  		},
   675  		{
   676  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastRealAsTime,
   677  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewFloat64Causet(20000101))),
   678  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   679  		},
   680  		{
   681  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastDecimalAsTime,
   682  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "20000101")))),
   683  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   684  		},
   685  		{
   686  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CastStringAsTime,
   687  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewStringCauset("20000101"))),
   688  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   689  		},
   690  		{
   691  			scalarFunctionExpr(fidelpb.ScalarFuncSig_PlusInt,
   692  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   693  			types.NewIntCauset(3),
   694  		},
   695  		{
   696  			scalarFunctionExpr(fidelpb.ScalarFuncSig_PlusDecimal,
   697  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   698  			types.NewDecimalCauset(newMyDecimal(c, "3")),
   699  		},
   700  		{
   701  			scalarFunctionExpr(fidelpb.ScalarFuncSig_PlusReal,
   702  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   703  			types.NewFloat64Causet(3),
   704  		},
   705  		{
   706  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MinusInt,
   707  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   708  			types.NewIntCauset(-1),
   709  		},
   710  		{
   711  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MinusDecimal,
   712  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   713  			types.NewDecimalCauset(newMyDecimal(c, "-1")),
   714  		},
   715  		{
   716  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MinusReal,
   717  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   718  			types.NewFloat64Causet(-1),
   719  		},
   720  		{
   721  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MultiplyInt,
   722  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1)), datumExpr(c, types.NewIntCauset(2))),
   723  			types.NewIntCauset(2),
   724  		},
   725  		{
   726  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MultiplyDecimal,
   727  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "2")))),
   728  			types.NewDecimalCauset(newMyDecimal(c, "2")),
   729  		},
   730  		{
   731  			scalarFunctionExpr(fidelpb.ScalarFuncSig_MultiplyReal,
   732  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1)), datumExpr(c, types.NewFloat64Causet(2))),
   733  			types.NewFloat64Causet(2),
   734  		},
   735  		{
   736  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CeilIntToInt,
   737  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1))),
   738  			types.NewIntCauset(1),
   739  		},
   740  		{
   741  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CeilIntToDec,
   742  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntCauset(1))),
   743  			types.NewDecimalCauset(newMyDecimal(c, "1")),
   744  		},
   745  		{
   746  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CeilDecToInt,
   747  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   748  			types.NewIntCauset(1),
   749  		},
   750  		{
   751  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CeilReal,
   752  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   753  			types.NewFloat64Causet(1),
   754  		},
   755  		{
   756  			scalarFunctionExpr(fidelpb.ScalarFuncSig_FloorIntToInt,
   757  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1))),
   758  			types.NewIntCauset(1),
   759  		},
   760  		{
   761  			scalarFunctionExpr(fidelpb.ScalarFuncSig_FloorIntToDec,
   762  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntCauset(1))),
   763  			types.NewDecimalCauset(newMyDecimal(c, "1")),
   764  		},
   765  		{
   766  			scalarFunctionExpr(fidelpb.ScalarFuncSig_FloorDecToInt,
   767  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   768  			types.NewIntCauset(1),
   769  		},
   770  		{
   771  			scalarFunctionExpr(fidelpb.ScalarFuncSig_FloorReal,
   772  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   773  			types.NewFloat64Causet(1),
   774  		},
   775  		{
   776  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceInt,
   777  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntCauset(1))),
   778  			types.NewIntCauset(1),
   779  		},
   780  		{
   781  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceReal,
   782  				toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   783  			types.NewFloat64Causet(1),
   784  		},
   785  		{
   786  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceDecimal,
   787  				toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   788  			types.NewDecimalCauset(newMyDecimal(c, "1")),
   789  		},
   790  		{
   791  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceString,
   792  				toPBFieldType(newStringFieldType()), datumExpr(c, types.NewStringCauset("1"))),
   793  			types.NewStringCauset("1"),
   794  		},
   795  		{
   796  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceDuration,
   797  				toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDurationCauset(newDuration(time.Second)))),
   798  			types.NewDurationCauset(newDuration(time.Second)),
   799  		},
   800  		{
   801  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CoalesceTime,
   802  				toPBFieldType(newDateFieldType()), datumExpr(c, types.NewTimeCauset(newDateTime(c, "2000-01-01")))),
   803  			types.NewTimeCauset(newDateTime(c, "2000-01-01")),
   804  		},
   805  		{
   806  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenInt,
   807  				toPBFieldType(newIntFieldType())),
   808  			types.NewCauset(nil),
   809  		},
   810  		{
   811  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenReal,
   812  				toPBFieldType(newRealFieldType())),
   813  			types.NewCauset(nil),
   814  		},
   815  		{
   816  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenDecimal,
   817  				toPBFieldType(newDecimalFieldType())),
   818  			types.NewCauset(nil),
   819  		},
   820  		{
   821  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenDuration,
   822  				toPBFieldType(newDurFieldType())),
   823  			types.NewCauset(nil),
   824  		},
   825  		{
   826  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenTime,
   827  				toPBFieldType(newDateFieldType())),
   828  			types.NewCauset(nil),
   829  		},
   830  		{
   831  			scalarFunctionExpr(fidelpb.ScalarFuncSig_CaseWhenJson,
   832  				toPBFieldType(newJSONFieldType())),
   833  			types.NewCauset(nil),
   834  		},
   835  		{
   836  			scalarFunctionExpr(fidelpb.ScalarFuncSig_RealIsFalse,
   837  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   838  			types.NewIntCauset(0),
   839  		},
   840  		{
   841  			scalarFunctionExpr(fidelpb.ScalarFuncSig_DecimalIsFalse,
   842  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   843  			types.NewIntCauset(0),
   844  		},
   845  		{
   846  			scalarFunctionExpr(fidelpb.ScalarFuncSig_RealIsTrue,
   847  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Causet(1))),
   848  			types.NewIntCauset(1),
   849  		},
   850  		{
   851  			scalarFunctionExpr(fidelpb.ScalarFuncSig_DecimalIsTrue,
   852  				toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalCauset(newMyDecimal(c, "1")))),
   853  			types.NewIntCauset(1),
   854  		},
   855  	}
   856  	sc := new(stmtctx.StatementContext)
   857  	for _, tt := range tests {
   858  		expr, err := PBToExpr(tt.expr, fieldTps, sc)
   859  		c.Assert(err, IsNil)
   860  		result, err := expr.Eval(event)
   861  		c.Assert(err, IsNil)
   862  		c.Assert(result.HoTT(), Equals, tt.result.HoTT())
   863  		cmp, err := result.CompareCauset(sc, &tt.result)
   864  		c.Assert(err, IsNil)
   865  		c.Assert(cmp, Equals, 0)
   866  	}
   867  }
   868  
   869  func datumExpr(c *C, d types.Causet) *fidelpb.Expr {
   870  	expr := new(fidelpb.Expr)
   871  	switch d.HoTT() {
   872  	case types.HoTTInt64:
   873  		expr.Tp = fidelpb.ExprType_Int64
   874  		expr.Val = codec.EncodeInt(nil, d.GetInt64())
   875  	case types.HoTTUint64:
   876  		expr.Tp = fidelpb.ExprType_Uint64
   877  		expr.Val = codec.EncodeUint(nil, d.GetUint64())
   878  	case types.HoTTString:
   879  		expr.Tp = fidelpb.ExprType_String
   880  		expr.FieldType = toPBFieldType(types.NewFieldType(allegrosql.TypeString))
   881  		expr.Val = d.GetBytes()
   882  	case types.HoTTBytes:
   883  		expr.Tp = fidelpb.ExprType_Bytes
   884  		expr.Val = d.GetBytes()
   885  	case types.HoTTFloat32:
   886  		expr.Tp = fidelpb.ExprType_Float32
   887  		expr.Val = codec.EncodeFloat(nil, d.GetFloat64())
   888  	case types.HoTTFloat64:
   889  		expr.Tp = fidelpb.ExprType_Float64
   890  		expr.Val = codec.EncodeFloat(nil, d.GetFloat64())
   891  	case types.HoTTMysqlDuration:
   892  		expr.Tp = fidelpb.ExprType_MysqlDuration
   893  		expr.Val = codec.EncodeInt(nil, int64(d.GetMysqlDuration().Duration))
   894  	case types.HoTTMysqlDecimal:
   895  		expr.Tp = fidelpb.ExprType_MysqlDecimal
   896  		var err error
   897  		expr.Val, err = codec.EncodeDecimal(nil, d.GetMysqlDecimal(), d.Length(), d.Frac())
   898  		c.Assert(err, IsNil)
   899  	case types.HoTTMysqlJSON:
   900  		expr.Tp = fidelpb.ExprType_MysqlJson
   901  		var err error
   902  		expr.Val = make([]byte, 0, 1024)
   903  		expr.Val, err = codec.EncodeValue(nil, expr.Val, d)
   904  		c.Assert(err, IsNil)
   905  	case types.HoTTMysqlTime:
   906  		expr.Tp = fidelpb.ExprType_MysqlTime
   907  		var err error
   908  		expr.Val, err = codec.EncodeMyALLEGROSQLTime(nil, d.GetMysqlTime(), allegrosql.TypeUnspecified, nil)
   909  		c.Assert(err, IsNil)
   910  		expr.FieldType = ToPBFieldType(newDateFieldType())
   911  	default:
   912  		expr.Tp = fidelpb.ExprType_Null
   913  	}
   914  	return expr
   915  }
   916  
   917  func newJSONCauset(c *C, s string) (d types.Causet) {
   918  	j, err := json.ParseBinaryFromString(s)
   919  	c.Assert(err, IsNil)
   920  	d.SetMysqlJSON(j)
   921  	return d
   922  }
   923  
   924  func jsonCausetExpr(c *C, s string) *fidelpb.Expr {
   925  	return datumExpr(c, newJSONCauset(c, s))
   926  }
   927  
   928  func defCausumnExpr(defCausumnID int64) *fidelpb.Expr {
   929  	expr := new(fidelpb.Expr)
   930  	expr.Tp = fidelpb.ExprType_DeferredCausetRef
   931  	expr.Val = codec.EncodeInt(nil, defCausumnID)
   932  	return expr
   933  }
   934  
   935  // toPBFieldType converts *types.FieldType to *fidelpb.FieldType.
   936  func toPBFieldType(ft *types.FieldType) *fidelpb.FieldType {
   937  	return &fidelpb.FieldType{
   938  		Tp:      int32(ft.Tp),
   939  		Flag:    uint32(ft.Flag),
   940  		Flen:    int32(ft.Flen),
   941  		Decimal: int32(ft.Decimal),
   942  		Charset: ft.Charset,
   943  		DefCauslate: defCauslationToProto(ft.DefCauslate),
   944  	}
   945  }
   946  
   947  func newMyDecimal(c *C, s string) *types.MyDecimal {
   948  	d := new(types.MyDecimal)
   949  	c.Assert(d.FromString([]byte(s)), IsNil)
   950  	return d
   951  }
   952  
   953  func newDuration(dur time.Duration) types.Duration {
   954  	return types.Duration{
   955  		Duration: dur,
   956  		Fsp:      types.DefaultFsp,
   957  	}
   958  }
   959  
   960  func newDateTime(c *C, s string) types.Time {
   961  	t, err := types.ParseDate(nil, s)
   962  	c.Assert(err, IsNil)
   963  	return t
   964  }
   965  
   966  func newDateFieldType() *types.FieldType {
   967  	return &types.FieldType{
   968  		Tp: allegrosql.TypeDate,
   969  	}
   970  }
   971  
   972  func newIntFieldType() *types.FieldType {
   973  	return &types.FieldType{
   974  		Tp:      allegrosql.TypeLonglong,
   975  		Flen:    allegrosql.MaxIntWidth,
   976  		Decimal: 0,
   977  		Flag:    allegrosql.BinaryFlag,
   978  	}
   979  }
   980  
   981  func newDurFieldType() *types.FieldType {
   982  	return &types.FieldType{
   983  		Tp:      allegrosql.TypeDuration,
   984  		Decimal: int(types.DefaultFsp),
   985  	}
   986  }
   987  
   988  func newStringFieldType() *types.FieldType {
   989  	return &types.FieldType{
   990  		Tp:   allegrosql.TypeVarString,
   991  		Flen: types.UnspecifiedLength,
   992  	}
   993  }
   994  
   995  func newRealFieldType() *types.FieldType {
   996  	return &types.FieldType{
   997  		Tp:   allegrosql.TypeFloat,
   998  		Flen: types.UnspecifiedLength,
   999  	}
  1000  }
  1001  
  1002  func newDecimalFieldType() *types.FieldType {
  1003  	return &types.FieldType{
  1004  		Tp:   allegrosql.TypeNewDecimal,
  1005  		Flen: types.UnspecifiedLength,
  1006  	}
  1007  }
  1008  
  1009  func newJSONFieldType() *types.FieldType {
  1010  	return &types.FieldType{
  1011  		Tp:      allegrosql.TypeJSON,
  1012  		Flen:    types.UnspecifiedLength,
  1013  		Decimal: 0,
  1014  		Charset: charset.CharsetBin,
  1015  		DefCauslate: charset.DefCauslationBin,
  1016  	}
  1017  }
  1018  
  1019  func newFloatFieldType() *types.FieldType {
  1020  	return &types.FieldType{
  1021  		Tp:      allegrosql.TypeFloat,
  1022  		Flen:    types.UnspecifiedLength,
  1023  		Decimal: 0,
  1024  		Charset: charset.CharsetBin,
  1025  		DefCauslate: charset.DefCauslationBin,
  1026  	}
  1027  }
  1028  
  1029  func newBinaryLiteralFieldType() *types.FieldType {
  1030  	return &types.FieldType{
  1031  		Tp:      allegrosql.TypeBit,
  1032  		Flen:    types.UnspecifiedLength,
  1033  		Decimal: 0,
  1034  		Charset: charset.CharsetBin,
  1035  		DefCauslate: charset.DefCauslationBin,
  1036  	}
  1037  }
  1038  
  1039  func newBlobFieldType() *types.FieldType {
  1040  	return &types.FieldType{
  1041  		Tp:      allegrosql.TypeBlob,
  1042  		Flen:    types.UnspecifiedLength,
  1043  		Decimal: 0,
  1044  		Charset: charset.CharsetBin,
  1045  		DefCauslate: charset.DefCauslationBin,
  1046  	}
  1047  }
  1048  
  1049  func newEnumFieldType() *types.FieldType {
  1050  	return &types.FieldType{
  1051  		Tp:      allegrosql.TypeEnum,
  1052  		Flen:    types.UnspecifiedLength,
  1053  		Decimal: 0,
  1054  		Charset: charset.CharsetBin,
  1055  		DefCauslate: charset.DefCauslationBin,
  1056  	}
  1057  }
  1058  
  1059  func scalarFunctionExpr(sigCode fidelpb.ScalarFuncSig, retType *fidelpb.FieldType, args ...*fidelpb.Expr) *fidelpb.Expr {
  1060  	return &fidelpb.Expr{
  1061  		Tp:        fidelpb.ExprType_ScalarFunc,
  1062  		Sig:       sigCode,
  1063  		Children:  args,
  1064  		FieldType: retType,
  1065  	}
  1066  }