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 }