github.com/mithrandie/csvq@v1.18.1/lib/query/function.go (about)

     1  package query
     2  
     3  import (
     4  	"context"
     5  	"crypto/hmac"
     6  	"crypto/md5"
     7  	"crypto/sha1"
     8  	"crypto/sha256"
     9  	"crypto/sha512"
    10  	"encoding/base64"
    11  	"encoding/hex"
    12  	gojson "encoding/json"
    13  	"errors"
    14  	"fmt"
    15  	"golang.org/x/text/cases"
    16  	"golang.org/x/text/language"
    17  	"hash"
    18  	"math"
    19  	"os/exec"
    20  	"regexp"
    21  	"strconv"
    22  	"strings"
    23  	"time"
    24  	"unicode"
    25  	"unicode/utf8"
    26  
    27  	"github.com/mithrandie/csvq/lib/json"
    28  	"github.com/mithrandie/csvq/lib/option"
    29  	"github.com/mithrandie/csvq/lib/parser"
    30  	"github.com/mithrandie/csvq/lib/value"
    31  
    32  	"github.com/mithrandie/go-text"
    33  	txjson "github.com/mithrandie/go-text/json"
    34  	"github.com/mithrandie/ternary"
    35  )
    36  
    37  type BuiltInFunction func(parser.Function, []value.Primary, *option.Flags) (value.Primary, error)
    38  
    39  var Functions = map[string]BuiltInFunction{
    40  	"COALESCE":               Coalesce,
    41  	"IF":                     If,
    42  	"IFNULL":                 Ifnull,
    43  	"NULLIF":                 Nullif,
    44  	"CEIL":                   Ceil,
    45  	"FLOOR":                  Floor,
    46  	"ROUND":                  Round,
    47  	"ABS":                    Abs,
    48  	"ACOS":                   Acos,
    49  	"ACOSH":                  Acosh,
    50  	"ASIN":                   Asin,
    51  	"ASINH":                  Asinh,
    52  	"ATAN":                   Atan,
    53  	"ATAN2":                  Atan2,
    54  	"ATANH":                  Atanh,
    55  	"CBRT":                   Cbrt,
    56  	"COS":                    Cos,
    57  	"COSH":                   Cosh,
    58  	"EXP":                    Exp,
    59  	"EXP2":                   Exp2,
    60  	"EXPM1":                  Expm1,
    61  	"IS_INF":                 IsInf,
    62  	"IS_NAN":                 IsNaN,
    63  	"LOG":                    MathLog,
    64  	"LOG10":                  Log10,
    65  	"LOG1P":                  Log1p,
    66  	"LOG2":                   Log2,
    67  	"LOGB":                   Logb,
    68  	"POW":                    Pow,
    69  	"SIN":                    Sin,
    70  	"SINH":                   Sinh,
    71  	"SQRT":                   Sqrt,
    72  	"TAN":                    Tan,
    73  	"TANH":                   Tanh,
    74  	"BIN_TO_DEC":             BinToDec,
    75  	"OCT_TO_DEC":             OctToDec,
    76  	"HEX_TO_DEC":             HexToDec,
    77  	"ENOTATION_TO_DEC":       EnotationToDec,
    78  	"BIN":                    Bin,
    79  	"OCT":                    Oct,
    80  	"HEX":                    Hex,
    81  	"ENOTATION":              Enotation,
    82  	"NUMBER_FORMAT":          NumberFormat,
    83  	"RAND":                   Rand,
    84  	"TRIM":                   Trim,
    85  	"LTRIM":                  Ltrim,
    86  	"RTRIM":                  Rtrim,
    87  	"UPPER":                  Upper,
    88  	"LOWER":                  Lower,
    89  	"BASE64_ENCODE":          Base64Encode,
    90  	"BASE64_DECODE":          Base64Decode,
    91  	"HEX_ENCODE":             HexEncode,
    92  	"HEX_DECODE":             HexDecode,
    93  	"LEN":                    Len,
    94  	"BYTE_LEN":               ByteLen,
    95  	"WIDTH":                  Width,
    96  	"LPAD":                   Lpad,
    97  	"RPAD":                   Rpad,
    98  	"SUBSTRING":              Substring,
    99  	"SUBSTR":                 Substr,
   100  	"INSTR":                  Instr,
   101  	"LIST_ELEM":              ListElem,
   102  	"REPLACE":                ReplaceFn,
   103  	"REGEXP_MATCH":           RegExpMatch,
   104  	"REGEXP_FIND":            RegExpFind,
   105  	"REGEXP_FIND_SUBMATCHES": RegExpFindSubMatches,
   106  	"REGEXP_FIND_ALL":        RegExpFindAll,
   107  	"REGEXP_REPLACE":         RegExpReplace,
   108  	"TITLE_CASE":             TitleCase,
   109  	"FORMAT":                 Format,
   110  	"JSON_VALUE":             JsonValue,
   111  	"MD5":                    Md5,
   112  	"SHA1":                   Sha1,
   113  	"SHA256":                 Sha256,
   114  	"SHA512":                 Sha512,
   115  	"MD5_HMAC":               Md5Hmac,
   116  	"SHA1_HMAC":              Sha1Hmac,
   117  	"SHA256_HMAC":            Sha256Hmac,
   118  	"SHA512_HMAC":            Sha512Hmac,
   119  	"DATETIME_FORMAT":        DatetimeFormat,
   120  	"YEAR":                   Year,
   121  	"MONTH":                  Month,
   122  	"DAY":                    Day,
   123  	"HOUR":                   Hour,
   124  	"MINUTE":                 Minute,
   125  	"SECOND":                 Second,
   126  	"MILLISECOND":            Millisecond,
   127  	"MICROSECOND":            Microsecond,
   128  	"NANOSECOND":             Nanosecond,
   129  	"WEEKDAY":                Weekday,
   130  	"UNIX_TIME":              UnixTime,
   131  	"UNIX_NANO_TIME":         UnixNanoTime,
   132  	"DAY_OF_YEAR":            DayOfYear,
   133  	"WEEK_OF_YEAR":           WeekOfYear,
   134  	"ADD_YEAR":               AddYear,
   135  	"ADD_MONTH":              AddMonth,
   136  	"ADD_DAY":                AddDay,
   137  	"ADD_HOUR":               AddHour,
   138  	"ADD_MINUTE":             AddMinute,
   139  	"ADD_SECOND":             AddSecond,
   140  	"ADD_MILLI":              AddMilli,
   141  	"ADD_MICRO":              AddMicro,
   142  	"ADD_NANO":               AddNano,
   143  	"TRUNC_MONTH":            TruncMonth,
   144  	"TRUNC_DAY":              TruncDay,
   145  	"TRUNC_TIME":             TruncTime,
   146  	"TRUNC_HOUR":             TruncTime,
   147  	"TRUNC_MINUTE":           TruncMinute,
   148  	"TRUNC_SECOND":           TruncSecond,
   149  	"TRUNC_MILLI":            TruncMilli,
   150  	"TRUNC_MICRO":            TruncMicro,
   151  	"TRUNC_NANO":             TruncNano,
   152  	"DATE_DIFF":              DateDiff,
   153  	"TIME_DIFF":              TimeDiff,
   154  	"TIME_NANO_DIFF":         TimeNanoDiff,
   155  	"UTC":                    UTC,
   156  	"MILLI_TO_DATETIME":      MilliToDatetime,
   157  	"NANO_TO_DATETIME":       NanoToDatetime,
   158  	"STRING":                 String,
   159  	"INTEGER":                Integer,
   160  	"FLOAT":                  Float,
   161  	"BOOLEAN":                Boolean,
   162  	"TERNARY":                Ternary,
   163  	"DATETIME":               Datetime,
   164  }
   165  
   166  type Direction string
   167  
   168  const (
   169  	RightDirection Direction = "R"
   170  	LeftDirection            = "L"
   171  )
   172  
   173  type PaddingType string
   174  
   175  const (
   176  	PaddingRuneCount PaddingType = "LEN"
   177  	PaddingByteCount PaddingType = "BYTE"
   178  	PaddingWidth     PaddingType = "WIDTH"
   179  )
   180  
   181  func Coalesce(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   182  	if len(args) < 1 {
   183  		return nil, NewFunctionArgumentLengthErrorWithCustomArgs(fn, fn.Name, "at least 1 argument")
   184  	}
   185  
   186  	for _, arg := range args {
   187  		if !value.IsNull(arg) {
   188  			return arg, nil
   189  		}
   190  	}
   191  	return value.NewNull(), nil
   192  }
   193  
   194  func If(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   195  	if len(args) != 3 {
   196  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{3})
   197  	}
   198  
   199  	if args[0].Ternary() == ternary.TRUE {
   200  		return args[1], nil
   201  	}
   202  	return args[2], nil
   203  }
   204  
   205  func Ifnull(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   206  	if len(args) != 2 {
   207  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
   208  	}
   209  
   210  	if value.IsNull(args[0]) {
   211  		return args[1], nil
   212  	}
   213  	return args[0], nil
   214  }
   215  
   216  func Nullif(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
   217  	if len(args) != 2 {
   218  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
   219  	}
   220  
   221  	if value.Equal(args[0], args[1], flags.DatetimeFormat, flags.GetTimeLocation()) == ternary.TRUE {
   222  		return value.NewNull(), nil
   223  	}
   224  	return args[0], nil
   225  }
   226  
   227  func roundParams(args []value.Primary) (number float64, place float64, isnull bool, argsErr bool) {
   228  	if len(args) < 1 || 2 < len(args) {
   229  		argsErr = true
   230  		return
   231  	}
   232  
   233  	f := value.ToFloat(args[0])
   234  	if value.IsNull(f) {
   235  		isnull = true
   236  		return
   237  	}
   238  	number = f.(*value.Float).Raw()
   239  	value.Discard(f)
   240  
   241  	if len(args) == 2 {
   242  		i := value.ToInteger(args[1])
   243  		if value.IsNull(i) {
   244  			isnull = true
   245  			return
   246  		}
   247  		place = float64(i.(*value.Integer).Raw())
   248  		value.Discard(i)
   249  	}
   250  	return
   251  }
   252  
   253  func Ceil(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   254  	number, place, isnull, argsErr := roundParams(args)
   255  	if argsErr {
   256  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   257  	}
   258  	if isnull {
   259  		return value.NewNull(), nil
   260  	}
   261  
   262  	pow := math.Pow(10, place)
   263  	r := math.Ceil(pow*number) / pow
   264  	return value.NewFloat(r), nil
   265  }
   266  
   267  func Floor(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   268  	number, place, isnull, argsErr := roundParams(args)
   269  	if argsErr {
   270  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   271  	}
   272  	if isnull {
   273  		return value.NewNull(), nil
   274  	}
   275  
   276  	pow := math.Pow(10, place)
   277  	r := math.Floor(pow*number) / pow
   278  	return value.NewFloat(r), nil
   279  }
   280  
   281  func round(f float64, place float64) float64 {
   282  	pow := math.Pow(10, place)
   283  	var r float64
   284  	if f < 0 {
   285  		r = math.Ceil(pow*f-0.5) / pow
   286  	} else {
   287  		r = math.Floor(pow*f+0.5) / pow
   288  	}
   289  	return r
   290  }
   291  
   292  func Round(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   293  	number, place, isnull, argsErr := roundParams(args)
   294  	if argsErr {
   295  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   296  	}
   297  	if isnull {
   298  		return value.NewNull(), nil
   299  	}
   300  
   301  	return value.NewFloat(round(number, place)), nil
   302  }
   303  
   304  func execMath1Arg(fn parser.Function, args []value.Primary, mathf func(float64) float64) (value.Primary, error) {
   305  	if len(args) != 1 {
   306  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   307  	}
   308  
   309  	f := value.ToFloat(args[0])
   310  	if value.IsNull(f) {
   311  		return value.NewNull(), nil
   312  	}
   313  	result := mathf(f.(*value.Float).Raw())
   314  	value.Discard(f)
   315  
   316  	return value.NewFloat(result), nil
   317  }
   318  
   319  func execMath2Args(fn parser.Function, args []value.Primary, mathf func(float64, float64) float64) (value.Primary, error) {
   320  	if len(args) != 2 {
   321  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
   322  	}
   323  
   324  	f1 := value.ToFloat(args[0])
   325  	if value.IsNull(f1) {
   326  		return value.NewNull(), nil
   327  	}
   328  
   329  	f2 := value.ToFloat(args[1])
   330  	if value.IsNull(f2) {
   331  		value.Discard(f1)
   332  		return value.NewNull(), nil
   333  	}
   334  	result := mathf(f1.(*value.Float).Raw(), f2.(*value.Float).Raw())
   335  	value.Discard(f1)
   336  	value.Discard(f2)
   337  
   338  	return value.NewFloat(result), nil
   339  }
   340  
   341  func Abs(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   342  	return execMath1Arg(fn, args, math.Abs)
   343  }
   344  
   345  func Acos(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   346  	return execMath1Arg(fn, args, math.Acos)
   347  }
   348  
   349  func Acosh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   350  	return execMath1Arg(fn, args, math.Acosh)
   351  }
   352  
   353  func Asin(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   354  	return execMath1Arg(fn, args, math.Asin)
   355  }
   356  
   357  func Asinh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   358  	return execMath1Arg(fn, args, math.Asinh)
   359  }
   360  
   361  func Atan(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   362  	return execMath1Arg(fn, args, math.Atan)
   363  }
   364  
   365  func Atan2(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   366  	return execMath2Args(fn, args, math.Atan2)
   367  }
   368  
   369  func Atanh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   370  	return execMath1Arg(fn, args, math.Atanh)
   371  }
   372  
   373  func Cbrt(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   374  	return execMath1Arg(fn, args, math.Cbrt)
   375  }
   376  
   377  func Cos(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   378  	return execMath1Arg(fn, args, math.Cos)
   379  }
   380  
   381  func Cosh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   382  	return execMath1Arg(fn, args, math.Cosh)
   383  }
   384  
   385  func Exp(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   386  	return execMath1Arg(fn, args, math.Exp)
   387  }
   388  
   389  func Exp2(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   390  	return execMath1Arg(fn, args, math.Exp2)
   391  }
   392  
   393  func Expm1(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   394  	return execMath1Arg(fn, args, math.Expm1)
   395  }
   396  
   397  func IsInf(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   398  	if len(args) < 1 {
   399  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   400  	}
   401  
   402  	f1 := value.ToFloat(args[0])
   403  	if value.IsNull(f1) {
   404  		return value.NewTernary(ternary.FALSE), nil
   405  	}
   406  
   407  	sign := 0
   408  	if len(args) == 2 {
   409  		f2 := value.ToIntegerStrictly(args[1])
   410  		if !value.IsNull(f2) {
   411  			sign = int(f2.(*value.Integer).Raw())
   412  		}
   413  	}
   414  
   415  	return value.NewTernary(ternary.ConvertFromBool(math.IsInf(f1.(*value.Float).Raw(), sign))), nil
   416  }
   417  
   418  func IsNaN(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   419  	if len(args) != 1 {
   420  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   421  	}
   422  
   423  	f := value.ToFloat(args[0])
   424  	if value.IsNull(f) {
   425  		return value.NewTernary(ternary.FALSE), nil
   426  	}
   427  
   428  	return value.NewTernary(ternary.ConvertFromBool(math.IsNaN(f.(*value.Float).Raw()))), nil
   429  }
   430  
   431  func MathLog(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   432  	return execMath1Arg(fn, args, math.Log)
   433  }
   434  
   435  func Log10(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   436  	return execMath1Arg(fn, args, math.Log10)
   437  }
   438  
   439  func Log1p(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   440  	return execMath1Arg(fn, args, math.Log1p)
   441  }
   442  
   443  func Log2(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   444  	return execMath1Arg(fn, args, math.Log2)
   445  }
   446  
   447  func Logb(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   448  	return execMath1Arg(fn, args, math.Logb)
   449  }
   450  
   451  func Pow(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   452  	return execMath2Args(fn, args, math.Pow)
   453  }
   454  
   455  func Sin(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   456  	return execMath1Arg(fn, args, math.Sin)
   457  }
   458  
   459  func Sinh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   460  	return execMath1Arg(fn, args, math.Sinh)
   461  }
   462  
   463  func Sqrt(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   464  	return execMath1Arg(fn, args, math.Sqrt)
   465  }
   466  
   467  func Tan(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   468  	return execMath1Arg(fn, args, math.Tan)
   469  }
   470  
   471  func Tanh(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   472  	return execMath1Arg(fn, args, math.Tanh)
   473  }
   474  
   475  func execParseInt(fn parser.Function, args []value.Primary, base int) (value.Primary, error) {
   476  	if len(args) != 1 {
   477  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   478  	}
   479  
   480  	p := value.ToString(args[0])
   481  	if value.IsNull(p) {
   482  		return value.NewNull(), nil
   483  	}
   484  	s := p.(*value.String).Raw()
   485  	value.Discard(p)
   486  
   487  	if base == 16 {
   488  		s = ltrim(s, "0x")
   489  	}
   490  
   491  	i, err := strconv.ParseInt(s, base, 64)
   492  	if err != nil {
   493  		return value.NewNull(), nil
   494  	}
   495  
   496  	return value.NewInteger(i), nil
   497  }
   498  
   499  func execFormatInt(fn parser.Function, args []value.Primary, base int) (value.Primary, error) {
   500  	if len(args) != 1 {
   501  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   502  	}
   503  
   504  	p := value.ToInteger(args[0])
   505  	if value.IsNull(p) {
   506  		return value.NewNull(), nil
   507  	}
   508  	s := strconv.FormatInt(p.(*value.Integer).Raw(), base)
   509  	value.Discard(p)
   510  
   511  	return value.NewString(s), nil
   512  }
   513  
   514  func BinToDec(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   515  	return execParseInt(fn, args, 2)
   516  }
   517  
   518  func OctToDec(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   519  	return execParseInt(fn, args, 8)
   520  }
   521  
   522  func HexToDec(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   523  	return execParseInt(fn, args, 16)
   524  }
   525  
   526  func EnotationToDec(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   527  	if len(args) != 1 {
   528  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   529  	}
   530  
   531  	p := value.ToString(args[0])
   532  	if value.IsNull(p) {
   533  		return value.NewNull(), nil
   534  	}
   535  
   536  	f, err := strconv.ParseFloat(p.(*value.String).Raw(), 64)
   537  	value.Discard(p)
   538  	if err != nil {
   539  		return value.NewNull(), nil
   540  	}
   541  
   542  	return value.NewFloat(f), nil
   543  }
   544  
   545  func Bin(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   546  	return execFormatInt(fn, args, 2)
   547  }
   548  
   549  func Oct(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   550  	return execFormatInt(fn, args, 8)
   551  }
   552  
   553  func Hex(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   554  	return execFormatInt(fn, args, 16)
   555  }
   556  
   557  func Enotation(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   558  	if len(args) != 1 {
   559  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   560  	}
   561  
   562  	p := value.ToFloat(args[0])
   563  	if value.IsNull(p) {
   564  		return value.NewNull(), nil
   565  	}
   566  	s := strconv.FormatFloat(p.(*value.Float).Raw(), 'e', -1, 64)
   567  	value.Discard(p)
   568  
   569  	return value.NewString(s), nil
   570  }
   571  
   572  func NumberFormat(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   573  	if len(args) < 1 || 5 < len(args) {
   574  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2, 3, 4, 5})
   575  	}
   576  
   577  	p := value.ToFloat(args[0])
   578  	if value.IsNull(p) {
   579  		return value.NewNull(), nil
   580  	}
   581  
   582  	precision := -1
   583  	decimalPoint := "."
   584  	thousandsSeparator := ","
   585  	decimalSeparator := ""
   586  
   587  	if 1 < len(args) {
   588  		i := value.ToInteger(args[1])
   589  		if !value.IsNull(i) {
   590  			precision = int(i.(*value.Integer).Raw())
   591  			value.Discard(i)
   592  		}
   593  	}
   594  	if 2 < len(args) {
   595  		i := value.ToString(args[2])
   596  		if !value.IsNull(i) {
   597  			decimalPoint = i.(*value.String).Raw()
   598  			value.Discard(i)
   599  		}
   600  	}
   601  	if 3 < len(args) {
   602  		i := value.ToString(args[3])
   603  		if !value.IsNull(i) {
   604  			thousandsSeparator = i.(*value.String).Raw()
   605  			value.Discard(i)
   606  		}
   607  	}
   608  	if 4 < len(args) {
   609  		i := value.ToString(args[4])
   610  		if !value.IsNull(i) {
   611  			decimalSeparator = i.(*value.String).Raw()
   612  			value.Discard(i)
   613  		}
   614  	}
   615  
   616  	s := option.FormatNumber(p.(*value.Float).Raw(), precision, decimalPoint, thousandsSeparator, decimalSeparator)
   617  	value.Discard(p)
   618  
   619  	return value.NewString(s), nil
   620  }
   621  
   622  func Rand(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   623  	if 0 < len(args) && len(args) != 2 {
   624  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{0, 2})
   625  	}
   626  
   627  	r := option.GetRand()
   628  
   629  	if len(args) == 0 {
   630  		return value.NewFloat(r.Float64()), nil
   631  	}
   632  
   633  	p1 := value.ToInteger(args[0])
   634  	if value.IsNull(p1) {
   635  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "the first argument must be an integer")
   636  	}
   637  	low := p1.(*value.Integer).Raw()
   638  	value.Discard(p1)
   639  
   640  	p2 := value.ToInteger(args[1])
   641  	if value.IsNull(p2) {
   642  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "the second argument must be an integer")
   643  	}
   644  	high := p2.(*value.Integer).Raw()
   645  	value.Discard(p2)
   646  
   647  	if high <= low {
   648  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "the second argument must be greater than the first argument")
   649  	}
   650  	delta := high - low + 1
   651  	return value.NewInteger(r.Int63n(delta) + low), nil
   652  }
   653  
   654  func execStrings1Arg(fn parser.Function, args []value.Primary, stringsf func(string) string) (value.Primary, error) {
   655  	if len(args) != 1 {
   656  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   657  	}
   658  
   659  	s := value.ToString(args[0])
   660  	if value.IsNull(s) {
   661  		return value.NewNull(), nil
   662  	}
   663  
   664  	result := stringsf(s.(*value.String).Raw())
   665  	value.Discard(s)
   666  
   667  	return value.NewString(result), nil
   668  }
   669  
   670  func execStringsTrim(fn parser.Function, args []value.Primary, stringsf func(string, string) string) (value.Primary, error) {
   671  	if len(args) < 1 || 2 < len(args) {
   672  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   673  	}
   674  
   675  	s := value.ToString(args[0])
   676  	if value.IsNull(s) {
   677  		return value.NewNull(), nil
   678  	}
   679  
   680  	cutset := ""
   681  	if 2 == len(args) {
   682  		cs := value.ToString(args[1])
   683  		if value.IsNull(cs) {
   684  			value.Discard(s)
   685  			return value.NewNull(), nil
   686  		}
   687  		cutset = cs.(*value.String).Raw()
   688  		value.Discard(cs)
   689  	}
   690  
   691  	result := stringsf(s.(*value.String).Raw(), cutset)
   692  	value.Discard(s)
   693  
   694  	return value.NewString(result), nil
   695  }
   696  
   697  func base64Encode(s string) string {
   698  	return base64.StdEncoding.EncodeToString([]byte(s))
   699  }
   700  
   701  func base64Decode(s string) string {
   702  	bytes, _ := base64.StdEncoding.DecodeString(s)
   703  	return string(bytes)
   704  }
   705  
   706  func hexEncode(s string) string {
   707  	return hex.EncodeToString([]byte(s))
   708  }
   709  
   710  func hexDecode(s string) string {
   711  	bytes, _ := hex.DecodeString(s)
   712  	return string(bytes)
   713  }
   714  
   715  func trim(s string, cutset string) string {
   716  	if len(cutset) < 1 {
   717  		return strings.TrimSpace(s)
   718  	}
   719  	return strings.Trim(s, cutset)
   720  }
   721  
   722  func ltrim(s string, cutset string) string {
   723  	if len(cutset) < 1 {
   724  		return strings.TrimLeftFunc(s, unicode.IsSpace)
   725  	}
   726  	return strings.TrimLeft(s, cutset)
   727  }
   728  
   729  func rtrim(s string, cutset string) string {
   730  	if len(cutset) < 1 {
   731  		return strings.TrimRightFunc(s, unicode.IsSpace)
   732  	}
   733  	return strings.TrimRight(s, cutset)
   734  }
   735  
   736  func execStringsLen(fn parser.Function, args []value.Primary, stringsf func(string) int) (value.Primary, error) {
   737  	if len(args) != 1 {
   738  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   739  	}
   740  
   741  	s := value.ToString(args[0])
   742  	if value.IsNull(s) {
   743  		return value.NewNull(), nil
   744  	}
   745  	result := stringsf(s.(*value.String).Raw())
   746  	value.Discard(s)
   747  
   748  	return value.NewInteger(int64(result)), nil
   749  }
   750  
   751  func execStringsPadding(fn parser.Function, args []value.Primary, direction Direction, flags *option.Flags) (value.Primary, error) {
   752  	if len(args) < 3 || 5 < len(args) {
   753  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{3, 4, 5})
   754  	}
   755  
   756  	s := value.ToString(args[0])
   757  	if value.IsNull(s) {
   758  		return value.NewNull(), nil
   759  	}
   760  	str := s.(*value.String).Raw()
   761  	value.Discard(s)
   762  
   763  	l := value.ToInteger(args[1])
   764  	if value.IsNull(l) {
   765  		return value.NewNull(), nil
   766  	}
   767  	length := int(l.(*value.Integer).Raw())
   768  	value.Discard(l)
   769  
   770  	p := value.ToString(args[2])
   771  	if value.IsNull(p) {
   772  		return value.NewNull(), nil
   773  	}
   774  	padstr := p.(*value.String).Raw()
   775  	value.Discard(p)
   776  
   777  	padType := PaddingRuneCount
   778  	if 3 < len(args) {
   779  		t := value.ToString(args[3])
   780  		if !value.IsNull(t) {
   781  			switch PaddingType(strings.ToUpper(t.(*value.String).Raw())) {
   782  			case PaddingRuneCount:
   783  				// Do Nothing
   784  			case PaddingByteCount:
   785  				padType = PaddingByteCount
   786  			case PaddingWidth:
   787  				padType = PaddingWidth
   788  			default:
   789  				return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "padding type must be one of LEN|BYTE|WIDTH")
   790  			}
   791  			value.Discard(t)
   792  		}
   793  	}
   794  
   795  	enc := text.UTF8
   796  	if 4 < len(args) {
   797  		encs := value.ToString(args[4])
   798  		if !value.IsNull(encs) {
   799  			e, err := option.ParseEncoding(encs.(*value.String).Raw())
   800  			value.Discard(encs)
   801  
   802  			if err != nil || e == text.AUTO {
   803  				return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "encoding must be one of UTF8|UTF16|SJIS")
   804  			}
   805  			enc = e
   806  		}
   807  	}
   808  
   809  	var strLen int
   810  	var padstrLen int
   811  	switch padType {
   812  	case PaddingRuneCount:
   813  		strLen = utf8.RuneCountInString(str)
   814  		padstrLen = utf8.RuneCountInString(padstr)
   815  	case PaddingByteCount:
   816  		strLen = text.ByteSize(str, enc)
   817  		padstrLen = text.ByteSize(padstr, enc)
   818  	case PaddingWidth:
   819  		strLen = option.TextWidth(str, flags)
   820  		padstrLen = option.TextWidth(padstr, flags)
   821  	}
   822  
   823  	if length <= strLen {
   824  		return args[0], nil
   825  	}
   826  
   827  	padLen := length - strLen
   828  	repeat := int(math.Ceil(float64(padLen) / float64(padstrLen)))
   829  	padding := strings.Repeat(padstr, repeat)
   830  	switch padType {
   831  	case PaddingRuneCount:
   832  		padding = string([]rune(padding)[:padLen])
   833  	default:
   834  		buf := make([]rune, 0, len(padding))
   835  		w := 0
   836  		l := 0
   837  		for _, r := range padding {
   838  			switch padType {
   839  			case PaddingByteCount:
   840  				w = text.RuneByteSize(r, enc)
   841  			default:
   842  				w = option.RuneWidth(r, flags)
   843  			}
   844  			l = l + w
   845  			buf = append(buf, r)
   846  			if padLen == l {
   847  				break
   848  			} else if padLen < l {
   849  				return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "cannot split pad string in a byte array of a character")
   850  			}
   851  		}
   852  		padding = string(buf)
   853  	}
   854  
   855  	if direction == RightDirection {
   856  		str = str + padding
   857  	} else {
   858  		str = padding + str
   859  	}
   860  
   861  	return value.NewString(str), nil
   862  }
   863  
   864  func execCrypto(fn parser.Function, args []value.Primary, cryptof func() hash.Hash) (value.Primary, error) {
   865  	if 1 != len(args) {
   866  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   867  	}
   868  
   869  	s := value.ToString(args[0])
   870  	if value.IsNull(s) {
   871  		return value.NewNull(), nil
   872  	}
   873  
   874  	h := cryptof()
   875  	h.Write([]byte(s.(*value.String).Raw()))
   876  	r := hex.EncodeToString(h.Sum(nil))
   877  	value.Discard(s)
   878  
   879  	return value.NewString(r), nil
   880  
   881  }
   882  
   883  func execCryptoHMAC(fn parser.Function, args []value.Primary, cryptof func() hash.Hash) (value.Primary, error) {
   884  	if 2 != len(args) {
   885  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
   886  	}
   887  
   888  	s := value.ToString(args[0])
   889  	if value.IsNull(s) {
   890  		return value.NewNull(), nil
   891  	}
   892  
   893  	key := value.ToString(args[1])
   894  	if value.IsNull(key) {
   895  		value.Discard(s)
   896  		return value.NewNull(), nil
   897  	}
   898  
   899  	h := hmac.New(cryptof, []byte(key.(*value.String).Raw()))
   900  	h.Write([]byte(s.(*value.String).Raw()))
   901  	r := hex.EncodeToString(h.Sum(nil))
   902  	value.Discard(s)
   903  	value.Discard(key)
   904  
   905  	return value.NewString(r), nil
   906  }
   907  
   908  func Trim(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   909  	return execStringsTrim(fn, args, trim)
   910  }
   911  
   912  func Ltrim(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   913  	return execStringsTrim(fn, args, ltrim)
   914  }
   915  
   916  func Rtrim(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   917  	return execStringsTrim(fn, args, rtrim)
   918  }
   919  
   920  func Upper(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   921  	return execStrings1Arg(fn, args, strings.ToUpper)
   922  }
   923  
   924  func Lower(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   925  	return execStrings1Arg(fn, args, strings.ToLower)
   926  }
   927  
   928  func Base64Encode(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   929  	return execStrings1Arg(fn, args, base64Encode)
   930  }
   931  
   932  func Base64Decode(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   933  	return execStrings1Arg(fn, args, base64Decode)
   934  }
   935  
   936  func HexEncode(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   937  	return execStrings1Arg(fn, args, hexEncode)
   938  }
   939  
   940  func HexDecode(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   941  	return execStrings1Arg(fn, args, hexDecode)
   942  }
   943  
   944  func Len(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   945  	return execStringsLen(fn, args, utf8.RuneCountInString)
   946  }
   947  
   948  func ByteLen(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
   949  	if len(args) < 1 || 2 < len(args) {
   950  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
   951  	}
   952  
   953  	s := value.ToString(args[0])
   954  	if value.IsNull(s) {
   955  		return value.NewNull(), nil
   956  	}
   957  
   958  	enc := text.UTF8
   959  	if 1 < len(args) {
   960  		encs := value.ToString(args[1])
   961  		if !value.IsNull(encs) {
   962  			e, err := option.ParseEncoding(encs.(*value.String).Raw())
   963  			value.Discard(encs)
   964  
   965  			if err != nil || e == text.AUTO {
   966  				value.Discard(s)
   967  				return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "encoding must be one of UTF8|UTF16|SJIS")
   968  			}
   969  			enc = e
   970  		}
   971  	}
   972  
   973  	i := int64(text.ByteSize(s.(*value.String).Raw(), enc))
   974  	value.Discard(s)
   975  
   976  	return value.NewInteger(i), nil
   977  }
   978  
   979  func Width(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
   980  	if len(args) != 1 {
   981  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
   982  	}
   983  
   984  	s := value.ToString(args[0])
   985  	if value.IsNull(s) {
   986  		return value.NewNull(), nil
   987  	}
   988  	result := option.TextWidth(s.(*value.String).Raw(), flags)
   989  	value.Discard(s)
   990  
   991  	return value.NewInteger(int64(result)), nil
   992  }
   993  
   994  func Lpad(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
   995  	return execStringsPadding(fn, args, LeftDirection, flags)
   996  }
   997  
   998  func Rpad(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
   999  	return execStringsPadding(fn, args, RightDirection, flags)
  1000  }
  1001  
  1002  func substr(fn parser.Function, args []value.Primary, zeroBasedIndex bool) (value.Primary, error) {
  1003  	if len(args) < 2 || 3 < len(args) {
  1004  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2, 3})
  1005  	}
  1006  
  1007  	s := value.ToString(args[0])
  1008  	if value.IsNull(s) {
  1009  		return value.NewNull(), nil
  1010  	}
  1011  	runes := []rune(s.(*value.String).Raw())
  1012  	value.Discard(s)
  1013  
  1014  	strlen := len(runes)
  1015  	start := 0
  1016  	end := strlen
  1017  
  1018  	i := value.ToInteger(args[1])
  1019  	if value.IsNull(i) {
  1020  		return value.NewNull(), nil
  1021  	}
  1022  	start = int(i.(*value.Integer).Raw())
  1023  	value.Discard(i)
  1024  
  1025  	if !zeroBasedIndex && start > 0 {
  1026  		start = start - 1
  1027  	}
  1028  	if start < 0 {
  1029  		start = strlen + start
  1030  	}
  1031  	if start < 0 || strlen <= start {
  1032  		return value.NewNull(), nil
  1033  	}
  1034  
  1035  	if 3 == len(args) {
  1036  		i := value.ToInteger(args[2])
  1037  		if value.IsNull(i) {
  1038  			return value.NewNull(), nil
  1039  		}
  1040  		sublen := int(i.(*value.Integer).Raw())
  1041  		value.Discard(i)
  1042  
  1043  		if sublen < 0 {
  1044  			return value.NewNull(), nil
  1045  		}
  1046  		end = start + sublen
  1047  		if strlen < end {
  1048  			end = strlen
  1049  		}
  1050  	}
  1051  
  1052  	return value.NewString(string(runes[start:end])), nil
  1053  }
  1054  
  1055  func Substring(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1056  	return substr(fn, args, false)
  1057  }
  1058  
  1059  func Substr(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1060  	return substr(fn, args, true)
  1061  }
  1062  
  1063  func Instr(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1064  	if len(args) < 2 || 2 < len(args) {
  1065  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1066  	}
  1067  
  1068  	s := value.ToString(args[0])
  1069  	if value.IsNull(s) {
  1070  		return value.NewNull(), nil
  1071  	}
  1072  
  1073  	substr := value.ToString(args[1])
  1074  	if value.IsNull(substr) {
  1075  		value.Discard(s)
  1076  		return value.NewNull(), nil
  1077  	}
  1078  
  1079  	index := strings.Index(s.(*value.String).Raw(), substr.(*value.String).Raw())
  1080  	value.Discard(s)
  1081  	value.Discard(substr)
  1082  
  1083  	if index < 0 {
  1084  		return value.NewNull(), nil
  1085  	}
  1086  	return value.NewInteger(int64(index)), nil
  1087  }
  1088  
  1089  func ListElem(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1090  	if len(args) < 3 || 3 < len(args) {
  1091  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{3})
  1092  	}
  1093  
  1094  	s := value.ToString(args[0])
  1095  	if value.IsNull(s) {
  1096  		return value.NewNull(), nil
  1097  	}
  1098  	str := s.(*value.String).Raw()
  1099  	value.Discard(s)
  1100  
  1101  	sep := value.ToString(args[1])
  1102  	if value.IsNull(sep) {
  1103  		return value.NewNull(), nil
  1104  	}
  1105  	sepStr := sep.(*value.String).Raw()
  1106  	value.Discard(sep)
  1107  
  1108  	i := value.ToInteger(args[2])
  1109  	if value.IsNull(i) {
  1110  		return value.NewNull(), nil
  1111  	}
  1112  	index := int(i.(*value.Integer).Raw())
  1113  	value.Discard(i)
  1114  
  1115  	if index < 0 {
  1116  		return value.NewNull(), nil
  1117  	}
  1118  
  1119  	list := strings.Split(str, sepStr)
  1120  
  1121  	if len(list) <= index {
  1122  		return value.NewNull(), nil
  1123  	}
  1124  	return value.NewString(list[index]), nil
  1125  }
  1126  
  1127  func ReplaceFn(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1128  	if 3 != len(args) {
  1129  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{3})
  1130  	}
  1131  
  1132  	s := value.ToString(args[0])
  1133  	if value.IsNull(s) {
  1134  		return value.NewNull(), nil
  1135  	}
  1136  	str := s.(*value.String).Raw()
  1137  	value.Discard(s)
  1138  
  1139  	oldstr := value.ToString(args[1])
  1140  	if value.IsNull(oldstr) {
  1141  		return value.NewNull(), nil
  1142  	}
  1143  	oldStr := oldstr.(*value.String).Raw()
  1144  	value.Discard(oldstr)
  1145  
  1146  	newstr := value.ToString(args[2])
  1147  	if value.IsNull(newstr) {
  1148  		return value.NewNull(), nil
  1149  	}
  1150  	newStr := newstr.(*value.String).Raw()
  1151  	value.Discard(newstr)
  1152  
  1153  	r := strings.Replace(str, oldStr, newStr, -1)
  1154  	return value.NewString(r), nil
  1155  }
  1156  
  1157  var regExpStrIsNull = errors.New("cannot convert the value to string")
  1158  
  1159  func prepareRegExp(fn parser.Function, str value.Primary, expr value.Primary, flags value.Primary) (string, *regexp.Regexp, error) {
  1160  	sVal := value.ToString(str)
  1161  	if value.IsNull(sVal) {
  1162  		return "", nil, regExpStrIsNull
  1163  	}
  1164  	s := sVal.(*value.String).Raw()
  1165  	value.Discard(sVal)
  1166  
  1167  	exprVal := value.ToString(expr)
  1168  	if value.IsNull(exprVal) {
  1169  		return "", nil, NewFunctionInvalidArgumentError(fn, fn.Name, "pattern must be a string")
  1170  	}
  1171  	exprStr := exprVal.(*value.String).Raw()
  1172  	value.Discard(exprVal)
  1173  
  1174  	if flags != nil && !value.IsNull(flags) {
  1175  		flagsVal := value.ToString(flags)
  1176  		if value.IsNull(flagsVal) {
  1177  			return s, nil, NewFunctionInvalidArgumentError(fn, fn.Name, "flags must be a string")
  1178  		}
  1179  		flagsStr := flagsVal.(*value.String).Raw()
  1180  		value.Discard(flagsVal)
  1181  
  1182  		if !validFlagsRegExp.MatchString(flagsStr) {
  1183  			return s, nil, NewFunctionInvalidArgumentError(fn, fn.Name, fmt.Sprintf("invalid flag %q", flagsStr))
  1184  		}
  1185  
  1186  		exprStr = strings.Join([]string{"(?", flagsStr, ")", exprStr}, "")
  1187  	}
  1188  
  1189  	regExp, err := RegExps.Get(exprStr)
  1190  	if err != nil {
  1191  		return s, nil, NewFunctionInvalidArgumentError(fn, fn.Name, err.Error())
  1192  	}
  1193  
  1194  	return s, regExp, nil
  1195  }
  1196  
  1197  func prepareRegExpMatch(fn parser.Function, args []value.Primary) (string, *regexp.Regexp, error) {
  1198  	if len(args) < 2 || 3 < len(args) {
  1199  		return "", nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2, 3})
  1200  	}
  1201  
  1202  	var flags value.Primary
  1203  	if 2 < len(args) {
  1204  		flags = args[2]
  1205  	}
  1206  
  1207  	return prepareRegExp(fn, args[0], args[1], flags)
  1208  }
  1209  
  1210  func prepareRegExpReplace(fn parser.Function, args []value.Primary) (string, *regexp.Regexp, string, error) {
  1211  	if len(args) < 3 || 4 < len(args) {
  1212  		return "", nil, "", NewFunctionArgumentLengthError(fn, fn.Name, []int{3, 4})
  1213  	}
  1214  
  1215  	var flags value.Primary
  1216  	if 3 < len(args) {
  1217  		flags = args[3]
  1218  	}
  1219  
  1220  	s, regExp, err := prepareRegExp(fn, args[0], args[1], flags)
  1221  
  1222  	replVal := value.ToString(args[2])
  1223  	if value.IsNull(replVal) {
  1224  		return "", nil, "", NewFunctionInvalidArgumentError(fn, fn.Name, "replacement string must be a string")
  1225  	}
  1226  	replStr := replVal.(*value.String).Raw()
  1227  	value.Discard(replVal)
  1228  
  1229  	return s, regExp, replStr, err
  1230  }
  1231  
  1232  func RegExpMatch(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1233  	s, regExp, err := prepareRegExpMatch(fn, args)
  1234  	if err != nil {
  1235  		if err == regExpStrIsNull {
  1236  			return value.NewTernary(ternary.UNKNOWN), nil
  1237  		}
  1238  		return nil, err
  1239  	}
  1240  
  1241  	return value.NewTernary(ternary.ConvertFromBool(regExp.MatchString(s))), nil
  1242  }
  1243  
  1244  func RegExpFind(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1245  	s, regExp, err := prepareRegExpMatch(fn, args)
  1246  	if err != nil {
  1247  		if err == regExpStrIsNull {
  1248  			return value.NewNull(), nil
  1249  		}
  1250  		return nil, err
  1251  	}
  1252  
  1253  	m := regExp.FindStringSubmatch(s)
  1254  
  1255  	switch len(m) {
  1256  	case 0:
  1257  		return value.NewNull(), nil
  1258  	case 1:
  1259  		return value.NewString(m[0]), nil
  1260  	default:
  1261  		return value.NewString(m[1]), err
  1262  	}
  1263  }
  1264  
  1265  func RegExpFindSubMatches(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1266  	s, regExp, err := prepareRegExpMatch(fn, args)
  1267  	if err != nil {
  1268  		if err == regExpStrIsNull {
  1269  			return value.NewNull(), nil
  1270  		}
  1271  		return nil, err
  1272  	}
  1273  
  1274  	m := regExp.FindStringSubmatch(s)
  1275  
  1276  	if len(m) < 1 {
  1277  		return value.NewNull(), nil
  1278  	}
  1279  
  1280  	b, _ := gojson.Marshal(m)
  1281  	return value.NewString(string(b)), err
  1282  }
  1283  
  1284  func RegExpFindAll(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1285  	s, regExp, err := prepareRegExpMatch(fn, args)
  1286  	if err != nil {
  1287  		if err == regExpStrIsNull {
  1288  			return value.NewNull(), nil
  1289  		}
  1290  		return nil, err
  1291  	}
  1292  
  1293  	m := regExp.FindAllStringSubmatch(s, 10)
  1294  
  1295  	if len(m) < 1 {
  1296  		return value.NewNull(), nil
  1297  	}
  1298  
  1299  	b, _ := gojson.Marshal(m)
  1300  	return value.NewString(string(b)), err
  1301  }
  1302  
  1303  func RegExpReplace(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1304  	s, regExp, replStr, err := prepareRegExpReplace(fn, args)
  1305  	if err != nil {
  1306  		if err == regExpStrIsNull {
  1307  			return value.NewNull(), nil
  1308  		}
  1309  		return nil, err
  1310  	}
  1311  
  1312  	return value.NewString(regExp.ReplaceAllString(s, replStr)), nil
  1313  }
  1314  
  1315  func TitleCase(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1316  	if len(args) != 1 {
  1317  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1318  	}
  1319  
  1320  	format := value.ToString(args[0])
  1321  	if value.IsNull(format) {
  1322  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "the first argument must be a string")
  1323  	}
  1324  
  1325  	c := cases.Title(language.English, cases.NoLower)
  1326  	return value.NewString(c.String(format.(*value.String).Raw())), nil
  1327  }
  1328  
  1329  func Format(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1330  	if len(args) < 1 {
  1331  		return nil, NewFunctionArgumentLengthErrorWithCustomArgs(fn, fn.Name, "at least 1 argument")
  1332  	}
  1333  
  1334  	format := value.ToString(args[0])
  1335  	if value.IsNull(format) {
  1336  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, "the first argument must be a string")
  1337  	}
  1338  	str, err := NewStringFormatter().Format(format.(*value.String).Raw(), args[1:])
  1339  	value.Discard(format)
  1340  
  1341  	if err != nil {
  1342  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, err.(Error).Message())
  1343  	}
  1344  	return value.NewString(str), nil
  1345  }
  1346  
  1347  func JsonValue(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1348  	if len(args) != 2 {
  1349  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1350  	}
  1351  
  1352  	query := value.ToString(args[0])
  1353  	if value.IsNull(query) {
  1354  		return value.NewNull(), nil
  1355  	}
  1356  
  1357  	jsonText := value.ToString(args[1])
  1358  	if value.IsNull(jsonText) {
  1359  		value.Discard(query)
  1360  		return value.NewNull(), nil
  1361  	}
  1362  
  1363  	v, err := json.LoadValue(query.(*value.String).Raw(), jsonText.(*value.String).Raw())
  1364  	value.Discard(query)
  1365  	value.Discard(jsonText)
  1366  
  1367  	if err != nil {
  1368  		return v, NewFunctionInvalidArgumentError(fn, fn.Name, err.Error())
  1369  	}
  1370  	return v, nil
  1371  }
  1372  
  1373  func Md5(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1374  	return execCrypto(fn, args, md5.New)
  1375  }
  1376  
  1377  func Sha1(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1378  	return execCrypto(fn, args, sha1.New)
  1379  }
  1380  
  1381  func Sha256(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1382  	return execCrypto(fn, args, sha256.New)
  1383  }
  1384  
  1385  func Sha512(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1386  	return execCrypto(fn, args, sha512.New)
  1387  }
  1388  
  1389  func Md5Hmac(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1390  	return execCryptoHMAC(fn, args, md5.New)
  1391  }
  1392  
  1393  func Sha1Hmac(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1394  	return execCryptoHMAC(fn, args, sha1.New)
  1395  }
  1396  
  1397  func Sha256Hmac(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1398  	return execCryptoHMAC(fn, args, sha256.New)
  1399  }
  1400  
  1401  func Sha512Hmac(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1402  	return execCryptoHMAC(fn, args, sha512.New)
  1403  }
  1404  
  1405  func DatetimeFormat(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1406  	if len(args) != 2 {
  1407  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1408  	}
  1409  
  1410  	p := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1411  	if value.IsNull(p) {
  1412  		return value.NewNull(), nil
  1413  	}
  1414  
  1415  	format := value.ToString(args[1])
  1416  	if value.IsNull(format) {
  1417  		value.Discard(p)
  1418  		return value.NewNull(), nil
  1419  	}
  1420  
  1421  	str := p.(*value.Datetime).Format(value.DatetimeFormats.Get(format.(*value.String).Raw()))
  1422  	value.Discard(p)
  1423  	value.Discard(format)
  1424  
  1425  	return value.NewString(str), nil
  1426  }
  1427  
  1428  func execDatetimeToInt(fn parser.Function, args []value.Primary, timef func(time.Time) int64, flags *option.Flags) (value.Primary, error) {
  1429  	if len(args) != 1 {
  1430  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1431  	}
  1432  
  1433  	dt := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1434  	if value.IsNull(dt) {
  1435  		return value.NewNull(), nil
  1436  	}
  1437  	result := timef(dt.(*value.Datetime).Raw())
  1438  	value.Discard(dt)
  1439  
  1440  	return value.NewInteger(result), nil
  1441  }
  1442  
  1443  func execDatetimeAdd(fn parser.Function, args []value.Primary, timef func(time.Time, int) time.Time, flags *option.Flags) (value.Primary, error) {
  1444  	if len(args) != 2 {
  1445  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1446  	}
  1447  
  1448  	p1 := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1449  	if value.IsNull(p1) {
  1450  		return value.NewNull(), nil
  1451  	}
  1452  
  1453  	p2 := value.ToInteger(args[1])
  1454  	if value.IsNull(p2) {
  1455  		value.Discard(p1)
  1456  		return value.NewNull(), nil
  1457  	}
  1458  
  1459  	dt := p1.(*value.Datetime).Raw()
  1460  	i := int(p2.(*value.Integer).Raw())
  1461  	value.Discard(p1)
  1462  	value.Discard(p2)
  1463  	return value.NewDatetime(timef(dt, i)), nil
  1464  }
  1465  
  1466  func year(t time.Time) int64 {
  1467  	return int64(t.Year())
  1468  }
  1469  
  1470  func month(t time.Time) int64 {
  1471  	return int64(t.Month())
  1472  }
  1473  
  1474  func day(t time.Time) int64 {
  1475  	return int64(t.Day())
  1476  }
  1477  
  1478  func hour(t time.Time) int64 {
  1479  	return int64(t.Hour())
  1480  }
  1481  
  1482  func minute(t time.Time) int64 {
  1483  	return int64(t.Minute())
  1484  }
  1485  
  1486  func second(t time.Time) int64 {
  1487  	return int64(t.Second())
  1488  }
  1489  
  1490  func millisecond(t time.Time) int64 {
  1491  	return int64(round(float64(t.Nanosecond())/1e6, 0))
  1492  }
  1493  
  1494  func microsecond(t time.Time) int64 {
  1495  	return int64(round(float64(t.Nanosecond())/1e3, 0))
  1496  }
  1497  
  1498  func nanosecond(t time.Time) int64 {
  1499  	return int64(t.Nanosecond())
  1500  }
  1501  
  1502  func weekday(t time.Time) int64 {
  1503  	return int64(t.Weekday())
  1504  }
  1505  
  1506  func unixTime(t time.Time) int64 {
  1507  	return t.Unix()
  1508  }
  1509  
  1510  func unixNanoTime(t time.Time) int64 {
  1511  	return t.UnixNano()
  1512  }
  1513  
  1514  func dayOfYear(t time.Time) int64 {
  1515  	return int64(t.YearDay())
  1516  }
  1517  
  1518  func weekOfYear(t time.Time) int64 {
  1519  	_, w := t.ISOWeek()
  1520  	return int64(w)
  1521  }
  1522  
  1523  func addYear(t time.Time, duration int) time.Time {
  1524  	return t.AddDate(duration, 0, 0)
  1525  }
  1526  
  1527  func addMonth(t time.Time, duration int) time.Time {
  1528  	return t.AddDate(0, duration, 0)
  1529  }
  1530  
  1531  func addDay(t time.Time, duration int) time.Time {
  1532  	return t.AddDate(0, 0, duration)
  1533  }
  1534  
  1535  func addHour(t time.Time, duration int) time.Time {
  1536  	dur := time.Duration(duration)
  1537  	return t.Add(dur * time.Hour)
  1538  }
  1539  
  1540  func addMinute(t time.Time, duration int) time.Time {
  1541  	dur := time.Duration(duration)
  1542  	return t.Add(dur * time.Minute)
  1543  }
  1544  
  1545  func addSecond(t time.Time, duration int) time.Time {
  1546  	dur := time.Duration(duration)
  1547  	return t.Add(dur * time.Second)
  1548  }
  1549  
  1550  func addMilli(t time.Time, duration int) time.Time {
  1551  	dur := time.Duration(duration)
  1552  	return t.Add(dur * time.Millisecond)
  1553  }
  1554  
  1555  func addMicro(t time.Time, duration int) time.Time {
  1556  	dur := time.Duration(duration)
  1557  	return t.Add(dur * time.Microsecond)
  1558  }
  1559  
  1560  func addNano(t time.Time, duration int) time.Time {
  1561  	dur := time.Duration(duration)
  1562  	return t.Add(dur * time.Nanosecond)
  1563  }
  1564  
  1565  func Year(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1566  	return execDatetimeToInt(fn, args, year, flags)
  1567  }
  1568  
  1569  func Month(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1570  	return execDatetimeToInt(fn, args, month, flags)
  1571  }
  1572  
  1573  func Day(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1574  	return execDatetimeToInt(fn, args, day, flags)
  1575  }
  1576  
  1577  func Hour(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1578  	return execDatetimeToInt(fn, args, hour, flags)
  1579  }
  1580  
  1581  func Minute(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1582  	return execDatetimeToInt(fn, args, minute, flags)
  1583  }
  1584  
  1585  func Second(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1586  	return execDatetimeToInt(fn, args, second, flags)
  1587  }
  1588  
  1589  func Millisecond(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1590  	return execDatetimeToInt(fn, args, millisecond, flags)
  1591  }
  1592  
  1593  func Microsecond(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1594  	return execDatetimeToInt(fn, args, microsecond, flags)
  1595  }
  1596  
  1597  func Nanosecond(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1598  	return execDatetimeToInt(fn, args, nanosecond, flags)
  1599  }
  1600  
  1601  func Weekday(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1602  	return execDatetimeToInt(fn, args, weekday, flags)
  1603  }
  1604  
  1605  func UnixTime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1606  	return execDatetimeToInt(fn, args, unixTime, flags)
  1607  }
  1608  
  1609  func UnixNanoTime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1610  	return execDatetimeToInt(fn, args, unixNanoTime, flags)
  1611  }
  1612  
  1613  func DayOfYear(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1614  	return execDatetimeToInt(fn, args, dayOfYear, flags)
  1615  }
  1616  
  1617  func WeekOfYear(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1618  	return execDatetimeToInt(fn, args, weekOfYear, flags)
  1619  }
  1620  
  1621  func AddYear(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1622  	return execDatetimeAdd(fn, args, addYear, flags)
  1623  }
  1624  
  1625  func AddMonth(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1626  	return execDatetimeAdd(fn, args, addMonth, flags)
  1627  }
  1628  
  1629  func AddDay(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1630  	return execDatetimeAdd(fn, args, addDay, flags)
  1631  }
  1632  
  1633  func AddHour(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1634  	return execDatetimeAdd(fn, args, addHour, flags)
  1635  }
  1636  
  1637  func AddMinute(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1638  	return execDatetimeAdd(fn, args, addMinute, flags)
  1639  }
  1640  
  1641  func AddSecond(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1642  	return execDatetimeAdd(fn, args, addSecond, flags)
  1643  }
  1644  
  1645  func AddMilli(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1646  	return execDatetimeAdd(fn, args, addMilli, flags)
  1647  }
  1648  
  1649  func AddMicro(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1650  	return execDatetimeAdd(fn, args, addMicro, flags)
  1651  }
  1652  
  1653  func AddNano(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1654  	return execDatetimeAdd(fn, args, addNano, flags)
  1655  }
  1656  
  1657  func truncateDate(fn parser.Function, args []value.Primary, place int8, flags *option.Flags) (value.Primary, error) {
  1658  	if len(args) != 1 {
  1659  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1660  	}
  1661  
  1662  	dt := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1663  	if value.IsNull(dt) {
  1664  		return value.NewNull(), nil
  1665  	}
  1666  	t := dt.(*value.Datetime).Raw()
  1667  	value.Discard(dt)
  1668  
  1669  	y, m, d := t.Date()
  1670  	switch place {
  1671  	case 1:
  1672  		d = 1
  1673  	case 2:
  1674  		d = 1
  1675  		m = 1
  1676  	}
  1677  	return value.NewDatetime(time.Date(y, m, d, 0, 0, 0, 0, t.Location())), nil
  1678  }
  1679  
  1680  func TruncMonth(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1681  	return truncateDate(fn, args, 2, flags)
  1682  }
  1683  
  1684  func TruncDay(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1685  	return truncateDate(fn, args, 1, flags)
  1686  }
  1687  
  1688  func TruncTime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1689  	return truncateDate(fn, args, 0, flags)
  1690  }
  1691  
  1692  func truncateDuration(fn parser.Function, args []value.Primary, dur time.Duration, flags *option.Flags) (value.Primary, error) {
  1693  	if len(args) != 1 {
  1694  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1695  	}
  1696  
  1697  	dt := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1698  	if value.IsNull(dt) {
  1699  		return value.NewNull(), nil
  1700  	}
  1701  	t := dt.(*value.Datetime).Raw().Truncate(dur)
  1702  	value.Discard(dt)
  1703  
  1704  	return value.NewDatetime(t), nil
  1705  }
  1706  
  1707  func TruncMinute(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1708  	return truncateDuration(fn, args, time.Hour, flags)
  1709  }
  1710  
  1711  func TruncSecond(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1712  	return truncateDuration(fn, args, time.Minute, flags)
  1713  }
  1714  
  1715  func TruncMilli(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1716  	return truncateDuration(fn, args, time.Second, flags)
  1717  }
  1718  
  1719  func TruncMicro(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1720  	return truncateDuration(fn, args, time.Millisecond, flags)
  1721  }
  1722  
  1723  func TruncNano(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1724  	return truncateDuration(fn, args, time.Microsecond, flags)
  1725  }
  1726  
  1727  func DateDiff(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1728  	if len(args) != 2 {
  1729  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1730  	}
  1731  
  1732  	p1 := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1733  	if value.IsNull(p1) {
  1734  		return value.NewNull(), nil
  1735  	}
  1736  
  1737  	p2 := value.ToDatetime(args[1], flags.DatetimeFormat, flags.GetTimeLocation())
  1738  	if value.IsNull(p2) {
  1739  		value.Discard(p1)
  1740  		return value.NewNull(), nil
  1741  	}
  1742  
  1743  	dt1 := p1.(*value.Datetime).Raw()
  1744  	dt2 := p2.(*value.Datetime).Raw()
  1745  	value.Discard(p1)
  1746  	value.Discard(p2)
  1747  
  1748  	subdt1 := time.Date(dt1.Year(), dt1.Month(), dt1.Day(), 0, 0, 0, 0, flags.GetTimeLocation())
  1749  	subdt2 := time.Date(dt2.Year(), dt2.Month(), dt2.Day(), 0, 0, 0, 0, flags.GetTimeLocation())
  1750  	dur := subdt1.Sub(subdt2)
  1751  
  1752  	return value.NewInteger(int64(dur.Hours() / 24)), nil
  1753  }
  1754  
  1755  func timeDiff(fn parser.Function, args []value.Primary, durf func(time.Duration) value.Primary, flags *option.Flags) (value.Primary, error) {
  1756  	if len(args) != 2 {
  1757  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2})
  1758  	}
  1759  
  1760  	p1 := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1761  	if value.IsNull(p1) {
  1762  		return value.NewNull(), nil
  1763  	}
  1764  
  1765  	p2 := value.ToDatetime(args[1], flags.DatetimeFormat, flags.GetTimeLocation())
  1766  	if value.IsNull(p2) {
  1767  		value.Discard(p1)
  1768  		return value.NewNull(), nil
  1769  	}
  1770  
  1771  	dt1 := p1.(*value.Datetime).Raw()
  1772  	dt2 := p2.(*value.Datetime).Raw()
  1773  	value.Discard(p1)
  1774  	value.Discard(p2)
  1775  
  1776  	dur := dt1.Sub(dt2)
  1777  	return durf(dur), nil
  1778  }
  1779  
  1780  func durationSeconds(dur time.Duration) value.Primary {
  1781  	return value.NewFloat(dur.Seconds())
  1782  }
  1783  
  1784  func durationNanoseconds(dur time.Duration) value.Primary {
  1785  	return value.NewInteger(dur.Nanoseconds())
  1786  }
  1787  
  1788  func TimeDiff(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1789  	return timeDiff(fn, args, durationSeconds, flags)
  1790  }
  1791  
  1792  func TimeNanoDiff(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1793  	return timeDiff(fn, args, durationNanoseconds, flags)
  1794  }
  1795  
  1796  func UTC(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1797  	if len(args) != 1 {
  1798  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1799  	}
  1800  
  1801  	dt := value.ToDatetime(args[0], flags.DatetimeFormat, flags.GetTimeLocation())
  1802  	if value.IsNull(dt) {
  1803  		return value.NewNull(), nil
  1804  	}
  1805  	t := dt.(*value.Datetime).Raw().UTC()
  1806  	value.Discard(dt)
  1807  
  1808  	return value.NewDatetime(t), nil
  1809  }
  1810  
  1811  func MilliToDatetime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1812  	if len(args) != 1 {
  1813  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1814  	}
  1815  
  1816  	p := value.ToInteger(args[0])
  1817  	if value.IsNull(p) {
  1818  		return value.NewNull(), nil
  1819  	}
  1820  	i := p.(*value.Integer).Raw()
  1821  	value.Discard(p)
  1822  
  1823  	return value.NewDatetime(time.Unix(i/1000, (i%1000)*1000000).In(flags.GetTimeLocation())), nil
  1824  }
  1825  
  1826  func NanoToDatetime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1827  	if len(args) != 1 {
  1828  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1829  	}
  1830  
  1831  	p := value.ToInteger(args[0])
  1832  	if value.IsNull(p) {
  1833  		return value.NewNull(), nil
  1834  	}
  1835  	i := p.(*value.Integer).Raw()
  1836  	value.Discard(p)
  1837  
  1838  	return value.NewDatetime(time.Unix(0, i).In(flags.GetTimeLocation())), nil
  1839  }
  1840  
  1841  func String(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1842  	if len(args) != 1 {
  1843  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1844  	}
  1845  
  1846  	switch p := args[0].(type) {
  1847  	case *value.Boolean:
  1848  		return value.NewString(strconv.FormatBool(p.Raw())), nil
  1849  	case *value.Ternary:
  1850  		return value.NewString(p.Ternary().String()), nil
  1851  	case *value.Datetime:
  1852  		return value.NewString(p.Format(time.RFC3339Nano)), nil
  1853  	default:
  1854  		return value.ToString(args[0]), nil
  1855  	}
  1856  }
  1857  
  1858  func Integer(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1859  	if len(args) != 1 {
  1860  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1861  	}
  1862  
  1863  	switch p := args[0].(type) {
  1864  	case *value.Datetime:
  1865  		return value.NewInteger(p.Raw().Unix()), nil
  1866  	default:
  1867  		return value.ToInteger(args[0]), nil
  1868  	}
  1869  }
  1870  
  1871  func Float(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1872  	if len(args) != 1 {
  1873  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1874  	}
  1875  
  1876  	switch p := args[0].(type) {
  1877  	case *value.Datetime:
  1878  		t := p.Raw()
  1879  		f := float64(t.Unix())
  1880  		if t.Nanosecond() > 0 {
  1881  			f = f + float64(t.Nanosecond())/1e9
  1882  		}
  1883  		return value.NewFloat(f), nil
  1884  	default:
  1885  		return value.ToFloat(args[0]), nil
  1886  	}
  1887  }
  1888  
  1889  func Boolean(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1890  	if len(args) != 1 {
  1891  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1892  	}
  1893  
  1894  	return value.ToBoolean(args[0]), nil
  1895  }
  1896  
  1897  func Ternary(fn parser.Function, args []value.Primary, _ *option.Flags) (value.Primary, error) {
  1898  	if len(args) != 1 {
  1899  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1})
  1900  	}
  1901  
  1902  	return value.NewTernary(args[0].Ternary()), nil
  1903  }
  1904  
  1905  func Datetime(fn parser.Function, args []value.Primary, flags *option.Flags) (value.Primary, error) {
  1906  	conv := func(p value.Primary, location *time.Location) value.Primary {
  1907  		if dt := value.ToDatetime(p, flags.DatetimeFormat, location); !value.IsNull(dt) {
  1908  			return dt
  1909  		}
  1910  
  1911  		if i := value.ToIntegerStrictly(p); !value.IsNull(i) {
  1912  			val := i.(*value.Integer).Raw()
  1913  			value.Discard(i)
  1914  			return value.NewDatetime(value.TimeFromUnixTime(val, 0, location))
  1915  		}
  1916  
  1917  		if f := value.ToFloat(p); !value.IsNull(f) {
  1918  			val := f.(*value.Float).Raw()
  1919  			value.Discard(f)
  1920  
  1921  			if math.IsNaN(val) || math.IsInf(val, 0) {
  1922  				return value.NewNull()
  1923  			}
  1924  			return value.NewDatetime(value.Float64ToTime(val, location))
  1925  		}
  1926  
  1927  		return value.NewNull()
  1928  	}
  1929  
  1930  	if len(args) < 1 || 2 < len(args) {
  1931  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{1, 2})
  1932  	}
  1933  
  1934  	var location *time.Location
  1935  	if 1 < len(args) {
  1936  		s := value.ToString(args[1])
  1937  		if value.IsNull(s) {
  1938  			return nil, NewFunctionInvalidArgumentError(fn, fn.Name, fmt.Sprintf("failed to load time zone %s", args[1].String()))
  1939  		}
  1940  
  1941  		l, err := option.GetLocation(s.(*value.String).Raw())
  1942  		if err != nil {
  1943  			return nil, NewFunctionInvalidArgumentError(fn, fn.Name, fmt.Sprintf("failed to load time zone %s", args[1].String()))
  1944  		}
  1945  		location = l
  1946  	} else {
  1947  		location = flags.GetTimeLocation()
  1948  	}
  1949  
  1950  	p := conv(args[0], location)
  1951  
  1952  	if len(args) < 2 || value.IsNull(p) {
  1953  		return p, nil
  1954  	}
  1955  
  1956  	p2 := value.NewDatetime(p.(*value.Datetime).Raw().In(location))
  1957  	value.Discard(p)
  1958  
  1959  	return p2, nil
  1960  }
  1961  
  1962  func Call(ctx context.Context, fn parser.Function, args []value.Primary) (value.Primary, error) {
  1963  	if len(args) < 1 {
  1964  		return nil, NewFunctionArgumentLengthErrorWithCustomArgs(fn, fn.Name, "at least 1 argument")
  1965  	}
  1966  
  1967  	cmdargs := make([]string, 0, len(args))
  1968  	for _, v := range args {
  1969  		s, _ := NewStringFormatter().Format("%s", []value.Primary{v})
  1970  		cmdargs = append(cmdargs, s)
  1971  	}
  1972  
  1973  	buf, err := exec.CommandContext(ctx, cmdargs[0], cmdargs[1:]...).Output()
  1974  	if err != nil {
  1975  		return nil, NewExternalCommandError(fn, err.Error())
  1976  	}
  1977  	return value.NewString(string(buf)), nil
  1978  }
  1979  
  1980  func Now(scope *ReferenceScope, fn parser.Function, args []value.Primary) (value.Primary, error) {
  1981  	if 0 < len(args) {
  1982  		return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{0})
  1983  	}
  1984  	return value.NewDatetime(scope.Now()), nil
  1985  }
  1986  
  1987  func JsonObject(ctx context.Context, scope *ReferenceScope, fn parser.Function) (value.Primary, error) {
  1988  	if len(scope.Records) < 1 {
  1989  		return value.NewNull(), nil
  1990  	}
  1991  
  1992  	view := NewView()
  1993  	view.Header = scope.Records[0].view.Header.Copy()
  1994  	view.RecordSet = RecordSet{scope.Records[0].view.RecordSet[scope.Records[0].recordIndex].Copy()}
  1995  
  1996  	if len(fn.Args) < 1 {
  1997  		if err := view.SelectAllColumns(ctx, scope); err != nil {
  1998  			return nil, err
  1999  		}
  2000  	} else {
  2001  		selectClause := parser.SelectClause{
  2002  			Fields: fn.Args,
  2003  		}
  2004  		if err := view.Select(ctx, scope, selectClause); err != nil {
  2005  			return nil, err
  2006  		}
  2007  	}
  2008  	if err := view.Fix(ctx, scope.Tx.Flags); err != nil {
  2009  		return nil, err
  2010  	}
  2011  
  2012  	pathes, err := json.ParsePathes(view.Header.TableColumnNames())
  2013  	if err != nil {
  2014  		return nil, NewFunctionInvalidArgumentError(fn, fn.Name, err.Error())
  2015  	}
  2016  
  2017  	record := make([]value.Primary, view.FieldLen())
  2018  	for i := range view.RecordSet[0] {
  2019  		record[i] = view.RecordSet[0][i][0]
  2020  	}
  2021  	structure, _ := json.ConvertRecordValueToJsonStructure(pathes, record)
  2022  
  2023  	encoder := txjson.NewEncoder()
  2024  	encoder.EscapeType = scope.Tx.Flags.ExportOptions.JsonEscape
  2025  	encoder.LineBreak = scope.Tx.Flags.ExportOptions.LineBreak
  2026  	encoder.FloatFormat = jsonFloatFormat(scope.Tx.Flags.ExportOptions.ScientificNotation)
  2027  
  2028  	val, err := encoder.Encode(structure)
  2029  	if err != nil {
  2030  		return nil, NewDataEncodingError(fmt.Sprintf("%s in JSON encoding", err.Error()))
  2031  	}
  2032  
  2033  	return value.NewString(val), nil
  2034  }