github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtins.go (about)

     1  // Copyright 2021 - 2022 Matrix Origin
     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  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package function
    16  
    17  import (
    18  	"context"
    19  	"math"
    20  
    21  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    22  	"github.com/matrixorigin/matrixone/pkg/vm/process"
    23  
    24  	"github.com/matrixorigin/matrixone/pkg/container/types"
    25  	"github.com/matrixorigin/matrixone/pkg/pb/plan"
    26  	"github.com/matrixorigin/matrixone/pkg/sql/plan/function/builtin/binary"
    27  	"github.com/matrixorigin/matrixone/pkg/sql/plan/function/builtin/ctl"
    28  	"github.com/matrixorigin/matrixone/pkg/sql/plan/function/builtin/multi"
    29  	"github.com/matrixorigin/matrixone/pkg/sql/plan/function/builtin/unary"
    30  	"github.com/matrixorigin/matrixone/pkg/sql/plan/function/operator"
    31  )
    32  
    33  func initBuiltIns() {
    34  	var err error
    35  
    36  	for fid, fs := range builtins {
    37  		err = appendFunction(context.Background(), fid, fs)
    38  		if err != nil {
    39  			panic(err)
    40  		}
    41  	}
    42  }
    43  
    44  // builtins contains the builtin function indexed by function id.
    45  var builtins = map[int]Functions{
    46  	ABS: {
    47  		Id:     ABS,
    48  		Flag:   plan.Function_STRICT,
    49  		Layout: STANDARD_FUNCTION,
    50  		Overloads: []Function{
    51  			{
    52  				Index:     0,
    53  				Args:      []types.T{types.T_int64},
    54  				ReturnTyp: types.T_int64,
    55  				Fn:        unary.AbsInt64,
    56  			},
    57  			{
    58  				Index:     1,
    59  				Args:      []types.T{types.T_uint64},
    60  				ReturnTyp: types.T_uint64,
    61  				Fn:        unary.AbsUInt64,
    62  			},
    63  			{
    64  				Index:     2,
    65  				Args:      []types.T{types.T_float64},
    66  				ReturnTyp: types.T_float64,
    67  				Fn:        unary.AbsFloat64,
    68  			},
    69  			{
    70  				Index:     3,
    71  				Args:      []types.T{types.T_decimal128},
    72  				ReturnTyp: types.T_decimal128,
    73  				Fn:        unary.AbsDecimal128,
    74  			},
    75  		},
    76  	},
    77  	ACOS: {
    78  		Id:     ACOS,
    79  		Flag:   plan.Function_STRICT,
    80  		Layout: STANDARD_FUNCTION,
    81  		Overloads: []Function{
    82  			{
    83  				Index:     0,
    84  				Args:      []types.T{types.T_float64},
    85  				ReturnTyp: types.T_float64,
    86  				Fn:        unary.Acos,
    87  			},
    88  		},
    89  	},
    90  	BIT_LENGTH: {
    91  		Id:     BIT_LENGTH,
    92  		Flag:   plan.Function_STRICT,
    93  		Layout: STANDARD_FUNCTION,
    94  		Overloads: []Function{
    95  			{
    96  				Index:     0,
    97  				Args:      []types.T{types.T_char}, // todo? check if there is implicit upcast for char/varchar, it not, register another type or add upcast
    98  				ReturnTyp: types.T_int64,
    99  				Fn:        unary.BitLengthFunc,
   100  			},
   101  		},
   102  	},
   103  	CONCAT_WS: {
   104  		Id:     CONCAT_WS,
   105  		Flag:   plan.Function_STRICT,
   106  		Layout: STANDARD_FUNCTION,
   107  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
   108  			if len(inputs) > 1 {
   109  				ret := make([]types.T, len(inputs))
   110  				convert := false
   111  				for i, t := range inputs {
   112  					if t != types.T_char && t != types.T_varchar && t != types.T_any && t != types.T_blob && t != types.T_text {
   113  						if castTable[t][types.T_varchar] {
   114  							ret[i] = types.T_varchar
   115  							convert = true
   116  							continue
   117  						}
   118  						return wrongFunctionParameters, nil
   119  					}
   120  					ret[i] = t
   121  				}
   122  				if convert {
   123  					return int32(0), ret
   124  				}
   125  				return int32(0), nil
   126  			}
   127  			return wrongFunctionParameters, nil
   128  		},
   129  		Overloads: []Function{
   130  			{
   131  				Index:     0,
   132  				Args:      []types.T{},
   133  				ReturnTyp: types.T_varchar,
   134  				Fn:        multi.Concat_ws,
   135  			},
   136  		},
   137  	},
   138  	CONCAT: {
   139  		Id:     CONCAT,
   140  		Flag:   plan.Function_STRICT,
   141  		Layout: STANDARD_FUNCTION,
   142  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
   143  			if len(inputs) > 1 {
   144  				ret := make([]types.T, len(inputs))
   145  				convert := false
   146  				for i, t := range inputs {
   147  					if t != types.T_char && t != types.T_varchar && t != types.T_any && t != types.T_blob && t != types.T_text {
   148  						if castTable[t][types.T_varchar] {
   149  							ret[i] = types.T_varchar
   150  							convert = true
   151  							continue
   152  						}
   153  						return wrongFunctionParameters, nil
   154  					}
   155  					ret[i] = t
   156  				}
   157  				if convert {
   158  					return int32(0), ret
   159  				}
   160  				return int32(0), nil
   161  			}
   162  			return wrongFunctionParameters, nil
   163  		},
   164  		Overloads: []Function{
   165  			{
   166  				Index:     0,
   167  				Args:      []types.T{},
   168  				ReturnTyp: types.T_varchar,
   169  				Fn:        multi.Concat,
   170  			},
   171  		},
   172  	},
   173  	CURRENT_TIMESTAMP: {
   174  		Id:     CURRENT_TIMESTAMP,
   175  		Flag:   plan.Function_STRICT,
   176  		Layout: STANDARD_FUNCTION,
   177  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
   178  			if len(inputs) == 0 {
   179  				return int32(0), nil
   180  			}
   181  			if len(inputs) == 1 && inputs[0] == types.T_int64 {
   182  				return int32(0), nil
   183  			}
   184  			return wrongFunctionParameters, nil
   185  		},
   186  		Overloads: []Function{
   187  			{
   188  				Index:           0,
   189  				Volatile:        false,
   190  				RealTimeRelated: true,
   191  				Args:            []types.T{},
   192  				ReturnTyp:       types.T_timestamp,
   193  				Fn:              multi.CurrentTimestamp,
   194  			},
   195  		},
   196  	},
   197  	UUID: {
   198  		// uuid function contains a hidden placeholder parameter
   199  		Id:     UUID,
   200  		Flag:   plan.Function_STRICT,
   201  		Layout: STANDARD_FUNCTION,
   202  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
   203  			if len(inputs) == 0 {
   204  				return int32(0), nil
   205  			}
   206  			return wrongFunctionParameters, nil
   207  		},
   208  		Overloads: []Function{
   209  			{
   210  				Index:         0,
   211  				Volatile:      true,
   212  				AppendHideArg: true,
   213  				ReturnTyp:     types.T_varchar,
   214  				Fn:            multi.UUID,
   215  			},
   216  		},
   217  	},
   218  	DATE: {
   219  		Id:     DATE,
   220  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
   221  		Layout: STANDARD_FUNCTION,
   222  		Overloads: []Function{
   223  			{
   224  				Index:     0,
   225  				Args:      []types.T{types.T_date},
   226  				ReturnTyp: types.T_date,
   227  				Fn:        unary.DateToDate,
   228  			},
   229  			{
   230  				Index:     1,
   231  				Args:      []types.T{types.T_time},
   232  				ReturnTyp: types.T_date,
   233  				Fn:        unary.TimeToDate,
   234  			},
   235  			{
   236  				Index:     2,
   237  				Args:      []types.T{types.T_datetime},
   238  				ReturnTyp: types.T_date,
   239  				Fn:        unary.DatetimeToDate,
   240  			},
   241  			{
   242  				Index:     3,
   243  				Args:      []types.T{types.T_varchar},
   244  				ReturnTyp: types.T_date,
   245  				Fn:        unary.DateStringToDate,
   246  			},
   247  			{
   248  				Index:     4,
   249  				Args:      []types.T{types.T_char},
   250  				ReturnTyp: types.T_date,
   251  				Fn:        unary.DateStringToDate,
   252  			},
   253  		},
   254  	},
   255  	TIME: {
   256  		Id:     TIME,
   257  		Flag:   plan.Function_STRICT,
   258  		Layout: STANDARD_FUNCTION,
   259  		Overloads: []Function{
   260  			{
   261  				Index:     0,
   262  				Args:      []types.T{types.T_time},
   263  				ReturnTyp: types.T_time,
   264  				Fn:        unary.TimeToTime,
   265  			},
   266  			{
   267  				Index:     1,
   268  				Args:      []types.T{types.T_date},
   269  				ReturnTyp: types.T_time,
   270  				Fn:        unary.DateToTime,
   271  			},
   272  			{
   273  				Index:     2,
   274  				Args:      []types.T{types.T_datetime},
   275  				ReturnTyp: types.T_time,
   276  				Fn:        unary.DatetimeToTime,
   277  			},
   278  			{
   279  				Index:     3,
   280  				Args:      []types.T{types.T_int64},
   281  				ReturnTyp: types.T_time,
   282  				Fn:        unary.Int64ToTime,
   283  			},
   284  			{
   285  				Index:     4,
   286  				Args:      []types.T{types.T_decimal128},
   287  				ReturnTyp: types.T_time,
   288  				Fn:        unary.Decimal128ToTime,
   289  			},
   290  			{
   291  				Index:     5,
   292  				Args:      []types.T{types.T_varchar},
   293  				ReturnTyp: types.T_time,
   294  				Fn:        unary.DateStringToTime,
   295  			},
   296  			{
   297  				Index:     6,
   298  				Args:      []types.T{types.T_char},
   299  				ReturnTyp: types.T_time,
   300  				Fn:        unary.DateStringToTime,
   301  			},
   302  			{
   303  				Index:     7,
   304  				Args:      []types.T{types.T_text},
   305  				ReturnTyp: types.T_time,
   306  				Fn:        unary.DateStringToTime,
   307  			},
   308  			{
   309  				Index:     8,
   310  				Args:      []types.T{types.T_blob},
   311  				ReturnTyp: types.T_time,
   312  				Fn:        unary.DateStringToTime,
   313  			},
   314  		},
   315  	},
   316  	HOUR: {
   317  		Id:     HOUR,
   318  		Flag:   plan.Function_STRICT,
   319  		Layout: STANDARD_FUNCTION,
   320  		Overloads: []Function{
   321  			{
   322  				Index:     0,
   323  				Args:      []types.T{types.T_timestamp},
   324  				ReturnTyp: types.T_uint8,
   325  				Fn:        unary.TimestampToHour,
   326  			},
   327  			{
   328  				Index:     1,
   329  				Args:      []types.T{types.T_datetime},
   330  				ReturnTyp: types.T_uint8,
   331  				Fn:        unary.DatetimeToHour,
   332  			},
   333  		},
   334  	},
   335  	MINUTE: {
   336  		Id:     MINUTE,
   337  		Flag:   plan.Function_STRICT,
   338  		Layout: STANDARD_FUNCTION,
   339  		Overloads: []Function{
   340  			{
   341  				Index:     0,
   342  				Args:      []types.T{types.T_timestamp},
   343  				ReturnTyp: types.T_uint8,
   344  				Fn:        unary.TimestampToMinute,
   345  			},
   346  			{
   347  				Index:     1,
   348  				Args:      []types.T{types.T_datetime},
   349  				ReturnTyp: types.T_uint8,
   350  				Fn:        unary.DatetimeToMinute,
   351  			},
   352  		},
   353  	},
   354  	SECOND: {
   355  		Id:     SECOND,
   356  		Flag:   plan.Function_STRICT,
   357  		Layout: STANDARD_FUNCTION,
   358  		Overloads: []Function{
   359  			{
   360  				Index:     0,
   361  				Args:      []types.T{types.T_timestamp},
   362  				ReturnTyp: types.T_uint8,
   363  				Fn:        unary.TimestampToSecond,
   364  			},
   365  			{
   366  				Index:     1,
   367  				Args:      []types.T{types.T_datetime},
   368  				ReturnTyp: types.T_uint8,
   369  				Fn:        unary.DatetimeToSecond,
   370  			},
   371  		},
   372  	},
   373  	DAY: {
   374  		Id:     DAY,
   375  		Flag:   plan.Function_STRICT,
   376  		Layout: STANDARD_FUNCTION,
   377  		Overloads: []Function{
   378  			{
   379  				Index:     0,
   380  				Args:      []types.T{types.T_date},
   381  				ReturnTyp: types.T_uint8,
   382  				Fn:        unary.DateToDay,
   383  			},
   384  			{
   385  				Index:     1,
   386  				Args:      []types.T{types.T_datetime},
   387  				ReturnTyp: types.T_uint8,
   388  				Fn:        unary.DatetimeToDay,
   389  			},
   390  		},
   391  	},
   392  	DAYOFYEAR: {
   393  		Id:     DAYOFYEAR,
   394  		Flag:   plan.Function_STRICT,
   395  		Layout: STANDARD_FUNCTION,
   396  		Overloads: []Function{
   397  			{
   398  				Index:     0,
   399  				Args:      []types.T{types.T_date},
   400  				ReturnTyp: types.T_uint16,
   401  				Fn:        unary.DayOfYear,
   402  			},
   403  		},
   404  	},
   405  	EMPTY: {
   406  		Id:     EMPTY,
   407  		Flag:   plan.Function_STRICT,
   408  		Layout: STANDARD_FUNCTION,
   409  		Overloads: []Function{
   410  			{
   411  				Index:     0,
   412  				Args:      []types.T{types.T_char},
   413  				ReturnTyp: types.T_uint8,
   414  				Fn:        unary.Empty,
   415  			},
   416  		},
   417  	},
   418  	EXP: {
   419  		Id:     EXP,
   420  		Flag:   plan.Function_STRICT,
   421  		Layout: STANDARD_FUNCTION,
   422  		Overloads: []Function{
   423  			{
   424  				Index:     0,
   425  				Args:      []types.T{types.T_float64},
   426  				ReturnTyp: types.T_float64,
   427  				Fn:        unary.Exp,
   428  			},
   429  		},
   430  	},
   431  	EXTRACT: {
   432  		Id:     EXTRACT,
   433  		Flag:   plan.Function_STRICT,
   434  		Layout: STANDARD_FUNCTION,
   435  		Overloads: []Function{
   436  			{
   437  				Index:     0,
   438  				Args:      []types.T{types.T_varchar, types.T_datetime},
   439  				ReturnTyp: types.T_varchar,
   440  				Fn:        binary.ExtractFromDatetime,
   441  			},
   442  			{
   443  				Index:     1,
   444  				Args:      []types.T{types.T_varchar, types.T_date},
   445  				ReturnTyp: types.T_uint32,
   446  				Fn:        binary.ExtractFromDate,
   447  			},
   448  		},
   449  	},
   450  	LENGTH: {
   451  		Id:     LENGTH,
   452  		Flag:   plan.Function_STRICT,
   453  		Layout: STANDARD_FUNCTION,
   454  		Overloads: []Function{
   455  			{
   456  				Index:     0,
   457  				Args:      []types.T{types.T_varchar},
   458  				ReturnTyp: types.T_int64,
   459  				Fn:        unary.Length,
   460  			},
   461  			{
   462  				Index:     1,
   463  				Args:      []types.T{types.T_char},
   464  				ReturnTyp: types.T_int64,
   465  				Fn:        unary.Length,
   466  			},
   467  			{
   468  				Index:     2,
   469  				Args:      []types.T{types.T_blob},
   470  				ReturnTyp: types.T_int64,
   471  				Fn:        unary.Length,
   472  			},
   473  			{
   474  				Index:     3,
   475  				Args:      []types.T{types.T_text},
   476  				ReturnTyp: types.T_int64,
   477  				Fn:        unary.Length,
   478  			},
   479  		},
   480  	},
   481  	LENGTH_UTF8: {
   482  		Id:     LENGTH_UTF8,
   483  		Flag:   plan.Function_STRICT,
   484  		Layout: STANDARD_FUNCTION,
   485  		Overloads: []Function{
   486  			{
   487  				Index:     0,
   488  				Args:      []types.T{types.T_varchar},
   489  				ReturnTyp: types.T_uint64, Fn: unary.LengthUTF8,
   490  			},
   491  			{
   492  				Index:     1,
   493  				Args:      []types.T{types.T_char},
   494  				ReturnTyp: types.T_uint64,
   495  				Fn:        unary.LengthUTF8,
   496  			},
   497  		},
   498  	},
   499  	LN: {
   500  		Id:     LN,
   501  		Flag:   plan.Function_STRICT,
   502  		Layout: STANDARD_FUNCTION,
   503  		Overloads: []Function{
   504  			{
   505  				Index:     0,
   506  				Args:      []types.T{types.T_float64},
   507  				ReturnTyp: types.T_float64,
   508  				Fn:        unary.Ln,
   509  			},
   510  		},
   511  	},
   512  	LOG: {
   513  		Id:     LOG,
   514  		Flag:   plan.Function_STRICT,
   515  		Layout: STANDARD_FUNCTION,
   516  		Overloads: []Function{
   517  			{
   518  				Index:     0,
   519  				Args:      []types.T{types.T_float64},
   520  				ReturnTyp: types.T_float64,
   521  				Fn:        unary.Log,
   522  			},
   523  			{
   524  				Index:     1,
   525  				Args:      []types.T{types.T_float64, types.T_float64},
   526  				ReturnTyp: types.T_float64,
   527  				Fn:        unary.Log,
   528  			},
   529  		},
   530  	},
   531  	LTRIM: {
   532  		Id:     LTRIM,
   533  		Flag:   plan.Function_STRICT,
   534  		Layout: STANDARD_FUNCTION,
   535  		Overloads: []Function{
   536  			{
   537  				Index:     0,
   538  				Args:      []types.T{types.T_char},
   539  				ReturnTyp: types.T_varchar,
   540  				Fn:        unary.Ltrim,
   541  			},
   542  		},
   543  	},
   544  	MONTH: {
   545  		Id:     MONTH,
   546  		Flag:   plan.Function_STRICT,
   547  		Layout: STANDARD_FUNCTION,
   548  		Overloads: []Function{
   549  			{
   550  				Index:     0,
   551  				Args:      []types.T{types.T_date},
   552  				ReturnTyp: types.T_uint8,
   553  				Fn:        unary.DateToMonth,
   554  			},
   555  			{
   556  				Index:     1,
   557  				Args:      []types.T{types.T_datetime},
   558  				ReturnTyp: types.T_uint8,
   559  				Fn:        unary.DatetimeToMonth,
   560  			},
   561  			{
   562  				Index:     2,
   563  				Args:      []types.T{types.T_varchar},
   564  				ReturnTyp: types.T_uint8,
   565  				Fn:        unary.DateStringToMonth,
   566  			},
   567  		},
   568  	},
   569  	OCT: {
   570  		Id:     OCT,
   571  		Flag:   plan.Function_STRICT,
   572  		Layout: STANDARD_FUNCTION,
   573  		Overloads: []Function{
   574  			{
   575  				Index:     0,
   576  				Args:      []types.T{types.T_uint8},
   577  				ReturnTyp: types.T_decimal128,
   578  				Fn:        unary.Oct[uint8],
   579  			},
   580  			{
   581  				Index:     1,
   582  				Args:      []types.T{types.T_uint16},
   583  				ReturnTyp: types.T_decimal128,
   584  				Fn:        unary.Oct[uint16],
   585  			},
   586  			{
   587  				Index:     2,
   588  				Args:      []types.T{types.T_uint32},
   589  				ReturnTyp: types.T_decimal128,
   590  				Fn:        unary.Oct[uint32],
   591  			},
   592  			{
   593  				Index:     3,
   594  				Args:      []types.T{types.T_uint64},
   595  				ReturnTyp: types.T_decimal128,
   596  				Fn:        unary.Oct[uint64],
   597  			},
   598  			{
   599  				Index:     4,
   600  				Args:      []types.T{types.T_int8},
   601  				ReturnTyp: types.T_decimal128,
   602  				Fn:        unary.Oct[int8],
   603  			},
   604  			{
   605  				Index:     5,
   606  				Args:      []types.T{types.T_int16},
   607  				ReturnTyp: types.T_decimal128,
   608  				Fn:        unary.Oct[int16],
   609  			},
   610  			{
   611  				Index:     6,
   612  				Args:      []types.T{types.T_int32},
   613  				ReturnTyp: types.T_decimal128,
   614  				Fn:        unary.Oct[int32],
   615  			},
   616  			{
   617  				Index:     7,
   618  				Args:      []types.T{types.T_int64},
   619  				ReturnTyp: types.T_decimal128,
   620  				Fn:        unary.Oct[int64],
   621  			},
   622  			{
   623  				Index:     8,
   624  				Args:      []types.T{types.T_float32},
   625  				ReturnTyp: types.T_decimal128,
   626  				Fn:        unary.OctFloat[float32],
   627  			},
   628  			{
   629  				Index:     9,
   630  				Args:      []types.T{types.T_float64},
   631  				ReturnTyp: types.T_decimal128,
   632  				Fn:        unary.OctFloat[float64],
   633  			},
   634  		},
   635  	},
   636  	REVERSE: {
   637  		Id:     REVERSE,
   638  		Flag:   plan.Function_STRICT,
   639  		Layout: STANDARD_FUNCTION,
   640  		Overloads: []Function{
   641  			{
   642  				Index:     0,
   643  				Args:      []types.T{types.T_char},
   644  				ReturnTyp: types.T_varchar,
   645  				Fn:        unary.Reverse,
   646  			},
   647  			{
   648  				Index:     1,
   649  				Args:      []types.T{types.T_varchar},
   650  				ReturnTyp: types.T_varchar,
   651  				Fn:        unary.Reverse,
   652  			},
   653  		},
   654  	},
   655  	RTRIM: {
   656  		Id:     RTRIM,
   657  		Flag:   plan.Function_STRICT,
   658  		Layout: STANDARD_FUNCTION,
   659  		Overloads: []Function{
   660  			{
   661  				Index:     0,
   662  				Args:      []types.T{types.T_char},
   663  				ReturnTyp: types.T_varchar,
   664  				Fn:        unary.Rtrim,
   665  			},
   666  		},
   667  	},
   668  	LEFT: {
   669  		Id:     LEFT,
   670  		Flag:   plan.Function_STRICT,
   671  		Layout: STANDARD_FUNCTION,
   672  		Overloads: []Function{
   673  			{
   674  				Index:     0,
   675  				Args:      []types.T{types.T_varchar, types.T_int64},
   676  				ReturnTyp: types.T_varchar,
   677  				Fn:        binary.Left,
   678  			},
   679  			{
   680  				Index:     1,
   681  				Args:      []types.T{types.T_char, types.T_int64},
   682  				ReturnTyp: types.T_char,
   683  				Fn:        binary.Left,
   684  			},
   685  		},
   686  	},
   687  	SIN: {
   688  		Id:     SIN,
   689  		Flag:   plan.Function_STRICT,
   690  		Layout: STANDARD_FUNCTION,
   691  		Overloads: []Function{
   692  			{
   693  				Index:     0,
   694  				Args:      []types.T{types.T_float64},
   695  				ReturnTyp: types.T_float64,
   696  				Fn:        unary.Sin,
   697  			},
   698  		},
   699  	},
   700  	SPACE: {
   701  		Id:     SPACE,
   702  		Flag:   plan.Function_STRICT,
   703  		Layout: STANDARD_FUNCTION,
   704  		Overloads: []Function{
   705  			{
   706  				Index:     0,
   707  				Args:      []types.T{types.T_uint64},
   708  				ReturnTyp: types.T_varchar,
   709  				Fn:        unary.SpaceNumber[uint64],
   710  			},
   711  			{
   712  				Index:     1,
   713  				Args:      []types.T{types.T_int64},
   714  				ReturnTyp: types.T_varchar,
   715  				Fn:        unary.SpaceNumber[int64],
   716  			},
   717  		},
   718  	},
   719  	WEEK: {
   720  		Id:     WEEK,
   721  		Flag:   plan.Function_STRICT,
   722  		Layout: STANDARD_FUNCTION,
   723  		Overloads: []Function{
   724  			{
   725  				Index:     0,
   726  				Args:      []types.T{types.T_date},
   727  				ReturnTyp: types.T_uint8,
   728  				Fn:        unary.DateToWeek,
   729  			},
   730  			{
   731  				Index:     1,
   732  				Args:      []types.T{types.T_datetime},
   733  				ReturnTyp: types.T_uint8,
   734  				Fn:        unary.DatetimeToWeek,
   735  			},
   736  		},
   737  	},
   738  	WEEKDAY: {
   739  		Id:     WEEKDAY,
   740  		Flag:   plan.Function_STRICT,
   741  		Layout: STANDARD_FUNCTION,
   742  		Overloads: []Function{
   743  			{
   744  				Index:     0,
   745  				Args:      []types.T{types.T_date},
   746  				ReturnTyp: types.T_int64,
   747  				Fn:        unary.DateToWeekday,
   748  			},
   749  			{
   750  				Index:     1,
   751  				Args:      []types.T{types.T_datetime},
   752  				ReturnTyp: types.T_int64,
   753  				Fn:        unary.DatetimeToWeekday,
   754  			},
   755  		},
   756  	},
   757  	YEAR: {
   758  		Id:     YEAR,
   759  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
   760  		Layout: STANDARD_FUNCTION,
   761  		Overloads: []Function{
   762  			{
   763  				Index:     0,
   764  				Args:      []types.T{types.T_date},
   765  				ReturnTyp: types.T_int64,
   766  				Fn:        unary.DateToYear,
   767  			},
   768  			{
   769  				Index:     1,
   770  				Args:      []types.T{types.T_datetime},
   771  				ReturnTyp: types.T_int64,
   772  				Fn:        unary.DatetimeToYear,
   773  			},
   774  			{
   775  				Index:     2,
   776  				Args:      []types.T{types.T_varchar},
   777  				ReturnTyp: types.T_int64,
   778  				Fn:        unary.DateStringToYear,
   779  			},
   780  		},
   781  	},
   782  	// binary functions
   783  	ENDSWITH: {
   784  		Id:     ENDSWITH,
   785  		Flag:   plan.Function_STRICT,
   786  		Layout: STANDARD_FUNCTION,
   787  		Overloads: []Function{
   788  			{
   789  				Index:     0,
   790  				Args:      []types.T{types.T_varchar, types.T_varchar},
   791  				ReturnTyp: types.T_uint8,
   792  				Fn:        binary.Endswith,
   793  			},
   794  		},
   795  	},
   796  	FINDINSET: {
   797  		Id:     FINDINSET,
   798  		Flag:   plan.Function_STRICT,
   799  		Layout: STANDARD_FUNCTION,
   800  		Overloads: []Function{
   801  			{
   802  				Index:     0,
   803  				Args:      []types.T{types.T_varchar, types.T_varchar},
   804  				ReturnTyp: types.T_uint64,
   805  				Fn:        binary.FindInSet,
   806  			},
   807  		},
   808  	},
   809  	POW: {
   810  		Id:     POW,
   811  		Flag:   plan.Function_STRICT,
   812  		Layout: STANDARD_FUNCTION,
   813  		Overloads: []Function{
   814  			{
   815  				Index:     0,
   816  				Args:      []types.T{types.T_float64, types.T_float64},
   817  				ReturnTyp: types.T_float64,
   818  				Fn:        binary.Power,
   819  			},
   820  		},
   821  	},
   822  	STARTSWITH: {
   823  		Id:     STARTSWITH,
   824  		Flag:   plan.Function_STRICT,
   825  		Layout: STANDARD_FUNCTION,
   826  		Overloads: []Function{
   827  			{
   828  				Index:     0,
   829  				Args:      []types.T{types.T_varchar, types.T_varchar},
   830  				ReturnTyp: types.T_uint8,
   831  				Fn:        binary.Startswith,
   832  			},
   833  		},
   834  	},
   835  	DATE_FORMAT: {
   836  		Id:     DATE_FORMAT,
   837  		Flag:   plan.Function_STRICT,
   838  		Layout: STANDARD_FUNCTION,
   839  		Overloads: []Function{
   840  			{
   841  				Index:     0,
   842  				Args:      []types.T{types.T_datetime, types.T_varchar},
   843  				ReturnTyp: types.T_varchar,
   844  				Fn:        binary.DateFormat,
   845  			},
   846  			{
   847  				Index:     1,
   848  				Args:      []types.T{types.T_datetime, types.T_char},
   849  				ReturnTyp: types.T_varchar,
   850  				Fn:        binary.DateFormat,
   851  			},
   852  		},
   853  	},
   854  	// variadic functions
   855  	CEIL: {
   856  		Id:     CEIL,
   857  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
   858  		Layout: STANDARD_FUNCTION,
   859  		Overloads: []Function{
   860  			{
   861  				Index:     0,
   862  				Args:      []types.T{types.T_uint64},
   863  				ReturnTyp: types.T_uint64,
   864  				Fn:        multi.CeilUint64,
   865  			},
   866  			{
   867  				Index:     1,
   868  				Args:      []types.T{types.T_uint64, types.T_int64},
   869  				ReturnTyp: types.T_uint64,
   870  				Fn:        multi.CeilUint64,
   871  			},
   872  			{
   873  				Index:     2,
   874  				Args:      []types.T{types.T_int64},
   875  				ReturnTyp: types.T_int64,
   876  				Fn:        multi.CeilInt64,
   877  			},
   878  			{
   879  				Index:     3,
   880  				Args:      []types.T{types.T_int64, types.T_int64},
   881  				ReturnTyp: types.T_int64,
   882  				Fn:        multi.CeilInt64,
   883  			},
   884  			{
   885  				Index:     4,
   886  				Args:      []types.T{types.T_float64},
   887  				ReturnTyp: types.T_float64,
   888  				Fn:        multi.CeilFloat64,
   889  			},
   890  			{
   891  				Index:     5,
   892  				Args:      []types.T{types.T_float64, types.T_int64},
   893  				ReturnTyp: types.T_float64,
   894  				Fn:        multi.CeilFloat64,
   895  			},
   896  			{
   897  				Index:     6,
   898  				Args:      []types.T{types.T_decimal128},
   899  				ReturnTyp: types.T_decimal128,
   900  				Fn:        multi.CeilDecimal128,
   901  			},
   902  			{
   903  				Index:     7,
   904  				Args:      []types.T{types.T_varchar},
   905  				ReturnTyp: types.T_float64,
   906  				Fn:        multi.CeilStr,
   907  			},
   908  		},
   909  	},
   910  	FLOOR: {
   911  		Id:     FLOOR,
   912  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
   913  		Layout: STANDARD_FUNCTION,
   914  		Overloads: []Function{
   915  			{
   916  				Index:     0,
   917  				Args:      []types.T{types.T_uint64},
   918  				ReturnTyp: types.T_uint64,
   919  				Fn:        multi.FloorUInt64,
   920  			},
   921  			{
   922  				Index:     1,
   923  				Args:      []types.T{types.T_uint64, types.T_int64},
   924  				ReturnTyp: types.T_uint64,
   925  				Fn:        multi.FloorUInt64,
   926  			},
   927  			{
   928  				Index:     2,
   929  				Args:      []types.T{types.T_int64},
   930  				ReturnTyp: types.T_int64,
   931  				Fn:        multi.FloorInt64,
   932  			},
   933  			{
   934  				Index:     3,
   935  				Args:      []types.T{types.T_int64, types.T_int64},
   936  				ReturnTyp: types.T_int64,
   937  				Fn:        multi.FloorInt64,
   938  			},
   939  			{
   940  				Index:     4,
   941  				Args:      []types.T{types.T_float64},
   942  				ReturnTyp: types.T_float64,
   943  				Fn:        multi.FloorFloat64,
   944  			},
   945  			{
   946  				Index:     5,
   947  				Args:      []types.T{types.T_float64, types.T_int64},
   948  				ReturnTyp: types.T_float64,
   949  				Fn:        multi.FloorFloat64,
   950  			},
   951  			{
   952  				Index:     6,
   953  				Args:      []types.T{types.T_decimal128},
   954  				ReturnTyp: types.T_decimal128,
   955  				Fn:        multi.FloorDecimal128,
   956  			},
   957  			{
   958  				Index:     7,
   959  				Args:      []types.T{types.T_varchar},
   960  				ReturnTyp: types.T_float64,
   961  				Fn:        multi.FloorStr,
   962  			},
   963  		},
   964  	},
   965  	LPAD: {
   966  		Id:     LPAD,
   967  		Flag:   plan.Function_STRICT,
   968  		Layout: STANDARD_FUNCTION,
   969  		Overloads: []Function{
   970  			{
   971  				Index:     0,
   972  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_varchar},
   973  				ReturnTyp: types.T_varchar,
   974  				Fn:        multi.Lpad,
   975  			},
   976  			{
   977  				Index:     1,
   978  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_varchar},
   979  				ReturnTyp: types.T_varchar, Fn: multi.Lpad,
   980  			},
   981  			{
   982  				Index:     2,
   983  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_varchar},
   984  				ReturnTyp: types.T_varchar, Fn: multi.Lpad,
   985  			},
   986  		},
   987  	},
   988  	PI: {
   989  		Id:     PI,
   990  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
   991  		Layout: STANDARD_FUNCTION,
   992  		Overloads: []Function{
   993  			{
   994  				Index:     0,
   995  				Args:      []types.T{},
   996  				ReturnTyp: types.T_float64,
   997  				Fn:        multi.Pi,
   998  			},
   999  		},
  1000  	},
  1001  	ROUND: {
  1002  		Id:     ROUND,
  1003  		Flag:   plan.Function_STRICT | plan.Function_MONOTONIC,
  1004  		Layout: STANDARD_FUNCTION,
  1005  		Overloads: []Function{
  1006  			{
  1007  				Index:     0,
  1008  				Args:      []types.T{types.T_uint64},
  1009  				ReturnTyp: types.T_uint64,
  1010  				Fn:        multi.RoundUint64,
  1011  			},
  1012  			{
  1013  				Index:     1,
  1014  				Args:      []types.T{types.T_uint64, types.T_int64},
  1015  				ReturnTyp: types.T_uint64,
  1016  				Fn:        multi.RoundUint64,
  1017  			},
  1018  			{
  1019  				Index:     2,
  1020  				Args:      []types.T{types.T_int64},
  1021  				ReturnTyp: types.T_int64,
  1022  				Fn:        multi.RoundInt64,
  1023  			},
  1024  			{
  1025  				Index:     3,
  1026  				Args:      []types.T{types.T_int64, types.T_int64},
  1027  				ReturnTyp: types.T_int64,
  1028  				Fn:        multi.RoundInt64,
  1029  			},
  1030  			{
  1031  				Index:     4,
  1032  				Args:      []types.T{types.T_float64},
  1033  				ReturnTyp: types.T_float64,
  1034  				Fn:        multi.RoundFloat64,
  1035  			},
  1036  			{
  1037  				Index:     5,
  1038  				Args:      []types.T{types.T_float64, types.T_int64},
  1039  				ReturnTyp: types.T_float64,
  1040  				Fn:        multi.RoundFloat64,
  1041  			},
  1042  		},
  1043  	},
  1044  	RPAD: {
  1045  		Id:     RPAD,
  1046  		Flag:   plan.Function_STRICT,
  1047  		Layout: STANDARD_FUNCTION,
  1048  		Overloads: []Function{
  1049  			{
  1050  				Index:     0,
  1051  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_int64},
  1052  				ReturnTyp: types.T_varchar,
  1053  				Fn:        multi.Rpad,
  1054  			},
  1055  			{
  1056  				Index:     1,
  1057  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_uint64},
  1058  				ReturnTyp: types.T_varchar,
  1059  				Fn:        multi.Rpad,
  1060  			},
  1061  			{
  1062  				Index:     2,
  1063  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_float64},
  1064  				ReturnTyp: types.T_varchar,
  1065  				Fn:        multi.Rpad,
  1066  			},
  1067  			{
  1068  				Index:     3,
  1069  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_varchar},
  1070  				ReturnTyp: types.T_varchar,
  1071  				Fn:        multi.Rpad,
  1072  			},
  1073  			{
  1074  				Index:     4,
  1075  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_char},
  1076  				ReturnTyp: types.T_varchar,
  1077  				Fn:        multi.Rpad,
  1078  			},
  1079  			{
  1080  				Index:     5,
  1081  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_int64},
  1082  				ReturnTyp: types.T_varchar,
  1083  				Fn:        multi.Rpad,
  1084  			},
  1085  			{
  1086  				Index:     6,
  1087  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_uint64},
  1088  				ReturnTyp: types.T_varchar,
  1089  				Fn:        multi.Rpad,
  1090  			},
  1091  			{
  1092  				Index:     7,
  1093  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_float64},
  1094  				ReturnTyp: types.T_varchar,
  1095  				Fn:        multi.Rpad,
  1096  			},
  1097  			{
  1098  				Index:     8,
  1099  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_varchar},
  1100  				ReturnTyp: types.T_varchar,
  1101  				Fn:        multi.Rpad,
  1102  			},
  1103  			{
  1104  				Index:     9,
  1105  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_char},
  1106  				ReturnTyp: types.T_varchar,
  1107  				Fn:        multi.Rpad,
  1108  			},
  1109  			{
  1110  				Index:     10,
  1111  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_int64},
  1112  				ReturnTyp: types.T_varchar,
  1113  				Fn:        multi.Rpad,
  1114  			},
  1115  			{
  1116  				Index:     11,
  1117  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_uint64},
  1118  				ReturnTyp: types.T_varchar,
  1119  				Fn:        multi.Rpad,
  1120  			},
  1121  			{
  1122  				Index:     12,
  1123  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_float64},
  1124  				ReturnTyp: types.T_varchar,
  1125  				Fn:        multi.Rpad,
  1126  			},
  1127  			{
  1128  				Index:     13,
  1129  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_varchar},
  1130  				ReturnTyp: types.T_varchar,
  1131  				Fn:        multi.Rpad,
  1132  			},
  1133  			{
  1134  				Index:     14,
  1135  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_char},
  1136  				ReturnTyp: types.T_varchar,
  1137  				Fn:        multi.Rpad,
  1138  			},
  1139  			{
  1140  				Index:     15,
  1141  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64},
  1142  				ReturnTyp: types.T_varchar,
  1143  				Fn:        multi.Rpad,
  1144  			},
  1145  			{
  1146  				Index:     16,
  1147  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_uint64},
  1148  				ReturnTyp: types.T_varchar,
  1149  				Fn:        multi.Rpad,
  1150  			},
  1151  			{
  1152  				Index:     17,
  1153  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_float64},
  1154  				ReturnTyp: types.T_varchar,
  1155  				Fn:        multi.Rpad,
  1156  			},
  1157  			{
  1158  				Index:     18,
  1159  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  1160  				ReturnTyp: types.T_varchar,
  1161  				Fn:        multi.Rpad,
  1162  			},
  1163  			{
  1164  				Index:     19,
  1165  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_char},
  1166  				ReturnTyp: types.T_varchar,
  1167  				Fn:        multi.Rpad,
  1168  			},
  1169  			{
  1170  				Index:     20,
  1171  				Args:      []types.T{types.T_varchar, types.T_char, types.T_int64},
  1172  				ReturnTyp: types.T_varchar,
  1173  				Fn:        multi.Rpad,
  1174  			},
  1175  			{
  1176  				Index:     21,
  1177  				Args:      []types.T{types.T_varchar, types.T_char, types.T_uint64},
  1178  				ReturnTyp: types.T_varchar,
  1179  				Fn:        multi.Rpad,
  1180  			},
  1181  			{
  1182  				Index:     22,
  1183  				Args:      []types.T{types.T_varchar, types.T_char, types.T_float64},
  1184  				ReturnTyp: types.T_varchar,
  1185  				Fn:        multi.Rpad,
  1186  			},
  1187  			{
  1188  				Index:     23,
  1189  				Args:      []types.T{types.T_varchar, types.T_char, types.T_varchar},
  1190  				ReturnTyp: types.T_varchar,
  1191  				Fn:        multi.Rpad,
  1192  			},
  1193  			{
  1194  				Index:     24,
  1195  				Args:      []types.T{types.T_varchar, types.T_char, types.T_char},
  1196  				ReturnTyp: types.T_varchar,
  1197  				Fn:        multi.Rpad,
  1198  			},
  1199  			{
  1200  				Index:     25,
  1201  				Args:      []types.T{types.T_char, types.T_int64, types.T_int64},
  1202  				ReturnTyp: types.T_char,
  1203  				Fn:        multi.Rpad,
  1204  			},
  1205  			{
  1206  				Index:     26,
  1207  				Args:      []types.T{types.T_char, types.T_int64, types.T_uint64},
  1208  				ReturnTyp: types.T_char,
  1209  				Fn:        multi.Rpad,
  1210  			},
  1211  			{
  1212  				Index:     27,
  1213  				Args:      []types.T{types.T_char, types.T_int64, types.T_float64},
  1214  				ReturnTyp: types.T_char,
  1215  				Fn:        multi.Rpad,
  1216  			},
  1217  			{
  1218  				Index:     28,
  1219  				Args:      []types.T{types.T_char, types.T_int64, types.T_varchar},
  1220  				ReturnTyp: types.T_char,
  1221  				Fn:        multi.Rpad,
  1222  			},
  1223  			{
  1224  				Index:     29,
  1225  				Args:      []types.T{types.T_char, types.T_int64, types.T_char},
  1226  				ReturnTyp: types.T_char,
  1227  				Fn:        multi.Rpad,
  1228  			},
  1229  			{
  1230  				Index:     30,
  1231  				Args:      []types.T{types.T_char, types.T_uint64, types.T_int64},
  1232  				ReturnTyp: types.T_char,
  1233  				Fn:        multi.Rpad,
  1234  			},
  1235  			{
  1236  				Index:     31,
  1237  				Args:      []types.T{types.T_char, types.T_uint64, types.T_uint64},
  1238  				ReturnTyp: types.T_char,
  1239  				Fn:        multi.Rpad,
  1240  			},
  1241  			{
  1242  				Index:     32,
  1243  				Args:      []types.T{types.T_char, types.T_uint64, types.T_float64},
  1244  				ReturnTyp: types.T_char,
  1245  				Fn:        multi.Rpad,
  1246  			},
  1247  			{
  1248  				Index:     33,
  1249  				Args:      []types.T{types.T_char, types.T_uint64, types.T_varchar},
  1250  				ReturnTyp: types.T_char,
  1251  				Fn:        multi.Rpad,
  1252  			},
  1253  			{
  1254  				Index:     34,
  1255  				Args:      []types.T{types.T_char, types.T_uint64, types.T_char},
  1256  				ReturnTyp: types.T_char,
  1257  				Fn:        multi.Rpad,
  1258  			},
  1259  			{
  1260  				Index:     35,
  1261  				Args:      []types.T{types.T_char, types.T_float64, types.T_int64},
  1262  				ReturnTyp: types.T_char,
  1263  				Fn:        multi.Rpad,
  1264  			},
  1265  			{
  1266  				Index:     36,
  1267  				Args:      []types.T{types.T_char, types.T_float64, types.T_uint64},
  1268  				ReturnTyp: types.T_char,
  1269  				Fn:        multi.Rpad,
  1270  			},
  1271  			{
  1272  				Index:     37,
  1273  				Args:      []types.T{types.T_char, types.T_float64, types.T_float64},
  1274  				ReturnTyp: types.T_char,
  1275  				Fn:        multi.Rpad,
  1276  			},
  1277  			{
  1278  				Index:     38,
  1279  				Args:      []types.T{types.T_char, types.T_float64, types.T_varchar},
  1280  				ReturnTyp: types.T_char,
  1281  				Fn:        multi.Rpad,
  1282  			},
  1283  			{
  1284  				Index:     39,
  1285  				Args:      []types.T{types.T_char, types.T_float64, types.T_char},
  1286  				ReturnTyp: types.T_char,
  1287  				Fn:        multi.Rpad,
  1288  			},
  1289  			{
  1290  				Index:     40,
  1291  				Args:      []types.T{types.T_char, types.T_varchar, types.T_int64},
  1292  				ReturnTyp: types.T_char,
  1293  				Fn:        multi.Rpad,
  1294  			},
  1295  			{
  1296  				Index:     41,
  1297  				Args:      []types.T{types.T_char, types.T_varchar, types.T_uint64},
  1298  				ReturnTyp: types.T_char,
  1299  				Fn:        multi.Rpad,
  1300  			},
  1301  			{
  1302  				Index:     42,
  1303  				Args:      []types.T{types.T_char, types.T_varchar, types.T_float64},
  1304  				ReturnTyp: types.T_char,
  1305  				Fn:        multi.Rpad,
  1306  			},
  1307  			{
  1308  				Index:     43,
  1309  				Args:      []types.T{types.T_char, types.T_varchar, types.T_varchar},
  1310  				ReturnTyp: types.T_char,
  1311  				Fn:        multi.Rpad,
  1312  			},
  1313  			{
  1314  				Index:     44,
  1315  				Args:      []types.T{types.T_char, types.T_varchar, types.T_char},
  1316  				ReturnTyp: types.T_char,
  1317  				Fn:        multi.Rpad,
  1318  			},
  1319  			{
  1320  				Index:     45,
  1321  				Args:      []types.T{types.T_char, types.T_char, types.T_int64},
  1322  				ReturnTyp: types.T_char,
  1323  				Fn:        multi.Rpad,
  1324  			},
  1325  			{
  1326  				Index:     46,
  1327  				Args:      []types.T{types.T_char, types.T_char, types.T_uint64},
  1328  				ReturnTyp: types.T_char,
  1329  				Fn:        multi.Rpad,
  1330  			},
  1331  			{
  1332  				Index:     47,
  1333  				Args:      []types.T{types.T_char, types.T_char, types.T_float64},
  1334  				ReturnTyp: types.T_char,
  1335  				Fn:        multi.Rpad,
  1336  			},
  1337  			{
  1338  				Index:     48,
  1339  				Args:      []types.T{types.T_char, types.T_char, types.T_varchar},
  1340  				ReturnTyp: types.T_char,
  1341  				Fn:        multi.Rpad,
  1342  			},
  1343  			{
  1344  				Index:     49,
  1345  				Args:      []types.T{types.T_char, types.T_char, types.T_char},
  1346  				ReturnTyp: types.T_char,
  1347  				Fn:        multi.Rpad,
  1348  			},
  1349  		},
  1350  	},
  1351  	SUBSTRING: {
  1352  		Id:     SUBSTRING,
  1353  		Flag:   plan.Function_STRICT,
  1354  		Layout: STANDARD_FUNCTION,
  1355  		Overloads: []Function{
  1356  			{
  1357  				Index:     0,
  1358  				Args:      []types.T{types.T_varchar, types.T_int64},
  1359  				ReturnTyp: types.T_varchar,
  1360  				Fn:        multi.Substring,
  1361  			},
  1362  			{
  1363  				Index:     1,
  1364  				Args:      []types.T{types.T_varchar, types.T_uint64},
  1365  				ReturnTyp: types.T_varchar,
  1366  				Fn:        multi.Substring,
  1367  			},
  1368  			{
  1369  				Index:     2,
  1370  				Args:      []types.T{types.T_char, types.T_int64},
  1371  				ReturnTyp: types.T_char,
  1372  				Fn:        multi.Substring,
  1373  			},
  1374  			{
  1375  				Index:     3,
  1376  				Args:      []types.T{types.T_char, types.T_uint64},
  1377  				ReturnTyp: types.T_char,
  1378  				Fn:        multi.Substring,
  1379  			},
  1380  			{
  1381  				Index:     4,
  1382  				Args:      []types.T{types.T_char, types.T_float64},
  1383  				ReturnTyp: types.T_char,
  1384  				Fn:        multi.Substring,
  1385  			},
  1386  			{
  1387  				Index:     5,
  1388  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_int64},
  1389  				ReturnTyp: types.T_varchar,
  1390  				Fn:        multi.Substring,
  1391  			},
  1392  			{
  1393  				Index:     6,
  1394  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_uint64},
  1395  				ReturnTyp: types.T_varchar,
  1396  				Fn:        multi.Substring,
  1397  			},
  1398  			{
  1399  				Index:     7,
  1400  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_float64},
  1401  				ReturnTyp: types.T_varchar,
  1402  				Fn:        multi.Substring,
  1403  			},
  1404  			{
  1405  				Index:     8,
  1406  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_float64},
  1407  				ReturnTyp: types.T_varchar,
  1408  				Fn:        multi.Substring,
  1409  			},
  1410  			{
  1411  				Index:     9,
  1412  				Args:      []types.T{types.T_varchar, types.T_float64, types.T_float64},
  1413  				ReturnTyp: types.T_varchar,
  1414  				Fn:        multi.Substring,
  1415  			},
  1416  			{
  1417  				Index:     10,
  1418  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_int64},
  1419  				ReturnTyp: types.T_varchar,
  1420  				Fn:        multi.Substring,
  1421  			},
  1422  			{
  1423  				Index:     11,
  1424  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_uint64},
  1425  				ReturnTyp: types.T_varchar,
  1426  				Fn:        multi.Substring,
  1427  			},
  1428  			{
  1429  				Index:     12,
  1430  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_int64},
  1431  				ReturnTyp: types.T_varchar,
  1432  				Fn:        multi.Substring,
  1433  			},
  1434  			{
  1435  				Index:     13,
  1436  				Args:      []types.T{types.T_varchar, types.T_uint64, types.T_uint64},
  1437  				ReturnTyp: types.T_varchar,
  1438  				Fn:        multi.Substring,
  1439  			},
  1440  			{
  1441  				Index:     14,
  1442  				Args:      []types.T{types.T_char, types.T_int64, types.T_int64},
  1443  				ReturnTyp: types.T_char,
  1444  				Fn:        multi.Substring,
  1445  			},
  1446  			{
  1447  				Index:     15,
  1448  				Args:      []types.T{types.T_char, types.T_int64, types.T_uint64},
  1449  				ReturnTyp: types.T_char,
  1450  				Fn:        multi.Substring,
  1451  			},
  1452  			{
  1453  				Index:     16,
  1454  				Args:      []types.T{types.T_char, types.T_uint64, types.T_int64},
  1455  				ReturnTyp: types.T_char,
  1456  				Fn:        multi.Substring,
  1457  			},
  1458  			{
  1459  				Index:     17,
  1460  				Args:      []types.T{types.T_char, types.T_uint64, types.T_uint64},
  1461  				ReturnTyp: types.T_char,
  1462  				Fn:        multi.Substring,
  1463  			},
  1464  			{
  1465  				Index:     18,
  1466  				Args:      []types.T{types.T_blob, types.T_int64, types.T_int64},
  1467  				ReturnTyp: types.T_char,
  1468  				Fn:        multi.Substring,
  1469  			},
  1470  			{
  1471  				Index:     19,
  1472  				Args:      []types.T{types.T_blob, types.T_int64, types.T_uint64},
  1473  				ReturnTyp: types.T_char,
  1474  				Fn:        multi.Substring,
  1475  			},
  1476  			{
  1477  				Index:     20,
  1478  				Args:      []types.T{types.T_blob, types.T_uint64, types.T_int64},
  1479  				ReturnTyp: types.T_char,
  1480  				Fn:        multi.Substring,
  1481  			},
  1482  			{
  1483  				Index:     21,
  1484  				Args:      []types.T{types.T_blob, types.T_uint64, types.T_uint64},
  1485  				ReturnTyp: types.T_char,
  1486  				Fn:        multi.Substring,
  1487  			},
  1488  
  1489  			{
  1490  				Index:     22,
  1491  				Args:      []types.T{types.T_text, types.T_int64, types.T_int64},
  1492  				ReturnTyp: types.T_char,
  1493  				Fn:        multi.Substring,
  1494  			},
  1495  			{
  1496  				Index:     23,
  1497  				Args:      []types.T{types.T_text, types.T_int64, types.T_uint64},
  1498  				ReturnTyp: types.T_char,
  1499  				Fn:        multi.Substring,
  1500  			},
  1501  			{
  1502  				Index:     24,
  1503  				Args:      []types.T{types.T_text, types.T_uint64, types.T_int64},
  1504  				ReturnTyp: types.T_char,
  1505  				Fn:        multi.Substring,
  1506  			},
  1507  			{
  1508  				Index:     25,
  1509  				Args:      []types.T{types.T_text, types.T_uint64, types.T_uint64},
  1510  				ReturnTyp: types.T_char,
  1511  				Fn:        multi.Substring,
  1512  			},
  1513  		},
  1514  	},
  1515  	FROM_UNIXTIME: {
  1516  		Id:     FROM_UNIXTIME,
  1517  		Flag:   plan.Function_STRICT,
  1518  		Layout: STANDARD_FUNCTION,
  1519  		Overloads: []Function{
  1520  			{
  1521  				Index:     0,
  1522  				Volatile:  true,
  1523  				Args:      []types.T{types.T_int64},
  1524  				ReturnTyp: types.T_datetime,
  1525  				Fn:        multi.FromUnixTimeInt64,
  1526  			},
  1527  			{
  1528  				Index:     1,
  1529  				Volatile:  true,
  1530  				Args:      []types.T{types.T_uint64},
  1531  				ReturnTyp: types.T_datetime,
  1532  				Fn:        multi.FromUnixTimeUint64,
  1533  			},
  1534  			{
  1535  				Index:     2,
  1536  				Volatile:  true,
  1537  				Args:      []types.T{types.T_float64},
  1538  				ReturnTyp: types.T_datetime,
  1539  				Fn:        multi.FromUnixTimeFloat64,
  1540  			},
  1541  			{
  1542  				Index:     3,
  1543  				Volatile:  true,
  1544  				Args:      []types.T{types.T_int64, types.T_varchar},
  1545  				ReturnTyp: types.T_varchar,
  1546  				Fn:        multi.FromUnixTimeInt64Format,
  1547  			},
  1548  			{
  1549  				Index:     4,
  1550  				Volatile:  true,
  1551  				Args:      []types.T{types.T_uint64, types.T_varchar},
  1552  				ReturnTyp: types.T_varchar,
  1553  				Fn:        multi.FromUnixTimeUint64Format,
  1554  			},
  1555  			{
  1556  				Index:     5,
  1557  				Volatile:  true,
  1558  				Args:      []types.T{types.T_float64, types.T_varchar},
  1559  				ReturnTyp: types.T_varchar,
  1560  				Fn:        multi.FromUnixTimeFloat64Format,
  1561  			},
  1562  		},
  1563  	},
  1564  	UNIX_TIMESTAMP: {
  1565  		Id:     UNIX_TIMESTAMP,
  1566  		Flag:   plan.Function_STRICT,
  1567  		Layout: STANDARD_FUNCTION,
  1568  		Overloads: []Function{
  1569  			{
  1570  				Index:     0,
  1571  				Volatile:  true,
  1572  				Args:      []types.T{},
  1573  				ReturnTyp: types.T_int64,
  1574  				Fn:        multi.UnixTimestamp,
  1575  			},
  1576  			{
  1577  				Index:     1,
  1578  				Volatile:  true,
  1579  				Args:      []types.T{types.T_timestamp},
  1580  				ReturnTyp: types.T_int64,
  1581  				Fn:        multi.UnixTimestamp,
  1582  			},
  1583  			{
  1584  				Index:     2,
  1585  				Volatile:  true,
  1586  				Args:      []types.T{types.T_varchar, types.T_int64},
  1587  				ReturnTyp: types.T_int64,
  1588  				Fn:        multi.UnixTimestampVarcharToInt64,
  1589  			},
  1590  			{
  1591  				Index:     3,
  1592  				Volatile:  true,
  1593  				Args:      []types.T{types.T_varchar, types.T_decimal128},
  1594  				ReturnTyp: types.T_decimal128,
  1595  				Fn:        multi.UnixTimestampVarcharToDecimal128,
  1596  			},
  1597  		},
  1598  	},
  1599  	UTC_TIMESTAMP: {
  1600  		Id:     UTC_TIMESTAMP,
  1601  		Flag:   plan.Function_STRICT,
  1602  		Layout: STANDARD_FUNCTION,
  1603  		Overloads: []Function{
  1604  			{
  1605  				Index:     0,
  1606  				Args:      []types.T{},
  1607  				ReturnTyp: types.T_datetime,
  1608  				Fn:        multi.UTCTimestamp,
  1609  			},
  1610  		},
  1611  	},
  1612  	DATE_ADD: {
  1613  		Id:     DATE_ADD,
  1614  		Flag:   plan.Function_STRICT,
  1615  		Layout: STANDARD_FUNCTION,
  1616  		Overloads: []Function{
  1617  			{
  1618  				Index:     0,
  1619  				Volatile:  true,
  1620  				Args:      []types.T{types.T_date, types.T_int64, types.T_int64},
  1621  				ReturnTyp: types.T_date,
  1622  				Fn:        multi.DateAdd,
  1623  			},
  1624  			{
  1625  				Index:     1,
  1626  				Volatile:  true,
  1627  				Args:      []types.T{types.T_datetime, types.T_int64, types.T_int64},
  1628  				ReturnTyp: types.T_datetime,
  1629  				Fn:        multi.DatetimeAdd,
  1630  			},
  1631  			{
  1632  				Index:     2,
  1633  				Volatile:  true,
  1634  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_int64},
  1635  				ReturnTyp: types.T_datetime,
  1636  				Fn:        multi.DateStringAdd,
  1637  			},
  1638  			{
  1639  				Index:     3,
  1640  				Volatile:  true,
  1641  				Args:      []types.T{types.T_char, types.T_int64, types.T_int64},
  1642  				ReturnTyp: types.T_datetime,
  1643  				Fn:        multi.DateStringAdd,
  1644  			},
  1645  			{
  1646  				Index:     4,
  1647  				Volatile:  true,
  1648  				Args:      []types.T{types.T_timestamp, types.T_int64, types.T_int64},
  1649  				ReturnTyp: types.T_timestamp,
  1650  				Fn:        multi.TimeStampAdd,
  1651  			},
  1652  			{
  1653  				Index:     5,
  1654  				Volatile:  true,
  1655  				Args:      []types.T{types.T_time, types.T_int64, types.T_int64},
  1656  				ReturnTyp: types.T_time,
  1657  				Fn:        multi.TimeAdd,
  1658  			},
  1659  		},
  1660  	},
  1661  	DATE_SUB: {
  1662  		Id:     DATE_SUB,
  1663  		Flag:   plan.Function_STRICT,
  1664  		Layout: STANDARD_FUNCTION,
  1665  		Overloads: []Function{
  1666  			{
  1667  				Index:     0,
  1668  				Volatile:  true,
  1669  				Args:      []types.T{types.T_date, types.T_int64, types.T_int64},
  1670  				ReturnTyp: types.T_date,
  1671  				Fn:        multi.DateSub,
  1672  			},
  1673  			{
  1674  				Index:     1,
  1675  				Volatile:  true,
  1676  				Args:      []types.T{types.T_datetime, types.T_int64, types.T_int64},
  1677  				ReturnTyp: types.T_datetime,
  1678  				Fn:        multi.DatetimeSub,
  1679  			},
  1680  			{
  1681  				Index:     2,
  1682  				Volatile:  true,
  1683  				Args:      []types.T{types.T_varchar, types.T_int64, types.T_int64},
  1684  				ReturnTyp: types.T_datetime,
  1685  				Fn:        multi.DateStringSub,
  1686  			},
  1687  			{
  1688  				Index:     3,
  1689  				Volatile:  true,
  1690  				Args:      []types.T{types.T_char, types.T_int64, types.T_int64},
  1691  				ReturnTyp: types.T_datetime,
  1692  				Fn:        multi.DateStringSub,
  1693  			},
  1694  			{
  1695  				Index:     4,
  1696  				Volatile:  true,
  1697  				Args:      []types.T{types.T_timestamp, types.T_int64, types.T_int64},
  1698  				ReturnTyp: types.T_timestamp,
  1699  				Fn:        multi.TimeStampSub,
  1700  			},
  1701  		},
  1702  	},
  1703  	TAN: {
  1704  		Id:     TAN,
  1705  		Flag:   plan.Function_STRICT,
  1706  		Layout: STANDARD_FUNCTION,
  1707  		Overloads: []Function{
  1708  			{
  1709  				Index:     0,
  1710  				Args:      []types.T{types.T_float64},
  1711  				ReturnTyp: types.T_float64,
  1712  				Fn:        unary.Tan,
  1713  			},
  1714  		},
  1715  	},
  1716  	SINH: {
  1717  		Id:     SINH,
  1718  		Flag:   plan.Function_STRICT,
  1719  		Layout: STANDARD_FUNCTION,
  1720  		Overloads: []Function{
  1721  			{
  1722  				Index:     0,
  1723  				Args:      []types.T{types.T_float64},
  1724  				ReturnTyp: types.T_float64,
  1725  				Fn:        unary.Sinh,
  1726  			},
  1727  		},
  1728  	},
  1729  	TO_DATE: {
  1730  		Id:     TO_DATE,
  1731  		Flag:   plan.Function_STRICT,
  1732  		Layout: STANDARD_FUNCTION,
  1733  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, _ []types.T) {
  1734  			if len(inputs) == 2 {
  1735  				if inputs[0] == types.T_char || inputs[0] == types.T_varchar {
  1736  					if inputs[1] == types.T_char || inputs[1] == types.T_varchar {
  1737  						return int32(0), nil
  1738  					}
  1739  				}
  1740  			}
  1741  			return wrongFunctionParameters, nil
  1742  		},
  1743  		Overloads: []Function{
  1744  			{
  1745  				Index:     0,
  1746  				Args:      []types.T{types.T_varchar, types.T_varchar},
  1747  				ReturnTyp: types.T_varchar,
  1748  				Fn:        binary.ToDate,
  1749  			},
  1750  		},
  1751  	},
  1752  	STR_TO_DATE: {
  1753  		Id:     STR_TO_DATE,
  1754  		Flag:   plan.Function_STRICT,
  1755  		Layout: STANDARD_FUNCTION,
  1756  		Overloads: []Function{
  1757  			{
  1758  				Index:     0,
  1759  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_datetime},
  1760  				ReturnTyp: types.T_datetime,
  1761  				Fn:        binary.StrToDateTime,
  1762  			},
  1763  			{
  1764  				Index:     1,
  1765  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_date},
  1766  				ReturnTyp: types.T_date,
  1767  				Fn:        binary.StrToDate,
  1768  			},
  1769  			{
  1770  				Index:     2,
  1771  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_time},
  1772  				ReturnTyp: types.T_time,
  1773  				Fn:        binary.StrToTime,
  1774  			},
  1775  			{
  1776  				Index:     3,
  1777  				Args:      []types.T{types.T_char, types.T_char, types.T_datetime},
  1778  				ReturnTyp: types.T_datetime,
  1779  				Fn:        binary.StrToDateTime,
  1780  			},
  1781  			{
  1782  				Index:     4,
  1783  				Args:      []types.T{types.T_char, types.T_char, types.T_date},
  1784  				ReturnTyp: types.T_date,
  1785  				Fn:        binary.StrToDate,
  1786  			},
  1787  			{
  1788  				Index:     5,
  1789  				Args:      []types.T{types.T_char, types.T_char, types.T_time},
  1790  				ReturnTyp: types.T_time,
  1791  				Fn:        binary.StrToTime,
  1792  			},
  1793  		},
  1794  	},
  1795  	ATAN: {
  1796  		Id:     ATAN,
  1797  		Flag:   plan.Function_STRICT,
  1798  		Layout: STANDARD_FUNCTION,
  1799  		Overloads: []Function{
  1800  			{
  1801  				Index:     0,
  1802  				Args:      []types.T{types.T_float64},
  1803  				ReturnTyp: types.T_float64,
  1804  				Fn:        unary.Atan,
  1805  			},
  1806  			{
  1807  				Index:     1,
  1808  				Args:      []types.T{types.T_float64, types.T_float64},
  1809  				ReturnTyp: types.T_float64,
  1810  				Fn:        unary.Atan,
  1811  			},
  1812  		},
  1813  	},
  1814  	COS: {
  1815  		Id:     COS,
  1816  		Flag:   plan.Function_STRICT,
  1817  		Layout: STANDARD_FUNCTION,
  1818  		Overloads: []Function{
  1819  			{
  1820  				Index:     0,
  1821  				Args:      []types.T{types.T_float64},
  1822  				ReturnTyp: types.T_float64,
  1823  				Fn:        unary.Cos,
  1824  			},
  1825  		},
  1826  	},
  1827  	COT: {
  1828  		Id:     COT,
  1829  		Flag:   plan.Function_STRICT,
  1830  		Layout: STANDARD_FUNCTION,
  1831  		Overloads: []Function{
  1832  			{
  1833  				Index:     0,
  1834  				Args:      []types.T{types.T_float64},
  1835  				ReturnTyp: types.T_float64,
  1836  				Fn:        unary.Cot,
  1837  			},
  1838  		},
  1839  	},
  1840  	TIMESTAMP: {
  1841  		Id:     TIMESTAMP,
  1842  		Flag:   plan.Function_STRICT,
  1843  		Layout: STANDARD_FUNCTION,
  1844  		Overloads: []Function{
  1845  			{
  1846  				Index:     0,
  1847  				Volatile:  true,
  1848  				Args:      []types.T{types.T_date},
  1849  				ReturnTyp: types.T_timestamp,
  1850  				Fn:        unary.DateToTimestamp,
  1851  			},
  1852  			{
  1853  				Index:     1,
  1854  				Volatile:  true,
  1855  				Args:      []types.T{types.T_datetime},
  1856  				ReturnTyp: types.T_timestamp,
  1857  				Fn:        unary.DatetimeToTimestamp,
  1858  			},
  1859  			{
  1860  				Index:     2,
  1861  				Args:      []types.T{types.T_timestamp},
  1862  				ReturnTyp: types.T_timestamp,
  1863  				Fn:        unary.TimestampToTimestamp,
  1864  			},
  1865  			{
  1866  				Index:     3,
  1867  				Volatile:  true,
  1868  				Args:      []types.T{types.T_varchar},
  1869  				ReturnTyp: types.T_timestamp,
  1870  				Fn:        unary.DateStringToTimestamp,
  1871  			},
  1872  			{
  1873  				Index:     4,
  1874  				Volatile:  true,
  1875  				Args:      []types.T{types.T_char},
  1876  				ReturnTyp: types.T_timestamp,
  1877  				Fn:        unary.DateStringToTimestamp,
  1878  			},
  1879  		},
  1880  	},
  1881  	DATABASE: {
  1882  		Id:     DATABASE,
  1883  		Flag:   plan.Function_STRICT,
  1884  		Layout: STANDARD_FUNCTION,
  1885  		Overloads: []Function{
  1886  			{
  1887  				Index:     0,
  1888  				Volatile:  true,
  1889  				Args:      []types.T{},
  1890  				ReturnTyp: types.T_varchar,
  1891  				Fn:        unary.Database,
  1892  			},
  1893  		},
  1894  	},
  1895  	USER: {
  1896  		Id:     USER,
  1897  		Flag:   plan.Function_STRICT,
  1898  		Layout: STANDARD_FUNCTION,
  1899  		Overloads: []Function{
  1900  			{
  1901  				Index:     0,
  1902  				Volatile:  true,
  1903  				Args:      []types.T{},
  1904  				ReturnTyp: types.T_varchar,
  1905  				Fn:        unary.User,
  1906  			},
  1907  		},
  1908  	},
  1909  	CONNECTION_ID: {
  1910  		Id:     CONNECTION_ID,
  1911  		Flag:   plan.Function_STRICT,
  1912  		Layout: STANDARD_FUNCTION,
  1913  		Overloads: []Function{
  1914  			{
  1915  				Index:     0,
  1916  				Volatile:  true,
  1917  				Args:      []types.T{},
  1918  				ReturnTyp: types.T_uint64,
  1919  				Fn:        unary.ConnectionID,
  1920  			},
  1921  		},
  1922  	},
  1923  	CHARSET: {
  1924  		Id:     CHARSET,
  1925  		Flag:   plan.Function_STRICT,
  1926  		Layout: STANDARD_FUNCTION,
  1927  		Overloads: []Function{
  1928  			{
  1929  				Index:     0,
  1930  				Volatile:  true,
  1931  				Args:      []types.T{types.T_varchar},
  1932  				ReturnTyp: types.T_varchar,
  1933  				Fn:        unary.Charset,
  1934  			},
  1935  		},
  1936  	},
  1937  	CURRENT_ROLE: {
  1938  		Flag:   plan.Function_STRICT,
  1939  		Layout: STANDARD_FUNCTION,
  1940  		Id:     CURRENT_ROLE,
  1941  		Overloads: []Function{
  1942  			{
  1943  				Index:     0,
  1944  				Volatile:  true,
  1945  				Args:      []types.T{},
  1946  				ReturnTyp: types.T_varchar,
  1947  				Fn:        unary.CurrentRole,
  1948  			},
  1949  		},
  1950  	},
  1951  	FOUND_ROWS: {
  1952  		Id:     FOUND_ROWS,
  1953  		Flag:   plan.Function_STRICT,
  1954  		Layout: STANDARD_FUNCTION,
  1955  		Overloads: []Function{
  1956  			{
  1957  				Index:     0,
  1958  				Volatile:  true,
  1959  				Args:      []types.T{},
  1960  				ReturnTyp: types.T_uint64,
  1961  				Fn:        unary.FoundRows,
  1962  			},
  1963  		},
  1964  	},
  1965  	ICULIBVERSION: {
  1966  		Id:     ICULIBVERSION,
  1967  		Flag:   plan.Function_STRICT,
  1968  		Layout: STANDARD_FUNCTION,
  1969  		Overloads: []Function{
  1970  			{
  1971  				Index:     0,
  1972  				Volatile:  true,
  1973  				Args:      []types.T{},
  1974  				ReturnTyp: types.T_varchar,
  1975  				Fn:        unary.ICULIBVersion,
  1976  			},
  1977  		},
  1978  	},
  1979  	LAST_INSERT_ID: {
  1980  		Id:     LAST_INSERT_ID,
  1981  		Flag:   plan.Function_STRICT,
  1982  		Layout: STANDARD_FUNCTION,
  1983  		Overloads: []Function{
  1984  			{
  1985  				Index:     0,
  1986  				Volatile:  true,
  1987  				Args:      []types.T{},
  1988  				ReturnTyp: types.T_uint64,
  1989  				Fn:        unary.LastInsertID,
  1990  			},
  1991  		},
  1992  	},
  1993  	LAST_QUERY_ID: {
  1994  		Id:     LAST_QUERY_ID,
  1995  		Flag:   plan.Function_STRICT,
  1996  		Layout: STANDARD_FUNCTION,
  1997  		Overloads: []Function{
  1998  			{
  1999  				Index:     0,
  2000  				Volatile:  true,
  2001  				Args:      []types.T{},
  2002  				ReturnTyp: types.T_varchar,
  2003  				Fn:        unary.LastQueryIDWithoutParam,
  2004  			},
  2005  			{
  2006  				Index:     1,
  2007  				Volatile:  true,
  2008  				Args:      []types.T{types.T_int64},
  2009  				ReturnTyp: types.T_varchar,
  2010  				Fn:        unary.LastQueryID,
  2011  			},
  2012  		},
  2013  	},
  2014  	ROLES_GRAPHML: {
  2015  		Id:     ROLES_GRAPHML,
  2016  		Flag:   plan.Function_STRICT,
  2017  		Layout: STANDARD_FUNCTION,
  2018  		Overloads: []Function{
  2019  			{
  2020  				Index:     0,
  2021  				Volatile:  true,
  2022  				Args:      []types.T{},
  2023  				ReturnTyp: types.T_varchar,
  2024  				Fn:        unary.RolesGraphml,
  2025  			},
  2026  		},
  2027  	},
  2028  	ROW_COUNT: {
  2029  		Id:     ROW_COUNT,
  2030  		Flag:   plan.Function_STRICT,
  2031  		Layout: STANDARD_FUNCTION,
  2032  		Overloads: []Function{
  2033  			{
  2034  				Index:     0,
  2035  				Volatile:  true,
  2036  				Args:      []types.T{},
  2037  				ReturnTyp: types.T_uint64,
  2038  				Fn:        unary.RowCount,
  2039  			},
  2040  		},
  2041  	},
  2042  	VERSION: {
  2043  		Id:     VERSION,
  2044  		Flag:   plan.Function_STRICT,
  2045  		Layout: STANDARD_FUNCTION,
  2046  		Overloads: []Function{
  2047  			{
  2048  				Index:     0,
  2049  				Volatile:  true,
  2050  				Args:      []types.T{},
  2051  				ReturnTyp: types.T_varchar,
  2052  				Fn:        unary.Version,
  2053  			},
  2054  		},
  2055  	},
  2056  	COLLATION: {
  2057  		Id:     COLLATION,
  2058  		Flag:   plan.Function_STRICT,
  2059  		Layout: STANDARD_FUNCTION,
  2060  		Overloads: []Function{
  2061  			{
  2062  				Index:     0,
  2063  				Volatile:  true,
  2064  				Args:      []types.T{types.T_varchar},
  2065  				ReturnTyp: types.T_varchar,
  2066  				Fn:        unary.Collation,
  2067  			},
  2068  		},
  2069  	},
  2070  	JSON_EXTRACT: {
  2071  		Id:     JSON_EXTRACT,
  2072  		Flag:   plan.Function_STRICT,
  2073  		Layout: STANDARD_FUNCTION,
  2074  		TypeCheckFn: func(overloads []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
  2075  			if len(inputs) < 2 {
  2076  				return wrongFunctionParameters, nil
  2077  			}
  2078  			if inputs[0] != types.T_json && !types.IsString(inputs[0]) && inputs[0] != types.T_any { //any: null scalar
  2079  				return wrongFunctionParameters, nil
  2080  			}
  2081  			ts = make([]types.T, len(inputs))
  2082  			ts[0] = inputs[0]
  2083  			for i := 1; i < len(inputs); i++ {
  2084  				if !types.IsString(inputs[i]) && inputs[i] != types.T_any {
  2085  					ts[i] = types.T_varchar
  2086  					continue
  2087  				}
  2088  				ts[i] = inputs[i]
  2089  			}
  2090  			return 0, ts
  2091  		},
  2092  		Overloads: []Function{
  2093  			{
  2094  				Index:           0,
  2095  				Volatile:        false,
  2096  				Args:            []types.T{},
  2097  				ReturnTyp:       types.T_json,
  2098  				UseNewFramework: true,
  2099  				NewFn:           multi.JsonExtract,
  2100  			},
  2101  		},
  2102  	},
  2103  	JSON_QUOTE: {
  2104  		Id:     JSON_QUOTE,
  2105  		Flag:   plan.Function_STRICT,
  2106  		Layout: STANDARD_FUNCTION,
  2107  		Overloads: []Function{
  2108  			{
  2109  				Index:     0,
  2110  				Volatile:  false,
  2111  				Args:      []types.T{types.T_varchar},
  2112  				ReturnTyp: types.T_json,
  2113  				Fn:        unary.JsonQuote,
  2114  			},
  2115  		},
  2116  	},
  2117  	JSON_UNQUOTE: {
  2118  		Id:     JSON_UNQUOTE,
  2119  		Flag:   plan.Function_STRICT,
  2120  		Layout: STANDARD_FUNCTION,
  2121  		Overloads: []Function{
  2122  			{
  2123  				Index:     0,
  2124  				Args:      []types.T{types.T_json},
  2125  				ReturnTyp: types.T_varchar,
  2126  				Fn:        unary.JsonUnquote,
  2127  			},
  2128  			{
  2129  				Index:     1,
  2130  				Args:      []types.T{types.T_varchar},
  2131  				ReturnTyp: types.T_varchar,
  2132  				Fn:        unary.JsonUnquote,
  2133  			},
  2134  			{
  2135  				Index:     2,
  2136  				Args:      []types.T{types.T_char},
  2137  				ReturnTyp: types.T_varchar,
  2138  				Fn:        unary.JsonUnquote,
  2139  			},
  2140  			{
  2141  				Index:     3,
  2142  				Args:      []types.T{types.T_text},
  2143  				ReturnTyp: types.T_varchar,
  2144  				Fn:        unary.JsonUnquote,
  2145  			},
  2146  		},
  2147  	},
  2148  
  2149  	ENABLE_FAULT_INJECTION: {
  2150  		Id:     ENABLE_FAULT_INJECTION,
  2151  		Flag:   plan.Function_INTERNAL,
  2152  		Layout: STANDARD_FUNCTION,
  2153  		Overloads: []Function{
  2154  			{
  2155  				Index:     0,
  2156  				Volatile:  true,
  2157  				Args:      []types.T{},
  2158  				ReturnTyp: types.T_bool,
  2159  				Fn:        multi.EnableFaultInjection,
  2160  			},
  2161  		},
  2162  	},
  2163  	DISABLE_FAULT_INJECTION: {
  2164  		Id:     DISABLE_FAULT_INJECTION,
  2165  		Flag:   plan.Function_INTERNAL,
  2166  		Layout: STANDARD_FUNCTION,
  2167  		Overloads: []Function{
  2168  			{
  2169  				Index:     0,
  2170  				Volatile:  true,
  2171  				Args:      []types.T{},
  2172  				ReturnTyp: types.T_bool,
  2173  				Fn:        multi.DisableFaultInjection,
  2174  			},
  2175  		},
  2176  	},
  2177  	ADD_FAULT_POINT: {
  2178  		Id:     ADD_FAULT_POINT,
  2179  		Flag:   plan.Function_INTERNAL,
  2180  		Layout: STANDARD_FUNCTION,
  2181  		Overloads: []Function{
  2182  			{
  2183  				Index:     0,
  2184  				Volatile:  true,
  2185  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar, types.T_int64, types.T_varchar},
  2186  				ReturnTyp: types.T_bool,
  2187  				Fn:        multi.AddFaultPoint,
  2188  			},
  2189  		},
  2190  	},
  2191  	REMOVE_FAULT_POINT: {
  2192  		Id:     REMOVE_FAULT_POINT,
  2193  		Flag:   plan.Function_INTERNAL,
  2194  		Layout: STANDARD_FUNCTION,
  2195  		Overloads: []Function{
  2196  			{
  2197  				Index:     0,
  2198  				Volatile:  true,
  2199  				Args:      []types.T{types.T_varchar},
  2200  				ReturnTyp: types.T_bool,
  2201  				Fn:        multi.RemoveFaultPoint,
  2202  			},
  2203  		},
  2204  	},
  2205  	TRIGGER_FAULT_POINT: {
  2206  		Id:     REMOVE_FAULT_POINT,
  2207  		Flag:   plan.Function_INTERNAL,
  2208  		Layout: STANDARD_FUNCTION,
  2209  		Overloads: []Function{
  2210  			{
  2211  				Index:     0,
  2212  				Volatile:  true,
  2213  				Args:      []types.T{types.T_varchar},
  2214  				ReturnTyp: types.T_int64,
  2215  				Fn:        multi.TriggerFaultPoint,
  2216  			},
  2217  		},
  2218  	},
  2219  	LOAD_FILE: {
  2220  		Id:     LOAD_FILE,
  2221  		Flag:   plan.Function_STRICT,
  2222  		Layout: STANDARD_FUNCTION,
  2223  		Overloads: []Function{
  2224  			{
  2225  				Index:     0,
  2226  				Volatile:  true,
  2227  				Args:      []types.T{types.T_varchar},
  2228  				ReturnTyp: types.T_text,
  2229  				Fn:        unary.LoadFile,
  2230  			},
  2231  			{
  2232  				Index:     1,
  2233  				Volatile:  true,
  2234  				Args:      []types.T{types.T_char},
  2235  				ReturnTyp: types.T_text,
  2236  				Fn:        unary.LoadFile,
  2237  			},
  2238  			// {
  2239  			// 	Index:     2,
  2240  			// 	Args:      []types.T{types.T_text},
  2241  			// 	ReturnTyp: types.T_blob,
  2242  			// 	Fn:        unary.LoadFile,
  2243  			// },
  2244  		},
  2245  	},
  2246  	HEX: {
  2247  		Id:     HEX,
  2248  		Flag:   plan.Function_STRICT,
  2249  		Layout: STANDARD_FUNCTION,
  2250  		Overloads: []Function{
  2251  			{
  2252  				Index:     0,
  2253  				Args:      []types.T{types.T_varchar},
  2254  				ReturnTyp: types.T_varchar,
  2255  				Fn:        unary.HexString,
  2256  			},
  2257  			{
  2258  				Index:     1,
  2259  				Args:      []types.T{types.T_char},
  2260  				ReturnTyp: types.T_varchar,
  2261  				Fn:        unary.HexString,
  2262  			},
  2263  			{
  2264  				Index:     2,
  2265  				Args:      []types.T{types.T_int64},
  2266  				ReturnTyp: types.T_varchar,
  2267  				Fn:        unary.HexInt64,
  2268  			},
  2269  		},
  2270  	},
  2271  	SERIAL: {
  2272  		Id:     SERIAL,
  2273  		Flag:   plan.Function_STRICT,
  2274  		Layout: STANDARD_FUNCTION,
  2275  		TypeCheckFn: func(_ []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
  2276  			return int32(0), nil
  2277  		},
  2278  		Overloads: []Function{
  2279  			{
  2280  				Index:     0,
  2281  				Args:      []types.T{},
  2282  				ReturnTyp: types.T_varchar,
  2283  				Fn:        multi.Serial,
  2284  			},
  2285  		},
  2286  	},
  2287  	HASH: {
  2288  		Id:     HASH,
  2289  		Flag:   plan.Function_STRICT,
  2290  		Layout: STANDARD_FUNCTION,
  2291  		TypeCheckFn: func(_ []Function, typs []types.T) (int32, []types.T) {
  2292  			return 0, typs
  2293  		},
  2294  		Overloads: []Function{
  2295  			{
  2296  				Index:     0,
  2297  				Args:      []types.T{},
  2298  				ReturnTyp: types.T_int64,
  2299  				Fn:        multi.Hash,
  2300  			},
  2301  		},
  2302  	},
  2303  	BIN: {
  2304  		Id:     BIN,
  2305  		Flag:   plan.Function_STRICT,
  2306  		Layout: STANDARD_FUNCTION,
  2307  		Overloads: []Function{
  2308  			{
  2309  				Index:     0,
  2310  				Args:      []types.T{types.T_uint8},
  2311  				ReturnTyp: types.T_varchar,
  2312  				Fn:        unary.Bin[uint8],
  2313  			},
  2314  			{
  2315  				Index:     1,
  2316  				Args:      []types.T{types.T_uint16},
  2317  				ReturnTyp: types.T_varchar,
  2318  				Fn:        unary.Bin[uint16],
  2319  			},
  2320  			{
  2321  				Index:     2,
  2322  				Args:      []types.T{types.T_uint32},
  2323  				ReturnTyp: types.T_varchar,
  2324  				Fn:        unary.Bin[uint32],
  2325  			},
  2326  			{
  2327  				Index:     3,
  2328  				Args:      []types.T{types.T_uint64},
  2329  				ReturnTyp: types.T_varchar,
  2330  				Fn:        unary.Bin[uint64],
  2331  			},
  2332  			{
  2333  				Index:     4,
  2334  				Args:      []types.T{types.T_int8},
  2335  				ReturnTyp: types.T_varchar,
  2336  				Fn:        unary.Bin[int8],
  2337  			},
  2338  			{
  2339  				Index:     5,
  2340  				Args:      []types.T{types.T_int16},
  2341  				ReturnTyp: types.T_varchar,
  2342  				Fn:        unary.Bin[int16],
  2343  			},
  2344  			{
  2345  				Index:     6,
  2346  				Args:      []types.T{types.T_int32},
  2347  				ReturnTyp: types.T_varchar,
  2348  				Fn:        unary.Bin[int32],
  2349  			},
  2350  			{
  2351  				Index:     7,
  2352  				Args:      []types.T{types.T_int64},
  2353  				ReturnTyp: types.T_varchar,
  2354  				Fn:        unary.Bin[int64],
  2355  			},
  2356  			{
  2357  				Index:     8,
  2358  				Args:      []types.T{types.T_float32},
  2359  				ReturnTyp: types.T_varchar,
  2360  				Fn:        unary.BinFloat[float32],
  2361  			},
  2362  			{
  2363  				Index:     9,
  2364  				Args:      []types.T{types.T_float64},
  2365  				ReturnTyp: types.T_varchar,
  2366  				Fn:        unary.BinFloat[float64],
  2367  			},
  2368  		},
  2369  	},
  2370  	REGEXP_INSTR: {
  2371  		Id:     REGEXP_INSTR,
  2372  		Flag:   plan.Function_STRICT,
  2373  		Layout: STANDARD_FUNCTION,
  2374  		Overloads: []Function{
  2375  			{
  2376  				Index:     0,
  2377  				Args:      []types.T{types.T_varchar, types.T_varchar},
  2378  				ReturnTyp: types.T_int64,
  2379  				Fn:        multi.RegularInstr,
  2380  			},
  2381  			{
  2382  				Index:     1,
  2383  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64},
  2384  				ReturnTyp: types.T_int64,
  2385  				Fn:        multi.RegularInstr,
  2386  			},
  2387  			{
  2388  				Index:     2,
  2389  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64, types.T_int64},
  2390  				ReturnTyp: types.T_int64,
  2391  				Fn:        multi.RegularInstr,
  2392  			},
  2393  			{
  2394  				Index:     3,
  2395  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64, types.T_int64, types.T_uint8},
  2396  				ReturnTyp: types.T_int64,
  2397  				Fn:        multi.RegularInstr,
  2398  			},
  2399  		},
  2400  	},
  2401  	REPLACE: {
  2402  		Id:     REPLACE,
  2403  		Flag:   plan.Function_STRICT,
  2404  		Layout: STANDARD_FUNCTION,
  2405  		Overloads: []Function{
  2406  			{
  2407  				Index:     0,
  2408  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  2409  				ReturnTyp: types.T_varchar,
  2410  				Fn:        multi.Replace,
  2411  			},
  2412  		},
  2413  	},
  2414  	REGEXP_REPLACE: {
  2415  		Id:     REGEXP_REPLACE,
  2416  		Flag:   plan.Function_STRICT,
  2417  		Layout: STANDARD_FUNCTION,
  2418  		Overloads: []Function{
  2419  			{
  2420  				Index:     0,
  2421  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  2422  				ReturnTyp: types.T_varchar,
  2423  				Fn:        multi.RegularReplace,
  2424  			},
  2425  			{
  2426  				Index:     1,
  2427  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar, types.T_int64},
  2428  				ReturnTyp: types.T_varchar,
  2429  				Fn:        multi.RegularReplace,
  2430  			},
  2431  			{
  2432  				Index:     2,
  2433  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar, types.T_int64, types.T_int64},
  2434  				ReturnTyp: types.T_varchar,
  2435  				Fn:        multi.RegularReplace,
  2436  			},
  2437  		},
  2438  	},
  2439  	REGEXP_LIKE: {
  2440  		Id:     REGEXP_LIKE,
  2441  		Flag:   plan.Function_STRICT,
  2442  		Layout: STANDARD_FUNCTION,
  2443  		Overloads: []Function{
  2444  			{
  2445  				Index:     0,
  2446  				Args:      []types.T{types.T_varchar, types.T_varchar},
  2447  				ReturnTyp: types.T_bool,
  2448  				Fn:        multi.RegularLike,
  2449  			},
  2450  			{
  2451  				Index:     1,
  2452  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  2453  				ReturnTyp: types.T_bool,
  2454  				Fn:        multi.RegularLike,
  2455  			},
  2456  		},
  2457  	},
  2458  	REGEXP_SUBSTR: {
  2459  		Id:     REGEXP_SUBSTR,
  2460  		Flag:   plan.Function_STRICT,
  2461  		Layout: STANDARD_FUNCTION,
  2462  		Overloads: []Function{
  2463  			{
  2464  				Index:     0,
  2465  				Args:      []types.T{types.T_varchar, types.T_varchar},
  2466  				ReturnTyp: types.T_varchar,
  2467  				Fn:        multi.RegularSubstr,
  2468  			},
  2469  			{
  2470  				Index:     1,
  2471  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64},
  2472  				ReturnTyp: types.T_varchar,
  2473  				Fn:        multi.RegularSubstr,
  2474  			},
  2475  			{
  2476  				Index:     2,
  2477  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_int64, types.T_int64},
  2478  				ReturnTyp: types.T_varchar,
  2479  				Fn:        multi.RegularSubstr,
  2480  			},
  2481  		},
  2482  	},
  2483  
  2484  	MO_MEMORY_USAGE: {
  2485  		Id:     MO_MEMORY_USAGE,
  2486  		Flag:   plan.Function_INTERNAL,
  2487  		Layout: STANDARD_FUNCTION,
  2488  		Overloads: []Function{
  2489  			{
  2490  				Index:     0,
  2491  				Volatile:  true,
  2492  				Args:      []types.T{types.T_varchar},
  2493  				ReturnTyp: types.T_varchar,
  2494  				Fn:        unary.MoMemUsage,
  2495  			},
  2496  		},
  2497  	},
  2498  
  2499  	MO_ENABLE_MEMORY_USAGE_DETAIL: {
  2500  		Id:     MO_ENABLE_MEMORY_USAGE_DETAIL,
  2501  		Flag:   plan.Function_INTERNAL,
  2502  		Layout: STANDARD_FUNCTION,
  2503  		Overloads: []Function{
  2504  			{
  2505  				Index:     0,
  2506  				Volatile:  true,
  2507  				Args:      []types.T{types.T_varchar},
  2508  				ReturnTyp: types.T_varchar,
  2509  				Fn:        unary.MoEnableMemUsageDetail,
  2510  			},
  2511  		},
  2512  	},
  2513  	MO_DISABLE_MEMORY_USAGE_DETAIL: {
  2514  		Id:     MO_DISABLE_MEMORY_USAGE_DETAIL,
  2515  		Flag:   plan.Function_INTERNAL,
  2516  		Layout: STANDARD_FUNCTION,
  2517  		Overloads: []Function{
  2518  			{
  2519  				Index:     0,
  2520  				Volatile:  true,
  2521  				Args:      []types.T{types.T_varchar},
  2522  				ReturnTyp: types.T_varchar,
  2523  				Fn:        unary.MoDisableMemUsageDetail,
  2524  			},
  2525  		},
  2526  	},
  2527  	DATEDIFF: {
  2528  		Id:     DATEDIFF,
  2529  		Flag:   plan.Function_STRICT,
  2530  		Layout: STANDARD_FUNCTION,
  2531  		Overloads: []Function{
  2532  			{
  2533  				Index:     0,
  2534  				Volatile:  true,
  2535  				Args:      []types.T{types.T_date, types.T_date},
  2536  				ReturnTyp: types.T_int64,
  2537  				Fn:        binary.DateDiff,
  2538  			},
  2539  		},
  2540  	},
  2541  	TIMESTAMPDIFF: {
  2542  		Id:     TIMESTAMPDIFF,
  2543  		Flag:   plan.Function_STRICT,
  2544  		Layout: STANDARD_FUNCTION,
  2545  		Overloads: []Function{
  2546  			{
  2547  				Index:     0,
  2548  				Volatile:  true,
  2549  				Args:      []types.T{types.T_varchar, types.T_datetime, types.T_datetime},
  2550  				ReturnTyp: types.T_int64,
  2551  				Fn:        multi.TimeStampDiff,
  2552  			},
  2553  		},
  2554  	},
  2555  	TIMEDIFF: {
  2556  		Id:     TIMEDIFF,
  2557  		Flag:   plan.Function_STRICT,
  2558  		Layout: STANDARD_FUNCTION,
  2559  		Overloads: []Function{
  2560  			{
  2561  				Index:     0,
  2562  				Volatile:  true,
  2563  				Args:      []types.T{types.T_time, types.T_time},
  2564  				ReturnTyp: types.T_time,
  2565  				Fn:        binary.TimeDiff[types.Time],
  2566  			},
  2567  			{
  2568  				Index:     1,
  2569  				Volatile:  true,
  2570  				Args:      []types.T{types.T_datetime, types.T_datetime},
  2571  				ReturnTyp: types.T_time,
  2572  				Fn:        binary.TimeDiff[types.Datetime],
  2573  			},
  2574  		},
  2575  	},
  2576  	MO_CTL: {
  2577  		Id:     MO_CTL,
  2578  		Flag:   plan.Function_STRICT,
  2579  		Layout: STANDARD_FUNCTION,
  2580  		Overloads: []Function{
  2581  			{
  2582  				Index:     0,
  2583  				Volatile:  true,
  2584  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  2585  				ReturnTyp: types.T_varchar,
  2586  				Fn:        ctl.Handler,
  2587  			},
  2588  		},
  2589  	},
  2590  	MO_SHOW_VISIBLE_BIN: {
  2591  		Id:     MO_SHOW_VISIBLE_BIN,
  2592  		Flag:   plan.Function_STRICT,
  2593  		Layout: STANDARD_FUNCTION,
  2594  		Overloads: []Function{
  2595  			{
  2596  				Index:     0,
  2597  				Volatile:  true,
  2598  				Args:      []types.T{types.T_varchar, types.T_uint8},
  2599  				ReturnTyp: types.T_varchar,
  2600  				Fn:        binary.ShowVisibleBin,
  2601  			},
  2602  			{
  2603  				Index:     1,
  2604  				Volatile:  true,
  2605  				Args:      []types.T{types.T_text, types.T_uint8},
  2606  				ReturnTyp: types.T_varchar,
  2607  				Fn:        binary.ShowVisibleBin,
  2608  			},
  2609  		},
  2610  	},
  2611  	FIELD: {
  2612  		Id:     FIELD,
  2613  		Flag:   plan.Function_STRICT,
  2614  		Layout: STANDARD_FUNCTION,
  2615  		TypeCheckFn: func(overloads []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
  2616  			l := len(inputs)
  2617  			if l < 2 {
  2618  				return wrongFunctionParameters, nil
  2619  			}
  2620  
  2621  			//If all arguments are strings, all arguments are compared as strings &&
  2622  			//If all arguments are numbers, all arguments are compared as numbers.
  2623  			returnType := [...]types.T{types.T_varchar, types.T_char, types.T_int8, types.T_int16, types.T_int32, types.T_int64, types.T_uint8, types.T_uint16, types.T_uint32, types.T_uint64, types.T_float32, types.T_float64}
  2624  			for i := range returnType {
  2625  				if operator.CoalesceTypeCheckFn(inputs, nil, returnType[i]) {
  2626  					if i < 2 {
  2627  						return 0, nil
  2628  					} else {
  2629  						return int32(i - 1), nil
  2630  					}
  2631  				}
  2632  			}
  2633  
  2634  			//Otherwise, the arguments are compared as double.
  2635  			targetTypes := make([]types.T, l)
  2636  
  2637  			for j := 0; j < l; j++ {
  2638  				targetTypes[j] = types.T_float64
  2639  			}
  2640  			if code, _ := tryToMatch(inputs, targetTypes); code == matchedByConvert {
  2641  				return 10, targetTypes
  2642  			}
  2643  
  2644  			return wrongFunctionParameters, nil
  2645  		},
  2646  		Overloads: []Function{
  2647  			{
  2648  				Index:     0,
  2649  				Volatile:  true,
  2650  				ReturnTyp: types.T_uint64,
  2651  				Fn:        multi.FieldString,
  2652  			},
  2653  			{
  2654  				Index:     1,
  2655  				Volatile:  true,
  2656  				ReturnTyp: types.T_uint64,
  2657  				Fn:        multi.FieldNumber[int8],
  2658  			},
  2659  			{
  2660  				Index:     2,
  2661  				Volatile:  true,
  2662  				ReturnTyp: types.T_uint64,
  2663  				Fn:        multi.FieldNumber[int16],
  2664  			},
  2665  			{
  2666  				Index:     3,
  2667  				Volatile:  true,
  2668  				ReturnTyp: types.T_uint64,
  2669  				Fn:        multi.FieldNumber[int32],
  2670  			},
  2671  			{
  2672  				Index:     4,
  2673  				Volatile:  true,
  2674  				ReturnTyp: types.T_uint64,
  2675  				Fn:        multi.FieldNumber[int64],
  2676  			},
  2677  			{
  2678  				Index:     5,
  2679  				Volatile:  true,
  2680  				ReturnTyp: types.T_uint64,
  2681  				Fn:        multi.FieldNumber[uint8],
  2682  			},
  2683  			{
  2684  				Index:     6,
  2685  				Volatile:  true,
  2686  				ReturnTyp: types.T_uint64,
  2687  				Fn:        multi.FieldNumber[uint16],
  2688  			},
  2689  			{
  2690  				Index:     7,
  2691  				Volatile:  true,
  2692  				ReturnTyp: types.T_uint64,
  2693  				Fn:        multi.FieldNumber[uint32],
  2694  			},
  2695  			{
  2696  				Index:     8,
  2697  				Volatile:  true,
  2698  				ReturnTyp: types.T_uint64,
  2699  				Fn:        multi.FieldNumber[uint64],
  2700  			},
  2701  			{
  2702  				Index:     9,
  2703  				Volatile:  true,
  2704  				ReturnTyp: types.T_uint64,
  2705  				Fn:        multi.FieldNumber[float32],
  2706  			},
  2707  			{
  2708  				Index:     10,
  2709  				Volatile:  true,
  2710  				ReturnTyp: types.T_uint64,
  2711  				Fn:        multi.FieldNumber[float64],
  2712  			},
  2713  		},
  2714  	},
  2715  	SUBSTRING_INDEX: {
  2716  		Id:     SUBSTRING_INDEX,
  2717  		Flag:   plan.Function_STRICT,
  2718  		Layout: STANDARD_FUNCTION,
  2719  		TypeCheckFn: func(overloads []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
  2720  			l := len(inputs)
  2721  			if l != 3 {
  2722  				return wrongFunctionParameters, nil
  2723  			}
  2724  
  2725  			stringType := [...]types.T{types.T_varchar, types.T_char, types.T_text, types.T_blob}
  2726  			numberType := [...]types.T{types.T_int8, types.T_int16, types.T_int32, types.T_int64, types.T_uint8, types.T_uint16, types.T_uint32, types.T_uint64, types.T_float32, types.T_float64}
  2727  			//the first and second arg's types
  2728  			stringTypeSet := make(map[types.T]bool)
  2729  			for _, v := range stringType {
  2730  				stringTypeSet[v] = true
  2731  			}
  2732  			//the third arg's types
  2733  			numberTypeSet := make(map[types.T]bool)
  2734  			for _, v := range numberType {
  2735  				numberTypeSet[v] = true
  2736  			}
  2737  			if stringTypeSet[inputs[0]] && stringTypeSet[inputs[1]] && numberTypeSet[inputs[2]] {
  2738  				return 0, nil
  2739  			}
  2740  
  2741  			//otherwise, try to cast
  2742  			minCost, minIndex := math.MaxInt32, -1
  2743  			convertTypes := make([]types.T, l)
  2744  			thirdArgType := [...]types.T{types.T_float64, types.T_uint64, types.T_int64}
  2745  
  2746  			for _, first := range stringType {
  2747  				for _, second := range stringType {
  2748  					for _, third := range thirdArgType {
  2749  						targetTypes := []types.T{first, second, third}
  2750  						if code, c := tryToMatch(inputs, targetTypes); code == matchedByConvert {
  2751  							if c < minCost {
  2752  								minCost = c
  2753  								copy(convertTypes, targetTypes)
  2754  								minIndex = 0
  2755  							}
  2756  						}
  2757  					}
  2758  				}
  2759  			}
  2760  			if minIndex != -1 {
  2761  				return 0, convertTypes
  2762  			}
  2763  
  2764  			return wrongFunctionParameters, nil
  2765  		},
  2766  		Overloads: []Function{
  2767  			{
  2768  				Index:     0,
  2769  				ReturnTyp: types.T_varchar,
  2770  				Fn:        multi.SubStrIndex,
  2771  			},
  2772  		},
  2773  	},
  2774  	FORMAT: {
  2775  		Id:     FORMAT,
  2776  		Flag:   plan.Function_STRICT,
  2777  		Layout: STANDARD_FUNCTION,
  2778  		TypeCheckFn: func(overloads []Function, inputs []types.T) (overloadIndex int32, ts []types.T) {
  2779  			l := len(inputs)
  2780  			if l < 2 {
  2781  				return wrongFunctionParameters, nil
  2782  			}
  2783  
  2784  			//if the first param's type is timeType, return wrongFunctionParameters
  2785  			timeType := [...]types.T{types.T_date, types.T_datetime, types.T_timestamp, types.T_time}
  2786  			timeTypeSet := make(map[types.T]bool)
  2787  			for _, v := range timeType {
  2788  				timeTypeSet[v] = true
  2789  			}
  2790  			if timeTypeSet[inputs[0]] {
  2791  				return wrongFunctionParameters, nil
  2792  			}
  2793  
  2794  			return normalTypeCheck(overloads, inputs)
  2795  		},
  2796  		Overloads: []Function{
  2797  			{
  2798  				Index:     0,
  2799  				Volatile:  true,
  2800  				Args:      []types.T{types.T_varchar, types.T_varchar},
  2801  				ReturnTyp: types.T_varchar,
  2802  				Fn:        multi.Format,
  2803  			},
  2804  			{
  2805  				Index:     1,
  2806  				Volatile:  true,
  2807  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  2808  				ReturnTyp: types.T_varchar,
  2809  				Fn:        multi.Format,
  2810  			},
  2811  		},
  2812  	},
  2813  	SLEEP: {
  2814  		Id:     SLEEP,
  2815  		Flag:   plan.Function_STRICT,
  2816  		Layout: STANDARD_FUNCTION,
  2817  		Overloads: []Function{
  2818  			{
  2819  				Index:     0,
  2820  				Args:      []types.T{types.T_uint64},
  2821  				ReturnTyp: types.T_uint8,
  2822  				Volatile:  true,
  2823  				Fn:        unary.Sleep[uint64],
  2824  			},
  2825  			{
  2826  				Index:     1,
  2827  				Args:      []types.T{types.T_float64},
  2828  				ReturnTyp: types.T_uint8,
  2829  				Volatile:  true,
  2830  				Fn:        unary.Sleep[float64],
  2831  			},
  2832  		},
  2833  	},
  2834  	INSTR: {
  2835  		Id:     INSTR,
  2836  		Flag:   plan.Function_STRICT,
  2837  		Layout: STANDARD_FUNCTION,
  2838  		Overloads: []Function{
  2839  			{
  2840  				Index:     0,
  2841  				Args:      []types.T{types.T_varchar, types.T_varchar},
  2842  				ReturnTyp: types.T_int64,
  2843  				Volatile:  false,
  2844  				Fn:        binary.Instr,
  2845  			},
  2846  		},
  2847  	},
  2848  	SPLIT_PART: {
  2849  		Id:     SPLIT_PART,
  2850  		Flag:   plan.Function_STRICT,
  2851  		Layout: STANDARD_FUNCTION,
  2852  		Overloads: []Function{
  2853  			{
  2854  				Index:     0,
  2855  				Args:      []types.T{types.T_varchar, types.T_varchar, types.T_uint32},
  2856  				ReturnTyp: types.T_varchar,
  2857  				Volatile:  false,
  2858  				Fn:        multi.SplitPart,
  2859  			},
  2860  		},
  2861  	},
  2862  	CURRENT_DATE: {
  2863  		Id:     CURRENT_DATE,
  2864  		Flag:   plan.Function_STRICT,
  2865  		Layout: STANDARD_FUNCTION,
  2866  		Overloads: []Function{
  2867  			{
  2868  				Index:           0,
  2869  				Args:            []types.T{},
  2870  				ReturnTyp:       types.T_date,
  2871  				Volatile:        false,
  2872  				RealTimeRelated: true,
  2873  				Fn:              unary.CurrentDate,
  2874  			},
  2875  		},
  2876  	},
  2877  	ASCII: {
  2878  		Id:     ASCII,
  2879  		Flag:   plan.Function_STRICT,
  2880  		Layout: STANDARD_FUNCTION,
  2881  		Overloads: []Function{
  2882  			{
  2883  				Index:     0,
  2884  				Args:      []types.T{types.T_varchar},
  2885  				ReturnTyp: types.T_uint8,
  2886  				Fn:        unary.AsciiString,
  2887  			},
  2888  			{
  2889  				Index:     1,
  2890  				Args:      []types.T{types.T_char},
  2891  				ReturnTyp: types.T_uint8,
  2892  				Fn:        unary.AsciiString,
  2893  			},
  2894  			{
  2895  				Index:     2,
  2896  				Args:      []types.T{types.T_text},
  2897  				ReturnTyp: types.T_uint8,
  2898  				Fn:        unary.AsciiString,
  2899  			},
  2900  			{
  2901  				Index:     3,
  2902  				Args:      []types.T{types.T_int8},
  2903  				ReturnTyp: types.T_uint8,
  2904  				Fn:        unary.AsciiInt[int8],
  2905  			},
  2906  			{
  2907  				Index:     4,
  2908  				Args:      []types.T{types.T_int16},
  2909  				ReturnTyp: types.T_uint8,
  2910  				Fn:        unary.AsciiInt[int16],
  2911  			},
  2912  			{
  2913  				Index:     5,
  2914  				Args:      []types.T{types.T_int32},
  2915  				ReturnTyp: types.T_uint8,
  2916  				Fn:        unary.AsciiInt[int32],
  2917  			},
  2918  			{
  2919  				Index:     6,
  2920  				Args:      []types.T{types.T_int64},
  2921  				ReturnTyp: types.T_uint8,
  2922  				Fn:        unary.AsciiInt[int64],
  2923  			},
  2924  			{
  2925  				Index:     7,
  2926  				Args:      []types.T{types.T_uint8},
  2927  				ReturnTyp: types.T_uint8,
  2928  				Fn:        unary.AsciiUint[uint8],
  2929  			},
  2930  			{
  2931  				Index:     8,
  2932  				Args:      []types.T{types.T_uint16},
  2933  				ReturnTyp: types.T_uint8,
  2934  				Fn:        unary.AsciiUint[uint16],
  2935  			},
  2936  			{
  2937  				Index:     9,
  2938  				Args:      []types.T{types.T_uint32},
  2939  				ReturnTyp: types.T_uint8,
  2940  				Fn:        unary.AsciiUint[uint32],
  2941  			},
  2942  			{
  2943  				Index:     10,
  2944  				Args:      []types.T{types.T_uint64},
  2945  				ReturnTyp: types.T_uint8,
  2946  				Fn:        unary.AsciiUint[uint64],
  2947  			},
  2948  		},
  2949  	},
  2950  	MO_TABLE_ROWS: {
  2951  		Id:     MO_TABLE_ROWS,
  2952  		Flag:   plan.Function_STRICT,
  2953  		Layout: STANDARD_FUNCTION,
  2954  		Overloads: []Function{
  2955  			{
  2956  				Index:           0,
  2957  				Args:            []types.T{types.T_varchar, types.T_varchar},
  2958  				ReturnTyp:       types.T_int64,
  2959  				Volatile:        true,
  2960  				RealTimeRelated: true,
  2961  				Fn:              ctl.MoTableRows,
  2962  			},
  2963  		},
  2964  	},
  2965  	MO_TABLE_SIZE: {
  2966  		Id:     MO_TABLE_SIZE,
  2967  		Flag:   plan.Function_STRICT,
  2968  		Layout: STANDARD_FUNCTION,
  2969  		Overloads: []Function{
  2970  			{
  2971  				Index:           0,
  2972  				Args:            []types.T{types.T_varchar, types.T_varchar},
  2973  				ReturnTyp:       types.T_int64,
  2974  				Volatile:        true,
  2975  				RealTimeRelated: true,
  2976  				Fn:              ctl.MoTableSize,
  2977  			},
  2978  		},
  2979  	},
  2980  	CURRENT_ACCOUNT_ID: {
  2981  		Id:     CURRENT_ACCOUNT_ID,
  2982  		Flag:   plan.Function_STRICT,
  2983  		Layout: STANDARD_FUNCTION,
  2984  		Overloads: []Function{
  2985  			{
  2986  				Index:           0,
  2987  				Args:            []types.T{},
  2988  				ReturnTyp:       types.T_uint32,
  2989  				UseNewFramework: true,
  2990  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  2991  					res := vector.MustFunctionResult[uint32](result)
  2992  					return res.Append(proc.SessionInfo.AccountId, false)
  2993  				},
  2994  			},
  2995  		},
  2996  	},
  2997  	CURRENT_ACCOUNT_NAME: {
  2998  		Id:     CURRENT_ACCOUNT_NAME,
  2999  		Flag:   plan.Function_STRICT,
  3000  		Layout: STANDARD_FUNCTION,
  3001  		Overloads: []Function{
  3002  			{
  3003  				Index:           0,
  3004  				Args:            []types.T{},
  3005  				ReturnTyp:       types.T_varchar,
  3006  				UseNewFramework: true,
  3007  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  3008  					res := vector.MustFunctionResult[types.Varlena](result)
  3009  					return res.AppendStr([]byte(proc.SessionInfo.Account), false)
  3010  				},
  3011  			},
  3012  		},
  3013  	},
  3014  	CURRENT_ROLE_ID: {
  3015  		Id:     CURRENT_ROLE_ID,
  3016  		Flag:   plan.Function_STRICT,
  3017  		Layout: STANDARD_FUNCTION,
  3018  		Overloads: []Function{
  3019  			{
  3020  				Index:           0,
  3021  				Args:            []types.T{},
  3022  				ReturnTyp:       types.T_uint32,
  3023  				UseNewFramework: true,
  3024  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  3025  					res := vector.MustFunctionResult[uint32](result)
  3026  					return res.Append(proc.SessionInfo.RoleId, false)
  3027  				},
  3028  			},
  3029  		},
  3030  	},
  3031  	CURRENT_ROLE_NAME: {
  3032  		Id:     CURRENT_ROLE_NAME,
  3033  		Flag:   plan.Function_STRICT,
  3034  		Layout: STANDARD_FUNCTION,
  3035  		Overloads: []Function{
  3036  			{
  3037  				Index:           0,
  3038  				Args:            []types.T{},
  3039  				ReturnTyp:       types.T_varchar,
  3040  				UseNewFramework: true,
  3041  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  3042  					res := vector.MustFunctionResult[types.Varlena](result)
  3043  					return res.AppendStr([]byte(proc.SessionInfo.Role), false)
  3044  				},
  3045  			},
  3046  		},
  3047  	},
  3048  	CURRENT_USER_ID: {
  3049  		Id:     CURRENT_USER_ID,
  3050  		Flag:   plan.Function_STRICT,
  3051  		Layout: STANDARD_FUNCTION,
  3052  		Overloads: []Function{
  3053  			{
  3054  				Index:           0,
  3055  				Args:            []types.T{},
  3056  				ReturnTyp:       types.T_uint32,
  3057  				UseNewFramework: true,
  3058  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  3059  					res := vector.MustFunctionResult[uint32](result)
  3060  					return res.Append(proc.SessionInfo.UserId, false)
  3061  				},
  3062  			},
  3063  		},
  3064  	},
  3065  	CURRENT_USER_NAME: {
  3066  		Id:     CURRENT_USER_NAME,
  3067  		Flag:   plan.Function_STRICT,
  3068  		Layout: STANDARD_FUNCTION,
  3069  		Overloads: []Function{
  3070  			{
  3071  				Index:           0,
  3072  				Args:            []types.T{},
  3073  				ReturnTyp:       types.T_varchar,
  3074  				UseNewFramework: true,
  3075  				NewFn: func(parameters []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int) error {
  3076  					res := vector.MustFunctionResult[types.Varlena](result)
  3077  					return res.AppendStr([]byte(proc.SessionInfo.User), false)
  3078  				},
  3079  			},
  3080  		},
  3081  	},
  3082  	MO_TABLE_COL_MAX: {
  3083  		Id:     MO_TABLE_COL_MAX,
  3084  		Flag:   plan.Function_STRICT,
  3085  		Layout: STANDARD_FUNCTION,
  3086  		Overloads: []Function{
  3087  			{
  3088  				Index:           0,
  3089  				Args:            []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  3090  				ReturnTyp:       types.T_varchar,
  3091  				Volatile:        true,
  3092  				RealTimeRelated: true,
  3093  				Fn:              ctl.MoTableColMax,
  3094  			},
  3095  		},
  3096  	},
  3097  	MO_TABLE_COL_MIN: {
  3098  		Id:     MO_TABLE_COL_MIN,
  3099  		Flag:   plan.Function_STRICT,
  3100  		Layout: STANDARD_FUNCTION,
  3101  		Overloads: []Function{
  3102  			{
  3103  				Index:           0,
  3104  				Args:            []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  3105  				ReturnTyp:       types.T_varchar,
  3106  				Volatile:        true,
  3107  				RealTimeRelated: true,
  3108  				Fn:              ctl.MoTableColMin,
  3109  			},
  3110  		},
  3111  	},
  3112  	TRIM: {
  3113  		Id:     TRIM,
  3114  		Flag:   plan.Function_STRICT,
  3115  		Layout: STANDARD_FUNCTION,
  3116  		Overloads: []Function{
  3117  			{
  3118  				Index:               0,
  3119  				Args:                []types.T{types.T_varchar, types.T_varchar, types.T_varchar},
  3120  				ReturnTyp:           types.T_varchar,
  3121  				UseNewFramework:     true,
  3122  				ParameterMustScalar: []bool{true, false, false},
  3123  				NewFn:               multi.Trim,
  3124  			},
  3125  		},
  3126  	},
  3127  	MO_LOG_DATE: {
  3128  		Id:     MO_LOG_DATE,
  3129  		Flag:   plan.Function_STRICT,
  3130  		Layout: STANDARD_FUNCTION,
  3131  		Overloads: []Function{
  3132  			{
  3133  				Index:           0,
  3134  				Args:            []types.T{types.T_varchar},
  3135  				ReturnTyp:       types.T_date,
  3136  				Volatile:        true,
  3137  				RealTimeRelated: true,
  3138  				Fn:              ctl.MOLogDate,
  3139  			},
  3140  		},
  3141  	},
  3142  }