go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/llx/builtin_simple.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package llx
     5  
     6  import (
     7  	"errors"
     8  	"io"
     9  	"regexp"
    10  	"strconv"
    11  	"strings"
    12  	"time"
    13  	"unicode"
    14  
    15  	"go.mondoo.com/cnquery/types"
    16  )
    17  
    18  // run an operation that returns true/false on a bind data vs a chunk call.
    19  // Unlike boolOp we don't check if either side is nil
    20  func rawboolOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(*RawData, *RawData) bool) (*RawData, uint64, error) {
    21  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
    22  	if err != nil {
    23  		return nil, 0, err
    24  	}
    25  	if dref != 0 {
    26  		return nil, dref, nil
    27  	}
    28  	return BoolData(f(bind, v)), 0, nil
    29  }
    30  
    31  // run an operation that returns true/false on a bind data vs a chunk call.
    32  // Unlike boolOp we don't check if either side is nil. It inverts the
    33  // returned boolean from the child function.
    34  func rawboolNotOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(*RawData, *RawData) bool) (*RawData, uint64, error) {
    35  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
    36  	if err != nil {
    37  		return nil, 0, err
    38  	}
    39  	if dref != 0 {
    40  		return nil, dref, nil
    41  	}
    42  	return BoolData(!f(bind, v)), 0, nil
    43  }
    44  
    45  // run an operation that returns true/false on a bind data vs a chunk call.
    46  // this includes handling for the case where either side is nil, i.e.
    47  // - if both sides are nil we return true
    48  // - if either side is nil but not the other we return false
    49  func boolOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(interface{}, interface{}) bool) (*RawData, uint64, error) {
    50  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
    51  	if err != nil {
    52  		return nil, 0, err
    53  	}
    54  	if dref != 0 {
    55  		return nil, dref, nil
    56  	}
    57  
    58  	if bind.Value == nil {
    59  		return BoolData(v.Value == nil), 0, nil
    60  	}
    61  	if v == nil || v.Value == nil {
    62  		return BoolData(false), 0, nil
    63  	}
    64  
    65  	return BoolData(f(bind.Value, v.Value)), 0, nil
    66  }
    67  
    68  // boolOrOp behaves like boolOp, but checks if the left argument is true first
    69  // (and stop if it is). Only then proceeds to check the right argument.
    70  func boolOrOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, fLeft func(interface{}) bool, fRight func(interface{}) bool) (*RawData, uint64, error) {
    71  	if bind.Value != nil && fLeft(bind.Value) {
    72  		return BoolData(true), 0, nil
    73  	}
    74  
    75  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
    76  	if err != nil {
    77  		return nil, 0, err
    78  	}
    79  	if dref != 0 {
    80  		return nil, dref, nil
    81  	}
    82  
    83  	if bind.Value == nil {
    84  		return BoolData(v.Value == nil), 0, nil
    85  	}
    86  	if v == nil || v.Value == nil {
    87  		return BoolData(false), 0, nil
    88  	}
    89  
    90  	return BoolData(fRight(v.Value)), 0, nil
    91  }
    92  
    93  // boolAndOp behaves like boolOp, but checks if the left argument is false first
    94  // (and stop if it is). Only then proceeds to check the right argument.
    95  func boolAndOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, fLeft func(interface{}) bool, fRight func(interface{}) bool) (*RawData, uint64, error) {
    96  	if bind.Value != nil && !fLeft(bind.Value) {
    97  		return BoolData(false), 0, nil
    98  	}
    99  
   100  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
   101  	if err != nil {
   102  		return nil, 0, err
   103  	}
   104  	if dref != 0 {
   105  		return nil, dref, nil
   106  	}
   107  
   108  	if bind.Value == nil {
   109  		return BoolData(v.Value == nil), 0, nil
   110  	}
   111  	if v == nil || v.Value == nil {
   112  		return BoolData(false), 0, nil
   113  	}
   114  	return BoolData(fRight(v.Value)), 0, nil
   115  }
   116  
   117  func boolNotOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(interface{}, interface{}) bool) (*RawData, uint64, error) {
   118  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
   119  	if err != nil {
   120  		return nil, 0, err
   121  	}
   122  	if dref != 0 {
   123  		return nil, dref, nil
   124  	}
   125  
   126  	if bind.Value == nil {
   127  		return BoolData(v.Value != nil), 0, nil
   128  	}
   129  	if v == nil || v.Value == nil {
   130  		return BoolData(true), 0, nil
   131  	}
   132  
   133  	return BoolData(!f(bind.Value, v.Value)), 0, nil
   134  }
   135  
   136  func dataOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, typ types.Type, f func(interface{}, interface{}) *RawData) (*RawData, uint64, error) {
   137  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
   138  	if err != nil {
   139  		return nil, 0, err
   140  	}
   141  	if dref != 0 {
   142  		return nil, dref, nil
   143  	}
   144  
   145  	if bind.Value == nil {
   146  		return &RawData{Type: typ}, 0, nil
   147  	}
   148  	if v == nil || v.Value == nil {
   149  		return &RawData{Type: typ}, 0, nil
   150  	}
   151  
   152  	return f(bind.Value, v.Value), 0, nil
   153  }
   154  
   155  func nonNilDataOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, typ types.Type, f func(interface{}, interface{}) *RawData) (*RawData, uint64, error) {
   156  	if bind.Value == nil {
   157  		return &RawData{Type: typ, Error: errors.New("left side of operation is null")}, 0, nil
   158  	}
   159  
   160  	v, dref, err := e.resolveValue(chunk.Function.Args[0], ref)
   161  	if err != nil {
   162  		return nil, 0, err
   163  	}
   164  	if dref != 0 {
   165  		return nil, dref, nil
   166  	}
   167  
   168  	if v == nil || v.Value == nil {
   169  		return &RawData{Type: typ, Error: errors.New("right side of operation is null")}, 0, nil
   170  	}
   171  
   172  	return f(bind.Value, v.Value), 0, nil
   173  }
   174  
   175  // for equality and inequality checks that are pre-determined
   176  // we need to catch the case where both values end up nil
   177  
   178  func chunkEqTrueV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   179  	return boolOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool {
   180  		return true
   181  	})
   182  }
   183  
   184  func chunkEqFalseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   185  	return boolOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool {
   186  		return false
   187  	})
   188  }
   189  
   190  func chunkNeqFalseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   191  	return boolNotOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool {
   192  		return true
   193  	})
   194  }
   195  
   196  func chunkNeqTrueV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   197  	return boolNotOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool {
   198  		return false
   199  	})
   200  }
   201  
   202  func bindingEqNil(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   203  	return BoolData(bind.Value == nil), 0, nil
   204  }
   205  
   206  func bindingNeqNil(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   207  	return BoolData(bind.Value != nil), 0, nil
   208  }
   209  
   210  // raw operator handling
   211  // ==   !=
   212  
   213  func opBoolCmpBool(left interface{}, right interface{}) bool {
   214  	return left.(bool) == right.(bool)
   215  }
   216  
   217  func opIntCmpInt(left interface{}, right interface{}) bool {
   218  	return left.(int64) == right.(int64)
   219  }
   220  
   221  func opFloatCmpFloat(left interface{}, right interface{}) bool {
   222  	return left.(float64) == right.(float64)
   223  }
   224  
   225  func opStringCmpString(left interface{}, right interface{}) bool {
   226  	return left.(string) == right.(string)
   227  }
   228  
   229  func opTimeCmpTime(left interface{}, right interface{}) bool {
   230  	l := left.(*time.Time)
   231  	r := right.(*time.Time)
   232  	if l == nil {
   233  		return r == nil
   234  	}
   235  	if r == nil {
   236  		return false
   237  	}
   238  
   239  	if (*l == NeverPastTime || *l == NeverFutureTime) && (*r == NeverPastTime || *r == NeverFutureTime) {
   240  		return true
   241  	}
   242  
   243  	return (*l).Equal(*r)
   244  }
   245  
   246  func opStringCmpInt(left interface{}, right interface{}) bool {
   247  	return left.(string) == strconv.FormatInt(right.(int64), 10)
   248  }
   249  
   250  func opIntCmpString(left interface{}, right interface{}) bool {
   251  	return right.(string) == strconv.FormatInt(left.(int64), 10)
   252  }
   253  
   254  func opStringCmpFloat(left interface{}, right interface{}) bool {
   255  	return left.(string) == strconv.FormatFloat(right.(float64), 'f', -1, 64)
   256  }
   257  
   258  func opFloatCmpString(left interface{}, right interface{}) bool {
   259  	return right.(string) == strconv.FormatFloat(left.(float64), 'f', -1, 64)
   260  }
   261  
   262  func opStringCmpRegex(left interface{}, right interface{}) bool {
   263  	r := regexp.MustCompile(right.(string))
   264  	return r.Match([]byte(left.(string)))
   265  }
   266  
   267  func opRegexCmpString(left interface{}, right interface{}) bool {
   268  	r := regexp.MustCompile(left.(string))
   269  	return r.Match([]byte(right.(string)))
   270  }
   271  
   272  func opRegexCmpInt(left interface{}, right interface{}) bool {
   273  	return opStringCmpRegex(strconv.FormatInt(right.(int64), 10), left.(string))
   274  }
   275  
   276  func opIntCmpRegex(left interface{}, right interface{}) bool {
   277  	return opStringCmpRegex(strconv.FormatInt(left.(int64), 10), right.(string))
   278  }
   279  
   280  func opRegexCmpFloat(left interface{}, right interface{}) bool {
   281  	return opStringCmpRegex(strconv.FormatFloat(right.(float64), 'f', -1, 64), left.(string))
   282  }
   283  
   284  func opFloatCmpRegex(left interface{}, right interface{}) bool {
   285  	return opStringCmpRegex(strconv.FormatFloat(left.(float64), 'f', -1, 64), right.(string))
   286  }
   287  
   288  // same operator types
   289  // ==   !=
   290  
   291  func boolCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   292  	return boolOpV2(e, bind, chunk, ref, opBoolCmpBool)
   293  }
   294  
   295  func boolNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   296  	return boolNotOpV2(e, bind, chunk, ref, opBoolCmpBool)
   297  }
   298  
   299  func intCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   300  	return boolOpV2(e, bind, chunk, ref, opIntCmpInt)
   301  }
   302  
   303  func intNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   304  	return boolNotOpV2(e, bind, chunk, ref, opIntCmpInt)
   305  }
   306  
   307  func floatCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   308  	return boolOpV2(e, bind, chunk, ref, opFloatCmpFloat)
   309  }
   310  
   311  func floatNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   312  	return boolNotOpV2(e, bind, chunk, ref, opFloatCmpFloat)
   313  }
   314  
   315  func stringCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   316  	return boolOpV2(e, bind, chunk, ref, opStringCmpString)
   317  }
   318  
   319  func stringNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   320  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpString)
   321  }
   322  
   323  func timeCmpTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   324  	return boolOpV2(e, bind, chunk, ref, opTimeCmpTime)
   325  }
   326  
   327  func timeNotTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   328  	return boolNotOpV2(e, bind, chunk, ref, opTimeCmpTime)
   329  }
   330  
   331  func stringCmpEmptyV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   332  	if bind.Value == nil {
   333  		return BoolTrue, 0, nil
   334  	}
   335  	return BoolData(bind.Value.(string) == ""), 0, nil
   336  }
   337  
   338  func stringNotEmptyV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   339  	if bind.Value == nil {
   340  		return BoolFalse, 0, nil
   341  	}
   342  	return BoolData(bind.Value.(string) != ""), 0, nil
   343  }
   344  
   345  // int arithmetic
   346  
   347  func intPlusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   348  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
   349  		res := left.(int64) + right.(int64)
   350  		return IntData(res)
   351  	})
   352  }
   353  
   354  func intMinusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   355  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
   356  		res := left.(int64) - right.(int64)
   357  		return IntData(res)
   358  	})
   359  }
   360  
   361  func intTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   362  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
   363  		res := left.(int64) * right.(int64)
   364  		return IntData(res)
   365  	})
   366  }
   367  
   368  func intDividedIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   369  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
   370  		res := left.(int64) / right.(int64)
   371  		return IntData(res)
   372  	})
   373  }
   374  
   375  func intPlusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   376  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   377  		res := float64(left.(int64)) + right.(float64)
   378  		return FloatData(res)
   379  	})
   380  }
   381  
   382  func intMinusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   383  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   384  		res := float64(left.(int64)) - right.(float64)
   385  		return FloatData(res)
   386  	})
   387  }
   388  
   389  func intTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   390  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   391  		res := float64(left.(int64)) * right.(float64)
   392  		return FloatData(res)
   393  	})
   394  }
   395  
   396  func intDividedFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   397  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   398  		res := float64(left.(int64)) / right.(float64)
   399  		return FloatData(res)
   400  	})
   401  }
   402  
   403  // float arithmetic
   404  
   405  func floatPlusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   406  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   407  		res := left.(float64) + float64(right.(int64))
   408  		return FloatData(res)
   409  	})
   410  }
   411  
   412  func floatMinusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   413  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   414  		res := left.(float64) - float64(right.(int64))
   415  		return FloatData(res)
   416  	})
   417  }
   418  
   419  func floatTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   420  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   421  		res := left.(float64) * float64(right.(int64))
   422  		return FloatData(res)
   423  	})
   424  }
   425  
   426  func floatDividedIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   427  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   428  		res := left.(float64) / float64(right.(int64))
   429  		return FloatData(res)
   430  	})
   431  }
   432  
   433  func floatPlusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   434  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   435  		res := left.(float64) + right.(float64)
   436  		return FloatData(res)
   437  	})
   438  }
   439  
   440  func floatMinusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   441  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   442  		res := left.(float64) - right.(float64)
   443  		return FloatData(res)
   444  	})
   445  }
   446  
   447  func floatTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   448  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   449  		res := left.(float64) * right.(float64)
   450  		return FloatData(res)
   451  	})
   452  }
   453  
   454  func floatDividedFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   455  	return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData {
   456  		res := left.(float64) / right.(float64)
   457  		return FloatData(res)
   458  	})
   459  }
   460  
   461  // int vs float
   462  // int ==/!= float
   463  
   464  func opIntCmpFloat(left interface{}, right interface{}) bool {
   465  	return float64(left.(int64)) == right.(float64)
   466  }
   467  
   468  func opFloatCmpInt(left interface{}, right interface{}) bool {
   469  	return left.(float64) == float64(right.(int64))
   470  }
   471  
   472  func intCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   473  	return boolOpV2(e, bind, chunk, ref, opIntCmpFloat)
   474  }
   475  
   476  func intNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   477  	return boolNotOpV2(e, bind, chunk, ref, opIntCmpFloat)
   478  }
   479  
   480  func floatCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   481  	return boolOpV2(e, bind, chunk, ref, opFloatCmpInt)
   482  }
   483  
   484  func floatNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   485  	return boolNotOpV2(e, bind, chunk, ref, opFloatCmpInt)
   486  }
   487  
   488  // string vs other types
   489  // string ==/!= nil
   490  
   491  func opStringCmpNil(left interface{}, right interface{}) bool {
   492  	return left == nil
   493  }
   494  
   495  func opNilCmpString(left interface{}, right interface{}) bool {
   496  	return right == nil
   497  }
   498  
   499  func stringCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   500  	return boolOpV2(e, bind, chunk, ref, opStringCmpNil)
   501  }
   502  
   503  func stringNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   504  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpNil)
   505  }
   506  
   507  func nilCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   508  	return boolOpV2(e, bind, chunk, ref, opNilCmpString)
   509  }
   510  
   511  func nilNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   512  	return boolNotOpV2(e, bind, chunk, ref, opNilCmpString)
   513  }
   514  
   515  // string ==/!= bool
   516  
   517  func opStringCmpBool(left interface{}, right interface{}) bool {
   518  	if right.(bool) == true {
   519  		return left.(string) == "true"
   520  	}
   521  	return left.(string) == "false"
   522  }
   523  
   524  func opBoolCmpString(left interface{}, right interface{}) bool {
   525  	if left.(bool) == true {
   526  		return right.(string) == "true"
   527  	}
   528  	return right.(string) == "false"
   529  }
   530  
   531  func stringCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   532  	return boolOpV2(e, bind, chunk, ref, opStringCmpBool)
   533  }
   534  
   535  func stringNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   536  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpBool)
   537  }
   538  
   539  func boolCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   540  	return boolOpV2(e, bind, chunk, ref, opBoolCmpString)
   541  }
   542  
   543  func boolNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   544  	return boolNotOpV2(e, bind, chunk, ref, opBoolCmpString)
   545  }
   546  
   547  // string ==/!= int
   548  
   549  func stringCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   550  	return boolOpV2(e, bind, chunk, ref, opStringCmpInt)
   551  }
   552  
   553  func stringNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   554  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpInt)
   555  }
   556  
   557  func intCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   558  	return boolOpV2(e, bind, chunk, ref, opIntCmpString)
   559  }
   560  
   561  func intNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   562  	return boolNotOpV2(e, bind, chunk, ref, opIntCmpString)
   563  }
   564  
   565  // string ==/!= float
   566  
   567  func stringCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   568  	return boolOpV2(e, bind, chunk, ref, opStringCmpFloat)
   569  }
   570  
   571  func stringNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   572  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpFloat)
   573  }
   574  
   575  func floatCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   576  	return boolOpV2(e, bind, chunk, ref, opFloatCmpString)
   577  }
   578  
   579  func floatNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   580  	return boolNotOpV2(e, bind, chunk, ref, opFloatCmpString)
   581  }
   582  
   583  // string ==/!= regex
   584  
   585  func stringCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   586  	return boolOpV2(e, bind, chunk, ref, opStringCmpRegex)
   587  }
   588  
   589  func stringNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   590  	return boolNotOpV2(e, bind, chunk, ref, opStringCmpRegex)
   591  }
   592  
   593  func regexCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   594  	return boolOpV2(e, bind, chunk, ref, opRegexCmpString)
   595  }
   596  
   597  func regexNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   598  	return boolNotOpV2(e, bind, chunk, ref, opRegexCmpString)
   599  }
   600  
   601  // regex vs other types
   602  // int ==/!= regex
   603  
   604  func intCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   605  	return boolOpV2(e, bind, chunk, ref, opIntCmpRegex)
   606  }
   607  
   608  func intNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   609  	return boolNotOpV2(e, bind, chunk, ref, opIntCmpRegex)
   610  }
   611  
   612  func regexCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   613  	return boolOpV2(e, bind, chunk, ref, opRegexCmpInt)
   614  }
   615  
   616  func regexNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   617  	return boolNotOpV2(e, bind, chunk, ref, opRegexCmpInt)
   618  }
   619  
   620  // float ==/!= regex
   621  
   622  func floatCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   623  	return boolOpV2(e, bind, chunk, ref, opFloatCmpRegex)
   624  }
   625  
   626  func floatNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   627  	return boolNotOpV2(e, bind, chunk, ref, opFloatCmpRegex)
   628  }
   629  
   630  func regexCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   631  	return boolOpV2(e, bind, chunk, ref, opRegexCmpFloat)
   632  }
   633  
   634  func regexNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   635  	return boolNotOpV2(e, bind, chunk, ref, opRegexCmpFloat)
   636  }
   637  
   638  // null vs other types
   639  // bool ==/!= nil
   640  
   641  func opBoolCmpNil(left interface{}, right interface{}) bool {
   642  	return left == nil
   643  }
   644  
   645  func opNilCmpBool(left interface{}, right interface{}) bool {
   646  	return right == nil
   647  }
   648  
   649  func boolCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   650  	return boolOpV2(e, bind, chunk, ref, opBoolCmpNil)
   651  }
   652  
   653  func boolNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   654  	return boolNotOpV2(e, bind, chunk, ref, opBoolCmpNil)
   655  }
   656  
   657  func nilCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   658  	return boolOpV2(e, bind, chunk, ref, opNilCmpBool)
   659  }
   660  
   661  func nilNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   662  	return boolNotOpV2(e, bind, chunk, ref, opNilCmpBool)
   663  }
   664  
   665  // int ==/!= nil
   666  
   667  func opIntCmpNil(left interface{}, right interface{}) bool {
   668  	return left == nil
   669  }
   670  
   671  func opNilCmpInt(left interface{}, right interface{}) bool {
   672  	return right == nil
   673  }
   674  
   675  func intCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   676  	return boolOpV2(e, bind, chunk, ref, opIntCmpNil)
   677  }
   678  
   679  func intNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   680  	return boolNotOpV2(e, bind, chunk, ref, opIntCmpNil)
   681  }
   682  
   683  func nilCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   684  	return boolOpV2(e, bind, chunk, ref, opNilCmpInt)
   685  }
   686  
   687  func nilNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   688  	return boolNotOpV2(e, bind, chunk, ref, opNilCmpInt)
   689  }
   690  
   691  // float ==/!= nil
   692  
   693  func opFloatCmpNil(left interface{}, right interface{}) bool {
   694  	return left == nil
   695  }
   696  
   697  func opNilCmpFloat(left interface{}, right interface{}) bool {
   698  	return right == nil
   699  }
   700  
   701  func floatCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   702  	return boolOpV2(e, bind, chunk, ref, opFloatCmpNil)
   703  }
   704  
   705  func floatNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   706  	return boolNotOpV2(e, bind, chunk, ref, opFloatCmpNil)
   707  }
   708  
   709  func nilCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   710  	return boolOpV2(e, bind, chunk, ref, opNilCmpFloat)
   711  }
   712  
   713  func nilNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   714  	return boolNotOpV2(e, bind, chunk, ref, opNilCmpFloat)
   715  }
   716  
   717  // time ==/!= nil
   718  
   719  func opTimeCmpNil(left *RawData, right *RawData) bool {
   720  	return left.Value == nil || left.Value.(*time.Time) == nil
   721  }
   722  
   723  func opNilCmpTime(left *RawData, right *RawData) bool {
   724  	return right.Value == nil || right.Value.(*time.Time) == nil
   725  }
   726  
   727  func timeCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   728  	return rawboolOpV2(e, bind, chunk, ref, opTimeCmpNil)
   729  }
   730  
   731  func timeNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   732  	return rawboolNotOpV2(e, bind, chunk, ref, opTimeCmpNil)
   733  }
   734  
   735  func nilCmpTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   736  	return rawboolOpV2(e, bind, chunk, ref, opNilCmpTime)
   737  }
   738  
   739  func nilNotTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   740  	return rawboolNotOpV2(e, bind, chunk, ref, opNilCmpTime)
   741  }
   742  
   743  // string </>/<=/>= string
   744  
   745  func stringLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   746  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   747  		return BoolData(left.(string) < right.(string))
   748  	})
   749  }
   750  
   751  func stringLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   752  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   753  		return BoolData(left.(string) <= right.(string))
   754  	})
   755  }
   756  
   757  func stringGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   758  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   759  		return BoolData(left.(string) > right.(string))
   760  	})
   761  }
   762  
   763  func stringGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   764  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   765  		return BoolData(left.(string) >= right.(string))
   766  	})
   767  }
   768  
   769  // int </>/<=/>= int
   770  
   771  func intLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   772  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   773  		return BoolData(left.(int64) < right.(int64))
   774  	})
   775  }
   776  
   777  func intLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   778  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   779  		return BoolData(left.(int64) <= right.(int64))
   780  	})
   781  }
   782  
   783  func intGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   784  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   785  		return BoolData(left.(int64) > right.(int64))
   786  	})
   787  }
   788  
   789  func intGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   790  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   791  		return BoolData(left.(int64) >= right.(int64))
   792  	})
   793  }
   794  
   795  // float </>/<=/>= float
   796  
   797  func floatLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   798  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   799  		return BoolData(left.(float64) < right.(float64))
   800  	})
   801  }
   802  
   803  func floatLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   804  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   805  		return BoolData(left.(float64) <= right.(float64))
   806  	})
   807  }
   808  
   809  func floatGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   810  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   811  		return BoolData(left.(float64) > right.(float64))
   812  	})
   813  }
   814  
   815  func floatGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   816  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   817  		return BoolData(left.(float64) >= right.(float64))
   818  	})
   819  }
   820  
   821  // time </>/<=/>= time
   822  
   823  func timeLTTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   824  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   825  		l := left.(*time.Time)
   826  		if l == nil {
   827  			return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")}
   828  		}
   829  		r := right.(*time.Time)
   830  		if r == nil {
   831  			return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")}
   832  		}
   833  
   834  		return BoolData((*l).Before(*r))
   835  	})
   836  }
   837  
   838  func timeLTETimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   839  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   840  		l := left.(*time.Time)
   841  		if l == nil {
   842  			return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")}
   843  		}
   844  		r := right.(*time.Time)
   845  		if r == nil {
   846  			return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")}
   847  		}
   848  
   849  		return BoolData((*l).Before(*r) || (*l).Equal(*r))
   850  	})
   851  }
   852  
   853  func timeGTTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   854  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   855  		l := left.(*time.Time)
   856  		if l == nil {
   857  			return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")}
   858  		}
   859  		r := right.(*time.Time)
   860  		if r == nil {
   861  			return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")}
   862  		}
   863  
   864  		return BoolData((*l).After(*r))
   865  	})
   866  }
   867  
   868  func timeGTETimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   869  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
   870  		l := left.(*time.Time)
   871  		if l == nil {
   872  			return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")}
   873  		}
   874  		r := right.(*time.Time)
   875  		if r == nil {
   876  			return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")}
   877  		}
   878  
   879  		return BoolData((*l).After(*r) || (*l).Equal(*r))
   880  	})
   881  }
   882  
   883  // time arithmetic
   884  
   885  func timeMinusTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   886  	return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData {
   887  		l := left.(*time.Time)
   888  		r := right.(*time.Time)
   889  		if l == nil || r == nil {
   890  			return &RawData{Type: types.Time}
   891  		}
   892  
   893  		if *r == NeverPastTime {
   894  			return NeverFuturePrimitive.RawData()
   895  		}
   896  		if *r == NeverFutureTime {
   897  			return NeverPastPrimitive.RawData()
   898  		}
   899  		if *l == NeverPastTime {
   900  			return NeverPastPrimitive.RawData()
   901  		}
   902  		if *l == NeverFutureTime {
   903  			return NeverFuturePrimitive.RawData()
   904  		}
   905  
   906  		diff := l.Unix() - r.Unix()
   907  		res := DurationToTime(diff)
   908  		return TimeData(res)
   909  	})
   910  }
   911  
   912  func timePlusTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   913  	return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData {
   914  		l := left.(*time.Time)
   915  		r := right.(*time.Time)
   916  		if l == nil || r == nil {
   917  			return &RawData{Type: types.Time}
   918  		}
   919  
   920  		if *r == NeverPastTime {
   921  			return NeverFuturePrimitive.RawData()
   922  		}
   923  		if *r == NeverFutureTime {
   924  			return NeverPastPrimitive.RawData()
   925  		}
   926  		if *l == NeverPastTime {
   927  			return NeverPastPrimitive.RawData()
   928  		}
   929  		if *l == NeverFutureTime {
   930  			return NeverFuturePrimitive.RawData()
   931  		}
   932  
   933  		lt := l.Unix()
   934  		rt := r.Unix()
   935  
   936  		// the breakpoint for time and duration is the unix time of zero
   937  		bothDuration := false
   938  		if lt < 0 {
   939  			lt = TimeToDuration(l)
   940  			if rt < 0 {
   941  				bothDuration = true
   942  			}
   943  		}
   944  		if rt < 0 {
   945  			rt = TimeToDuration(r)
   946  		}
   947  
   948  		sum := lt + rt
   949  		if bothDuration {
   950  			return TimeData(DurationToTime(sum))
   951  		}
   952  
   953  		return TimeData(time.Unix(sum, 0))
   954  	})
   955  }
   956  
   957  func opTimeTimesInt(left interface{}, right interface{}) *RawData {
   958  	l := left.(*time.Time)
   959  	if l == nil {
   960  		return &RawData{Type: types.Time}
   961  	}
   962  
   963  	if *l == NeverPastTime {
   964  		return NeverPastPrimitive.RawData()
   965  	}
   966  	if *l == NeverFutureTime {
   967  		return NeverFuturePrimitive.RawData()
   968  	}
   969  
   970  	diff := TimeToDuration(l) * right.(int64)
   971  	res := DurationToTime(diff)
   972  	return TimeData(res)
   973  }
   974  
   975  func opTimeTimesFloat(left interface{}, right interface{}) *RawData {
   976  	l := left.(*time.Time)
   977  	if l == nil {
   978  		return &RawData{Type: types.Time}
   979  	}
   980  
   981  	if *l == NeverPastTime {
   982  		return NeverPastPrimitive.RawData()
   983  	}
   984  	if *l == NeverFutureTime {
   985  		return NeverFuturePrimitive.RawData()
   986  	}
   987  
   988  	diff := float64(TimeToDuration(l)) * right.(float64)
   989  	res := DurationToTime(int64(diff))
   990  	return TimeData(res)
   991  }
   992  
   993  func timeTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   994  	return dataOpV2(e, bind, chunk, ref, types.Time, opTimeTimesInt)
   995  }
   996  
   997  func intTimesTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
   998  	return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData {
   999  		return opTimeTimesInt(right, left)
  1000  	})
  1001  }
  1002  
  1003  func timeTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1004  	return dataOpV2(e, bind, chunk, ref, types.Time, opTimeTimesFloat)
  1005  }
  1006  
  1007  func floatTimesTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1008  	return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData {
  1009  		return opTimeTimesFloat(right, left)
  1010  	})
  1011  }
  1012  
  1013  // int </>/<=/>= float
  1014  
  1015  func intLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1016  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1017  		return BoolData(float64(left.(int64)) < right.(float64))
  1018  	})
  1019  }
  1020  
  1021  func intLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1022  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1023  		return BoolData(float64(left.(int64)) <= right.(float64))
  1024  	})
  1025  }
  1026  
  1027  func intGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1028  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1029  		return BoolData(float64(left.(int64)) > right.(float64))
  1030  	})
  1031  }
  1032  
  1033  func intGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1034  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1035  		return BoolData(float64(left.(int64)) >= right.(float64))
  1036  	})
  1037  }
  1038  
  1039  // float </>/<=/>= int
  1040  
  1041  func floatLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1042  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1043  		return BoolData(left.(float64) < float64(right.(int64)))
  1044  	})
  1045  }
  1046  
  1047  func floatLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1048  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1049  		return BoolData(left.(float64) <= float64(right.(int64)))
  1050  	})
  1051  }
  1052  
  1053  func floatGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1054  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1055  		return BoolData(left.(float64) > float64(right.(int64)))
  1056  	})
  1057  }
  1058  
  1059  func floatGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1060  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1061  		return BoolData(left.(float64) >= float64(right.(int64)))
  1062  	})
  1063  }
  1064  
  1065  // float </>/<=/>= string
  1066  
  1067  func floatLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1068  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1069  		f, err := strconv.ParseFloat(right.(string), 64)
  1070  		if err != nil {
  1071  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1072  		}
  1073  		return BoolData(left.(float64) < f)
  1074  	})
  1075  }
  1076  
  1077  func floatLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1078  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1079  		f, err := strconv.ParseFloat(right.(string), 64)
  1080  		if err != nil {
  1081  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1082  		}
  1083  		return BoolData(left.(float64) <= f)
  1084  	})
  1085  }
  1086  
  1087  func floatGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1088  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1089  		f, err := strconv.ParseFloat(right.(string), 64)
  1090  		if err != nil {
  1091  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1092  		}
  1093  		return BoolData(left.(float64) > f)
  1094  	})
  1095  }
  1096  
  1097  func floatGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1098  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1099  		f, err := strconv.ParseFloat(right.(string), 64)
  1100  		if err != nil {
  1101  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1102  		}
  1103  		return BoolData(left.(float64) >= f)
  1104  	})
  1105  }
  1106  
  1107  // string </>/<=/>= float
  1108  
  1109  func stringLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1110  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1111  		f, err := strconv.ParseFloat(left.(string), 64)
  1112  		if err != nil {
  1113  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1114  		}
  1115  		return BoolData(f < right.(float64))
  1116  	})
  1117  }
  1118  
  1119  func stringLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1120  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1121  		f, err := strconv.ParseFloat(left.(string), 64)
  1122  		if err != nil {
  1123  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1124  		}
  1125  		return BoolData(f <= right.(float64))
  1126  	})
  1127  }
  1128  
  1129  func stringGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1130  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1131  		f, err := strconv.ParseFloat(left.(string), 64)
  1132  		if err != nil {
  1133  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1134  		}
  1135  		return BoolData(f > right.(float64))
  1136  	})
  1137  }
  1138  
  1139  func stringGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1140  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1141  		f, err := strconv.ParseFloat(left.(string), 64)
  1142  		if err != nil {
  1143  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1144  		}
  1145  		return BoolData(f >= right.(float64))
  1146  	})
  1147  }
  1148  
  1149  // int </>/<=/>= string
  1150  
  1151  func intLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1152  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1153  		f, err := strconv.ParseInt(right.(string), 10, 64)
  1154  		if err != nil {
  1155  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1156  		}
  1157  		return BoolData(left.(int64) < f)
  1158  	})
  1159  }
  1160  
  1161  func intLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1162  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1163  		f, err := strconv.ParseInt(right.(string), 10, 64)
  1164  		if err != nil {
  1165  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1166  		}
  1167  		return BoolData(left.(int64) <= f)
  1168  	})
  1169  }
  1170  
  1171  func intGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1172  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1173  		f, err := strconv.ParseInt(right.(string), 10, 64)
  1174  		if err != nil {
  1175  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1176  		}
  1177  		return BoolData(left.(int64) > f)
  1178  	})
  1179  }
  1180  
  1181  func intGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1182  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1183  		f, err := strconv.ParseInt(right.(string), 10, 64)
  1184  		if err != nil {
  1185  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1186  		}
  1187  		return BoolData(left.(int64) >= f)
  1188  	})
  1189  }
  1190  
  1191  // string </>/<=/>= int
  1192  
  1193  func stringLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1194  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1195  		f, err := strconv.ParseInt(left.(string), 10, 64)
  1196  		if err != nil {
  1197  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1198  		}
  1199  		return BoolData(f < right.(int64))
  1200  	})
  1201  }
  1202  
  1203  func stringLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1204  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1205  		f, err := strconv.ParseInt(left.(string), 10, 64)
  1206  		if err != nil {
  1207  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1208  		}
  1209  		return BoolData(f <= right.(int64))
  1210  	})
  1211  }
  1212  
  1213  func stringGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1214  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1215  		f, err := strconv.ParseInt(left.(string), 10, 64)
  1216  		if err != nil {
  1217  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1218  		}
  1219  		return BoolData(f > right.(int64))
  1220  	})
  1221  }
  1222  
  1223  func stringGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1224  	return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData {
  1225  		f, err := strconv.ParseInt(left.(string), 10, 64)
  1226  		if err != nil {
  1227  			return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")}
  1228  		}
  1229  		return BoolData(f >= right.(int64))
  1230  	})
  1231  }
  1232  
  1233  // ---------------------------------
  1234  //       &&  AND        ||  OR
  1235  // ---------------------------------
  1236  
  1237  // T &&/|| T
  1238  
  1239  func truthyBool(val interface{}) bool {
  1240  	return val.(bool)
  1241  }
  1242  
  1243  func truthyInt(val interface{}) bool {
  1244  	return val.(int64) != 0
  1245  }
  1246  
  1247  func truthyFloat(val interface{}) bool {
  1248  	return val.(float64) != 0
  1249  }
  1250  
  1251  func truthyString(val interface{}) bool {
  1252  	return val.(string) != ""
  1253  }
  1254  
  1255  func truthyArray(val interface{}) bool {
  1256  	return true
  1257  }
  1258  
  1259  func truthyMap(val interface{}) bool {
  1260  	return true
  1261  }
  1262  
  1263  func boolAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1264  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyBool)
  1265  }
  1266  
  1267  func boolOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1268  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyBool)
  1269  }
  1270  
  1271  func intAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1272  	return boolAndOpV2(e, bind, chunk, ref, truthyInt, truthyInt)
  1273  }
  1274  
  1275  func intOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1276  	return boolOrOpV2(e, bind, chunk, ref, truthyInt, truthyInt)
  1277  }
  1278  
  1279  func floatAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1280  	return boolAndOpV2(e, bind, chunk, ref, truthyFloat, truthyFloat)
  1281  }
  1282  
  1283  func floatOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1284  	return boolOrOpV2(e, bind, chunk, ref, truthyFloat, truthyFloat)
  1285  }
  1286  
  1287  func stringAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1288  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1289  }
  1290  
  1291  func stringOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1292  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1293  }
  1294  
  1295  func regexAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1296  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1297  }
  1298  
  1299  func regexOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1300  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1301  }
  1302  
  1303  func arrayAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1304  	return boolAndOpV2(e, bind, chunk, ref, truthyArray, truthyArray)
  1305  }
  1306  
  1307  func arrayOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1308  	return boolOrOpV2(e, bind, chunk, ref, truthyArray, truthyArray)
  1309  }
  1310  
  1311  // bool &&/|| T
  1312  
  1313  func boolAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1314  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyInt)
  1315  }
  1316  
  1317  func boolOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1318  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyInt)
  1319  }
  1320  
  1321  func intAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1322  	return boolAndOpV2(e, bind, chunk, ref, truthyInt, truthyBool)
  1323  }
  1324  
  1325  func intOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1326  	return boolOrOpV2(e, bind, chunk, ref, truthyInt, truthyBool)
  1327  }
  1328  
  1329  func boolAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1330  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyFloat)
  1331  }
  1332  
  1333  func boolOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1334  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyFloat)
  1335  }
  1336  
  1337  func floatAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1338  	return boolAndOpV2(e, bind, chunk, ref, truthyFloat, truthyBool)
  1339  }
  1340  
  1341  func floatOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1342  	return boolOrOpV2(e, bind, chunk, ref, truthyFloat, truthyBool)
  1343  }
  1344  
  1345  func boolAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1346  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyString)
  1347  }
  1348  
  1349  func boolOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1350  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyString)
  1351  }
  1352  
  1353  func stringAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1354  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyBool)
  1355  }
  1356  
  1357  func stringOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1358  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyBool)
  1359  }
  1360  
  1361  func boolAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1362  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyString)
  1363  }
  1364  
  1365  func boolOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1366  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyString)
  1367  }
  1368  
  1369  func regexAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1370  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyBool)
  1371  }
  1372  
  1373  func regexOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1374  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyBool)
  1375  }
  1376  
  1377  func boolAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1378  	return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyArray)
  1379  }
  1380  
  1381  func boolOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1382  	return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyArray)
  1383  }
  1384  
  1385  func arrayAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1386  	return boolAndOpV2(e, bind, chunk, ref, truthyArray, truthyBool)
  1387  }
  1388  
  1389  func arrayOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1390  	return boolOrOpV2(e, bind, chunk, ref, truthyArray, truthyBool)
  1391  }
  1392  
  1393  func opBoolAndMap(left interface{}, right interface{}) bool {
  1394  	return left.(bool) && (len(right.([]interface{})) != 0)
  1395  }
  1396  
  1397  func opMapAndBool(left interface{}, right interface{}) bool {
  1398  	return right.(bool) && (len(left.([]interface{})) != 0)
  1399  }
  1400  
  1401  func opBoolOrMap(left interface{}, right interface{}) bool {
  1402  	return left.(bool) || (len(right.([]interface{})) != 0)
  1403  }
  1404  
  1405  func opMapOrBool(left interface{}, right interface{}) bool {
  1406  	return right.(bool) || (len(left.([]interface{})) != 0)
  1407  }
  1408  
  1409  func boolAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1410  	return boolOpV2(e, bind, chunk, ref, opBoolAndMap)
  1411  }
  1412  
  1413  func boolOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1414  	return boolOpV2(e, bind, chunk, ref, opBoolOrMap)
  1415  }
  1416  
  1417  func mapAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1418  	return boolOpV2(e, bind, chunk, ref, opMapAndBool)
  1419  }
  1420  
  1421  func mapOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1422  	return boolOpV2(e, bind, chunk, ref, opMapOrBool)
  1423  }
  1424  
  1425  // int &&/|| T
  1426  
  1427  func opIntAndFloat(left interface{}, right interface{}) bool {
  1428  	return (left.(int64) != 0) && (right.(float64) != 0)
  1429  }
  1430  
  1431  func opFloatAndInt(left interface{}, right interface{}) bool {
  1432  	return (right.(int64) != 0) && (left.(float64) != 0)
  1433  }
  1434  
  1435  func opIntOrFloat(left interface{}, right interface{}) bool {
  1436  	return (left.(int64) != 0) || (right.(float64) != 0)
  1437  }
  1438  
  1439  func opFloatOrInt(left interface{}, right interface{}) bool {
  1440  	return (right.(int64) != 0) || (left.(float64) != 0)
  1441  }
  1442  
  1443  func intAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1444  	return boolOpV2(e, bind, chunk, ref, opIntAndFloat)
  1445  }
  1446  
  1447  func intOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1448  	return boolOpV2(e, bind, chunk, ref, opIntOrFloat)
  1449  }
  1450  
  1451  func floatAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1452  	return boolOpV2(e, bind, chunk, ref, opFloatAndInt)
  1453  }
  1454  
  1455  func floatOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1456  	return boolOpV2(e, bind, chunk, ref, opFloatOrInt)
  1457  }
  1458  
  1459  func opIntAndString(left interface{}, right interface{}) bool {
  1460  	return (left.(int64) != 0) && (right.(string) != "")
  1461  }
  1462  
  1463  func opStringAndInt(left interface{}, right interface{}) bool {
  1464  	return (right.(int64) != 0) && (left.(string) != "")
  1465  }
  1466  
  1467  func opIntOrString(left interface{}, right interface{}) bool {
  1468  	return (left.(int64) != 0) || (right.(string) != "")
  1469  }
  1470  
  1471  func opStringOrInt(left interface{}, right interface{}) bool {
  1472  	return (right.(int64) != 0) || (left.(string) != "")
  1473  }
  1474  
  1475  func intAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1476  	return boolOpV2(e, bind, chunk, ref, opIntAndString)
  1477  }
  1478  
  1479  func intOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1480  	return boolOpV2(e, bind, chunk, ref, opIntOrString)
  1481  }
  1482  
  1483  func stringAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1484  	return boolOpV2(e, bind, chunk, ref, opStringAndInt)
  1485  }
  1486  
  1487  func stringOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1488  	return boolOpV2(e, bind, chunk, ref, opStringOrInt)
  1489  }
  1490  
  1491  func intAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1492  	return boolOpV2(e, bind, chunk, ref, opIntAndString)
  1493  }
  1494  
  1495  func intOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1496  	return boolOpV2(e, bind, chunk, ref, opIntOrString)
  1497  }
  1498  
  1499  func regexAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1500  	return boolOpV2(e, bind, chunk, ref, opStringAndInt)
  1501  }
  1502  
  1503  func regexOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1504  	return boolOpV2(e, bind, chunk, ref, opStringOrInt)
  1505  }
  1506  
  1507  func opIntAndArray(left interface{}, right interface{}) bool {
  1508  	return (left.(int64) != 0) && (len(right.([]interface{})) != 0)
  1509  }
  1510  
  1511  func opArrayAndInt(left interface{}, right interface{}) bool {
  1512  	return (right.(int64) != 0) && (len(left.([]interface{})) != 0)
  1513  }
  1514  
  1515  func opIntOrArray(left interface{}, right interface{}) bool {
  1516  	return (left.(int64) != 0) || (len(right.([]interface{})) != 0)
  1517  }
  1518  
  1519  func opArrayOrInt(left interface{}, right interface{}) bool {
  1520  	return (right.(int64) != 0) || (len(left.([]interface{})) != 0)
  1521  }
  1522  
  1523  func intAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1524  	return boolOpV2(e, bind, chunk, ref, opIntAndArray)
  1525  }
  1526  
  1527  func intOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1528  	return boolOpV2(e, bind, chunk, ref, opIntOrArray)
  1529  }
  1530  
  1531  func arrayAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1532  	return boolOpV2(e, bind, chunk, ref, opArrayAndInt)
  1533  }
  1534  
  1535  func arrayOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1536  	return boolOpV2(e, bind, chunk, ref, opArrayOrInt)
  1537  }
  1538  
  1539  func opIntAndMap(left interface{}, right interface{}) bool {
  1540  	return (left.(int64) != 0) && (len(right.(map[string]interface{})) != 0)
  1541  }
  1542  
  1543  func opMapAndInt(left interface{}, right interface{}) bool {
  1544  	return (right.(int64) != 0) && (len(left.(map[string]interface{})) != 0)
  1545  }
  1546  
  1547  func opIntOrMap(left interface{}, right interface{}) bool {
  1548  	return (left.(int64) != 0) || (len(right.(map[string]interface{})) != 0)
  1549  }
  1550  
  1551  func opMapOrInt(left interface{}, right interface{}) bool {
  1552  	return (right.(int64) != 0) || (len(left.(map[string]interface{})) != 0)
  1553  }
  1554  
  1555  func intAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1556  	return boolOpV2(e, bind, chunk, ref, opIntAndMap)
  1557  }
  1558  
  1559  func intOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1560  	return boolOpV2(e, bind, chunk, ref, opIntOrMap)
  1561  }
  1562  
  1563  func mapAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1564  	return boolOpV2(e, bind, chunk, ref, opMapAndInt)
  1565  }
  1566  
  1567  func mapOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1568  	return boolOpV2(e, bind, chunk, ref, opMapOrInt)
  1569  }
  1570  
  1571  // float &&/|| T
  1572  
  1573  func opFloatAndString(left interface{}, right interface{}) bool {
  1574  	return (left.(float64) != 0) && (right.(string) != "")
  1575  }
  1576  
  1577  func opStringAndFloat(left interface{}, right interface{}) bool {
  1578  	return (right.(float64) != 0) && (left.(string) != "")
  1579  }
  1580  
  1581  func opFloatOrString(left interface{}, right interface{}) bool {
  1582  	return (left.(float64) != 0) || (right.(string) != "")
  1583  }
  1584  
  1585  func opStringOrFloat(left interface{}, right interface{}) bool {
  1586  	return (right.(float64) != 0) || (left.(string) != "")
  1587  }
  1588  
  1589  func floatAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1590  	return boolOpV2(e, bind, chunk, ref, opFloatAndString)
  1591  }
  1592  
  1593  func floatOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1594  	return boolOpV2(e, bind, chunk, ref, opFloatOrString)
  1595  }
  1596  
  1597  func stringAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1598  	return boolOpV2(e, bind, chunk, ref, opStringAndFloat)
  1599  }
  1600  
  1601  func stringOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1602  	return boolOpV2(e, bind, chunk, ref, opStringOrFloat)
  1603  }
  1604  
  1605  func floatAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1606  	return boolOpV2(e, bind, chunk, ref, opFloatAndString)
  1607  }
  1608  
  1609  func floatOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1610  	return boolOpV2(e, bind, chunk, ref, opFloatOrString)
  1611  }
  1612  
  1613  func regexAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1614  	return boolOpV2(e, bind, chunk, ref, opStringAndFloat)
  1615  }
  1616  
  1617  func regexOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1618  	return boolOpV2(e, bind, chunk, ref, opStringOrFloat)
  1619  }
  1620  
  1621  func opFloatAndArray(left interface{}, right interface{}) bool {
  1622  	return (left.(float64) != 0) && (len(right.([]interface{})) != 0)
  1623  }
  1624  
  1625  func opArrayAndFloat(left interface{}, right interface{}) bool {
  1626  	return (right.(float64) != 0) && (len(left.([]interface{})) != 0)
  1627  }
  1628  
  1629  func opFloatOrArray(left interface{}, right interface{}) bool {
  1630  	return (left.(float64) != 0) || (len(right.([]interface{})) != 0)
  1631  }
  1632  
  1633  func opArrayOrFloat(left interface{}, right interface{}) bool {
  1634  	return (right.(float64) != 0) || (len(left.([]interface{})) != 0)
  1635  }
  1636  
  1637  func floatAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1638  	return boolOpV2(e, bind, chunk, ref, opFloatAndArray)
  1639  }
  1640  
  1641  func floatOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1642  	return boolOpV2(e, bind, chunk, ref, opFloatOrArray)
  1643  }
  1644  
  1645  func arrayAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1646  	return boolOpV2(e, bind, chunk, ref, opArrayAndFloat)
  1647  }
  1648  
  1649  func arrayOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1650  	return boolOpV2(e, bind, chunk, ref, opArrayOrFloat)
  1651  }
  1652  
  1653  func opFloatAndMap(left interface{}, right interface{}) bool {
  1654  	return (left.(float64) != 0) && (len(right.(map[string]interface{})) != 0)
  1655  }
  1656  
  1657  func opMapAndFloat(left interface{}, right interface{}) bool {
  1658  	return (right.(float64) != 0) && (len(left.(map[string]interface{})) != 0)
  1659  }
  1660  
  1661  func opFloatOrMap(left interface{}, right interface{}) bool {
  1662  	return (left.(float64) != 0) || (len(right.(map[string]interface{})) != 0)
  1663  }
  1664  
  1665  func opMapOrFloat(left interface{}, right interface{}) bool {
  1666  	return (right.(float64) != 0) || (len(left.(map[string]interface{})) != 0)
  1667  }
  1668  
  1669  func floatAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1670  	return boolOpV2(e, bind, chunk, ref, opFloatAndMap)
  1671  }
  1672  
  1673  func floatOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1674  	return boolOpV2(e, bind, chunk, ref, opFloatOrMap)
  1675  }
  1676  
  1677  func mapAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1678  	return boolOpV2(e, bind, chunk, ref, opMapAndFloat)
  1679  }
  1680  
  1681  func mapOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1682  	return boolOpV2(e, bind, chunk, ref, opMapOrFloat)
  1683  }
  1684  
  1685  // string &&/|| T
  1686  
  1687  func stringAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1688  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1689  }
  1690  
  1691  func stringOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1692  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1693  }
  1694  
  1695  func regexAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1696  	return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1697  }
  1698  
  1699  func regexOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1700  	return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString)
  1701  }
  1702  
  1703  func opStringAndArray(left interface{}, right interface{}) bool {
  1704  	return (left.(float64) != 0) && (len(right.([]interface{})) != 0)
  1705  }
  1706  
  1707  func opArrayAndString(left interface{}, right interface{}) bool {
  1708  	return (right.(float64) != 0) && (len(left.([]interface{})) != 0)
  1709  }
  1710  
  1711  func opStringOrArray(left interface{}, right interface{}) bool {
  1712  	return (left.(float64) != 0) || (len(right.([]interface{})) != 0)
  1713  }
  1714  
  1715  func opArrayOrString(left interface{}, right interface{}) bool {
  1716  	return (right.(float64) != 0) || (len(left.([]interface{})) != 0)
  1717  }
  1718  
  1719  func stringAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1720  	return boolOpV2(e, bind, chunk, ref, opStringAndArray)
  1721  }
  1722  
  1723  func stringOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1724  	return boolOpV2(e, bind, chunk, ref, opStringOrArray)
  1725  }
  1726  
  1727  func arrayAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1728  	return boolOpV2(e, bind, chunk, ref, opArrayAndString)
  1729  }
  1730  
  1731  func arrayOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1732  	return boolOpV2(e, bind, chunk, ref, opArrayOrString)
  1733  }
  1734  
  1735  func opStringAndMap(left interface{}, right interface{}) bool {
  1736  	return (left.(float64) != 0) && (len(right.(map[string]interface{})) != 0)
  1737  }
  1738  
  1739  func opMapAndString(left interface{}, right interface{}) bool {
  1740  	return (right.(float64) != 0) && (len(left.(map[string]interface{})) != 0)
  1741  }
  1742  
  1743  func opStringOrMap(left interface{}, right interface{}) bool {
  1744  	return (left.(float64) != 0) || (len(right.(map[string]interface{})) != 0)
  1745  }
  1746  
  1747  func opMapOrString(left interface{}, right interface{}) bool {
  1748  	return (right.(float64) != 0) || (len(left.(map[string]interface{})) != 0)
  1749  }
  1750  
  1751  func stringAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1752  	return boolOpV2(e, bind, chunk, ref, opStringAndMap)
  1753  }
  1754  
  1755  func stringOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1756  	return boolOpV2(e, bind, chunk, ref, opStringOrMap)
  1757  }
  1758  
  1759  func mapAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1760  	return boolOpV2(e, bind, chunk, ref, opMapAndString)
  1761  }
  1762  
  1763  func mapOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1764  	return boolOpV2(e, bind, chunk, ref, opMapOrString)
  1765  }
  1766  
  1767  // string + T
  1768  
  1769  func stringPlusStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1770  	return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData {
  1771  		l := left.(string)
  1772  		r := right.(string)
  1773  
  1774  		return StringData(l + r)
  1775  	})
  1776  }
  1777  
  1778  // regex &&/|| array
  1779  
  1780  func regexAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1781  	return boolOpV2(e, bind, chunk, ref, opStringAndArray)
  1782  }
  1783  
  1784  func regexOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1785  	return boolOpV2(e, bind, chunk, ref, opStringOrArray)
  1786  }
  1787  
  1788  func arrayAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1789  	return boolOpV2(e, bind, chunk, ref, opArrayAndString)
  1790  }
  1791  
  1792  func arrayOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1793  	return boolOpV2(e, bind, chunk, ref, opArrayOrString)
  1794  }
  1795  
  1796  // regex &&/|| map
  1797  
  1798  func regexAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1799  	return boolOpV2(e, bind, chunk, ref, opStringAndMap)
  1800  }
  1801  
  1802  func regexOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1803  	return boolOpV2(e, bind, chunk, ref, opStringOrMap)
  1804  }
  1805  
  1806  func mapAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1807  	return boolOpV2(e, bind, chunk, ref, opMapAndString)
  1808  }
  1809  
  1810  func mapOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1811  	return boolOpV2(e, bind, chunk, ref, opMapOrString)
  1812  }
  1813  
  1814  // time &&/|| T
  1815  // note: time is always truthy
  1816  
  1817  func opBoolAndTime(left interface{}, right interface{}) bool {
  1818  	return left.(bool)
  1819  }
  1820  
  1821  func opTimeAndBool(left interface{}, right interface{}) bool {
  1822  	return right.(bool)
  1823  }
  1824  
  1825  func boolAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1826  	return boolOpV2(e, bind, chunk, ref, opBoolAndTime)
  1827  }
  1828  
  1829  func boolOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1830  	return BoolTrue, 0, nil
  1831  }
  1832  
  1833  func timeAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1834  	return boolOpV2(e, bind, chunk, ref, opTimeAndBool)
  1835  }
  1836  
  1837  func timeOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1838  	return BoolTrue, 0, nil
  1839  }
  1840  
  1841  func opIntAndTime(left interface{}, right interface{}) bool {
  1842  	return left.(int64) != 0
  1843  }
  1844  
  1845  func opTimeAndInt(left interface{}, right interface{}) bool {
  1846  	return right.(int64) != 0
  1847  }
  1848  
  1849  func intAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1850  	return boolOpV2(e, bind, chunk, ref, opIntAndTime)
  1851  }
  1852  
  1853  func intOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1854  	return BoolTrue, 0, nil
  1855  }
  1856  
  1857  func timeAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1858  	return boolOpV2(e, bind, chunk, ref, opTimeAndInt)
  1859  }
  1860  
  1861  func timeOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1862  	return BoolTrue, 0, nil
  1863  }
  1864  
  1865  func opFloatAndTime(left interface{}, right interface{}) bool {
  1866  	return left.(float64) != 0
  1867  }
  1868  
  1869  func opTimeAndFloat(left interface{}, right interface{}) bool {
  1870  	return right.(float64) != 0
  1871  }
  1872  
  1873  func floatAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1874  	return boolOpV2(e, bind, chunk, ref, opFloatAndTime)
  1875  }
  1876  
  1877  func floatOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1878  	return BoolTrue, 0, nil
  1879  }
  1880  
  1881  func timeAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1882  	return boolOpV2(e, bind, chunk, ref, opTimeAndFloat)
  1883  }
  1884  
  1885  func timeOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1886  	return BoolTrue, 0, nil
  1887  }
  1888  
  1889  func opStringAndTime(left interface{}, right interface{}) bool {
  1890  	return left.(string) != ""
  1891  }
  1892  
  1893  func opTimeAndString(left interface{}, right interface{}) bool {
  1894  	return right.(string) != ""
  1895  }
  1896  
  1897  func stringAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1898  	return boolOpV2(e, bind, chunk, ref, opStringAndTime)
  1899  }
  1900  
  1901  func stringOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1902  	return BoolTrue, 0, nil
  1903  }
  1904  
  1905  func timeAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1906  	return boolOpV2(e, bind, chunk, ref, opTimeAndString)
  1907  }
  1908  
  1909  func timeOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1910  	return BoolTrue, 0, nil
  1911  }
  1912  
  1913  func opRegexAndTime(left interface{}, right interface{}) bool {
  1914  	return left.(string) != ""
  1915  }
  1916  
  1917  func opTimeAndRegex(left interface{}, right interface{}) bool {
  1918  	return right.(string) != ""
  1919  }
  1920  
  1921  func regexAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1922  	return boolOpV2(e, bind, chunk, ref, opRegexAndTime)
  1923  }
  1924  
  1925  func regexOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1926  	return BoolTrue, 0, nil
  1927  }
  1928  
  1929  func timeAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1930  	return boolOpV2(e, bind, chunk, ref, opTimeAndRegex)
  1931  }
  1932  
  1933  func timeOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1934  	return BoolTrue, 0, nil
  1935  }
  1936  
  1937  func timeAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1938  	return BoolTrue, 0, nil
  1939  }
  1940  
  1941  func timeOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1942  	return BoolTrue, 0, nil
  1943  }
  1944  
  1945  func opTimeAndArray(left interface{}, right interface{}) bool {
  1946  	return len(right.([]interface{})) != 0
  1947  }
  1948  
  1949  func opArrayAndTime(left interface{}, right interface{}) bool {
  1950  	return len(left.([]interface{})) != 0
  1951  }
  1952  
  1953  func timeAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1954  	return boolOpV2(e, bind, chunk, ref, opTimeAndArray)
  1955  }
  1956  
  1957  func timeOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1958  	return BoolTrue, 0, nil
  1959  }
  1960  
  1961  func arrayAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1962  	return boolOpV2(e, bind, chunk, ref, opArrayAndTime)
  1963  }
  1964  
  1965  func arrayOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1966  	return BoolTrue, 0, nil
  1967  }
  1968  
  1969  func opTimeAndMap(left interface{}, right interface{}) bool {
  1970  	return len(right.(map[string]interface{})) != 0
  1971  }
  1972  
  1973  func opMapAndTime(left interface{}, right interface{}) bool {
  1974  	return len(left.(map[string]interface{})) != 0
  1975  }
  1976  
  1977  func timeAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1978  	return boolOpV2(e, bind, chunk, ref, opTimeAndMap)
  1979  }
  1980  
  1981  func timeOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1982  	return BoolTrue, 0, nil
  1983  }
  1984  
  1985  func mapAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1986  	return boolOpV2(e, bind, chunk, ref, opMapAndTime)
  1987  }
  1988  
  1989  func mapOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1990  	return BoolTrue, 0, nil
  1991  }
  1992  
  1993  // string methods
  1994  
  1995  func stringContainsStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  1996  	if bind.Value == nil {
  1997  		return BoolFalse, 0, nil
  1998  	}
  1999  
  2000  	argRef := chunk.Function.Args[0]
  2001  	arg, rref, err := e.resolveValue(argRef, ref)
  2002  	if err != nil || rref > 0 {
  2003  		return nil, rref, err
  2004  	}
  2005  
  2006  	if arg.Value == nil {
  2007  		return BoolFalse, 0, nil
  2008  	}
  2009  
  2010  	ok := strings.Contains(bind.Value.(string), arg.Value.(string))
  2011  	return BoolData(ok), 0, nil
  2012  }
  2013  
  2014  func stringContainsIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2015  	if bind.Value == nil {
  2016  		return BoolFalse, 0, nil
  2017  	}
  2018  
  2019  	argRef := chunk.Function.Args[0]
  2020  	arg, rref, err := e.resolveValue(argRef, ref)
  2021  	if err != nil || rref > 0 {
  2022  		return nil, rref, err
  2023  	}
  2024  
  2025  	if arg.Value == nil {
  2026  		return BoolFalse, 0, nil
  2027  	}
  2028  
  2029  	val := strconv.FormatInt(arg.Value.(int64), 10)
  2030  
  2031  	ok := strings.Contains(bind.Value.(string), val)
  2032  	return BoolData(ok), 0, nil
  2033  }
  2034  
  2035  func stringContainsRegex(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2036  	if bind.Value == nil {
  2037  		return BoolFalse, 0, nil
  2038  	}
  2039  
  2040  	argRef := chunk.Function.Args[0]
  2041  	arg, rref, err := e.resolveValue(argRef, ref)
  2042  	if err != nil || rref > 0 {
  2043  		return nil, rref, err
  2044  	}
  2045  
  2046  	if arg.Value == nil {
  2047  		return BoolFalse, 0, nil
  2048  	}
  2049  
  2050  	reContent := arg.Value.(string)
  2051  	re, err := regexp.Compile(reContent)
  2052  	if err != nil {
  2053  		return nil, 0, errors.New("Failed to compile regular expression: " + reContent)
  2054  	}
  2055  
  2056  	ok := re.MatchString(bind.Value.(string))
  2057  	return BoolData(ok), 0, nil
  2058  }
  2059  
  2060  func stringContainsArrayStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2061  	if bind.Value == nil {
  2062  		return BoolFalse, 0, nil
  2063  	}
  2064  
  2065  	argRef := chunk.Function.Args[0]
  2066  	arg, rref, err := e.resolveValue(argRef, ref)
  2067  	if err != nil || rref > 0 {
  2068  		return nil, rref, err
  2069  	}
  2070  
  2071  	if arg.Value == nil {
  2072  		return BoolFalse, 0, nil
  2073  	}
  2074  
  2075  	arr := arg.Value.([]interface{})
  2076  	for i := range arr {
  2077  		v := arr[i].(string)
  2078  		if strings.Contains(bind.Value.(string), v) {
  2079  			return BoolData(true), 0, nil
  2080  		}
  2081  	}
  2082  
  2083  	return BoolData(false), 0, nil
  2084  }
  2085  
  2086  func stringContainsArrayIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2087  	if bind.Value == nil {
  2088  		return BoolFalse, 0, nil
  2089  	}
  2090  
  2091  	argRef := chunk.Function.Args[0]
  2092  	arg, rref, err := e.resolveValue(argRef, ref)
  2093  	if err != nil || rref > 0 {
  2094  		return nil, rref, err
  2095  	}
  2096  
  2097  	if arg.Value == nil {
  2098  		return BoolFalse, 0, nil
  2099  	}
  2100  
  2101  	arr := arg.Value.([]interface{})
  2102  	for i := range arr {
  2103  		v := arr[i].(int64)
  2104  		val := strconv.FormatInt(v, 10)
  2105  		if strings.Contains(bind.Value.(string), val) {
  2106  			return BoolData(true), 0, nil
  2107  		}
  2108  	}
  2109  
  2110  	return BoolData(false), 0, nil
  2111  }
  2112  
  2113  func stringContainsArrayRegex(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2114  	if bind.Value == nil {
  2115  		return BoolFalse, 0, nil
  2116  	}
  2117  
  2118  	argRef := chunk.Function.Args[0]
  2119  	arg, rref, err := e.resolveValue(argRef, ref)
  2120  	if err != nil || rref > 0 {
  2121  		return nil, rref, err
  2122  	}
  2123  
  2124  	if arg.Value == nil {
  2125  		return BoolFalse, 0, nil
  2126  	}
  2127  
  2128  	arr := arg.Value.([]interface{})
  2129  	for i := range arr {
  2130  		v := arr[i].(string)
  2131  		re, err := regexp.Compile(v)
  2132  		if err != nil {
  2133  			return nil, 0, errors.New("Failed to compile regular expression: " + v)
  2134  		}
  2135  
  2136  		if re.MatchString(bind.Value.(string)) {
  2137  			return BoolData(true), 0, nil
  2138  		}
  2139  	}
  2140  
  2141  	return BoolData(false), 0, nil
  2142  }
  2143  
  2144  func stringFindV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2145  	if bind.Value == nil {
  2146  		return ArrayData([]interface{}{}, types.String), 0, nil
  2147  	}
  2148  
  2149  	argRef := chunk.Function.Args[0]
  2150  	arg, rref, err := e.resolveValue(argRef, ref)
  2151  	if err != nil || rref > 0 {
  2152  		return nil, rref, err
  2153  	}
  2154  
  2155  	if arg.Value == nil {
  2156  		return ArrayData([]interface{}{}, types.String), 0, nil
  2157  	}
  2158  
  2159  	reContent := arg.Value.(string)
  2160  	re, err := regexp.Compile(reContent)
  2161  	if err != nil {
  2162  		return nil, 0, errors.New("Failed to compile regular expression: " + reContent)
  2163  	}
  2164  
  2165  	list := re.FindAllString(bind.Value.(string), -1)
  2166  	res := make([]interface{}, len(list))
  2167  	for i := range list {
  2168  		res[i] = list[i]
  2169  	}
  2170  
  2171  	return ArrayData(res, types.String), 0, nil
  2172  }
  2173  
  2174  func stringDowncaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2175  	if bind.Value == nil {
  2176  		return &RawData{Type: bind.Type}, 0, nil
  2177  	}
  2178  
  2179  	res := strings.ToLower(bind.Value.(string))
  2180  	return StringData(res), 0, nil
  2181  }
  2182  
  2183  var camelCaseRe = regexp.MustCompile(`([[:punct:]]|\s)+[\p{L}]`)
  2184  
  2185  func stringCamelcaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2186  	if bind.Value == nil {
  2187  		return &RawData{Type: bind.Type}, 0, nil
  2188  	}
  2189  
  2190  	res := camelCaseRe.ReplaceAllStringFunc(bind.Value.(string), func(in string) string {
  2191  		reader := strings.NewReader(in)
  2192  		var last rune
  2193  		for {
  2194  			r, _, err := reader.ReadRune()
  2195  			if err == io.EOF {
  2196  				break
  2197  			}
  2198  			if err != nil {
  2199  				return in
  2200  			}
  2201  			last = r
  2202  		}
  2203  
  2204  		return string(unicode.ToTitle(last))
  2205  	})
  2206  
  2207  	return StringData(res), 0, nil
  2208  }
  2209  
  2210  func stringUpcaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2211  	if bind.Value == nil {
  2212  		return &RawData{Type: bind.Type}, 0, nil
  2213  	}
  2214  
  2215  	res := strings.ToUpper(bind.Value.(string))
  2216  	return StringData(res), 0, nil
  2217  }
  2218  
  2219  func stringLengthV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2220  	if bind.Value == nil {
  2221  		return &RawData{Type: types.Int}, 0, nil
  2222  	}
  2223  
  2224  	l := len(bind.Value.(string))
  2225  	return IntData(int64(l)), 0, nil
  2226  }
  2227  
  2228  func stringLinesV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2229  	if bind.Value == nil {
  2230  		return &RawData{Type: types.Array(types.String)}, 0, nil
  2231  	}
  2232  
  2233  	s := bind.Value.(string)
  2234  	lines := strings.Split(s, "\n")
  2235  	res := make([]interface{}, len(lines))
  2236  	for i := range lines {
  2237  		res[i] = lines[i]
  2238  	}
  2239  
  2240  	return ArrayData(res, types.String), 0, nil
  2241  }
  2242  
  2243  func stringSplitV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2244  	if bind.Value == nil {
  2245  		return &RawData{Type: types.Array(types.String)}, 0, nil
  2246  	}
  2247  
  2248  	argRef := chunk.Function.Args[0]
  2249  	arg, rref, err := e.resolveValue(argRef, ref)
  2250  	if err != nil || rref > 0 {
  2251  		return nil, rref, err
  2252  	}
  2253  
  2254  	if arg.Value == nil {
  2255  		return &RawData{
  2256  			Type:  types.Array(types.String),
  2257  			Value: nil,
  2258  			Error: errors.New("failed to split string, separator was null"),
  2259  		}, 0, nil
  2260  	}
  2261  
  2262  	splits := strings.Split(bind.Value.(string), arg.Value.(string))
  2263  	res := make([]interface{}, len(splits))
  2264  	for i := range splits {
  2265  		res[i] = splits[i]
  2266  	}
  2267  
  2268  	return ArrayData(res, types.String), 0, nil
  2269  }
  2270  
  2271  func stringTrimV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2272  	if bind.Value == nil {
  2273  		return &RawData{Type: bind.Type}, 0, nil
  2274  	}
  2275  
  2276  	cutset := " \t\n\r"
  2277  
  2278  	if len(chunk.Function.Args) != 0 {
  2279  		argRef := chunk.Function.Args[0]
  2280  		arg, rref, err := e.resolveValue(argRef, ref)
  2281  		if err != nil || rref > 0 {
  2282  			return nil, rref, err
  2283  		}
  2284  
  2285  		if arg.Value == nil {
  2286  			return &RawData{
  2287  				Type:  bind.Type,
  2288  				Value: nil,
  2289  				Error: errors.New("failed to trim string, cutset was null"),
  2290  			}, 0, nil
  2291  		}
  2292  
  2293  		cutset = arg.Value.(string)
  2294  	}
  2295  
  2296  	res := strings.Trim(bind.Value.(string), cutset)
  2297  
  2298  	return StringData(res), 0, nil
  2299  }
  2300  
  2301  // time methods
  2302  
  2303  // zeroTimeOffset to help convert unix times into base times that start at the year 0
  2304  const zeroTimeOffset int64 = -62167219200
  2305  
  2306  // TimeToDuration takes a regular time object and treats it as a duration and gets the duration in seconds
  2307  func TimeToDuration(t *time.Time) int64 {
  2308  	return t.Unix() - zeroTimeOffset
  2309  }
  2310  
  2311  // DurationToTime takes a duration in seconds and turns it into a time object
  2312  func DurationToTime(i int64) time.Time {
  2313  	return time.Unix(i+zeroTimeOffset, 0)
  2314  }
  2315  
  2316  func timeSecondsV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2317  	t := bind.Value.(*time.Time)
  2318  	if t == nil {
  2319  		return &RawData{Type: types.Array(types.Time)}, 0, nil
  2320  	}
  2321  
  2322  	if *t == NeverPastTime {
  2323  		return MinIntPrimitive.RawData(), 0, nil
  2324  	}
  2325  	if *t == NeverFutureTime {
  2326  		return MaxIntPrimitive.RawData(), 0, nil
  2327  	}
  2328  
  2329  	raw := TimeToDuration(t)
  2330  	return IntData(int64(raw)), 0, nil
  2331  }
  2332  
  2333  func timeMinutesV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2334  	t := bind.Value.(*time.Time)
  2335  	if t == nil {
  2336  		return &RawData{Type: types.Array(types.Time)}, 0, nil
  2337  	}
  2338  
  2339  	if *t == NeverPastTime {
  2340  		return MinIntPrimitive.RawData(), 0, nil
  2341  	}
  2342  	if *t == NeverFutureTime {
  2343  		return MaxIntPrimitive.RawData(), 0, nil
  2344  	}
  2345  
  2346  	raw := TimeToDuration(t) / 60
  2347  	return IntData(int64(raw)), 0, nil
  2348  }
  2349  
  2350  func timeHoursV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2351  	t := bind.Value.(*time.Time)
  2352  	if t == nil {
  2353  		return &RawData{Type: types.Array(types.Time)}, 0, nil
  2354  	}
  2355  
  2356  	if *t == NeverPastTime {
  2357  		return MinIntPrimitive.RawData(), 0, nil
  2358  	}
  2359  	if *t == NeverFutureTime {
  2360  		return MaxIntPrimitive.RawData(), 0, nil
  2361  	}
  2362  
  2363  	raw := TimeToDuration(t) / (60 * 60)
  2364  	return IntData(int64(raw)), 0, nil
  2365  }
  2366  
  2367  func timeDaysV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2368  	t := bind.Value.(*time.Time)
  2369  	if t == nil {
  2370  		return &RawData{Type: types.Array(types.Time)}, 0, nil
  2371  	}
  2372  
  2373  	if *t == NeverPastTime {
  2374  		return MinIntPrimitive.RawData(), 0, nil
  2375  	}
  2376  	if *t == NeverFutureTime {
  2377  		return MaxIntPrimitive.RawData(), 0, nil
  2378  	}
  2379  
  2380  	raw := TimeToDuration(t) / (60 * 60 * 24)
  2381  	return IntData(int64(raw)), 0, nil
  2382  }
  2383  
  2384  func timeUnixV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2385  	t := bind.Value.(*time.Time)
  2386  	if t == nil {
  2387  		return &RawData{Type: types.Array(types.Time)}, 0, nil
  2388  	}
  2389  
  2390  	raw := t.Unix()
  2391  	return IntData(int64(raw)), 0, nil
  2392  }
  2393  
  2394  // stringslice methods
  2395  
  2396  func stringsliceEqString(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2397  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
  2398  		l := left.(string)
  2399  		r := right.(string)
  2400  		idx := strings.Index(l, r)
  2401  		if idx == -1 {
  2402  			return StringData("")
  2403  		}
  2404  		return StringData(r)
  2405  	})
  2406  }
  2407  
  2408  func stringsliceEqArrayString(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) {
  2409  	return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData {
  2410  		l := left.(string)
  2411  		arr := right.([]interface{})
  2412  		for i := range arr {
  2413  			r := arr[i].(string)
  2414  			idx := strings.Index(l, r)
  2415  			if idx != -1 {
  2416  				return StringData(r)
  2417  			}
  2418  		}
  2419  
  2420  		return StringData("")
  2421  	})
  2422  }