From 87ab6b720d65ec80a5db3e8bfde3168296985ba6 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Wed, 20 Nov 2024 12:03:06 -0500 Subject: [PATCH 01/22] vam: Summarize use vector.Builder to materialize (#5484) The commit changes slow path aggregations to use vector.Builder when materializing the aggregation table. The previous approaching of creating a dynamic of consts was causing the system to run out of memory when querying larger datasets. --- runtime/vam/expr/agg/avg.go | 12 +++--- runtime/vam/expr/agg/count.go | 6 +-- runtime/vam/op/summarize/agg.go | 53 ++++++++++++++++----------- runtime/vam/op/summarize/summarize.go | 2 +- vector/builder.go | 35 ++++++++++++++++++ 5 files changed, 78 insertions(+), 30 deletions(-) diff --git a/runtime/vam/expr/agg/avg.go b/runtime/vam/expr/agg/avg.go index 214215f776..7c17bd589f 100644 --- a/runtime/vam/expr/agg/avg.go +++ b/runtime/vam/expr/agg/avg.go @@ -43,13 +43,15 @@ func (a *avg) ConsumeAsPartial(partial vector.Any) { if !ok1 || !ok2 { panic("avg: invalid partial") } - sumVal, ok1 := rec.Fields[si].(*vector.Const) - countVal, ok2 := rec.Fields[ci].(*vector.Const) - if !ok1 || !ok2 || sumVal.Type() != super.TypeFloat64 || countVal.Type() != super.TypeUint64 { + sumVal := rec.Fields[si] + countVal := rec.Fields[ci] + if sumVal.Type() != super.TypeFloat64 || countVal.Type() != super.TypeUint64 { panic("avg: invalid partial") } - a.sum += sumVal.Value().Float() - a.count += countVal.Value().Uint() + sum, _ := vector.FloatValue(sumVal, 0) + count, _ := vector.UintValue(countVal, 0) + a.sum += sum + a.count += count } func (a *avg) ResultAsPartial(zctx *super.Context) super.Value { diff --git a/runtime/vam/expr/agg/count.go b/runtime/vam/expr/agg/count.go index 9272efabc7..d25f9d4fbb 100644 --- a/runtime/vam/expr/agg/count.go +++ b/runtime/vam/expr/agg/count.go @@ -37,11 +37,11 @@ func (a *count) Result(*super.Context) super.Value { } func (a *count) ConsumeAsPartial(partial vector.Any) { - c, ok := partial.(*vector.Const) - if !ok || c.Len() != 1 || partial.Type() != super.TypeUint64 { + if partial.Len() != 1 || partial.Type() != super.TypeUint64 { panic("count: bad partial") } - a.count += c.Value().Uint() + count, _ := vector.UintValue(partial, 0) + a.count += count } func (a *count) ResultAsPartial(*super.Context) super.Value { diff --git a/runtime/vam/op/summarize/agg.go b/runtime/vam/op/summarize/agg.go index a3fa2a2b20..f592e72dae 100644 --- a/runtime/vam/op/summarize/agg.go +++ b/runtime/vam/op/summarize/agg.go @@ -24,7 +24,8 @@ type superTable struct { builder *vector.RecordBuilder partialsIn bool partialsOut bool - table map[string]aggRow + table map[string]int + rows []aggRow zctx *super.Context } @@ -52,11 +53,13 @@ func (s *superTable) update(keys []vector.Any, args []vector.Any) { m[string(keyBytes)] = append(m[string(keyBytes)], slot) } for rowKey, index := range m { - row, ok := s.table[rowKey] + id, ok := s.table[rowKey] if !ok { - row = s.newRow(keys, index) - s.table[rowKey] = row + id = len(s.rows) + s.table[rowKey] = id + s.rows = append(s.rows, s.newRow(keys, index)) } + row := s.rows[id] for i, arg := range args { if len(m) > 1 { arg = vector.NewView(arg, index) @@ -85,32 +88,40 @@ func (s *superTable) newRow(keys []vector.Any, index []uint32) aggRow { } func (s *superTable) materialize() vector.Any { + if len(s.rows) == 0 { + return vector.NewConst(super.Null, 0, nil) + } var vecs []vector.Any - var tags []uint32 - // XXX This should reasonably concat all materialize rows together instead - // of this crazy Dynamic hack. - for _, row := range s.table { - tags = append(tags, uint32(len(tags))) - vecs = append(vecs, s.materializeRow(row)) + for i := range s.rows[0].keys { + vecs = append(vecs, s.materializeKey(i)) + } + for i := range s.rows[0].funcs { + vecs = append(vecs, s.materializeAgg(i)) } - return vector.NewDynamic(tags, vecs) + // Since aggs can return dynamic values need to do apply to create record. + return vector.Apply(false, func(vecs ...vector.Any) vector.Any { + return s.builder.New(vecs) + }, vecs...) } -func (s *superTable) materializeRow(row aggRow) vector.Any { - var vecs []vector.Any - for _, key := range row.keys { - vecs = append(vecs, vector.NewConst(key, 1, nil)) +func (s *superTable) materializeKey(i int) vector.Any { + b := vector.NewBuilder(s.rows[0].keys[i].Type()) + for _, row := range s.rows { + b.Write(row.keys[i].Bytes()) } - for _, fn := range row.funcs { - var val super.Value + return b.Build() +} + +func (s *superTable) materializeAgg(i int) vector.Any { + b := vector.NewDynamicBuilder() + for _, row := range s.rows { if s.partialsOut { - val = fn.ResultAsPartial(s.zctx) + b.Write(row.funcs[i].ResultAsPartial(s.zctx)) } else { - val = fn.Result(s.zctx) + b.Write(row.funcs[i].Result(s.zctx)) } - vecs = append(vecs, vector.NewConst(val, 1, nil)) } - return s.builder.New(vecs) + return b.Build() } type countByString struct { diff --git a/runtime/vam/op/summarize/summarize.go b/runtime/vam/op/summarize/summarize.go index 62d3d42204..0f85009da9 100644 --- a/runtime/vam/op/summarize/summarize.go +++ b/runtime/vam/op/summarize/summarize.go @@ -111,7 +111,7 @@ func (s *Summarize) newAggTable(keyTypes []super.Type) aggTable { builder: s.builder, partialsIn: s.partialsIn, partialsOut: s.partialsOut, - table: make(map[string]aggRow), + table: make(map[string]int), zctx: s.zctx, } } diff --git a/vector/builder.go b/vector/builder.go index a65c2f9d50..a9b7847937 100644 --- a/vector/builder.go +++ b/vector/builder.go @@ -14,6 +14,41 @@ type Builder interface { Build() Any } +type DynamicBuilder struct { + tags []uint32 + values []Builder + which map[super.Type]int +} + +func NewDynamicBuilder() *DynamicBuilder { + return &DynamicBuilder{ + which: make(map[super.Type]int), + } +} + +func (d *DynamicBuilder) Write(val super.Value) { + typ := val.Type() + tag, ok := d.which[typ] + if !ok { + tag = len(d.values) + d.values = append(d.values, NewBuilder(typ)) + d.which[typ] = tag + } + d.tags = append(d.tags, uint32(tag)) + d.values[tag].Write(val.Bytes()) +} + +func (d *DynamicBuilder) Build() Any { + var vecs []Any + for _, b := range d.values { + vecs = append(vecs, b.Build()) + } + if len(vecs) == 1 { + return vecs[0] + } + return NewDynamic(d.tags, vecs) +} + func NewBuilder(typ super.Type) Builder { var b Builder switch typ := typ.(type) { From 95e746d3cf44baa05a4924cc68daa58093a5c0d2 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Thu, 21 Nov 2024 10:29:32 -0500 Subject: [PATCH 02/22] sam: Use SQL semantics for null comparison (#5490) The commit changes the sequential runtime to embrace SQL semantics when comparing values to nulls. This commit also changes the IS NULL expression to not rely on generic equality compare which would produce incorrect results with SQL null semantics. --- compiler/ast/ast.go | 8 + compiler/ast/unpack.go | 1 + compiler/dag/expr.go | 5 + compiler/dag/unpack.go | 1 + compiler/kernel/expr.go | 10 + compiler/parser/parser.go | 5138 ++++++++--------- compiler/parser/parser.peg | 15 +- compiler/semantic/expr.go | 11 + compiler/semantic/op.go | 2 + runtime/sam/expr/boolean.go | 121 +- runtime/sam/expr/eval.go | 32 +- runtime/sam/expr/filter.go | 11 +- .../sam/expr/ztests/compare-null-int64.yaml | 4 +- .../sam/expr/ztests/compare-null-string.yaml | 4 +- .../ztests/filter-null-with-unset-field.yaml | 2 +- runtime/sam/expr/ztests/is-null.yaml | 19 + runtime/sam/expr/ztests/slice.yaml | 2 +- zfmt/ast.go | 7 + zfmt/dag.go | 12 +- 19 files changed, 2731 insertions(+), 2674 deletions(-) create mode 100644 runtime/sam/expr/ztests/is-null.yaml diff --git a/compiler/ast/ast.go b/compiler/ast/ast.go index daf935c95c..88b9a7fd69 100644 --- a/compiler/ast/ast.go +++ b/compiler/ast/ast.go @@ -133,6 +133,13 @@ type IndexExpr struct { Loc `json:"loc"` } +type IsNullExpr struct { + Kind string `json:"kind" unpack:""` + Expr Expr `json:"expr"` + Not bool `json:"not"` + Loc `json:"loc"` +} + type SliceExpr struct { Kind string `json:"kind" unpack:""` Expr Expr `json:"expr"` @@ -315,6 +322,7 @@ func (*CaseExpr) ExprAST() {} func (*Cast) ExprAST() {} func (*ID) ExprAST() {} func (*IndexExpr) ExprAST() {} +func (*IsNullExpr) ExprAST() {} func (*SliceExpr) ExprAST() {} func (*Assignment) ExprAST() {} diff --git a/compiler/ast/unpack.go b/compiler/ast/unpack.go index a1c36c796d..da064963bc 100644 --- a/compiler/ast/unpack.go +++ b/compiler/ast/unpack.go @@ -45,6 +45,7 @@ var unpacker = unpack.New( ID{}, ImpliedValue{}, IndexExpr{}, + IsNullExpr{}, Join{}, Load{}, Merge{}, diff --git a/compiler/dag/expr.go b/compiler/dag/expr.go index a824a970fc..85cefc4bdf 100644 --- a/compiler/dag/expr.go +++ b/compiler/dag/expr.go @@ -70,6 +70,10 @@ type ( Expr Expr `json:"expr"` Index Expr `json:"index"` } + IsNullExpr struct { + Kind string `json:"kind" unpack:""` + Expr Expr `json:"expr"` + } Literal struct { Kind string `json:"kind" unpack:""` Value string `json:"value"` @@ -148,6 +152,7 @@ func (*Conditional) ExprDAG() {} func (*Dot) ExprDAG() {} func (*Func) ExprDAG() {} func (*IndexExpr) ExprDAG() {} +func (*IsNullExpr) ExprDAG() {} func (*Literal) ExprDAG() {} func (*MapCall) ExprDAG() {} func (*MapExpr) ExprDAG() {} diff --git a/compiler/dag/unpack.go b/compiler/dag/unpack.go index 572e49fcb1..102116c9ce 100644 --- a/compiler/dag/unpack.go +++ b/compiler/dag/unpack.go @@ -33,6 +33,7 @@ var unpacker = unpack.New( Head{}, HTTPScan{}, IndexExpr{}, + IsNullExpr{}, Join{}, LakeMetaScan{}, Lister{}, diff --git a/compiler/kernel/expr.go b/compiler/kernel/expr.go index 3ebf4a2f8a..65bca3e62f 100644 --- a/compiler/kernel/expr.go +++ b/compiler/kernel/expr.go @@ -75,6 +75,8 @@ func (b *Builder) compileExpr(e dag.Expr) (expr.Evaluator, error) { return b.compileCall(*e) case *dag.IndexExpr: return b.compileIndexExpr(e) + case *dag.IsNullExpr: + return b.compileIsNullExpr(e) case *dag.SliceExpr: return b.compileSliceExpr(e) case *dag.RegexpMatch: @@ -405,6 +407,14 @@ func (b *Builder) compileIndexExpr(e *dag.IndexExpr) (expr.Evaluator, error) { return expr.NewIndexExpr(b.zctx(), container, index), nil } +func (b *Builder) compileIsNullExpr(e *dag.IsNullExpr) (expr.Evaluator, error) { + eval, err := b.compileExpr(e.Expr) + if err != nil { + return nil, err + } + return expr.NewIsNullExpr(eval), nil +} + func (b *Builder) compileRegexpMatch(match *dag.RegexpMatch) (expr.Evaluator, error) { e, err := b.compileExpr(match.Expr) if err != nil { diff --git a/compiler/parser/parser.go b/compiler/parser/parser.go index 58290a835d..661e1b5328 100644 --- a/compiler/parser/parser.go +++ b/compiler/parser/parser.go @@ -6427,93 +6427,117 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ pos: position{line: 951, col: 5, offset: 22632}, - label: "lhs", + label: "expr", expr: &ruleRefExpr{ - pos: position{line: 951, col: 9, offset: 22636}, + pos: position{line: 951, col: 10, offset: 22637}, name: "AdditiveExpr", }, }, &ruleRefExpr{ - pos: position{line: 951, col: 22, offset: 22649}, + pos: position{line: 951, col: 23, offset: 22650}, name: "_", }, + &ruleRefExpr{ + pos: position{line: 951, col: 25, offset: 22652}, + name: "IS", + }, &labeledExpr{ - pos: position{line: 951, col: 24, offset: 22651}, - label: "op", - expr: &ruleRefExpr{ - pos: position{line: 951, col: 27, offset: 22654}, - name: "IsNull", + pos: position{line: 951, col: 28, offset: 22655}, + label: "not", + expr: &zeroOrOneExpr{ + pos: position{line: 951, col: 32, offset: 22659}, + expr: &seqExpr{ + pos: position{line: 951, col: 33, offset: 22660}, + exprs: []any{ + &ruleRefExpr{ + pos: position{line: 951, col: 33, offset: 22660}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 951, col: 35, offset: 22662}, + name: "NOT", + }, + }, + }, }, }, + &ruleRefExpr{ + pos: position{line: 951, col: 41, offset: 22668}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 951, col: 43, offset: 22670}, + name: "NULL", + }, }, }, }, &actionExpr{ - pos: position{line: 960, col: 5, offset: 22864}, - run: (*parser).callonComparisonExpr9, + pos: position{line: 959, col: 5, offset: 22838}, + run: (*parser).callonComparisonExpr15, expr: &seqExpr{ - pos: position{line: 960, col: 5, offset: 22864}, + pos: position{line: 959, col: 5, offset: 22838}, exprs: []any{ &labeledExpr{ - pos: position{line: 960, col: 5, offset: 22864}, + pos: position{line: 959, col: 5, offset: 22838}, label: "lhs", expr: &ruleRefExpr{ - pos: position{line: 960, col: 9, offset: 22868}, + pos: position{line: 959, col: 9, offset: 22842}, name: "AdditiveExpr", }, }, &labeledExpr{ - pos: position{line: 960, col: 22, offset: 22881}, + pos: position{line: 959, col: 22, offset: 22855}, label: "opAndRHS", expr: &zeroOrOneExpr{ - pos: position{line: 960, col: 31, offset: 22890}, + pos: position{line: 959, col: 31, offset: 22864}, expr: &choiceExpr{ - pos: position{line: 960, col: 32, offset: 22891}, + pos: position{line: 959, col: 32, offset: 22865}, alternatives: []any{ &seqExpr{ - pos: position{line: 960, col: 32, offset: 22891}, + pos: position{line: 959, col: 32, offset: 22865}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 960, col: 32, offset: 22891}, + pos: position{line: 959, col: 32, offset: 22865}, name: "__", }, &ruleRefExpr{ - pos: position{line: 960, col: 35, offset: 22894}, + pos: position{line: 959, col: 35, offset: 22868}, name: "Comparator", }, &ruleRefExpr{ - pos: position{line: 960, col: 46, offset: 22905}, + pos: position{line: 959, col: 46, offset: 22879}, name: "__", }, &ruleRefExpr{ - pos: position{line: 960, col: 49, offset: 22908}, + pos: position{line: 959, col: 49, offset: 22882}, name: "AdditiveExpr", }, }, }, &seqExpr{ - pos: position{line: 960, col: 64, offset: 22923}, + pos: position{line: 959, col: 64, offset: 22897}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 960, col: 64, offset: 22923}, + pos: position{line: 959, col: 64, offset: 22897}, name: "__", }, &actionExpr{ - pos: position{line: 960, col: 68, offset: 22927}, - run: (*parser).callonComparisonExpr23, + pos: position{line: 959, col: 68, offset: 22901}, + run: (*parser).callonComparisonExpr29, expr: &litMatcher{ - pos: position{line: 960, col: 68, offset: 22927}, + pos: position{line: 959, col: 68, offset: 22901}, val: "~", ignoreCase: false, want: "\"~\"", }, }, &ruleRefExpr{ - pos: position{line: 960, col: 104, offset: 22963}, + pos: position{line: 959, col: 104, offset: 22937}, name: "__", }, &ruleRefExpr{ - pos: position{line: 960, col: 107, offset: 22966}, + pos: position{line: 959, col: 107, offset: 22940}, name: "Regexp", }, }, @@ -6530,116 +6554,55 @@ var g = &grammar{ leader: false, leftRecursive: false, }, - { - name: "IsNull", - pos: position{line: 973, col: 2, offset: 23253}, - expr: &choiceExpr{ - pos: position{line: 974, col: 5, offset: 23264}, - alternatives: []any{ - &actionExpr{ - pos: position{line: 974, col: 5, offset: 23264}, - run: (*parser).callonIsNull2, - expr: &seqExpr{ - pos: position{line: 974, col: 5, offset: 23264}, - exprs: []any{ - &ruleRefExpr{ - pos: position{line: 974, col: 5, offset: 23264}, - name: "IS", - }, - &ruleRefExpr{ - pos: position{line: 974, col: 8, offset: 23267}, - name: "_", - }, - &ruleRefExpr{ - pos: position{line: 974, col: 10, offset: 23269}, - name: "NULL", - }, - }, - }, - }, - &actionExpr{ - pos: position{line: 975, col: 5, offset: 23299}, - run: (*parser).callonIsNull7, - expr: &seqExpr{ - pos: position{line: 975, col: 5, offset: 23299}, - exprs: []any{ - &ruleRefExpr{ - pos: position{line: 975, col: 5, offset: 23299}, - name: "IS", - }, - &ruleRefExpr{ - pos: position{line: 975, col: 8, offset: 23302}, - name: "_", - }, - &ruleRefExpr{ - pos: position{line: 975, col: 10, offset: 23304}, - name: "NOT", - }, - &ruleRefExpr{ - pos: position{line: 975, col: 14, offset: 23308}, - name: "_", - }, - &ruleRefExpr{ - pos: position{line: 975, col: 16, offset: 23310}, - name: "NULL", - }, - }, - }, - }, - }, - }, - leader: false, - leftRecursive: false, - }, { name: "AdditiveExpr", - pos: position{line: 977, col: 1, offset: 23337}, + pos: position{line: 972, col: 1, offset: 23226}, expr: &actionExpr{ - pos: position{line: 978, col: 5, offset: 23354}, + pos: position{line: 973, col: 5, offset: 23243}, run: (*parser).callonAdditiveExpr1, expr: &seqExpr{ - pos: position{line: 978, col: 5, offset: 23354}, + pos: position{line: 973, col: 5, offset: 23243}, exprs: []any{ &labeledExpr{ - pos: position{line: 978, col: 5, offset: 23354}, + pos: position{line: 973, col: 5, offset: 23243}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 978, col: 11, offset: 23360}, + pos: position{line: 973, col: 11, offset: 23249}, name: "MultiplicativeExpr", }, }, &labeledExpr{ - pos: position{line: 979, col: 5, offset: 23383}, + pos: position{line: 974, col: 5, offset: 23272}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 979, col: 10, offset: 23388}, + pos: position{line: 974, col: 10, offset: 23277}, expr: &actionExpr{ - pos: position{line: 979, col: 11, offset: 23389}, + pos: position{line: 974, col: 11, offset: 23278}, run: (*parser).callonAdditiveExpr7, expr: &seqExpr{ - pos: position{line: 979, col: 11, offset: 23389}, + pos: position{line: 974, col: 11, offset: 23278}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 979, col: 11, offset: 23389}, + pos: position{line: 974, col: 11, offset: 23278}, name: "__", }, &labeledExpr{ - pos: position{line: 979, col: 14, offset: 23392}, + pos: position{line: 974, col: 14, offset: 23281}, label: "op", expr: &ruleRefExpr{ - pos: position{line: 979, col: 17, offset: 23395}, + pos: position{line: 974, col: 17, offset: 23284}, name: "AdditiveOperator", }, }, &ruleRefExpr{ - pos: position{line: 979, col: 34, offset: 23412}, + pos: position{line: 974, col: 34, offset: 23301}, name: "__", }, &labeledExpr{ - pos: position{line: 979, col: 37, offset: 23415}, + pos: position{line: 974, col: 37, offset: 23304}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 979, col: 42, offset: 23420}, + pos: position{line: 974, col: 42, offset: 23309}, name: "MultiplicativeExpr", }, }, @@ -6656,21 +6619,21 @@ var g = &grammar{ }, { name: "AdditiveOperator", - pos: position{line: 983, col: 1, offset: 23538}, + pos: position{line: 978, col: 1, offset: 23427}, expr: &actionExpr{ - pos: position{line: 983, col: 20, offset: 23557}, + pos: position{line: 978, col: 20, offset: 23446}, run: (*parser).callonAdditiveOperator1, expr: &choiceExpr{ - pos: position{line: 983, col: 21, offset: 23558}, + pos: position{line: 978, col: 21, offset: 23447}, alternatives: []any{ &litMatcher{ - pos: position{line: 983, col: 21, offset: 23558}, + pos: position{line: 978, col: 21, offset: 23447}, val: "+", ignoreCase: false, want: "\"+\"", }, &litMatcher{ - pos: position{line: 983, col: 27, offset: 23564}, + pos: position{line: 978, col: 27, offset: 23453}, val: "-", ignoreCase: false, want: "\"-\"", @@ -6683,53 +6646,53 @@ var g = &grammar{ }, { name: "MultiplicativeExpr", - pos: position{line: 985, col: 1, offset: 23601}, + pos: position{line: 980, col: 1, offset: 23490}, expr: &actionExpr{ - pos: position{line: 986, col: 5, offset: 23624}, + pos: position{line: 981, col: 5, offset: 23513}, run: (*parser).callonMultiplicativeExpr1, expr: &seqExpr{ - pos: position{line: 986, col: 5, offset: 23624}, + pos: position{line: 981, col: 5, offset: 23513}, exprs: []any{ &labeledExpr{ - pos: position{line: 986, col: 5, offset: 23624}, + pos: position{line: 981, col: 5, offset: 23513}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 986, col: 11, offset: 23630}, + pos: position{line: 981, col: 11, offset: 23519}, name: "ConcatExpr", }, }, &labeledExpr{ - pos: position{line: 987, col: 5, offset: 23645}, + pos: position{line: 982, col: 5, offset: 23534}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 987, col: 10, offset: 23650}, + pos: position{line: 982, col: 10, offset: 23539}, expr: &actionExpr{ - pos: position{line: 987, col: 11, offset: 23651}, + pos: position{line: 982, col: 11, offset: 23540}, run: (*parser).callonMultiplicativeExpr7, expr: &seqExpr{ - pos: position{line: 987, col: 11, offset: 23651}, + pos: position{line: 982, col: 11, offset: 23540}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 987, col: 11, offset: 23651}, + pos: position{line: 982, col: 11, offset: 23540}, name: "__", }, &labeledExpr{ - pos: position{line: 987, col: 14, offset: 23654}, + pos: position{line: 982, col: 14, offset: 23543}, label: "op", expr: &ruleRefExpr{ - pos: position{line: 987, col: 17, offset: 23657}, + pos: position{line: 982, col: 17, offset: 23546}, name: "MultiplicativeOperator", }, }, &ruleRefExpr{ - pos: position{line: 987, col: 40, offset: 23680}, + pos: position{line: 982, col: 40, offset: 23569}, name: "__", }, &labeledExpr{ - pos: position{line: 987, col: 43, offset: 23683}, + pos: position{line: 982, col: 43, offset: 23572}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 987, col: 48, offset: 23688}, + pos: position{line: 982, col: 48, offset: 23577}, name: "ConcatExpr", }, }, @@ -6746,27 +6709,27 @@ var g = &grammar{ }, { name: "MultiplicativeOperator", - pos: position{line: 991, col: 1, offset: 23798}, + pos: position{line: 986, col: 1, offset: 23687}, expr: &actionExpr{ - pos: position{line: 991, col: 26, offset: 23823}, + pos: position{line: 986, col: 26, offset: 23712}, run: (*parser).callonMultiplicativeOperator1, expr: &choiceExpr{ - pos: position{line: 991, col: 27, offset: 23824}, + pos: position{line: 986, col: 27, offset: 23713}, alternatives: []any{ &litMatcher{ - pos: position{line: 991, col: 27, offset: 23824}, + pos: position{line: 986, col: 27, offset: 23713}, val: "*", ignoreCase: false, want: "\"*\"", }, &litMatcher{ - pos: position{line: 991, col: 33, offset: 23830}, + pos: position{line: 986, col: 33, offset: 23719}, val: "/", ignoreCase: false, want: "\"/\"", }, &litMatcher{ - pos: position{line: 991, col: 39, offset: 23836}, + pos: position{line: 986, col: 39, offset: 23725}, val: "%", ignoreCase: false, want: "\"%\"", @@ -6779,51 +6742,51 @@ var g = &grammar{ }, { name: "ConcatExpr", - pos: position{line: 993, col: 1, offset: 23873}, + pos: position{line: 988, col: 1, offset: 23762}, expr: &actionExpr{ - pos: position{line: 994, col: 5, offset: 23889}, + pos: position{line: 989, col: 5, offset: 23778}, run: (*parser).callonConcatExpr1, expr: &seqExpr{ - pos: position{line: 994, col: 5, offset: 23889}, + pos: position{line: 989, col: 5, offset: 23778}, exprs: []any{ &labeledExpr{ - pos: position{line: 994, col: 5, offset: 23889}, + pos: position{line: 989, col: 5, offset: 23778}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 994, col: 11, offset: 23895}, + pos: position{line: 989, col: 11, offset: 23784}, name: "UnaryPlusOrMinus", }, }, &labeledExpr{ - pos: position{line: 995, col: 5, offset: 23916}, + pos: position{line: 990, col: 5, offset: 23805}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 995, col: 10, offset: 23921}, + pos: position{line: 990, col: 10, offset: 23810}, expr: &actionExpr{ - pos: position{line: 995, col: 11, offset: 23922}, + pos: position{line: 990, col: 11, offset: 23811}, run: (*parser).callonConcatExpr7, expr: &seqExpr{ - pos: position{line: 995, col: 11, offset: 23922}, + pos: position{line: 990, col: 11, offset: 23811}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 995, col: 11, offset: 23922}, + pos: position{line: 990, col: 11, offset: 23811}, name: "__", }, &litMatcher{ - pos: position{line: 995, col: 14, offset: 23925}, + pos: position{line: 990, col: 14, offset: 23814}, val: "||", ignoreCase: false, want: "\"||\"", }, &ruleRefExpr{ - pos: position{line: 995, col: 19, offset: 23930}, + pos: position{line: 990, col: 19, offset: 23819}, name: "__", }, &labeledExpr{ - pos: position{line: 995, col: 22, offset: 23933}, + pos: position{line: 990, col: 22, offset: 23822}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 995, col: 27, offset: 23938}, + pos: position{line: 990, col: 27, offset: 23827}, name: "UnaryPlusOrMinus", }, }, @@ -6840,40 +6803,40 @@ var g = &grammar{ }, { name: "UnaryPlusOrMinus", - pos: position{line: 999, col: 1, offset: 24056}, + pos: position{line: 994, col: 1, offset: 23945}, expr: &choiceExpr{ - pos: position{line: 1000, col: 5, offset: 24077}, + pos: position{line: 995, col: 5, offset: 23966}, alternatives: []any{ &actionExpr{ - pos: position{line: 1000, col: 5, offset: 24077}, + pos: position{line: 995, col: 5, offset: 23966}, run: (*parser).callonUnaryPlusOrMinus2, expr: &seqExpr{ - pos: position{line: 1000, col: 5, offset: 24077}, + pos: position{line: 995, col: 5, offset: 23966}, exprs: []any{ ¬Expr{ - pos: position{line: 1000, col: 5, offset: 24077}, + pos: position{line: 995, col: 5, offset: 23966}, expr: &ruleRefExpr{ - pos: position{line: 1000, col: 6, offset: 24078}, + pos: position{line: 995, col: 6, offset: 23967}, name: "Literal", }, }, &labeledExpr{ - pos: position{line: 1000, col: 14, offset: 24086}, + pos: position{line: 995, col: 14, offset: 23975}, label: "op", expr: &ruleRefExpr{ - pos: position{line: 1000, col: 17, offset: 24089}, + pos: position{line: 995, col: 17, offset: 23978}, name: "PlusOrMinusOp", }, }, &ruleRefExpr{ - pos: position{line: 1000, col: 31, offset: 24103}, + pos: position{line: 995, col: 31, offset: 23992}, name: "__", }, &labeledExpr{ - pos: position{line: 1000, col: 34, offset: 24106}, + pos: position{line: 995, col: 34, offset: 23995}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1000, col: 36, offset: 24108}, + pos: position{line: 995, col: 36, offset: 23997}, name: "UnaryPlusOrMinus", }, }, @@ -6881,7 +6844,7 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1009, col: 5, offset: 24292}, + pos: position{line: 1004, col: 5, offset: 24181}, name: "DerefExpr", }, }, @@ -6891,21 +6854,21 @@ var g = &grammar{ }, { name: "PlusOrMinusOp", - pos: position{line: 1011, col: 1, offset: 24303}, + pos: position{line: 1006, col: 1, offset: 24192}, expr: &actionExpr{ - pos: position{line: 1011, col: 17, offset: 24319}, + pos: position{line: 1006, col: 17, offset: 24208}, run: (*parser).callonPlusOrMinusOp1, expr: &choiceExpr{ - pos: position{line: 1011, col: 18, offset: 24320}, + pos: position{line: 1006, col: 18, offset: 24209}, alternatives: []any{ &litMatcher{ - pos: position{line: 1011, col: 18, offset: 24320}, + pos: position{line: 1006, col: 18, offset: 24209}, val: "+", ignoreCase: false, want: "\"+\"", }, &litMatcher{ - pos: position{line: 1011, col: 24, offset: 24326}, + pos: position{line: 1006, col: 24, offset: 24215}, val: "-", ignoreCase: false, want: "\"-\"", @@ -6918,73 +6881,73 @@ var g = &grammar{ }, { name: "DerefExpr", - pos: position{line: 1013, col: 1, offset: 24363}, + pos: position{line: 1008, col: 1, offset: 24252}, expr: &choiceExpr{ - pos: position{line: 1014, col: 5, offset: 24377}, + pos: position{line: 1009, col: 5, offset: 24266}, alternatives: []any{ &actionExpr{ - pos: position{line: 1014, col: 5, offset: 24377}, + pos: position{line: 1009, col: 5, offset: 24266}, run: (*parser).callonDerefExpr2, expr: &seqExpr{ - pos: position{line: 1014, col: 5, offset: 24377}, + pos: position{line: 1009, col: 5, offset: 24266}, exprs: []any{ &labeledExpr{ - pos: position{line: 1014, col: 5, offset: 24377}, + pos: position{line: 1009, col: 5, offset: 24266}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1014, col: 10, offset: 24382}, + pos: position{line: 1009, col: 10, offset: 24271}, name: "DerefExpr", }, }, &litMatcher{ - pos: position{line: 1014, col: 20, offset: 24392}, + pos: position{line: 1009, col: 20, offset: 24281}, val: "[", ignoreCase: false, want: "\"[\"", }, &ruleRefExpr{ - pos: position{line: 1014, col: 24, offset: 24396}, + pos: position{line: 1009, col: 24, offset: 24285}, name: "__", }, &labeledExpr{ - pos: position{line: 1014, col: 27, offset: 24399}, + pos: position{line: 1009, col: 27, offset: 24288}, label: "from", expr: &ruleRefExpr{ - pos: position{line: 1014, col: 32, offset: 24404}, + pos: position{line: 1009, col: 32, offset: 24293}, name: "AdditiveExpr", }, }, &ruleRefExpr{ - pos: position{line: 1014, col: 45, offset: 24417}, + pos: position{line: 1009, col: 45, offset: 24306}, name: "__", }, &litMatcher{ - pos: position{line: 1014, col: 48, offset: 24420}, + pos: position{line: 1009, col: 48, offset: 24309}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1014, col: 52, offset: 24424}, + pos: position{line: 1009, col: 52, offset: 24313}, name: "__", }, &labeledExpr{ - pos: position{line: 1014, col: 55, offset: 24427}, + pos: position{line: 1009, col: 55, offset: 24316}, label: "to", expr: &zeroOrOneExpr{ - pos: position{line: 1014, col: 58, offset: 24430}, + pos: position{line: 1009, col: 58, offset: 24319}, expr: &ruleRefExpr{ - pos: position{line: 1014, col: 58, offset: 24430}, + pos: position{line: 1009, col: 58, offset: 24319}, name: "AdditiveExpr", }, }, }, &ruleRefExpr{ - pos: position{line: 1014, col: 72, offset: 24444}, + pos: position{line: 1009, col: 72, offset: 24333}, name: "__", }, &litMatcher{ - pos: position{line: 1014, col: 75, offset: 24447}, + pos: position{line: 1009, col: 75, offset: 24336}, val: "]", ignoreCase: false, want: "\"]\"", @@ -6993,49 +6956,49 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1026, col: 5, offset: 24686}, + pos: position{line: 1021, col: 5, offset: 24575}, run: (*parser).callonDerefExpr18, expr: &seqExpr{ - pos: position{line: 1026, col: 5, offset: 24686}, + pos: position{line: 1021, col: 5, offset: 24575}, exprs: []any{ &labeledExpr{ - pos: position{line: 1026, col: 5, offset: 24686}, + pos: position{line: 1021, col: 5, offset: 24575}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1026, col: 10, offset: 24691}, + pos: position{line: 1021, col: 10, offset: 24580}, name: "DerefExpr", }, }, &litMatcher{ - pos: position{line: 1026, col: 20, offset: 24701}, + pos: position{line: 1021, col: 20, offset: 24590}, val: "[", ignoreCase: false, want: "\"[\"", }, &ruleRefExpr{ - pos: position{line: 1026, col: 24, offset: 24705}, + pos: position{line: 1021, col: 24, offset: 24594}, name: "__", }, &litMatcher{ - pos: position{line: 1026, col: 27, offset: 24708}, + pos: position{line: 1021, col: 27, offset: 24597}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1026, col: 31, offset: 24712}, + pos: position{line: 1021, col: 31, offset: 24601}, name: "__", }, &labeledExpr{ - pos: position{line: 1026, col: 34, offset: 24715}, + pos: position{line: 1021, col: 34, offset: 24604}, label: "to", expr: &ruleRefExpr{ - pos: position{line: 1026, col: 37, offset: 24718}, + pos: position{line: 1021, col: 37, offset: 24607}, name: "AdditiveExpr", }, }, &litMatcher{ - pos: position{line: 1026, col: 50, offset: 24731}, + pos: position{line: 1021, col: 50, offset: 24620}, val: "]", ignoreCase: false, want: "\"]\"", @@ -7044,35 +7007,35 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1034, col: 5, offset: 24895}, + pos: position{line: 1029, col: 5, offset: 24784}, run: (*parser).callonDerefExpr29, expr: &seqExpr{ - pos: position{line: 1034, col: 5, offset: 24895}, + pos: position{line: 1029, col: 5, offset: 24784}, exprs: []any{ &labeledExpr{ - pos: position{line: 1034, col: 5, offset: 24895}, + pos: position{line: 1029, col: 5, offset: 24784}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1034, col: 10, offset: 24900}, + pos: position{line: 1029, col: 10, offset: 24789}, name: "DerefExpr", }, }, &litMatcher{ - pos: position{line: 1034, col: 20, offset: 24910}, + pos: position{line: 1029, col: 20, offset: 24799}, val: "[", ignoreCase: false, want: "\"[\"", }, &labeledExpr{ - pos: position{line: 1034, col: 24, offset: 24914}, + pos: position{line: 1029, col: 24, offset: 24803}, label: "index", expr: &ruleRefExpr{ - pos: position{line: 1034, col: 30, offset: 24920}, + pos: position{line: 1029, col: 30, offset: 24809}, name: "Expr", }, }, &litMatcher{ - pos: position{line: 1034, col: 35, offset: 24925}, + pos: position{line: 1029, col: 35, offset: 24814}, val: "]", ignoreCase: false, want: "\"]\"", @@ -7081,30 +7044,30 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1042, col: 5, offset: 25095}, + pos: position{line: 1037, col: 5, offset: 24984}, run: (*parser).callonDerefExpr37, expr: &seqExpr{ - pos: position{line: 1042, col: 5, offset: 25095}, + pos: position{line: 1037, col: 5, offset: 24984}, exprs: []any{ &labeledExpr{ - pos: position{line: 1042, col: 5, offset: 25095}, + pos: position{line: 1037, col: 5, offset: 24984}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1042, col: 10, offset: 25100}, + pos: position{line: 1037, col: 10, offset: 24989}, name: "DerefExpr", }, }, &litMatcher{ - pos: position{line: 1042, col: 20, offset: 25110}, + pos: position{line: 1037, col: 20, offset: 24999}, val: ".", ignoreCase: false, want: "\".\"", }, &labeledExpr{ - pos: position{line: 1042, col: 24, offset: 25114}, + pos: position{line: 1037, col: 24, offset: 25003}, label: "id", expr: &ruleRefExpr{ - pos: position{line: 1042, col: 27, offset: 25117}, + pos: position{line: 1037, col: 27, offset: 25006}, name: "Identifier", }, }, @@ -7112,11 +7075,11 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1051, col: 5, offset: 25307}, + pos: position{line: 1046, col: 5, offset: 25196}, name: "FuncExpr", }, &ruleRefExpr{ - pos: position{line: 1052, col: 5, offset: 25320}, + pos: position{line: 1047, col: 5, offset: 25209}, name: "Primary", }, }, @@ -7126,16 +7089,16 @@ var g = &grammar{ }, { name: "FuncExpr", - pos: position{line: 1054, col: 1, offset: 25329}, + pos: position{line: 1049, col: 1, offset: 25218}, expr: &choiceExpr{ - pos: position{line: 1055, col: 5, offset: 25342}, + pos: position{line: 1050, col: 5, offset: 25231}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1055, col: 5, offset: 25342}, + pos: position{line: 1050, col: 5, offset: 25231}, name: "Cast", }, &ruleRefExpr{ - pos: position{line: 1056, col: 5, offset: 25351}, + pos: position{line: 1051, col: 5, offset: 25240}, name: "Function", }, }, @@ -7145,20 +7108,20 @@ var g = &grammar{ }, { name: "FuncGuard", - pos: position{line: 1058, col: 1, offset: 25361}, + pos: position{line: 1053, col: 1, offset: 25250}, expr: &seqExpr{ - pos: position{line: 1058, col: 13, offset: 25373}, + pos: position{line: 1053, col: 13, offset: 25262}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1058, col: 13, offset: 25373}, + pos: position{line: 1053, col: 13, offset: 25262}, name: "NotFuncs", }, &ruleRefExpr{ - pos: position{line: 1058, col: 22, offset: 25382}, + pos: position{line: 1053, col: 22, offset: 25271}, name: "__", }, &litMatcher{ - pos: position{line: 1058, col: 25, offset: 25385}, + pos: position{line: 1053, col: 25, offset: 25274}, val: "(", ignoreCase: false, want: "\"(\"", @@ -7170,16 +7133,16 @@ var g = &grammar{ }, { name: "NotFuncs", - pos: position{line: 1060, col: 1, offset: 25390}, + pos: position{line: 1055, col: 1, offset: 25279}, expr: &choiceExpr{ - pos: position{line: 1061, col: 5, offset: 25403}, + pos: position{line: 1056, col: 5, offset: 25292}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1061, col: 5, offset: 25403}, + pos: position{line: 1056, col: 5, offset: 25292}, name: "NOT", }, &ruleRefExpr{ - pos: position{line: 1062, col: 5, offset: 25411}, + pos: position{line: 1057, col: 5, offset: 25300}, name: "SELECT", }, }, @@ -7189,58 +7152,58 @@ var g = &grammar{ }, { name: "Cast", - pos: position{line: 1064, col: 1, offset: 25419}, + pos: position{line: 1059, col: 1, offset: 25308}, expr: &actionExpr{ - pos: position{line: 1065, col: 5, offset: 25428}, + pos: position{line: 1060, col: 5, offset: 25317}, run: (*parser).callonCast1, expr: &seqExpr{ - pos: position{line: 1065, col: 5, offset: 25428}, + pos: position{line: 1060, col: 5, offset: 25317}, exprs: []any{ &labeledExpr{ - pos: position{line: 1065, col: 5, offset: 25428}, + pos: position{line: 1060, col: 5, offset: 25317}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1065, col: 9, offset: 25432}, + pos: position{line: 1060, col: 9, offset: 25321}, name: "TypeLiteral", }, }, &ruleRefExpr{ - pos: position{line: 1065, col: 21, offset: 25444}, + pos: position{line: 1060, col: 21, offset: 25333}, name: "__", }, &litMatcher{ - pos: position{line: 1065, col: 24, offset: 25447}, + pos: position{line: 1060, col: 24, offset: 25336}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1065, col: 28, offset: 25451}, + pos: position{line: 1060, col: 28, offset: 25340}, name: "__", }, &labeledExpr{ - pos: position{line: 1065, col: 31, offset: 25454}, + pos: position{line: 1060, col: 31, offset: 25343}, label: "expr", expr: &choiceExpr{ - pos: position{line: 1065, col: 37, offset: 25460}, + pos: position{line: 1060, col: 37, offset: 25349}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1065, col: 37, offset: 25460}, + pos: position{line: 1060, col: 37, offset: 25349}, name: "OverExpr", }, &ruleRefExpr{ - pos: position{line: 1065, col: 48, offset: 25471}, + pos: position{line: 1060, col: 48, offset: 25360}, name: "Expr", }, }, }, }, &ruleRefExpr{ - pos: position{line: 1065, col: 54, offset: 25477}, + pos: position{line: 1060, col: 54, offset: 25366}, name: "__", }, &litMatcher{ - pos: position{line: 1065, col: 57, offset: 25480}, + pos: position{line: 1060, col: 57, offset: 25369}, val: ")", ignoreCase: false, want: "\")\"", @@ -7253,85 +7216,85 @@ var g = &grammar{ }, { name: "Function", - pos: position{line: 1069, col: 1, offset: 25593}, + pos: position{line: 1064, col: 1, offset: 25482}, expr: &choiceExpr{ - pos: position{line: 1070, col: 5, offset: 25606}, + pos: position{line: 1065, col: 5, offset: 25495}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1070, col: 5, offset: 25606}, + pos: position{line: 1065, col: 5, offset: 25495}, name: "Grep", }, &actionExpr{ - pos: position{line: 1072, col: 5, offset: 25693}, + pos: position{line: 1067, col: 5, offset: 25582}, run: (*parser).callonFunction3, expr: &seqExpr{ - pos: position{line: 1072, col: 5, offset: 25693}, + pos: position{line: 1067, col: 5, offset: 25582}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1072, col: 5, offset: 25693}, + pos: position{line: 1067, col: 5, offset: 25582}, name: "REGEXP", }, &ruleRefExpr{ - pos: position{line: 1072, col: 12, offset: 25700}, + pos: position{line: 1067, col: 12, offset: 25589}, name: "__", }, &litMatcher{ - pos: position{line: 1072, col: 15, offset: 25703}, + pos: position{line: 1067, col: 15, offset: 25592}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1072, col: 19, offset: 25707}, + pos: position{line: 1067, col: 19, offset: 25596}, name: "__", }, &labeledExpr{ - pos: position{line: 1072, col: 22, offset: 25710}, + pos: position{line: 1067, col: 22, offset: 25599}, label: "arg0", expr: &ruleRefExpr{ - pos: position{line: 1072, col: 27, offset: 25715}, + pos: position{line: 1067, col: 27, offset: 25604}, name: "RegexpPrimitive", }, }, &ruleRefExpr{ - pos: position{line: 1072, col: 43, offset: 25731}, + pos: position{line: 1067, col: 43, offset: 25620}, name: "__", }, &litMatcher{ - pos: position{line: 1072, col: 46, offset: 25734}, + pos: position{line: 1067, col: 46, offset: 25623}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1072, col: 50, offset: 25738}, + pos: position{line: 1067, col: 50, offset: 25627}, name: "__", }, &labeledExpr{ - pos: position{line: 1072, col: 53, offset: 25741}, + pos: position{line: 1067, col: 53, offset: 25630}, label: "arg1", expr: &ruleRefExpr{ - pos: position{line: 1072, col: 58, offset: 25746}, + pos: position{line: 1067, col: 58, offset: 25635}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1072, col: 63, offset: 25751}, + pos: position{line: 1067, col: 63, offset: 25640}, name: "__", }, &litMatcher{ - pos: position{line: 1072, col: 66, offset: 25754}, + pos: position{line: 1067, col: 66, offset: 25643}, val: ")", ignoreCase: false, want: "\")\"", }, &labeledExpr{ - pos: position{line: 1072, col: 70, offset: 25758}, + pos: position{line: 1067, col: 70, offset: 25647}, label: "where", expr: &zeroOrOneExpr{ - pos: position{line: 1072, col: 76, offset: 25764}, + pos: position{line: 1067, col: 76, offset: 25653}, expr: &ruleRefExpr{ - pos: position{line: 1072, col: 76, offset: 25764}, + pos: position{line: 1067, col: 76, offset: 25653}, name: "WhereClause", }, }, @@ -7340,98 +7303,98 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1076, col: 5, offset: 25943}, + pos: position{line: 1071, col: 5, offset: 25832}, run: (*parser).callonFunction21, expr: &seqExpr{ - pos: position{line: 1076, col: 5, offset: 25943}, + pos: position{line: 1071, col: 5, offset: 25832}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1076, col: 5, offset: 25943}, + pos: position{line: 1071, col: 5, offset: 25832}, name: "REGEXP_REPLACE", }, &ruleRefExpr{ - pos: position{line: 1076, col: 20, offset: 25958}, + pos: position{line: 1071, col: 20, offset: 25847}, name: "__", }, &litMatcher{ - pos: position{line: 1076, col: 23, offset: 25961}, + pos: position{line: 1071, col: 23, offset: 25850}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1076, col: 27, offset: 25965}, + pos: position{line: 1071, col: 27, offset: 25854}, name: "__", }, &labeledExpr{ - pos: position{line: 1076, col: 30, offset: 25968}, + pos: position{line: 1071, col: 30, offset: 25857}, label: "arg0", expr: &ruleRefExpr{ - pos: position{line: 1076, col: 35, offset: 25973}, + pos: position{line: 1071, col: 35, offset: 25862}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1076, col: 40, offset: 25978}, + pos: position{line: 1071, col: 40, offset: 25867}, name: "__", }, &litMatcher{ - pos: position{line: 1076, col: 43, offset: 25981}, + pos: position{line: 1071, col: 43, offset: 25870}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1076, col: 47, offset: 25985}, + pos: position{line: 1071, col: 47, offset: 25874}, name: "__", }, &labeledExpr{ - pos: position{line: 1076, col: 50, offset: 25988}, + pos: position{line: 1071, col: 50, offset: 25877}, label: "arg1", expr: &ruleRefExpr{ - pos: position{line: 1076, col: 55, offset: 25993}, + pos: position{line: 1071, col: 55, offset: 25882}, name: "RegexpPrimitive", }, }, &ruleRefExpr{ - pos: position{line: 1076, col: 71, offset: 26009}, + pos: position{line: 1071, col: 71, offset: 25898}, name: "__", }, &litMatcher{ - pos: position{line: 1076, col: 74, offset: 26012}, + pos: position{line: 1071, col: 74, offset: 25901}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1076, col: 78, offset: 26016}, + pos: position{line: 1071, col: 78, offset: 25905}, name: "__", }, &labeledExpr{ - pos: position{line: 1076, col: 81, offset: 26019}, + pos: position{line: 1071, col: 81, offset: 25908}, label: "arg2", expr: &ruleRefExpr{ - pos: position{line: 1076, col: 86, offset: 26024}, + pos: position{line: 1071, col: 86, offset: 25913}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1076, col: 91, offset: 26029}, + pos: position{line: 1071, col: 91, offset: 25918}, name: "__", }, &litMatcher{ - pos: position{line: 1076, col: 94, offset: 26032}, + pos: position{line: 1071, col: 94, offset: 25921}, val: ")", ignoreCase: false, want: "\")\"", }, &labeledExpr{ - pos: position{line: 1076, col: 98, offset: 26036}, + pos: position{line: 1071, col: 98, offset: 25925}, label: "where", expr: &zeroOrOneExpr{ - pos: position{line: 1076, col: 104, offset: 26042}, + pos: position{line: 1071, col: 104, offset: 25931}, expr: &ruleRefExpr{ - pos: position{line: 1076, col: 104, offset: 26042}, + pos: position{line: 1071, col: 104, offset: 25931}, name: "WhereClause", }, }, @@ -7440,65 +7403,65 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1080, col: 5, offset: 26236}, + pos: position{line: 1075, col: 5, offset: 26125}, run: (*parser).callonFunction44, expr: &seqExpr{ - pos: position{line: 1080, col: 5, offset: 26236}, + pos: position{line: 1075, col: 5, offset: 26125}, exprs: []any{ ¬Expr{ - pos: position{line: 1080, col: 5, offset: 26236}, + pos: position{line: 1075, col: 5, offset: 26125}, expr: &ruleRefExpr{ - pos: position{line: 1080, col: 6, offset: 26237}, + pos: position{line: 1075, col: 6, offset: 26126}, name: "FuncGuard", }, }, &labeledExpr{ - pos: position{line: 1080, col: 16, offset: 26247}, + pos: position{line: 1075, col: 16, offset: 26136}, label: "fn", expr: &ruleRefExpr{ - pos: position{line: 1080, col: 19, offset: 26250}, + pos: position{line: 1075, col: 19, offset: 26139}, name: "Identifier", }, }, &ruleRefExpr{ - pos: position{line: 1080, col: 30, offset: 26261}, + pos: position{line: 1075, col: 30, offset: 26150}, name: "__", }, &litMatcher{ - pos: position{line: 1080, col: 33, offset: 26264}, + pos: position{line: 1075, col: 33, offset: 26153}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1080, col: 37, offset: 26268}, + pos: position{line: 1075, col: 37, offset: 26157}, name: "__", }, &labeledExpr{ - pos: position{line: 1080, col: 40, offset: 26271}, + pos: position{line: 1075, col: 40, offset: 26160}, label: "args", expr: &ruleRefExpr{ - pos: position{line: 1080, col: 45, offset: 26276}, + pos: position{line: 1075, col: 45, offset: 26165}, name: "FunctionArgs", }, }, &ruleRefExpr{ - pos: position{line: 1080, col: 58, offset: 26289}, + pos: position{line: 1075, col: 58, offset: 26178}, name: "__", }, &litMatcher{ - pos: position{line: 1080, col: 61, offset: 26292}, + pos: position{line: 1075, col: 61, offset: 26181}, val: ")", ignoreCase: false, want: "\")\"", }, &labeledExpr{ - pos: position{line: 1080, col: 65, offset: 26296}, + pos: position{line: 1075, col: 65, offset: 26185}, label: "where", expr: &zeroOrOneExpr{ - pos: position{line: 1080, col: 71, offset: 26302}, + pos: position{line: 1075, col: 71, offset: 26191}, expr: &ruleRefExpr{ - pos: position{line: 1080, col: 71, offset: 26302}, + pos: position{line: 1075, col: 71, offset: 26191}, name: "WhereClause", }, }, @@ -7507,7 +7470,7 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1083, col: 5, offset: 26373}, + pos: position{line: 1078, col: 5, offset: 26262}, name: "CountStar", }, }, @@ -7517,15 +7480,15 @@ var g = &grammar{ }, { name: "RegexpPrimitive", - pos: position{line: 1085, col: 1, offset: 26384}, + pos: position{line: 1080, col: 1, offset: 26273}, expr: &actionExpr{ - pos: position{line: 1086, col: 5, offset: 26404}, + pos: position{line: 1081, col: 5, offset: 26293}, run: (*parser).callonRegexpPrimitive1, expr: &labeledExpr{ - pos: position{line: 1086, col: 5, offset: 26404}, + pos: position{line: 1081, col: 5, offset: 26293}, label: "pat", expr: &ruleRefExpr{ - pos: position{line: 1086, col: 9, offset: 26408}, + pos: position{line: 1081, col: 9, offset: 26297}, name: "RegexpPattern", }, }, @@ -7535,24 +7498,24 @@ var g = &grammar{ }, { name: "FunctionArgs", - pos: position{line: 1088, col: 1, offset: 26479}, + pos: position{line: 1083, col: 1, offset: 26368}, expr: &choiceExpr{ - pos: position{line: 1089, col: 5, offset: 26496}, + pos: position{line: 1084, col: 5, offset: 26385}, alternatives: []any{ &actionExpr{ - pos: position{line: 1089, col: 5, offset: 26496}, + pos: position{line: 1084, col: 5, offset: 26385}, run: (*parser).callonFunctionArgs2, expr: &labeledExpr{ - pos: position{line: 1089, col: 5, offset: 26496}, + pos: position{line: 1084, col: 5, offset: 26385}, label: "o", expr: &ruleRefExpr{ - pos: position{line: 1089, col: 7, offset: 26498}, + pos: position{line: 1084, col: 7, offset: 26387}, name: "OverExpr", }, }, }, &ruleRefExpr{ - pos: position{line: 1090, col: 5, offset: 26536}, + pos: position{line: 1085, col: 5, offset: 26425}, name: "OptionalExprs", }, }, @@ -7562,96 +7525,96 @@ var g = &grammar{ }, { name: "Grep", - pos: position{line: 1092, col: 1, offset: 26551}, + pos: position{line: 1087, col: 1, offset: 26440}, expr: &actionExpr{ - pos: position{line: 1093, col: 5, offset: 26560}, + pos: position{line: 1088, col: 5, offset: 26449}, run: (*parser).callonGrep1, expr: &seqExpr{ - pos: position{line: 1093, col: 5, offset: 26560}, + pos: position{line: 1088, col: 5, offset: 26449}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1093, col: 5, offset: 26560}, + pos: position{line: 1088, col: 5, offset: 26449}, name: "GREP", }, &ruleRefExpr{ - pos: position{line: 1093, col: 10, offset: 26565}, + pos: position{line: 1088, col: 10, offset: 26454}, name: "__", }, &litMatcher{ - pos: position{line: 1093, col: 13, offset: 26568}, + pos: position{line: 1088, col: 13, offset: 26457}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1093, col: 17, offset: 26572}, + pos: position{line: 1088, col: 17, offset: 26461}, name: "__", }, &labeledExpr{ - pos: position{line: 1093, col: 20, offset: 26575}, + pos: position{line: 1088, col: 20, offset: 26464}, label: "pattern", expr: &choiceExpr{ - pos: position{line: 1093, col: 29, offset: 26584}, + pos: position{line: 1088, col: 29, offset: 26473}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1093, col: 29, offset: 26584}, + pos: position{line: 1088, col: 29, offset: 26473}, name: "Regexp", }, &ruleRefExpr{ - pos: position{line: 1093, col: 38, offset: 26593}, + pos: position{line: 1088, col: 38, offset: 26482}, name: "Glob", }, &ruleRefExpr{ - pos: position{line: 1093, col: 45, offset: 26600}, + pos: position{line: 1088, col: 45, offset: 26489}, name: "Expr", }, }, }, }, &ruleRefExpr{ - pos: position{line: 1093, col: 51, offset: 26606}, + pos: position{line: 1088, col: 51, offset: 26495}, name: "__", }, &labeledExpr{ - pos: position{line: 1093, col: 54, offset: 26609}, + pos: position{line: 1088, col: 54, offset: 26498}, label: "opt", expr: &zeroOrOneExpr{ - pos: position{line: 1093, col: 58, offset: 26613}, + pos: position{line: 1088, col: 58, offset: 26502}, expr: &actionExpr{ - pos: position{line: 1093, col: 59, offset: 26614}, + pos: position{line: 1088, col: 59, offset: 26503}, run: (*parser).callonGrep15, expr: &seqExpr{ - pos: position{line: 1093, col: 59, offset: 26614}, + pos: position{line: 1088, col: 59, offset: 26503}, exprs: []any{ &litMatcher{ - pos: position{line: 1093, col: 59, offset: 26614}, + pos: position{line: 1088, col: 59, offset: 26503}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1093, col: 63, offset: 26618}, + pos: position{line: 1088, col: 63, offset: 26507}, name: "__", }, &labeledExpr{ - pos: position{line: 1093, col: 66, offset: 26621}, + pos: position{line: 1088, col: 66, offset: 26510}, label: "e", expr: &choiceExpr{ - pos: position{line: 1093, col: 69, offset: 26624}, + pos: position{line: 1088, col: 69, offset: 26513}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1093, col: 69, offset: 26624}, + pos: position{line: 1088, col: 69, offset: 26513}, name: "OverExpr", }, &ruleRefExpr{ - pos: position{line: 1093, col: 80, offset: 26635}, + pos: position{line: 1088, col: 80, offset: 26524}, name: "Expr", }, }, }, }, &ruleRefExpr{ - pos: position{line: 1093, col: 86, offset: 26641}, + pos: position{line: 1088, col: 86, offset: 26530}, name: "__", }, }, @@ -7660,7 +7623,7 @@ var g = &grammar{ }, }, &litMatcher{ - pos: position{line: 1093, col: 109, offset: 26664}, + pos: position{line: 1088, col: 109, offset: 26553}, val: ")", ignoreCase: false, want: "\")\"", @@ -7673,19 +7636,19 @@ var g = &grammar{ }, { name: "OptionalExprs", - pos: position{line: 1105, col: 1, offset: 26877}, + pos: position{line: 1100, col: 1, offset: 26766}, expr: &choiceExpr{ - pos: position{line: 1106, col: 5, offset: 26895}, + pos: position{line: 1101, col: 5, offset: 26784}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1106, col: 5, offset: 26895}, + pos: position{line: 1101, col: 5, offset: 26784}, name: "Exprs", }, &actionExpr{ - pos: position{line: 1107, col: 5, offset: 26905}, + pos: position{line: 1102, col: 5, offset: 26794}, run: (*parser).callonOptionalExprs3, expr: &ruleRefExpr{ - pos: position{line: 1107, col: 5, offset: 26905}, + pos: position{line: 1102, col: 5, offset: 26794}, name: "__", }, }, @@ -7696,51 +7659,51 @@ var g = &grammar{ }, { name: "Exprs", - pos: position{line: 1109, col: 1, offset: 26933}, + pos: position{line: 1104, col: 1, offset: 26822}, expr: &actionExpr{ - pos: position{line: 1110, col: 5, offset: 26943}, + pos: position{line: 1105, col: 5, offset: 26832}, run: (*parser).callonExprs1, expr: &seqExpr{ - pos: position{line: 1110, col: 5, offset: 26943}, + pos: position{line: 1105, col: 5, offset: 26832}, exprs: []any{ &labeledExpr{ - pos: position{line: 1110, col: 5, offset: 26943}, + pos: position{line: 1105, col: 5, offset: 26832}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1110, col: 11, offset: 26949}, + pos: position{line: 1105, col: 11, offset: 26838}, name: "Expr", }, }, &labeledExpr{ - pos: position{line: 1110, col: 16, offset: 26954}, + pos: position{line: 1105, col: 16, offset: 26843}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1110, col: 21, offset: 26959}, + pos: position{line: 1105, col: 21, offset: 26848}, expr: &actionExpr{ - pos: position{line: 1110, col: 22, offset: 26960}, + pos: position{line: 1105, col: 22, offset: 26849}, run: (*parser).callonExprs7, expr: &seqExpr{ - pos: position{line: 1110, col: 22, offset: 26960}, + pos: position{line: 1105, col: 22, offset: 26849}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1110, col: 22, offset: 26960}, + pos: position{line: 1105, col: 22, offset: 26849}, name: "__", }, &litMatcher{ - pos: position{line: 1110, col: 25, offset: 26963}, + pos: position{line: 1105, col: 25, offset: 26852}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1110, col: 29, offset: 26967}, + pos: position{line: 1105, col: 29, offset: 26856}, name: "__", }, &labeledExpr{ - pos: position{line: 1110, col: 32, offset: 26970}, + pos: position{line: 1105, col: 32, offset: 26859}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1110, col: 34, offset: 26972}, + pos: position{line: 1105, col: 34, offset: 26861}, name: "Expr", }, }, @@ -7757,52 +7720,52 @@ var g = &grammar{ }, { name: "Primary", - pos: position{line: 1114, col: 1, offset: 27045}, + pos: position{line: 1109, col: 1, offset: 26934}, expr: &choiceExpr{ - pos: position{line: 1115, col: 5, offset: 27057}, + pos: position{line: 1110, col: 5, offset: 26946}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1115, col: 5, offset: 27057}, + pos: position{line: 1110, col: 5, offset: 26946}, name: "CaseExpr", }, &ruleRefExpr{ - pos: position{line: 1116, col: 5, offset: 27070}, + pos: position{line: 1111, col: 5, offset: 26959}, name: "Record", }, &ruleRefExpr{ - pos: position{line: 1117, col: 5, offset: 27081}, + pos: position{line: 1112, col: 5, offset: 26970}, name: "Array", }, &ruleRefExpr{ - pos: position{line: 1118, col: 5, offset: 27091}, + pos: position{line: 1113, col: 5, offset: 26980}, name: "Set", }, &ruleRefExpr{ - pos: position{line: 1119, col: 5, offset: 27099}, + pos: position{line: 1114, col: 5, offset: 26988}, name: "Map", }, &ruleRefExpr{ - pos: position{line: 1120, col: 5, offset: 27107}, + pos: position{line: 1115, col: 5, offset: 26996}, name: "Literal", }, &actionExpr{ - pos: position{line: 1121, col: 5, offset: 27119}, + pos: position{line: 1116, col: 5, offset: 27008}, run: (*parser).callonPrimary8, expr: &seqExpr{ - pos: position{line: 1121, col: 5, offset: 27119}, + pos: position{line: 1116, col: 5, offset: 27008}, exprs: []any{ ¬Expr{ - pos: position{line: 1121, col: 5, offset: 27119}, + pos: position{line: 1116, col: 5, offset: 27008}, expr: &ruleRefExpr{ - pos: position{line: 1121, col: 6, offset: 27120}, + pos: position{line: 1116, col: 6, offset: 27009}, name: "PipeKeyword", }, }, &labeledExpr{ - pos: position{line: 1121, col: 18, offset: 27132}, + pos: position{line: 1116, col: 18, offset: 27021}, label: "id", expr: &ruleRefExpr{ - pos: position{line: 1121, col: 21, offset: 27135}, + pos: position{line: 1116, col: 21, offset: 27024}, name: "Identifier", }, }, @@ -7810,39 +7773,39 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1122, col: 5, offset: 27169}, + pos: position{line: 1117, col: 5, offset: 27058}, name: "Tuple", }, &actionExpr{ - pos: position{line: 1123, col: 5, offset: 27179}, + pos: position{line: 1118, col: 5, offset: 27068}, run: (*parser).callonPrimary15, expr: &seqExpr{ - pos: position{line: 1123, col: 5, offset: 27179}, + pos: position{line: 1118, col: 5, offset: 27068}, exprs: []any{ &litMatcher{ - pos: position{line: 1123, col: 5, offset: 27179}, + pos: position{line: 1118, col: 5, offset: 27068}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1123, col: 9, offset: 27183}, + pos: position{line: 1118, col: 9, offset: 27072}, name: "__", }, &labeledExpr{ - pos: position{line: 1123, col: 12, offset: 27186}, + pos: position{line: 1118, col: 12, offset: 27075}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1123, col: 17, offset: 27191}, + pos: position{line: 1118, col: 17, offset: 27080}, name: "OverExpr", }, }, &ruleRefExpr{ - pos: position{line: 1123, col: 26, offset: 27200}, + pos: position{line: 1118, col: 26, offset: 27089}, name: "__", }, &litMatcher{ - pos: position{line: 1123, col: 29, offset: 27203}, + pos: position{line: 1118, col: 29, offset: 27092}, val: ")", ignoreCase: false, want: "\")\"", @@ -7851,35 +7814,35 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1124, col: 5, offset: 27232}, + pos: position{line: 1119, col: 5, offset: 27121}, run: (*parser).callonPrimary23, expr: &seqExpr{ - pos: position{line: 1124, col: 5, offset: 27232}, + pos: position{line: 1119, col: 5, offset: 27121}, exprs: []any{ &litMatcher{ - pos: position{line: 1124, col: 5, offset: 27232}, + pos: position{line: 1119, col: 5, offset: 27121}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1124, col: 9, offset: 27236}, + pos: position{line: 1119, col: 9, offset: 27125}, name: "__", }, &labeledExpr{ - pos: position{line: 1124, col: 12, offset: 27239}, + pos: position{line: 1119, col: 12, offset: 27128}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1124, col: 17, offset: 27244}, + pos: position{line: 1119, col: 17, offset: 27133}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1124, col: 22, offset: 27249}, + pos: position{line: 1119, col: 22, offset: 27138}, name: "__", }, &litMatcher{ - pos: position{line: 1124, col: 25, offset: 27252}, + pos: position{line: 1119, col: 25, offset: 27141}, val: ")", ignoreCase: false, want: "\")\"", @@ -7894,53 +7857,53 @@ var g = &grammar{ }, { name: "CaseExpr", - pos: position{line: 1126, col: 1, offset: 27278}, + pos: position{line: 1121, col: 1, offset: 27167}, expr: &choiceExpr{ - pos: position{line: 1127, col: 5, offset: 27291}, + pos: position{line: 1122, col: 5, offset: 27180}, alternatives: []any{ &actionExpr{ - pos: position{line: 1127, col: 5, offset: 27291}, + pos: position{line: 1122, col: 5, offset: 27180}, run: (*parser).callonCaseExpr2, expr: &seqExpr{ - pos: position{line: 1127, col: 5, offset: 27291}, + pos: position{line: 1122, col: 5, offset: 27180}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1127, col: 5, offset: 27291}, + pos: position{line: 1122, col: 5, offset: 27180}, name: "CASE", }, &labeledExpr{ - pos: position{line: 1127, col: 10, offset: 27296}, + pos: position{line: 1122, col: 10, offset: 27185}, label: "cases", expr: &oneOrMoreExpr{ - pos: position{line: 1127, col: 16, offset: 27302}, + pos: position{line: 1122, col: 16, offset: 27191}, expr: &ruleRefExpr{ - pos: position{line: 1127, col: 16, offset: 27302}, + pos: position{line: 1122, col: 16, offset: 27191}, name: "When", }, }, }, &labeledExpr{ - pos: position{line: 1127, col: 22, offset: 27308}, + pos: position{line: 1122, col: 22, offset: 27197}, label: "else_", expr: &zeroOrOneExpr{ - pos: position{line: 1127, col: 28, offset: 27314}, + pos: position{line: 1122, col: 28, offset: 27203}, expr: &seqExpr{ - pos: position{line: 1127, col: 29, offset: 27315}, + pos: position{line: 1122, col: 29, offset: 27204}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1127, col: 29, offset: 27315}, + pos: position{line: 1122, col: 29, offset: 27204}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1127, col: 31, offset: 27317}, + pos: position{line: 1122, col: 31, offset: 27206}, name: "ELSE", }, &ruleRefExpr{ - pos: position{line: 1127, col: 36, offset: 27322}, + pos: position{line: 1122, col: 36, offset: 27211}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1127, col: 38, offset: 27324}, + pos: position{line: 1122, col: 38, offset: 27213}, name: "Expr", }, }, @@ -7948,24 +7911,24 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1127, col: 45, offset: 27331}, + pos: position{line: 1122, col: 45, offset: 27220}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1127, col: 47, offset: 27333}, + pos: position{line: 1122, col: 47, offset: 27222}, name: "END", }, &zeroOrOneExpr{ - pos: position{line: 1127, col: 51, offset: 27337}, + pos: position{line: 1122, col: 51, offset: 27226}, expr: &seqExpr{ - pos: position{line: 1127, col: 52, offset: 27338}, + pos: position{line: 1122, col: 52, offset: 27227}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1127, col: 52, offset: 27338}, + pos: position{line: 1122, col: 52, offset: 27227}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1127, col: 54, offset: 27340}, + pos: position{line: 1122, col: 54, offset: 27229}, name: "CASE", }, }, @@ -7975,60 +7938,60 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1151, col: 5, offset: 27989}, + pos: position{line: 1146, col: 5, offset: 27878}, run: (*parser).callonCaseExpr21, expr: &seqExpr{ - pos: position{line: 1151, col: 5, offset: 27989}, + pos: position{line: 1146, col: 5, offset: 27878}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1151, col: 5, offset: 27989}, + pos: position{line: 1146, col: 5, offset: 27878}, name: "CASE", }, &ruleRefExpr{ - pos: position{line: 1151, col: 10, offset: 27994}, + pos: position{line: 1146, col: 10, offset: 27883}, name: "_", }, &labeledExpr{ - pos: position{line: 1151, col: 12, offset: 27996}, + pos: position{line: 1146, col: 12, offset: 27885}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1151, col: 17, offset: 28001}, + pos: position{line: 1146, col: 17, offset: 27890}, name: "Expr", }, }, &labeledExpr{ - pos: position{line: 1151, col: 22, offset: 28006}, + pos: position{line: 1146, col: 22, offset: 27895}, label: "whens", expr: &oneOrMoreExpr{ - pos: position{line: 1151, col: 28, offset: 28012}, + pos: position{line: 1146, col: 28, offset: 27901}, expr: &ruleRefExpr{ - pos: position{line: 1151, col: 28, offset: 28012}, + pos: position{line: 1146, col: 28, offset: 27901}, name: "When", }, }, }, &labeledExpr{ - pos: position{line: 1151, col: 34, offset: 28018}, + pos: position{line: 1146, col: 34, offset: 27907}, label: "else_", expr: &zeroOrOneExpr{ - pos: position{line: 1151, col: 40, offset: 28024}, + pos: position{line: 1146, col: 40, offset: 27913}, expr: &seqExpr{ - pos: position{line: 1151, col: 41, offset: 28025}, + pos: position{line: 1146, col: 41, offset: 27914}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1151, col: 41, offset: 28025}, + pos: position{line: 1146, col: 41, offset: 27914}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1151, col: 43, offset: 28027}, + pos: position{line: 1146, col: 43, offset: 27916}, name: "ELSE", }, &ruleRefExpr{ - pos: position{line: 1151, col: 48, offset: 28032}, + pos: position{line: 1146, col: 48, offset: 27921}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1151, col: 50, offset: 28034}, + pos: position{line: 1146, col: 50, offset: 27923}, name: "Expr", }, }, @@ -8036,24 +7999,24 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1151, col: 57, offset: 28041}, + pos: position{line: 1146, col: 57, offset: 27930}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1151, col: 59, offset: 28043}, + pos: position{line: 1146, col: 59, offset: 27932}, name: "END", }, &zeroOrOneExpr{ - pos: position{line: 1151, col: 63, offset: 28047}, + pos: position{line: 1146, col: 63, offset: 27936}, expr: &seqExpr{ - pos: position{line: 1151, col: 64, offset: 28048}, + pos: position{line: 1146, col: 64, offset: 27937}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1151, col: 64, offset: 28048}, + pos: position{line: 1146, col: 64, offset: 27937}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1151, col: 66, offset: 28050}, + pos: position{line: 1146, col: 66, offset: 27939}, name: "CASE", }, }, @@ -8069,50 +8032,50 @@ var g = &grammar{ }, { name: "When", - pos: position{line: 1164, col: 1, offset: 28356}, + pos: position{line: 1159, col: 1, offset: 28245}, expr: &actionExpr{ - pos: position{line: 1165, col: 5, offset: 28365}, + pos: position{line: 1160, col: 5, offset: 28254}, run: (*parser).callonWhen1, expr: &seqExpr{ - pos: position{line: 1165, col: 5, offset: 28365}, + pos: position{line: 1160, col: 5, offset: 28254}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1165, col: 5, offset: 28365}, + pos: position{line: 1160, col: 5, offset: 28254}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1165, col: 7, offset: 28367}, + pos: position{line: 1160, col: 7, offset: 28256}, name: "WHEN", }, &ruleRefExpr{ - pos: position{line: 1165, col: 12, offset: 28372}, + pos: position{line: 1160, col: 12, offset: 28261}, name: "_", }, &labeledExpr{ - pos: position{line: 1165, col: 14, offset: 28374}, + pos: position{line: 1160, col: 14, offset: 28263}, label: "cond", expr: &ruleRefExpr{ - pos: position{line: 1165, col: 19, offset: 28379}, + pos: position{line: 1160, col: 19, offset: 28268}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1165, col: 24, offset: 28384}, + pos: position{line: 1160, col: 24, offset: 28273}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1165, col: 26, offset: 28386}, + pos: position{line: 1160, col: 26, offset: 28275}, name: "THEN", }, &ruleRefExpr{ - pos: position{line: 1165, col: 31, offset: 28391}, + pos: position{line: 1160, col: 31, offset: 28280}, name: "_", }, &labeledExpr{ - pos: position{line: 1165, col: 33, offset: 28393}, + pos: position{line: 1160, col: 33, offset: 28282}, label: "then", expr: &ruleRefExpr{ - pos: position{line: 1165, col: 38, offset: 28398}, + pos: position{line: 1160, col: 38, offset: 28287}, name: "Expr", }, }, @@ -8124,57 +8087,57 @@ var g = &grammar{ }, { name: "OverExpr", - pos: position{line: 1174, col: 1, offset: 28557}, + pos: position{line: 1169, col: 1, offset: 28446}, expr: &actionExpr{ - pos: position{line: 1175, col: 5, offset: 28570}, + pos: position{line: 1170, col: 5, offset: 28459}, run: (*parser).callonOverExpr1, expr: &seqExpr{ - pos: position{line: 1175, col: 5, offset: 28570}, + pos: position{line: 1170, col: 5, offset: 28459}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1175, col: 5, offset: 28570}, + pos: position{line: 1170, col: 5, offset: 28459}, name: "OVER", }, &ruleRefExpr{ - pos: position{line: 1175, col: 10, offset: 28575}, + pos: position{line: 1170, col: 10, offset: 28464}, name: "_", }, &labeledExpr{ - pos: position{line: 1175, col: 12, offset: 28577}, + pos: position{line: 1170, col: 12, offset: 28466}, label: "exprs", expr: &ruleRefExpr{ - pos: position{line: 1175, col: 18, offset: 28583}, + pos: position{line: 1170, col: 18, offset: 28472}, name: "Exprs", }, }, &labeledExpr{ - pos: position{line: 1175, col: 24, offset: 28589}, + pos: position{line: 1170, col: 24, offset: 28478}, label: "locals", expr: &zeroOrOneExpr{ - pos: position{line: 1175, col: 31, offset: 28596}, + pos: position{line: 1170, col: 31, offset: 28485}, expr: &ruleRefExpr{ - pos: position{line: 1175, col: 31, offset: 28596}, + pos: position{line: 1170, col: 31, offset: 28485}, name: "Locals", }, }, }, &ruleRefExpr{ - pos: position{line: 1175, col: 39, offset: 28604}, + pos: position{line: 1170, col: 39, offset: 28493}, name: "__", }, &ruleRefExpr{ - pos: position{line: 1175, col: 42, offset: 28607}, + pos: position{line: 1170, col: 42, offset: 28496}, name: "Pipe", }, &ruleRefExpr{ - pos: position{line: 1175, col: 47, offset: 28612}, + pos: position{line: 1170, col: 47, offset: 28501}, name: "__", }, &labeledExpr{ - pos: position{line: 1175, col: 50, offset: 28615}, + pos: position{line: 1170, col: 50, offset: 28504}, label: "body", expr: &ruleRefExpr{ - pos: position{line: 1175, col: 55, offset: 28620}, + pos: position{line: 1170, col: 55, offset: 28509}, name: "Seq", }, }, @@ -8186,37 +8149,37 @@ var g = &grammar{ }, { name: "Record", - pos: position{line: 1185, col: 1, offset: 28851}, + pos: position{line: 1180, col: 1, offset: 28740}, expr: &actionExpr{ - pos: position{line: 1186, col: 5, offset: 28862}, + pos: position{line: 1181, col: 5, offset: 28751}, run: (*parser).callonRecord1, expr: &seqExpr{ - pos: position{line: 1186, col: 5, offset: 28862}, + pos: position{line: 1181, col: 5, offset: 28751}, exprs: []any{ &litMatcher{ - pos: position{line: 1186, col: 5, offset: 28862}, + pos: position{line: 1181, col: 5, offset: 28751}, val: "{", ignoreCase: false, want: "\"{\"", }, &ruleRefExpr{ - pos: position{line: 1186, col: 9, offset: 28866}, + pos: position{line: 1181, col: 9, offset: 28755}, name: "__", }, &labeledExpr{ - pos: position{line: 1186, col: 12, offset: 28869}, + pos: position{line: 1181, col: 12, offset: 28758}, label: "elems", expr: &ruleRefExpr{ - pos: position{line: 1186, col: 18, offset: 28875}, + pos: position{line: 1181, col: 18, offset: 28764}, name: "RecordElems", }, }, &ruleRefExpr{ - pos: position{line: 1186, col: 30, offset: 28887}, + pos: position{line: 1181, col: 30, offset: 28776}, name: "__", }, &litMatcher{ - pos: position{line: 1186, col: 33, offset: 28890}, + pos: position{line: 1181, col: 33, offset: 28779}, val: "}", ignoreCase: false, want: "\"}\"", @@ -8229,31 +8192,31 @@ var g = &grammar{ }, { name: "RecordElems", - pos: position{line: 1194, col: 1, offset: 29048}, + pos: position{line: 1189, col: 1, offset: 28937}, expr: &choiceExpr{ - pos: position{line: 1195, col: 5, offset: 29064}, + pos: position{line: 1190, col: 5, offset: 28953}, alternatives: []any{ &actionExpr{ - pos: position{line: 1195, col: 5, offset: 29064}, + pos: position{line: 1190, col: 5, offset: 28953}, run: (*parser).callonRecordElems2, expr: &seqExpr{ - pos: position{line: 1195, col: 5, offset: 29064}, + pos: position{line: 1190, col: 5, offset: 28953}, exprs: []any{ &labeledExpr{ - pos: position{line: 1195, col: 5, offset: 29064}, + pos: position{line: 1190, col: 5, offset: 28953}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1195, col: 11, offset: 29070}, + pos: position{line: 1190, col: 11, offset: 28959}, name: "RecordElem", }, }, &labeledExpr{ - pos: position{line: 1195, col: 22, offset: 29081}, + pos: position{line: 1190, col: 22, offset: 28970}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1195, col: 27, offset: 29086}, + pos: position{line: 1190, col: 27, offset: 28975}, expr: &ruleRefExpr{ - pos: position{line: 1195, col: 27, offset: 29086}, + pos: position{line: 1190, col: 27, offset: 28975}, name: "RecordElemTail", }, }, @@ -8262,10 +8225,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1198, col: 5, offset: 29149}, + pos: position{line: 1193, col: 5, offset: 29038}, run: (*parser).callonRecordElems9, expr: &ruleRefExpr{ - pos: position{line: 1198, col: 5, offset: 29149}, + pos: position{line: 1193, col: 5, offset: 29038}, name: "__", }, }, @@ -8276,32 +8239,32 @@ var g = &grammar{ }, { name: "RecordElemTail", - pos: position{line: 1200, col: 1, offset: 29173}, + pos: position{line: 1195, col: 1, offset: 29062}, expr: &actionExpr{ - pos: position{line: 1200, col: 18, offset: 29190}, + pos: position{line: 1195, col: 18, offset: 29079}, run: (*parser).callonRecordElemTail1, expr: &seqExpr{ - pos: position{line: 1200, col: 18, offset: 29190}, + pos: position{line: 1195, col: 18, offset: 29079}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1200, col: 18, offset: 29190}, + pos: position{line: 1195, col: 18, offset: 29079}, name: "__", }, &litMatcher{ - pos: position{line: 1200, col: 21, offset: 29193}, + pos: position{line: 1195, col: 21, offset: 29082}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1200, col: 25, offset: 29197}, + pos: position{line: 1195, col: 25, offset: 29086}, name: "__", }, &labeledExpr{ - pos: position{line: 1200, col: 28, offset: 29200}, + pos: position{line: 1195, col: 28, offset: 29089}, label: "elem", expr: &ruleRefExpr{ - pos: position{line: 1200, col: 33, offset: 29205}, + pos: position{line: 1195, col: 33, offset: 29094}, name: "RecordElem", }, }, @@ -8313,20 +8276,20 @@ var g = &grammar{ }, { name: "RecordElem", - pos: position{line: 1202, col: 1, offset: 29238}, + pos: position{line: 1197, col: 1, offset: 29127}, expr: &choiceExpr{ - pos: position{line: 1203, col: 5, offset: 29253}, + pos: position{line: 1198, col: 5, offset: 29142}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1203, col: 5, offset: 29253}, + pos: position{line: 1198, col: 5, offset: 29142}, name: "Spread", }, &ruleRefExpr{ - pos: position{line: 1204, col: 5, offset: 29264}, + pos: position{line: 1199, col: 5, offset: 29153}, name: "FieldExpr", }, &ruleRefExpr{ - pos: position{line: 1205, col: 5, offset: 29278}, + pos: position{line: 1200, col: 5, offset: 29167}, name: "Identifier", }, }, @@ -8336,28 +8299,28 @@ var g = &grammar{ }, { name: "Spread", - pos: position{line: 1207, col: 1, offset: 29290}, + pos: position{line: 1202, col: 1, offset: 29179}, expr: &actionExpr{ - pos: position{line: 1208, col: 5, offset: 29301}, + pos: position{line: 1203, col: 5, offset: 29190}, run: (*parser).callonSpread1, expr: &seqExpr{ - pos: position{line: 1208, col: 5, offset: 29301}, + pos: position{line: 1203, col: 5, offset: 29190}, exprs: []any{ &litMatcher{ - pos: position{line: 1208, col: 5, offset: 29301}, + pos: position{line: 1203, col: 5, offset: 29190}, val: "...", ignoreCase: false, want: "\"...\"", }, &ruleRefExpr{ - pos: position{line: 1208, col: 11, offset: 29307}, + pos: position{line: 1203, col: 11, offset: 29196}, name: "__", }, &labeledExpr{ - pos: position{line: 1208, col: 14, offset: 29310}, + pos: position{line: 1203, col: 14, offset: 29199}, label: "expr", expr: &ruleRefExpr{ - pos: position{line: 1208, col: 19, offset: 29315}, + pos: position{line: 1203, col: 19, offset: 29204}, name: "Expr", }, }, @@ -8369,40 +8332,40 @@ var g = &grammar{ }, { name: "FieldExpr", - pos: position{line: 1212, col: 1, offset: 29411}, + pos: position{line: 1207, col: 1, offset: 29300}, expr: &actionExpr{ - pos: position{line: 1213, col: 5, offset: 29425}, + pos: position{line: 1208, col: 5, offset: 29314}, run: (*parser).callonFieldExpr1, expr: &seqExpr{ - pos: position{line: 1213, col: 5, offset: 29425}, + pos: position{line: 1208, col: 5, offset: 29314}, exprs: []any{ &labeledExpr{ - pos: position{line: 1213, col: 5, offset: 29425}, + pos: position{line: 1208, col: 5, offset: 29314}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1213, col: 10, offset: 29430}, + pos: position{line: 1208, col: 10, offset: 29319}, name: "Name", }, }, &ruleRefExpr{ - pos: position{line: 1213, col: 15, offset: 29435}, + pos: position{line: 1208, col: 15, offset: 29324}, name: "__", }, &litMatcher{ - pos: position{line: 1213, col: 18, offset: 29438}, + pos: position{line: 1208, col: 18, offset: 29327}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1213, col: 22, offset: 29442}, + pos: position{line: 1208, col: 22, offset: 29331}, name: "__", }, &labeledExpr{ - pos: position{line: 1213, col: 25, offset: 29445}, + pos: position{line: 1208, col: 25, offset: 29334}, label: "value", expr: &ruleRefExpr{ - pos: position{line: 1213, col: 31, offset: 29451}, + pos: position{line: 1208, col: 31, offset: 29340}, name: "Expr", }, }, @@ -8414,37 +8377,37 @@ var g = &grammar{ }, { name: "Array", - pos: position{line: 1222, col: 1, offset: 29620}, + pos: position{line: 1217, col: 1, offset: 29509}, expr: &actionExpr{ - pos: position{line: 1223, col: 5, offset: 29630}, + pos: position{line: 1218, col: 5, offset: 29519}, run: (*parser).callonArray1, expr: &seqExpr{ - pos: position{line: 1223, col: 5, offset: 29630}, + pos: position{line: 1218, col: 5, offset: 29519}, exprs: []any{ &litMatcher{ - pos: position{line: 1223, col: 5, offset: 29630}, + pos: position{line: 1218, col: 5, offset: 29519}, val: "[", ignoreCase: false, want: "\"[\"", }, &ruleRefExpr{ - pos: position{line: 1223, col: 9, offset: 29634}, + pos: position{line: 1218, col: 9, offset: 29523}, name: "__", }, &labeledExpr{ - pos: position{line: 1223, col: 12, offset: 29637}, + pos: position{line: 1218, col: 12, offset: 29526}, label: "elems", expr: &ruleRefExpr{ - pos: position{line: 1223, col: 18, offset: 29643}, + pos: position{line: 1218, col: 18, offset: 29532}, name: "VectorElems", }, }, &ruleRefExpr{ - pos: position{line: 1223, col: 30, offset: 29655}, + pos: position{line: 1218, col: 30, offset: 29544}, name: "__", }, &litMatcher{ - pos: position{line: 1223, col: 33, offset: 29658}, + pos: position{line: 1218, col: 33, offset: 29547}, val: "]", ignoreCase: false, want: "\"]\"", @@ -8457,37 +8420,37 @@ var g = &grammar{ }, { name: "Set", - pos: position{line: 1231, col: 1, offset: 29814}, + pos: position{line: 1226, col: 1, offset: 29703}, expr: &actionExpr{ - pos: position{line: 1232, col: 5, offset: 29822}, + pos: position{line: 1227, col: 5, offset: 29711}, run: (*parser).callonSet1, expr: &seqExpr{ - pos: position{line: 1232, col: 5, offset: 29822}, + pos: position{line: 1227, col: 5, offset: 29711}, exprs: []any{ &litMatcher{ - pos: position{line: 1232, col: 5, offset: 29822}, + pos: position{line: 1227, col: 5, offset: 29711}, val: "|[", ignoreCase: false, want: "\"|[\"", }, &ruleRefExpr{ - pos: position{line: 1232, col: 10, offset: 29827}, + pos: position{line: 1227, col: 10, offset: 29716}, name: "__", }, &labeledExpr{ - pos: position{line: 1232, col: 13, offset: 29830}, + pos: position{line: 1227, col: 13, offset: 29719}, label: "elems", expr: &ruleRefExpr{ - pos: position{line: 1232, col: 19, offset: 29836}, + pos: position{line: 1227, col: 19, offset: 29725}, name: "VectorElems", }, }, &ruleRefExpr{ - pos: position{line: 1232, col: 31, offset: 29848}, + pos: position{line: 1227, col: 31, offset: 29737}, name: "__", }, &litMatcher{ - pos: position{line: 1232, col: 34, offset: 29851}, + pos: position{line: 1227, col: 34, offset: 29740}, val: "]|", ignoreCase: false, want: "\"]|\"", @@ -8500,54 +8463,54 @@ var g = &grammar{ }, { name: "VectorElems", - pos: position{line: 1240, col: 1, offset: 30004}, + pos: position{line: 1235, col: 1, offset: 29893}, expr: &choiceExpr{ - pos: position{line: 1241, col: 5, offset: 30020}, + pos: position{line: 1236, col: 5, offset: 29909}, alternatives: []any{ &actionExpr{ - pos: position{line: 1241, col: 5, offset: 30020}, + pos: position{line: 1236, col: 5, offset: 29909}, run: (*parser).callonVectorElems2, expr: &seqExpr{ - pos: position{line: 1241, col: 5, offset: 30020}, + pos: position{line: 1236, col: 5, offset: 29909}, exprs: []any{ &labeledExpr{ - pos: position{line: 1241, col: 5, offset: 30020}, + pos: position{line: 1236, col: 5, offset: 29909}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1241, col: 11, offset: 30026}, + pos: position{line: 1236, col: 11, offset: 29915}, name: "VectorElem", }, }, &labeledExpr{ - pos: position{line: 1241, col: 22, offset: 30037}, + pos: position{line: 1236, col: 22, offset: 29926}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1241, col: 27, offset: 30042}, + pos: position{line: 1236, col: 27, offset: 29931}, expr: &actionExpr{ - pos: position{line: 1241, col: 28, offset: 30043}, + pos: position{line: 1236, col: 28, offset: 29932}, run: (*parser).callonVectorElems8, expr: &seqExpr{ - pos: position{line: 1241, col: 28, offset: 30043}, + pos: position{line: 1236, col: 28, offset: 29932}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1241, col: 28, offset: 30043}, + pos: position{line: 1236, col: 28, offset: 29932}, name: "__", }, &litMatcher{ - pos: position{line: 1241, col: 31, offset: 30046}, + pos: position{line: 1236, col: 31, offset: 29935}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1241, col: 35, offset: 30050}, + pos: position{line: 1236, col: 35, offset: 29939}, name: "__", }, &labeledExpr{ - pos: position{line: 1241, col: 38, offset: 30053}, + pos: position{line: 1236, col: 38, offset: 29942}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1241, col: 40, offset: 30055}, + pos: position{line: 1236, col: 40, offset: 29944}, name: "VectorElem", }, }, @@ -8560,10 +8523,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1244, col: 5, offset: 30137}, + pos: position{line: 1239, col: 5, offset: 30026}, run: (*parser).callonVectorElems15, expr: &ruleRefExpr{ - pos: position{line: 1244, col: 5, offset: 30137}, + pos: position{line: 1239, col: 5, offset: 30026}, name: "__", }, }, @@ -8574,22 +8537,22 @@ var g = &grammar{ }, { name: "VectorElem", - pos: position{line: 1246, col: 1, offset: 30161}, + pos: position{line: 1241, col: 1, offset: 30050}, expr: &choiceExpr{ - pos: position{line: 1247, col: 5, offset: 30176}, + pos: position{line: 1242, col: 5, offset: 30065}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1247, col: 5, offset: 30176}, + pos: position{line: 1242, col: 5, offset: 30065}, name: "Spread", }, &actionExpr{ - pos: position{line: 1248, col: 5, offset: 30187}, + pos: position{line: 1243, col: 5, offset: 30076}, run: (*parser).callonVectorElem3, expr: &labeledExpr{ - pos: position{line: 1248, col: 5, offset: 30187}, + pos: position{line: 1243, col: 5, offset: 30076}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1248, col: 7, offset: 30189}, + pos: position{line: 1243, col: 7, offset: 30078}, name: "Expr", }, }, @@ -8601,37 +8564,37 @@ var g = &grammar{ }, { name: "Map", - pos: position{line: 1250, col: 1, offset: 30280}, + pos: position{line: 1245, col: 1, offset: 30169}, expr: &actionExpr{ - pos: position{line: 1251, col: 5, offset: 30288}, + pos: position{line: 1246, col: 5, offset: 30177}, run: (*parser).callonMap1, expr: &seqExpr{ - pos: position{line: 1251, col: 5, offset: 30288}, + pos: position{line: 1246, col: 5, offset: 30177}, exprs: []any{ &litMatcher{ - pos: position{line: 1251, col: 5, offset: 30288}, + pos: position{line: 1246, col: 5, offset: 30177}, val: "|{", ignoreCase: false, want: "\"|{\"", }, &ruleRefExpr{ - pos: position{line: 1251, col: 10, offset: 30293}, + pos: position{line: 1246, col: 10, offset: 30182}, name: "__", }, &labeledExpr{ - pos: position{line: 1251, col: 13, offset: 30296}, + pos: position{line: 1246, col: 13, offset: 30185}, label: "exprs", expr: &ruleRefExpr{ - pos: position{line: 1251, col: 19, offset: 30302}, + pos: position{line: 1246, col: 19, offset: 30191}, name: "Entries", }, }, &ruleRefExpr{ - pos: position{line: 1251, col: 27, offset: 30310}, + pos: position{line: 1246, col: 27, offset: 30199}, name: "__", }, &litMatcher{ - pos: position{line: 1251, col: 30, offset: 30313}, + pos: position{line: 1246, col: 30, offset: 30202}, val: "}|", ignoreCase: false, want: "\"}|\"", @@ -8644,31 +8607,31 @@ var g = &grammar{ }, { name: "Entries", - pos: position{line: 1259, col: 1, offset: 30467}, + pos: position{line: 1254, col: 1, offset: 30356}, expr: &choiceExpr{ - pos: position{line: 1260, col: 5, offset: 30479}, + pos: position{line: 1255, col: 5, offset: 30368}, alternatives: []any{ &actionExpr{ - pos: position{line: 1260, col: 5, offset: 30479}, + pos: position{line: 1255, col: 5, offset: 30368}, run: (*parser).callonEntries2, expr: &seqExpr{ - pos: position{line: 1260, col: 5, offset: 30479}, + pos: position{line: 1255, col: 5, offset: 30368}, exprs: []any{ &labeledExpr{ - pos: position{line: 1260, col: 5, offset: 30479}, + pos: position{line: 1255, col: 5, offset: 30368}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1260, col: 11, offset: 30485}, + pos: position{line: 1255, col: 11, offset: 30374}, name: "Entry", }, }, &labeledExpr{ - pos: position{line: 1260, col: 17, offset: 30491}, + pos: position{line: 1255, col: 17, offset: 30380}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1260, col: 22, offset: 30496}, + pos: position{line: 1255, col: 22, offset: 30385}, expr: &ruleRefExpr{ - pos: position{line: 1260, col: 22, offset: 30496}, + pos: position{line: 1255, col: 22, offset: 30385}, name: "EntryTail", }, }, @@ -8677,10 +8640,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1263, col: 5, offset: 30554}, + pos: position{line: 1258, col: 5, offset: 30443}, run: (*parser).callonEntries9, expr: &ruleRefExpr{ - pos: position{line: 1263, col: 5, offset: 30554}, + pos: position{line: 1258, col: 5, offset: 30443}, name: "__", }, }, @@ -8691,32 +8654,32 @@ var g = &grammar{ }, { name: "EntryTail", - pos: position{line: 1266, col: 1, offset: 30579}, + pos: position{line: 1261, col: 1, offset: 30468}, expr: &actionExpr{ - pos: position{line: 1266, col: 13, offset: 30591}, + pos: position{line: 1261, col: 13, offset: 30480}, run: (*parser).callonEntryTail1, expr: &seqExpr{ - pos: position{line: 1266, col: 13, offset: 30591}, + pos: position{line: 1261, col: 13, offset: 30480}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1266, col: 13, offset: 30591}, + pos: position{line: 1261, col: 13, offset: 30480}, name: "__", }, &litMatcher{ - pos: position{line: 1266, col: 16, offset: 30594}, + pos: position{line: 1261, col: 16, offset: 30483}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1266, col: 20, offset: 30598}, + pos: position{line: 1261, col: 20, offset: 30487}, name: "__", }, &labeledExpr{ - pos: position{line: 1266, col: 23, offset: 30601}, + pos: position{line: 1261, col: 23, offset: 30490}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1266, col: 25, offset: 30603}, + pos: position{line: 1261, col: 25, offset: 30492}, name: "Entry", }, }, @@ -8728,40 +8691,40 @@ var g = &grammar{ }, { name: "Entry", - pos: position{line: 1268, col: 1, offset: 30628}, + pos: position{line: 1263, col: 1, offset: 30517}, expr: &actionExpr{ - pos: position{line: 1269, col: 5, offset: 30638}, + pos: position{line: 1264, col: 5, offset: 30527}, run: (*parser).callonEntry1, expr: &seqExpr{ - pos: position{line: 1269, col: 5, offset: 30638}, + pos: position{line: 1264, col: 5, offset: 30527}, exprs: []any{ &labeledExpr{ - pos: position{line: 1269, col: 5, offset: 30638}, + pos: position{line: 1264, col: 5, offset: 30527}, label: "key", expr: &ruleRefExpr{ - pos: position{line: 1269, col: 9, offset: 30642}, + pos: position{line: 1264, col: 9, offset: 30531}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1269, col: 14, offset: 30647}, + pos: position{line: 1264, col: 14, offset: 30536}, name: "__", }, &litMatcher{ - pos: position{line: 1269, col: 17, offset: 30650}, + pos: position{line: 1264, col: 17, offset: 30539}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1269, col: 21, offset: 30654}, + pos: position{line: 1264, col: 21, offset: 30543}, name: "__", }, &labeledExpr{ - pos: position{line: 1269, col: 24, offset: 30657}, + pos: position{line: 1264, col: 24, offset: 30546}, label: "value", expr: &ruleRefExpr{ - pos: position{line: 1269, col: 30, offset: 30663}, + pos: position{line: 1264, col: 30, offset: 30552}, name: "Expr", }, }, @@ -8773,61 +8736,61 @@ var g = &grammar{ }, { name: "Tuple", - pos: position{line: 1273, col: 1, offset: 30766}, + pos: position{line: 1268, col: 1, offset: 30655}, expr: &actionExpr{ - pos: position{line: 1274, col: 5, offset: 30776}, + pos: position{line: 1269, col: 5, offset: 30665}, run: (*parser).callonTuple1, expr: &seqExpr{ - pos: position{line: 1274, col: 5, offset: 30776}, + pos: position{line: 1269, col: 5, offset: 30665}, exprs: []any{ &litMatcher{ - pos: position{line: 1274, col: 5, offset: 30776}, + pos: position{line: 1269, col: 5, offset: 30665}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1274, col: 9, offset: 30780}, + pos: position{line: 1269, col: 9, offset: 30669}, name: "__", }, &labeledExpr{ - pos: position{line: 1274, col: 12, offset: 30783}, + pos: position{line: 1269, col: 12, offset: 30672}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1274, col: 18, offset: 30789}, + pos: position{line: 1269, col: 18, offset: 30678}, name: "Expr", }, }, &labeledExpr{ - pos: position{line: 1274, col: 23, offset: 30794}, + pos: position{line: 1269, col: 23, offset: 30683}, label: "rest", expr: &oneOrMoreExpr{ - pos: position{line: 1274, col: 28, offset: 30799}, + pos: position{line: 1269, col: 28, offset: 30688}, expr: &actionExpr{ - pos: position{line: 1274, col: 29, offset: 30800}, + pos: position{line: 1269, col: 29, offset: 30689}, run: (*parser).callonTuple9, expr: &seqExpr{ - pos: position{line: 1274, col: 29, offset: 30800}, + pos: position{line: 1269, col: 29, offset: 30689}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1274, col: 29, offset: 30800}, + pos: position{line: 1269, col: 29, offset: 30689}, name: "__", }, &litMatcher{ - pos: position{line: 1274, col: 32, offset: 30803}, + pos: position{line: 1269, col: 32, offset: 30692}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1274, col: 36, offset: 30807}, + pos: position{line: 1269, col: 36, offset: 30696}, name: "__", }, &labeledExpr{ - pos: position{line: 1274, col: 39, offset: 30810}, + pos: position{line: 1269, col: 39, offset: 30699}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1274, col: 41, offset: 30812}, + pos: position{line: 1269, col: 41, offset: 30701}, name: "Expr", }, }, @@ -8837,11 +8800,11 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1274, col: 66, offset: 30837}, + pos: position{line: 1269, col: 66, offset: 30726}, name: "__", }, &litMatcher{ - pos: position{line: 1274, col: 69, offset: 30840}, + pos: position{line: 1269, col: 69, offset: 30729}, val: ")", ignoreCase: false, want: "\")\"", @@ -8854,56 +8817,56 @@ var g = &grammar{ }, { name: "Literal", - pos: position{line: 1284, col: 1, offset: 31021}, + pos: position{line: 1279, col: 1, offset: 30910}, expr: &choiceExpr{ - pos: position{line: 1285, col: 5, offset: 31033}, + pos: position{line: 1280, col: 5, offset: 30922}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1285, col: 5, offset: 31033}, + pos: position{line: 1280, col: 5, offset: 30922}, name: "TypeLiteral", }, &ruleRefExpr{ - pos: position{line: 1286, col: 5, offset: 31049}, + pos: position{line: 1281, col: 5, offset: 30938}, name: "StringLiteral", }, &ruleRefExpr{ - pos: position{line: 1287, col: 5, offset: 31067}, + pos: position{line: 1282, col: 5, offset: 30956}, name: "FString", }, &ruleRefExpr{ - pos: position{line: 1288, col: 5, offset: 31079}, + pos: position{line: 1283, col: 5, offset: 30968}, name: "SubnetLiteral", }, &ruleRefExpr{ - pos: position{line: 1289, col: 5, offset: 31097}, + pos: position{line: 1284, col: 5, offset: 30986}, name: "AddressLiteral", }, &ruleRefExpr{ - pos: position{line: 1290, col: 5, offset: 31116}, + pos: position{line: 1285, col: 5, offset: 31005}, name: "BytesLiteral", }, &ruleRefExpr{ - pos: position{line: 1291, col: 5, offset: 31133}, + pos: position{line: 1286, col: 5, offset: 31022}, name: "Duration", }, &ruleRefExpr{ - pos: position{line: 1292, col: 5, offset: 31146}, + pos: position{line: 1287, col: 5, offset: 31035}, name: "Time", }, &ruleRefExpr{ - pos: position{line: 1293, col: 5, offset: 31155}, + pos: position{line: 1288, col: 5, offset: 31044}, name: "FloatLiteral", }, &ruleRefExpr{ - pos: position{line: 1294, col: 5, offset: 31172}, + pos: position{line: 1289, col: 5, offset: 31061}, name: "IntegerLiteral", }, &ruleRefExpr{ - pos: position{line: 1295, col: 5, offset: 31191}, + pos: position{line: 1290, col: 5, offset: 31080}, name: "BooleanLiteral", }, &ruleRefExpr{ - pos: position{line: 1296, col: 5, offset: 31210}, + pos: position{line: 1291, col: 5, offset: 31099}, name: "NullLiteral", }, }, @@ -8913,28 +8876,28 @@ var g = &grammar{ }, { name: "SubnetLiteral", - pos: position{line: 1298, col: 1, offset: 31223}, + pos: position{line: 1293, col: 1, offset: 31112}, expr: &choiceExpr{ - pos: position{line: 1299, col: 5, offset: 31241}, + pos: position{line: 1294, col: 5, offset: 31130}, alternatives: []any{ &actionExpr{ - pos: position{line: 1299, col: 5, offset: 31241}, + pos: position{line: 1294, col: 5, offset: 31130}, run: (*parser).callonSubnetLiteral2, expr: &seqExpr{ - pos: position{line: 1299, col: 5, offset: 31241}, + pos: position{line: 1294, col: 5, offset: 31130}, exprs: []any{ &labeledExpr{ - pos: position{line: 1299, col: 5, offset: 31241}, + pos: position{line: 1294, col: 5, offset: 31130}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1299, col: 7, offset: 31243}, + pos: position{line: 1294, col: 7, offset: 31132}, name: "IP6Net", }, }, ¬Expr{ - pos: position{line: 1299, col: 14, offset: 31250}, + pos: position{line: 1294, col: 14, offset: 31139}, expr: &ruleRefExpr{ - pos: position{line: 1299, col: 15, offset: 31251}, + pos: position{line: 1294, col: 15, offset: 31140}, name: "IdentifierRest", }, }, @@ -8942,13 +8905,13 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1302, col: 5, offset: 31331}, + pos: position{line: 1297, col: 5, offset: 31220}, run: (*parser).callonSubnetLiteral8, expr: &labeledExpr{ - pos: position{line: 1302, col: 5, offset: 31331}, + pos: position{line: 1297, col: 5, offset: 31220}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1302, col: 7, offset: 31333}, + pos: position{line: 1297, col: 7, offset: 31222}, name: "IP4Net", }, }, @@ -8960,28 +8923,28 @@ var g = &grammar{ }, { name: "AddressLiteral", - pos: position{line: 1306, col: 1, offset: 31402}, + pos: position{line: 1301, col: 1, offset: 31291}, expr: &choiceExpr{ - pos: position{line: 1307, col: 5, offset: 31421}, + pos: position{line: 1302, col: 5, offset: 31310}, alternatives: []any{ &actionExpr{ - pos: position{line: 1307, col: 5, offset: 31421}, + pos: position{line: 1302, col: 5, offset: 31310}, run: (*parser).callonAddressLiteral2, expr: &seqExpr{ - pos: position{line: 1307, col: 5, offset: 31421}, + pos: position{line: 1302, col: 5, offset: 31310}, exprs: []any{ &labeledExpr{ - pos: position{line: 1307, col: 5, offset: 31421}, + pos: position{line: 1302, col: 5, offset: 31310}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1307, col: 7, offset: 31423}, + pos: position{line: 1302, col: 7, offset: 31312}, name: "IP6", }, }, ¬Expr{ - pos: position{line: 1307, col: 11, offset: 31427}, + pos: position{line: 1302, col: 11, offset: 31316}, expr: &ruleRefExpr{ - pos: position{line: 1307, col: 12, offset: 31428}, + pos: position{line: 1302, col: 12, offset: 31317}, name: "IdentifierRest", }, }, @@ -8989,13 +8952,13 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1310, col: 5, offset: 31507}, + pos: position{line: 1305, col: 5, offset: 31396}, run: (*parser).callonAddressLiteral8, expr: &labeledExpr{ - pos: position{line: 1310, col: 5, offset: 31507}, + pos: position{line: 1305, col: 5, offset: 31396}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1310, col: 7, offset: 31509}, + pos: position{line: 1305, col: 7, offset: 31398}, name: "IP", }, }, @@ -9007,15 +8970,15 @@ var g = &grammar{ }, { name: "FloatLiteral", - pos: position{line: 1314, col: 1, offset: 31573}, + pos: position{line: 1309, col: 1, offset: 31462}, expr: &actionExpr{ - pos: position{line: 1315, col: 5, offset: 31590}, + pos: position{line: 1310, col: 5, offset: 31479}, run: (*parser).callonFloatLiteral1, expr: &labeledExpr{ - pos: position{line: 1315, col: 5, offset: 31590}, + pos: position{line: 1310, col: 5, offset: 31479}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1315, col: 7, offset: 31592}, + pos: position{line: 1310, col: 7, offset: 31481}, name: "FloatString", }, }, @@ -9025,15 +8988,15 @@ var g = &grammar{ }, { name: "IntegerLiteral", - pos: position{line: 1319, col: 1, offset: 31670}, + pos: position{line: 1314, col: 1, offset: 31559}, expr: &actionExpr{ - pos: position{line: 1320, col: 5, offset: 31689}, + pos: position{line: 1315, col: 5, offset: 31578}, run: (*parser).callonIntegerLiteral1, expr: &labeledExpr{ - pos: position{line: 1320, col: 5, offset: 31689}, + pos: position{line: 1315, col: 5, offset: 31578}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1320, col: 7, offset: 31691}, + pos: position{line: 1315, col: 7, offset: 31580}, name: "IntString", }, }, @@ -9043,23 +9006,23 @@ var g = &grammar{ }, { name: "BooleanLiteral", - pos: position{line: 1324, col: 1, offset: 31765}, + pos: position{line: 1319, col: 1, offset: 31654}, expr: &choiceExpr{ - pos: position{line: 1325, col: 5, offset: 31784}, + pos: position{line: 1320, col: 5, offset: 31673}, alternatives: []any{ &actionExpr{ - pos: position{line: 1325, col: 5, offset: 31784}, + pos: position{line: 1320, col: 5, offset: 31673}, run: (*parser).callonBooleanLiteral2, expr: &ruleRefExpr{ - pos: position{line: 1325, col: 5, offset: 31784}, + pos: position{line: 1320, col: 5, offset: 31673}, name: "TRUE", }, }, &actionExpr{ - pos: position{line: 1326, col: 5, offset: 31842}, + pos: position{line: 1321, col: 5, offset: 31731}, run: (*parser).callonBooleanLiteral4, expr: &ruleRefExpr{ - pos: position{line: 1326, col: 5, offset: 31842}, + pos: position{line: 1321, col: 5, offset: 31731}, name: "FALSE", }, }, @@ -9070,12 +9033,12 @@ var g = &grammar{ }, { name: "NullLiteral", - pos: position{line: 1328, col: 1, offset: 31898}, + pos: position{line: 1323, col: 1, offset: 31787}, expr: &actionExpr{ - pos: position{line: 1329, col: 5, offset: 31914}, + pos: position{line: 1324, col: 5, offset: 31803}, run: (*parser).callonNullLiteral1, expr: &ruleRefExpr{ - pos: position{line: 1329, col: 5, offset: 31914}, + pos: position{line: 1324, col: 5, offset: 31803}, name: "NULL", }, }, @@ -9084,23 +9047,23 @@ var g = &grammar{ }, { name: "BytesLiteral", - pos: position{line: 1331, col: 1, offset: 31964}, + pos: position{line: 1326, col: 1, offset: 31853}, expr: &actionExpr{ - pos: position{line: 1332, col: 5, offset: 31981}, + pos: position{line: 1327, col: 5, offset: 31870}, run: (*parser).callonBytesLiteral1, expr: &seqExpr{ - pos: position{line: 1332, col: 5, offset: 31981}, + pos: position{line: 1327, col: 5, offset: 31870}, exprs: []any{ &litMatcher{ - pos: position{line: 1332, col: 5, offset: 31981}, + pos: position{line: 1327, col: 5, offset: 31870}, val: "0x", ignoreCase: false, want: "\"0x\"", }, &zeroOrMoreExpr{ - pos: position{line: 1332, col: 10, offset: 31986}, + pos: position{line: 1327, col: 10, offset: 31875}, expr: &ruleRefExpr{ - pos: position{line: 1332, col: 10, offset: 31986}, + pos: position{line: 1327, col: 10, offset: 31875}, name: "HexDigit", }, }, @@ -9112,29 +9075,29 @@ var g = &grammar{ }, { name: "TypeLiteral", - pos: position{line: 1336, col: 1, offset: 32060}, + pos: position{line: 1331, col: 1, offset: 31949}, expr: &actionExpr{ - pos: position{line: 1337, col: 5, offset: 32076}, + pos: position{line: 1332, col: 5, offset: 31965}, run: (*parser).callonTypeLiteral1, expr: &seqExpr{ - pos: position{line: 1337, col: 5, offset: 32076}, + pos: position{line: 1332, col: 5, offset: 31965}, exprs: []any{ &litMatcher{ - pos: position{line: 1337, col: 5, offset: 32076}, + pos: position{line: 1332, col: 5, offset: 31965}, val: "<", ignoreCase: false, want: "\"<\"", }, &labeledExpr{ - pos: position{line: 1337, col: 9, offset: 32080}, + pos: position{line: 1332, col: 9, offset: 31969}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1337, col: 13, offset: 32084}, + pos: position{line: 1332, col: 13, offset: 31973}, name: "Type", }, }, &litMatcher{ - pos: position{line: 1337, col: 18, offset: 32089}, + pos: position{line: 1332, col: 18, offset: 31978}, val: ">", ignoreCase: false, want: "\">\"", @@ -9147,16 +9110,16 @@ var g = &grammar{ }, { name: "Type", - pos: position{line: 1345, col: 1, offset: 32222}, + pos: position{line: 1340, col: 1, offset: 32111}, expr: &choiceExpr{ - pos: position{line: 1346, col: 5, offset: 32231}, + pos: position{line: 1341, col: 5, offset: 32120}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1346, col: 5, offset: 32231}, + pos: position{line: 1341, col: 5, offset: 32120}, name: "AmbiguousType", }, &ruleRefExpr{ - pos: position{line: 1347, col: 5, offset: 32249}, + pos: position{line: 1342, col: 5, offset: 32138}, name: "ComplexType", }, }, @@ -9166,28 +9129,28 @@ var g = &grammar{ }, { name: "AmbiguousType", - pos: position{line: 1349, col: 1, offset: 32262}, + pos: position{line: 1344, col: 1, offset: 32151}, expr: &choiceExpr{ - pos: position{line: 1350, col: 5, offset: 32280}, + pos: position{line: 1345, col: 5, offset: 32169}, alternatives: []any{ &actionExpr{ - pos: position{line: 1350, col: 5, offset: 32280}, + pos: position{line: 1345, col: 5, offset: 32169}, run: (*parser).callonAmbiguousType2, expr: &seqExpr{ - pos: position{line: 1350, col: 5, offset: 32280}, + pos: position{line: 1345, col: 5, offset: 32169}, exprs: []any{ &labeledExpr{ - pos: position{line: 1350, col: 5, offset: 32280}, + pos: position{line: 1345, col: 5, offset: 32169}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1350, col: 10, offset: 32285}, + pos: position{line: 1345, col: 10, offset: 32174}, name: "PrimitiveType", }, }, ¬Expr{ - pos: position{line: 1350, col: 24, offset: 32299}, + pos: position{line: 1345, col: 24, offset: 32188}, expr: &ruleRefExpr{ - pos: position{line: 1350, col: 25, offset: 32300}, + pos: position{line: 1345, col: 25, offset: 32189}, name: "IdentifierRest", }, }, @@ -9195,43 +9158,43 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1351, col: 5, offset: 32340}, + pos: position{line: 1346, col: 5, offset: 32229}, run: (*parser).callonAmbiguousType8, expr: &seqExpr{ - pos: position{line: 1351, col: 5, offset: 32340}, + pos: position{line: 1346, col: 5, offset: 32229}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1351, col: 5, offset: 32340}, + pos: position{line: 1346, col: 5, offset: 32229}, name: "ERROR", }, &ruleRefExpr{ - pos: position{line: 1351, col: 11, offset: 32346}, + pos: position{line: 1346, col: 11, offset: 32235}, name: "__", }, &litMatcher{ - pos: position{line: 1351, col: 14, offset: 32349}, + pos: position{line: 1346, col: 14, offset: 32238}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1351, col: 18, offset: 32353}, + pos: position{line: 1346, col: 18, offset: 32242}, name: "__", }, &labeledExpr{ - pos: position{line: 1351, col: 21, offset: 32356}, + pos: position{line: 1346, col: 21, offset: 32245}, label: "t", expr: &ruleRefExpr{ - pos: position{line: 1351, col: 23, offset: 32358}, + pos: position{line: 1346, col: 23, offset: 32247}, name: "Type", }, }, &ruleRefExpr{ - pos: position{line: 1351, col: 28, offset: 32363}, + pos: position{line: 1346, col: 28, offset: 32252}, name: "__", }, &litMatcher{ - pos: position{line: 1351, col: 31, offset: 32366}, + pos: position{line: 1346, col: 31, offset: 32255}, val: ")", ignoreCase: false, want: "\")\"", @@ -9240,43 +9203,43 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1358, col: 5, offset: 32506}, + pos: position{line: 1353, col: 5, offset: 32395}, run: (*parser).callonAmbiguousType18, expr: &seqExpr{ - pos: position{line: 1358, col: 5, offset: 32506}, + pos: position{line: 1353, col: 5, offset: 32395}, exprs: []any{ &labeledExpr{ - pos: position{line: 1358, col: 5, offset: 32506}, + pos: position{line: 1353, col: 5, offset: 32395}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1358, col: 10, offset: 32511}, + pos: position{line: 1353, col: 10, offset: 32400}, name: "Name", }, }, &labeledExpr{ - pos: position{line: 1358, col: 15, offset: 32516}, + pos: position{line: 1353, col: 15, offset: 32405}, label: "opt", expr: &zeroOrOneExpr{ - pos: position{line: 1358, col: 19, offset: 32520}, + pos: position{line: 1353, col: 19, offset: 32409}, expr: &seqExpr{ - pos: position{line: 1358, col: 20, offset: 32521}, + pos: position{line: 1353, col: 20, offset: 32410}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1358, col: 20, offset: 32521}, + pos: position{line: 1353, col: 20, offset: 32410}, name: "__", }, &litMatcher{ - pos: position{line: 1358, col: 23, offset: 32524}, + pos: position{line: 1353, col: 23, offset: 32413}, val: "=", ignoreCase: false, want: "\"=\"", }, &ruleRefExpr{ - pos: position{line: 1358, col: 27, offset: 32528}, + pos: position{line: 1353, col: 27, offset: 32417}, name: "__", }, &ruleRefExpr{ - pos: position{line: 1358, col: 30, offset: 32531}, + pos: position{line: 1353, col: 30, offset: 32420}, name: "Type", }, }, @@ -9287,31 +9250,31 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1369, col: 5, offset: 32856}, + pos: position{line: 1364, col: 5, offset: 32745}, run: (*parser).callonAmbiguousType29, expr: &seqExpr{ - pos: position{line: 1369, col: 5, offset: 32856}, + pos: position{line: 1364, col: 5, offset: 32745}, exprs: []any{ &litMatcher{ - pos: position{line: 1369, col: 5, offset: 32856}, + pos: position{line: 1364, col: 5, offset: 32745}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1369, col: 9, offset: 32860}, + pos: position{line: 1364, col: 9, offset: 32749}, name: "__", }, &labeledExpr{ - pos: position{line: 1369, col: 12, offset: 32863}, + pos: position{line: 1364, col: 12, offset: 32752}, label: "types", expr: &ruleRefExpr{ - pos: position{line: 1369, col: 18, offset: 32869}, + pos: position{line: 1364, col: 18, offset: 32758}, name: "TypeList", }, }, &litMatcher{ - pos: position{line: 1369, col: 27, offset: 32878}, + pos: position{line: 1364, col: 27, offset: 32767}, val: ")", ignoreCase: false, want: "\")\"", @@ -9326,28 +9289,28 @@ var g = &grammar{ }, { name: "TypeList", - pos: position{line: 1377, col: 1, offset: 33022}, + pos: position{line: 1372, col: 1, offset: 32911}, expr: &actionExpr{ - pos: position{line: 1378, col: 5, offset: 33035}, + pos: position{line: 1373, col: 5, offset: 32924}, run: (*parser).callonTypeList1, expr: &seqExpr{ - pos: position{line: 1378, col: 5, offset: 33035}, + pos: position{line: 1373, col: 5, offset: 32924}, exprs: []any{ &labeledExpr{ - pos: position{line: 1378, col: 5, offset: 33035}, + pos: position{line: 1373, col: 5, offset: 32924}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1378, col: 11, offset: 33041}, + pos: position{line: 1373, col: 11, offset: 32930}, name: "Type", }, }, &labeledExpr{ - pos: position{line: 1378, col: 16, offset: 33046}, + pos: position{line: 1373, col: 16, offset: 32935}, label: "rest", expr: &oneOrMoreExpr{ - pos: position{line: 1378, col: 21, offset: 33051}, + pos: position{line: 1373, col: 21, offset: 32940}, expr: &ruleRefExpr{ - pos: position{line: 1378, col: 21, offset: 33051}, + pos: position{line: 1373, col: 21, offset: 32940}, name: "TypeListTail", }, }, @@ -9360,32 +9323,32 @@ var g = &grammar{ }, { name: "TypeListTail", - pos: position{line: 1382, col: 1, offset: 33109}, + pos: position{line: 1377, col: 1, offset: 32998}, expr: &actionExpr{ - pos: position{line: 1382, col: 16, offset: 33124}, + pos: position{line: 1377, col: 16, offset: 33013}, run: (*parser).callonTypeListTail1, expr: &seqExpr{ - pos: position{line: 1382, col: 16, offset: 33124}, + pos: position{line: 1377, col: 16, offset: 33013}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1382, col: 16, offset: 33124}, + pos: position{line: 1377, col: 16, offset: 33013}, name: "__", }, &litMatcher{ - pos: position{line: 1382, col: 19, offset: 33127}, + pos: position{line: 1377, col: 19, offset: 33016}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1382, col: 23, offset: 33131}, + pos: position{line: 1377, col: 23, offset: 33020}, name: "__", }, &labeledExpr{ - pos: position{line: 1382, col: 26, offset: 33134}, + pos: position{line: 1377, col: 26, offset: 33023}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1382, col: 30, offset: 33138}, + pos: position{line: 1377, col: 30, offset: 33027}, name: "Type", }, }, @@ -9397,40 +9360,40 @@ var g = &grammar{ }, { name: "ComplexType", - pos: position{line: 1384, col: 1, offset: 33164}, + pos: position{line: 1379, col: 1, offset: 33053}, expr: &choiceExpr{ - pos: position{line: 1385, col: 5, offset: 33180}, + pos: position{line: 1380, col: 5, offset: 33069}, alternatives: []any{ &actionExpr{ - pos: position{line: 1385, col: 5, offset: 33180}, + pos: position{line: 1380, col: 5, offset: 33069}, run: (*parser).callonComplexType2, expr: &seqExpr{ - pos: position{line: 1385, col: 5, offset: 33180}, + pos: position{line: 1380, col: 5, offset: 33069}, exprs: []any{ &litMatcher{ - pos: position{line: 1385, col: 5, offset: 33180}, + pos: position{line: 1380, col: 5, offset: 33069}, val: "{", ignoreCase: false, want: "\"{\"", }, &ruleRefExpr{ - pos: position{line: 1385, col: 9, offset: 33184}, + pos: position{line: 1380, col: 9, offset: 33073}, name: "__", }, &labeledExpr{ - pos: position{line: 1385, col: 12, offset: 33187}, + pos: position{line: 1380, col: 12, offset: 33076}, label: "fields", expr: &ruleRefExpr{ - pos: position{line: 1385, col: 19, offset: 33194}, + pos: position{line: 1380, col: 19, offset: 33083}, name: "TypeFieldList", }, }, &ruleRefExpr{ - pos: position{line: 1385, col: 33, offset: 33208}, + pos: position{line: 1380, col: 33, offset: 33097}, name: "__", }, &litMatcher{ - pos: position{line: 1385, col: 36, offset: 33211}, + pos: position{line: 1380, col: 36, offset: 33100}, val: "}", ignoreCase: false, want: "\"}\"", @@ -9439,35 +9402,35 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1392, col: 5, offset: 33373}, + pos: position{line: 1387, col: 5, offset: 33262}, run: (*parser).callonComplexType10, expr: &seqExpr{ - pos: position{line: 1392, col: 5, offset: 33373}, + pos: position{line: 1387, col: 5, offset: 33262}, exprs: []any{ &litMatcher{ - pos: position{line: 1392, col: 5, offset: 33373}, + pos: position{line: 1387, col: 5, offset: 33262}, val: "[", ignoreCase: false, want: "\"[\"", }, &ruleRefExpr{ - pos: position{line: 1392, col: 9, offset: 33377}, + pos: position{line: 1387, col: 9, offset: 33266}, name: "__", }, &labeledExpr{ - pos: position{line: 1392, col: 12, offset: 33380}, + pos: position{line: 1387, col: 12, offset: 33269}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1392, col: 16, offset: 33384}, + pos: position{line: 1387, col: 16, offset: 33273}, name: "Type", }, }, &ruleRefExpr{ - pos: position{line: 1392, col: 21, offset: 33389}, + pos: position{line: 1387, col: 21, offset: 33278}, name: "__", }, &litMatcher{ - pos: position{line: 1392, col: 24, offset: 33392}, + pos: position{line: 1387, col: 24, offset: 33281}, val: "]", ignoreCase: false, want: "\"]\"", @@ -9476,35 +9439,35 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1399, col: 5, offset: 33534}, + pos: position{line: 1394, col: 5, offset: 33423}, run: (*parser).callonComplexType18, expr: &seqExpr{ - pos: position{line: 1399, col: 5, offset: 33534}, + pos: position{line: 1394, col: 5, offset: 33423}, exprs: []any{ &litMatcher{ - pos: position{line: 1399, col: 5, offset: 33534}, + pos: position{line: 1394, col: 5, offset: 33423}, val: "|[", ignoreCase: false, want: "\"|[\"", }, &ruleRefExpr{ - pos: position{line: 1399, col: 10, offset: 33539}, + pos: position{line: 1394, col: 10, offset: 33428}, name: "__", }, &labeledExpr{ - pos: position{line: 1399, col: 13, offset: 33542}, + pos: position{line: 1394, col: 13, offset: 33431}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1399, col: 17, offset: 33546}, + pos: position{line: 1394, col: 17, offset: 33435}, name: "Type", }, }, &ruleRefExpr{ - pos: position{line: 1399, col: 22, offset: 33551}, + pos: position{line: 1394, col: 22, offset: 33440}, name: "__", }, &litMatcher{ - pos: position{line: 1399, col: 25, offset: 33554}, + pos: position{line: 1394, col: 25, offset: 33443}, val: "]|", ignoreCase: false, want: "\"]|\"", @@ -9513,57 +9476,57 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1406, col: 5, offset: 33693}, + pos: position{line: 1401, col: 5, offset: 33582}, run: (*parser).callonComplexType26, expr: &seqExpr{ - pos: position{line: 1406, col: 5, offset: 33693}, + pos: position{line: 1401, col: 5, offset: 33582}, exprs: []any{ &litMatcher{ - pos: position{line: 1406, col: 5, offset: 33693}, + pos: position{line: 1401, col: 5, offset: 33582}, val: "|{", ignoreCase: false, want: "\"|{\"", }, &ruleRefExpr{ - pos: position{line: 1406, col: 10, offset: 33698}, + pos: position{line: 1401, col: 10, offset: 33587}, name: "__", }, &labeledExpr{ - pos: position{line: 1406, col: 13, offset: 33701}, + pos: position{line: 1401, col: 13, offset: 33590}, label: "keyType", expr: &ruleRefExpr{ - pos: position{line: 1406, col: 21, offset: 33709}, + pos: position{line: 1401, col: 21, offset: 33598}, name: "Type", }, }, &ruleRefExpr{ - pos: position{line: 1406, col: 26, offset: 33714}, + pos: position{line: 1401, col: 26, offset: 33603}, name: "__", }, &litMatcher{ - pos: position{line: 1406, col: 29, offset: 33717}, + pos: position{line: 1401, col: 29, offset: 33606}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1406, col: 33, offset: 33721}, + pos: position{line: 1401, col: 33, offset: 33610}, name: "__", }, &labeledExpr{ - pos: position{line: 1406, col: 36, offset: 33724}, + pos: position{line: 1401, col: 36, offset: 33613}, label: "valType", expr: &ruleRefExpr{ - pos: position{line: 1406, col: 44, offset: 33732}, + pos: position{line: 1401, col: 44, offset: 33621}, name: "Type", }, }, &ruleRefExpr{ - pos: position{line: 1406, col: 49, offset: 33737}, + pos: position{line: 1401, col: 49, offset: 33626}, name: "__", }, &litMatcher{ - pos: position{line: 1406, col: 52, offset: 33740}, + pos: position{line: 1401, col: 52, offset: 33629}, val: "}|", ignoreCase: false, want: "\"}|\"", @@ -9578,35 +9541,35 @@ var g = &grammar{ }, { name: "StringLiteral", - pos: position{line: 1415, col: 1, offset: 33914}, + pos: position{line: 1410, col: 1, offset: 33803}, expr: &choiceExpr{ - pos: position{line: 1416, col: 5, offset: 33932}, + pos: position{line: 1411, col: 5, offset: 33821}, alternatives: []any{ &actionExpr{ - pos: position{line: 1416, col: 5, offset: 33932}, + pos: position{line: 1411, col: 5, offset: 33821}, run: (*parser).callonStringLiteral2, expr: &seqExpr{ - pos: position{line: 1416, col: 5, offset: 33932}, + pos: position{line: 1411, col: 5, offset: 33821}, exprs: []any{ &litMatcher{ - pos: position{line: 1416, col: 5, offset: 33932}, + pos: position{line: 1411, col: 5, offset: 33821}, val: "\"", ignoreCase: false, want: "\"\\\"\"", }, &labeledExpr{ - pos: position{line: 1416, col: 9, offset: 33936}, + pos: position{line: 1411, col: 9, offset: 33825}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1416, col: 11, offset: 33938}, + pos: position{line: 1411, col: 11, offset: 33827}, expr: &ruleRefExpr{ - pos: position{line: 1416, col: 11, offset: 33938}, + pos: position{line: 1411, col: 11, offset: 33827}, name: "DoubleQuotedChar", }, }, }, &litMatcher{ - pos: position{line: 1416, col: 29, offset: 33956}, + pos: position{line: 1411, col: 29, offset: 33845}, val: "\"", ignoreCase: false, want: "\"\\\"\"", @@ -9615,30 +9578,30 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1417, col: 5, offset: 34020}, + pos: position{line: 1412, col: 5, offset: 33909}, run: (*parser).callonStringLiteral9, expr: &seqExpr{ - pos: position{line: 1417, col: 5, offset: 34020}, + pos: position{line: 1412, col: 5, offset: 33909}, exprs: []any{ &litMatcher{ - pos: position{line: 1417, col: 5, offset: 34020}, + pos: position{line: 1412, col: 5, offset: 33909}, val: "'", ignoreCase: false, want: "\"'\"", }, &labeledExpr{ - pos: position{line: 1417, col: 9, offset: 34024}, + pos: position{line: 1412, col: 9, offset: 33913}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1417, col: 11, offset: 34026}, + pos: position{line: 1412, col: 11, offset: 33915}, expr: &ruleRefExpr{ - pos: position{line: 1417, col: 11, offset: 34026}, + pos: position{line: 1412, col: 11, offset: 33915}, name: "SingleQuotedChar", }, }, }, &litMatcher{ - pos: position{line: 1417, col: 29, offset: 34044}, + pos: position{line: 1412, col: 29, offset: 33933}, val: "'", ignoreCase: false, want: "\"'\"", @@ -9653,35 +9616,35 @@ var g = &grammar{ }, { name: "FString", - pos: position{line: 1419, col: 1, offset: 34105}, + pos: position{line: 1414, col: 1, offset: 33994}, expr: &choiceExpr{ - pos: position{line: 1420, col: 5, offset: 34117}, + pos: position{line: 1415, col: 5, offset: 34006}, alternatives: []any{ &actionExpr{ - pos: position{line: 1420, col: 5, offset: 34117}, + pos: position{line: 1415, col: 5, offset: 34006}, run: (*parser).callonFString2, expr: &seqExpr{ - pos: position{line: 1420, col: 5, offset: 34117}, + pos: position{line: 1415, col: 5, offset: 34006}, exprs: []any{ &litMatcher{ - pos: position{line: 1420, col: 5, offset: 34117}, + pos: position{line: 1415, col: 5, offset: 34006}, val: "f\"", ignoreCase: false, want: "\"f\\\"\"", }, &labeledExpr{ - pos: position{line: 1420, col: 11, offset: 34123}, + pos: position{line: 1415, col: 11, offset: 34012}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1420, col: 13, offset: 34125}, + pos: position{line: 1415, col: 13, offset: 34014}, expr: &ruleRefExpr{ - pos: position{line: 1420, col: 13, offset: 34125}, + pos: position{line: 1415, col: 13, offset: 34014}, name: "FStringDoubleQuotedElem", }, }, }, &litMatcher{ - pos: position{line: 1420, col: 38, offset: 34150}, + pos: position{line: 1415, col: 38, offset: 34039}, val: "\"", ignoreCase: false, want: "\"\\\"\"", @@ -9690,30 +9653,30 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1427, col: 5, offset: 34296}, + pos: position{line: 1422, col: 5, offset: 34185}, run: (*parser).callonFString9, expr: &seqExpr{ - pos: position{line: 1427, col: 5, offset: 34296}, + pos: position{line: 1422, col: 5, offset: 34185}, exprs: []any{ &litMatcher{ - pos: position{line: 1427, col: 5, offset: 34296}, + pos: position{line: 1422, col: 5, offset: 34185}, val: "f'", ignoreCase: false, want: "\"f'\"", }, &labeledExpr{ - pos: position{line: 1427, col: 10, offset: 34301}, + pos: position{line: 1422, col: 10, offset: 34190}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1427, col: 12, offset: 34303}, + pos: position{line: 1422, col: 12, offset: 34192}, expr: &ruleRefExpr{ - pos: position{line: 1427, col: 12, offset: 34303}, + pos: position{line: 1422, col: 12, offset: 34192}, name: "FStringSingleQuotedElem", }, }, }, &litMatcher{ - pos: position{line: 1427, col: 37, offset: 34328}, + pos: position{line: 1422, col: 37, offset: 34217}, val: "'", ignoreCase: false, want: "\"'\"", @@ -9728,24 +9691,24 @@ var g = &grammar{ }, { name: "FStringDoubleQuotedElem", - pos: position{line: 1435, col: 1, offset: 34471}, + pos: position{line: 1430, col: 1, offset: 34360}, expr: &choiceExpr{ - pos: position{line: 1436, col: 5, offset: 34499}, + pos: position{line: 1431, col: 5, offset: 34388}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1436, col: 5, offset: 34499}, + pos: position{line: 1431, col: 5, offset: 34388}, name: "FStringExpr", }, &actionExpr{ - pos: position{line: 1437, col: 5, offset: 34515}, + pos: position{line: 1432, col: 5, offset: 34404}, run: (*parser).callonFStringDoubleQuotedElem3, expr: &labeledExpr{ - pos: position{line: 1437, col: 5, offset: 34515}, + pos: position{line: 1432, col: 5, offset: 34404}, label: "v", expr: &oneOrMoreExpr{ - pos: position{line: 1437, col: 7, offset: 34517}, + pos: position{line: 1432, col: 7, offset: 34406}, expr: &ruleRefExpr{ - pos: position{line: 1437, col: 7, offset: 34517}, + pos: position{line: 1432, col: 7, offset: 34406}, name: "FStringDoubleQuotedChar", }, }, @@ -9758,27 +9721,27 @@ var g = &grammar{ }, { name: "FStringDoubleQuotedChar", - pos: position{line: 1441, col: 1, offset: 34640}, + pos: position{line: 1436, col: 1, offset: 34529}, expr: &choiceExpr{ - pos: position{line: 1442, col: 5, offset: 34668}, + pos: position{line: 1437, col: 5, offset: 34557}, alternatives: []any{ &actionExpr{ - pos: position{line: 1442, col: 5, offset: 34668}, + pos: position{line: 1437, col: 5, offset: 34557}, run: (*parser).callonFStringDoubleQuotedChar2, expr: &seqExpr{ - pos: position{line: 1442, col: 5, offset: 34668}, + pos: position{line: 1437, col: 5, offset: 34557}, exprs: []any{ &litMatcher{ - pos: position{line: 1442, col: 5, offset: 34668}, + pos: position{line: 1437, col: 5, offset: 34557}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1442, col: 10, offset: 34673}, + pos: position{line: 1437, col: 10, offset: 34562}, label: "v", expr: &litMatcher{ - pos: position{line: 1442, col: 12, offset: 34675}, + pos: position{line: 1437, col: 12, offset: 34564}, val: "{", ignoreCase: false, want: "\"{\"", @@ -9788,25 +9751,25 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1443, col: 5, offset: 34701}, + pos: position{line: 1438, col: 5, offset: 34590}, run: (*parser).callonFStringDoubleQuotedChar7, expr: &seqExpr{ - pos: position{line: 1443, col: 5, offset: 34701}, + pos: position{line: 1438, col: 5, offset: 34590}, exprs: []any{ ¬Expr{ - pos: position{line: 1443, col: 5, offset: 34701}, + pos: position{line: 1438, col: 5, offset: 34590}, expr: &litMatcher{ - pos: position{line: 1443, col: 7, offset: 34703}, + pos: position{line: 1438, col: 7, offset: 34592}, val: "{", ignoreCase: false, want: "\"{\"", }, }, &labeledExpr{ - pos: position{line: 1443, col: 12, offset: 34708}, + pos: position{line: 1438, col: 12, offset: 34597}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1443, col: 14, offset: 34710}, + pos: position{line: 1438, col: 14, offset: 34599}, name: "DoubleQuotedChar", }, }, @@ -9820,24 +9783,24 @@ var g = &grammar{ }, { name: "FStringSingleQuotedElem", - pos: position{line: 1445, col: 1, offset: 34746}, + pos: position{line: 1440, col: 1, offset: 34635}, expr: &choiceExpr{ - pos: position{line: 1446, col: 5, offset: 34774}, + pos: position{line: 1441, col: 5, offset: 34663}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1446, col: 5, offset: 34774}, + pos: position{line: 1441, col: 5, offset: 34663}, name: "FStringExpr", }, &actionExpr{ - pos: position{line: 1447, col: 5, offset: 34790}, + pos: position{line: 1442, col: 5, offset: 34679}, run: (*parser).callonFStringSingleQuotedElem3, expr: &labeledExpr{ - pos: position{line: 1447, col: 5, offset: 34790}, + pos: position{line: 1442, col: 5, offset: 34679}, label: "v", expr: &oneOrMoreExpr{ - pos: position{line: 1447, col: 7, offset: 34792}, + pos: position{line: 1442, col: 7, offset: 34681}, expr: &ruleRefExpr{ - pos: position{line: 1447, col: 7, offset: 34792}, + pos: position{line: 1442, col: 7, offset: 34681}, name: "FStringSingleQuotedChar", }, }, @@ -9850,27 +9813,27 @@ var g = &grammar{ }, { name: "FStringSingleQuotedChar", - pos: position{line: 1451, col: 1, offset: 34915}, + pos: position{line: 1446, col: 1, offset: 34804}, expr: &choiceExpr{ - pos: position{line: 1452, col: 5, offset: 34943}, + pos: position{line: 1447, col: 5, offset: 34832}, alternatives: []any{ &actionExpr{ - pos: position{line: 1452, col: 5, offset: 34943}, + pos: position{line: 1447, col: 5, offset: 34832}, run: (*parser).callonFStringSingleQuotedChar2, expr: &seqExpr{ - pos: position{line: 1452, col: 5, offset: 34943}, + pos: position{line: 1447, col: 5, offset: 34832}, exprs: []any{ &litMatcher{ - pos: position{line: 1452, col: 5, offset: 34943}, + pos: position{line: 1447, col: 5, offset: 34832}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1452, col: 10, offset: 34948}, + pos: position{line: 1447, col: 10, offset: 34837}, label: "v", expr: &litMatcher{ - pos: position{line: 1452, col: 12, offset: 34950}, + pos: position{line: 1447, col: 12, offset: 34839}, val: "{", ignoreCase: false, want: "\"{\"", @@ -9880,25 +9843,25 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1453, col: 5, offset: 34976}, + pos: position{line: 1448, col: 5, offset: 34865}, run: (*parser).callonFStringSingleQuotedChar7, expr: &seqExpr{ - pos: position{line: 1453, col: 5, offset: 34976}, + pos: position{line: 1448, col: 5, offset: 34865}, exprs: []any{ ¬Expr{ - pos: position{line: 1453, col: 5, offset: 34976}, + pos: position{line: 1448, col: 5, offset: 34865}, expr: &litMatcher{ - pos: position{line: 1453, col: 7, offset: 34978}, + pos: position{line: 1448, col: 7, offset: 34867}, val: "{", ignoreCase: false, want: "\"{\"", }, }, &labeledExpr{ - pos: position{line: 1453, col: 12, offset: 34983}, + pos: position{line: 1448, col: 12, offset: 34872}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1453, col: 14, offset: 34985}, + pos: position{line: 1448, col: 14, offset: 34874}, name: "SingleQuotedChar", }, }, @@ -9912,37 +9875,37 @@ var g = &grammar{ }, { name: "FStringExpr", - pos: position{line: 1455, col: 1, offset: 35021}, + pos: position{line: 1450, col: 1, offset: 34910}, expr: &actionExpr{ - pos: position{line: 1456, col: 5, offset: 35037}, + pos: position{line: 1451, col: 5, offset: 34926}, run: (*parser).callonFStringExpr1, expr: &seqExpr{ - pos: position{line: 1456, col: 5, offset: 35037}, + pos: position{line: 1451, col: 5, offset: 34926}, exprs: []any{ &litMatcher{ - pos: position{line: 1456, col: 5, offset: 35037}, + pos: position{line: 1451, col: 5, offset: 34926}, val: "{", ignoreCase: false, want: "\"{\"", }, &ruleRefExpr{ - pos: position{line: 1456, col: 9, offset: 35041}, + pos: position{line: 1451, col: 9, offset: 34930}, name: "__", }, &labeledExpr{ - pos: position{line: 1456, col: 12, offset: 35044}, + pos: position{line: 1451, col: 12, offset: 34933}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1456, col: 14, offset: 35046}, + pos: position{line: 1451, col: 14, offset: 34935}, name: "Expr", }, }, &ruleRefExpr{ - pos: position{line: 1456, col: 19, offset: 35051}, + pos: position{line: 1451, col: 19, offset: 34940}, name: "__", }, &litMatcher{ - pos: position{line: 1456, col: 22, offset: 35054}, + pos: position{line: 1451, col: 22, offset: 34943}, val: "}", ignoreCase: false, want: "\"}\"", @@ -9955,129 +9918,129 @@ var g = &grammar{ }, { name: "PrimitiveType", - pos: position{line: 1464, col: 1, offset: 35189}, + pos: position{line: 1459, col: 1, offset: 35078}, expr: &actionExpr{ - pos: position{line: 1465, col: 5, offset: 35207}, + pos: position{line: 1460, col: 5, offset: 35096}, run: (*parser).callonPrimitiveType1, expr: &choiceExpr{ - pos: position{line: 1465, col: 9, offset: 35211}, + pos: position{line: 1460, col: 9, offset: 35100}, alternatives: []any{ &litMatcher{ - pos: position{line: 1465, col: 9, offset: 35211}, + pos: position{line: 1460, col: 9, offset: 35100}, val: "uint8", ignoreCase: false, want: "\"uint8\"", }, &litMatcher{ - pos: position{line: 1465, col: 19, offset: 35221}, + pos: position{line: 1460, col: 19, offset: 35110}, val: "uint16", ignoreCase: false, want: "\"uint16\"", }, &litMatcher{ - pos: position{line: 1465, col: 30, offset: 35232}, + pos: position{line: 1460, col: 30, offset: 35121}, val: "uint32", ignoreCase: false, want: "\"uint32\"", }, &litMatcher{ - pos: position{line: 1465, col: 41, offset: 35243}, + pos: position{line: 1460, col: 41, offset: 35132}, val: "uint64", ignoreCase: false, want: "\"uint64\"", }, &litMatcher{ - pos: position{line: 1466, col: 9, offset: 35260}, + pos: position{line: 1461, col: 9, offset: 35149}, val: "int8", ignoreCase: false, want: "\"int8\"", }, &litMatcher{ - pos: position{line: 1466, col: 18, offset: 35269}, + pos: position{line: 1461, col: 18, offset: 35158}, val: "int16", ignoreCase: false, want: "\"int16\"", }, &litMatcher{ - pos: position{line: 1466, col: 28, offset: 35279}, + pos: position{line: 1461, col: 28, offset: 35168}, val: "int32", ignoreCase: false, want: "\"int32\"", }, &litMatcher{ - pos: position{line: 1466, col: 38, offset: 35289}, + pos: position{line: 1461, col: 38, offset: 35178}, val: "int64", ignoreCase: false, want: "\"int64\"", }, &litMatcher{ - pos: position{line: 1467, col: 9, offset: 35305}, + pos: position{line: 1462, col: 9, offset: 35194}, val: "float16", ignoreCase: false, want: "\"float16\"", }, &litMatcher{ - pos: position{line: 1467, col: 21, offset: 35317}, + pos: position{line: 1462, col: 21, offset: 35206}, val: "float32", ignoreCase: false, want: "\"float32\"", }, &litMatcher{ - pos: position{line: 1467, col: 33, offset: 35329}, + pos: position{line: 1462, col: 33, offset: 35218}, val: "float64", ignoreCase: false, want: "\"float64\"", }, &litMatcher{ - pos: position{line: 1468, col: 9, offset: 35347}, + pos: position{line: 1463, col: 9, offset: 35236}, val: "bool", ignoreCase: false, want: "\"bool\"", }, &litMatcher{ - pos: position{line: 1468, col: 18, offset: 35356}, + pos: position{line: 1463, col: 18, offset: 35245}, val: "string", ignoreCase: false, want: "\"string\"", }, &litMatcher{ - pos: position{line: 1469, col: 9, offset: 35373}, + pos: position{line: 1464, col: 9, offset: 35262}, val: "duration", ignoreCase: false, want: "\"duration\"", }, &litMatcher{ - pos: position{line: 1469, col: 22, offset: 35386}, + pos: position{line: 1464, col: 22, offset: 35275}, val: "time", ignoreCase: false, want: "\"time\"", }, &litMatcher{ - pos: position{line: 1470, col: 9, offset: 35401}, + pos: position{line: 1465, col: 9, offset: 35290}, val: "bytes", ignoreCase: false, want: "\"bytes\"", }, &litMatcher{ - pos: position{line: 1471, col: 9, offset: 35417}, + pos: position{line: 1466, col: 9, offset: 35306}, val: "ip", ignoreCase: false, want: "\"ip\"", }, &litMatcher{ - pos: position{line: 1471, col: 16, offset: 35424}, + pos: position{line: 1466, col: 16, offset: 35313}, val: "net", ignoreCase: false, want: "\"net\"", }, &litMatcher{ - pos: position{line: 1472, col: 9, offset: 35438}, + pos: position{line: 1467, col: 9, offset: 35327}, val: "type", ignoreCase: false, want: "\"type\"", }, &litMatcher{ - pos: position{line: 1472, col: 18, offset: 35447}, + pos: position{line: 1467, col: 18, offset: 35336}, val: "null", ignoreCase: false, want: "\"null\"", @@ -10090,31 +10053,31 @@ var g = &grammar{ }, { name: "TypeFieldList", - pos: position{line: 1480, col: 1, offset: 35632}, + pos: position{line: 1475, col: 1, offset: 35521}, expr: &choiceExpr{ - pos: position{line: 1481, col: 5, offset: 35650}, + pos: position{line: 1476, col: 5, offset: 35539}, alternatives: []any{ &actionExpr{ - pos: position{line: 1481, col: 5, offset: 35650}, + pos: position{line: 1476, col: 5, offset: 35539}, run: (*parser).callonTypeFieldList2, expr: &seqExpr{ - pos: position{line: 1481, col: 5, offset: 35650}, + pos: position{line: 1476, col: 5, offset: 35539}, exprs: []any{ &labeledExpr{ - pos: position{line: 1481, col: 5, offset: 35650}, + pos: position{line: 1476, col: 5, offset: 35539}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1481, col: 11, offset: 35656}, + pos: position{line: 1476, col: 11, offset: 35545}, name: "TypeField", }, }, &labeledExpr{ - pos: position{line: 1481, col: 21, offset: 35666}, + pos: position{line: 1476, col: 21, offset: 35555}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1481, col: 26, offset: 35671}, + pos: position{line: 1476, col: 26, offset: 35560}, expr: &ruleRefExpr{ - pos: position{line: 1481, col: 26, offset: 35671}, + pos: position{line: 1476, col: 26, offset: 35560}, name: "TypeFieldListTail", }, }, @@ -10123,10 +10086,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1484, col: 5, offset: 35737}, + pos: position{line: 1479, col: 5, offset: 35626}, run: (*parser).callonTypeFieldList9, expr: &litMatcher{ - pos: position{line: 1484, col: 5, offset: 35737}, + pos: position{line: 1479, col: 5, offset: 35626}, val: "", ignoreCase: false, want: "\"\"", @@ -10139,32 +10102,32 @@ var g = &grammar{ }, { name: "TypeFieldListTail", - pos: position{line: 1486, col: 1, offset: 35761}, + pos: position{line: 1481, col: 1, offset: 35650}, expr: &actionExpr{ - pos: position{line: 1486, col: 21, offset: 35781}, + pos: position{line: 1481, col: 21, offset: 35670}, run: (*parser).callonTypeFieldListTail1, expr: &seqExpr{ - pos: position{line: 1486, col: 21, offset: 35781}, + pos: position{line: 1481, col: 21, offset: 35670}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1486, col: 21, offset: 35781}, + pos: position{line: 1481, col: 21, offset: 35670}, name: "__", }, &litMatcher{ - pos: position{line: 1486, col: 24, offset: 35784}, + pos: position{line: 1481, col: 24, offset: 35673}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1486, col: 28, offset: 35788}, + pos: position{line: 1481, col: 28, offset: 35677}, name: "__", }, &labeledExpr{ - pos: position{line: 1486, col: 31, offset: 35791}, + pos: position{line: 1481, col: 31, offset: 35680}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1486, col: 35, offset: 35795}, + pos: position{line: 1481, col: 35, offset: 35684}, name: "TypeField", }, }, @@ -10176,40 +10139,40 @@ var g = &grammar{ }, { name: "TypeField", - pos: position{line: 1488, col: 1, offset: 35826}, + pos: position{line: 1483, col: 1, offset: 35715}, expr: &actionExpr{ - pos: position{line: 1489, col: 5, offset: 35840}, + pos: position{line: 1484, col: 5, offset: 35729}, run: (*parser).callonTypeField1, expr: &seqExpr{ - pos: position{line: 1489, col: 5, offset: 35840}, + pos: position{line: 1484, col: 5, offset: 35729}, exprs: []any{ &labeledExpr{ - pos: position{line: 1489, col: 5, offset: 35840}, + pos: position{line: 1484, col: 5, offset: 35729}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1489, col: 10, offset: 35845}, + pos: position{line: 1484, col: 10, offset: 35734}, name: "Name", }, }, &ruleRefExpr{ - pos: position{line: 1489, col: 15, offset: 35850}, + pos: position{line: 1484, col: 15, offset: 35739}, name: "__", }, &litMatcher{ - pos: position{line: 1489, col: 18, offset: 35853}, + pos: position{line: 1484, col: 18, offset: 35742}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1489, col: 22, offset: 35857}, + pos: position{line: 1484, col: 22, offset: 35746}, name: "__", }, &labeledExpr{ - pos: position{line: 1489, col: 25, offset: 35860}, + pos: position{line: 1484, col: 25, offset: 35749}, label: "typ", expr: &ruleRefExpr{ - pos: position{line: 1489, col: 29, offset: 35864}, + pos: position{line: 1484, col: 29, offset: 35753}, name: "Type", }, }, @@ -10221,54 +10184,54 @@ var g = &grammar{ }, { name: "Name", - pos: position{line: 1497, col: 1, offset: 36013}, + pos: position{line: 1492, col: 1, offset: 35902}, expr: &choiceExpr{ - pos: position{line: 1498, col: 5, offset: 36022}, + pos: position{line: 1493, col: 5, offset: 35911}, alternatives: []any{ &actionExpr{ - pos: position{line: 1498, col: 5, offset: 36022}, + pos: position{line: 1493, col: 5, offset: 35911}, run: (*parser).callonName2, expr: &labeledExpr{ - pos: position{line: 1498, col: 5, offset: 36022}, + pos: position{line: 1493, col: 5, offset: 35911}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1498, col: 7, offset: 36024}, + pos: position{line: 1493, col: 7, offset: 35913}, name: "DottedIDs", }, }, }, &actionExpr{ - pos: position{line: 1499, col: 5, offset: 36113}, + pos: position{line: 1494, col: 5, offset: 36002}, run: (*parser).callonName5, expr: &labeledExpr{ - pos: position{line: 1499, col: 5, offset: 36113}, + pos: position{line: 1494, col: 5, offset: 36002}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1499, col: 7, offset: 36115}, + pos: position{line: 1494, col: 7, offset: 36004}, name: "IdentifierName", }, }, }, &actionExpr{ - pos: position{line: 1500, col: 5, offset: 36204}, + pos: position{line: 1495, col: 5, offset: 36093}, run: (*parser).callonName8, expr: &labeledExpr{ - pos: position{line: 1500, col: 5, offset: 36204}, + pos: position{line: 1495, col: 5, offset: 36093}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1500, col: 7, offset: 36206}, + pos: position{line: 1495, col: 7, offset: 36095}, name: "QuotedString", }, }, }, &actionExpr{ - pos: position{line: 1501, col: 5, offset: 36295}, + pos: position{line: 1496, col: 5, offset: 36184}, run: (*parser).callonName11, expr: &labeledExpr{ - pos: position{line: 1501, col: 5, offset: 36295}, + pos: position{line: 1496, col: 5, offset: 36184}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1501, col: 7, offset: 36297}, + pos: position{line: 1496, col: 7, offset: 36186}, name: "KSUID", }, }, @@ -10280,22 +10243,22 @@ var g = &grammar{ }, { name: "DottedIDs", - pos: position{line: 1503, col: 1, offset: 36383}, + pos: position{line: 1498, col: 1, offset: 36272}, expr: &actionExpr{ - pos: position{line: 1504, col: 5, offset: 36397}, + pos: position{line: 1499, col: 5, offset: 36286}, run: (*parser).callonDottedIDs1, expr: &seqExpr{ - pos: position{line: 1504, col: 5, offset: 36397}, + pos: position{line: 1499, col: 5, offset: 36286}, exprs: []any{ &choiceExpr{ - pos: position{line: 1504, col: 6, offset: 36398}, + pos: position{line: 1499, col: 6, offset: 36287}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1504, col: 6, offset: 36398}, + pos: position{line: 1499, col: 6, offset: 36287}, name: "IdentifierStart", }, &litMatcher{ - pos: position{line: 1504, col: 24, offset: 36416}, + pos: position{line: 1499, col: 24, offset: 36305}, val: ".", ignoreCase: false, want: "\".\"", @@ -10303,16 +10266,16 @@ var g = &grammar{ }, }, &zeroOrMoreExpr{ - pos: position{line: 1504, col: 29, offset: 36421}, + pos: position{line: 1499, col: 29, offset: 36310}, expr: &choiceExpr{ - pos: position{line: 1504, col: 30, offset: 36422}, + pos: position{line: 1499, col: 30, offset: 36311}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1504, col: 30, offset: 36422}, + pos: position{line: 1499, col: 30, offset: 36311}, name: "IdentifierRest", }, &litMatcher{ - pos: position{line: 1504, col: 47, offset: 36439}, + pos: position{line: 1499, col: 47, offset: 36328}, val: ".", ignoreCase: false, want: "\".\"", @@ -10328,15 +10291,15 @@ var g = &grammar{ }, { name: "Identifier", - pos: position{line: 1506, col: 1, offset: 36477}, + pos: position{line: 1501, col: 1, offset: 36366}, expr: &actionExpr{ - pos: position{line: 1507, col: 5, offset: 36492}, + pos: position{line: 1502, col: 5, offset: 36381}, run: (*parser).callonIdentifier1, expr: &labeledExpr{ - pos: position{line: 1507, col: 5, offset: 36492}, + pos: position{line: 1502, col: 5, offset: 36381}, label: "id", expr: &ruleRefExpr{ - pos: position{line: 1507, col: 8, offset: 36495}, + pos: position{line: 1502, col: 8, offset: 36384}, name: "IdentifierName", }, }, @@ -10346,51 +10309,51 @@ var g = &grammar{ }, { name: "Identifiers", - pos: position{line: 1515, col: 1, offset: 36628}, + pos: position{line: 1510, col: 1, offset: 36517}, expr: &actionExpr{ - pos: position{line: 1516, col: 5, offset: 36644}, + pos: position{line: 1511, col: 5, offset: 36533}, run: (*parser).callonIdentifiers1, expr: &seqExpr{ - pos: position{line: 1516, col: 5, offset: 36644}, + pos: position{line: 1511, col: 5, offset: 36533}, exprs: []any{ &labeledExpr{ - pos: position{line: 1516, col: 5, offset: 36644}, + pos: position{line: 1511, col: 5, offset: 36533}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1516, col: 11, offset: 36650}, + pos: position{line: 1511, col: 11, offset: 36539}, name: "Identifier", }, }, &labeledExpr{ - pos: position{line: 1516, col: 22, offset: 36661}, + pos: position{line: 1511, col: 22, offset: 36550}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1516, col: 27, offset: 36666}, + pos: position{line: 1511, col: 27, offset: 36555}, expr: &actionExpr{ - pos: position{line: 1516, col: 28, offset: 36667}, + pos: position{line: 1511, col: 28, offset: 36556}, run: (*parser).callonIdentifiers7, expr: &seqExpr{ - pos: position{line: 1516, col: 28, offset: 36667}, + pos: position{line: 1511, col: 28, offset: 36556}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1516, col: 28, offset: 36667}, + pos: position{line: 1511, col: 28, offset: 36556}, name: "__", }, &litMatcher{ - pos: position{line: 1516, col: 31, offset: 36670}, + pos: position{line: 1511, col: 31, offset: 36559}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1516, col: 35, offset: 36674}, + pos: position{line: 1511, col: 35, offset: 36563}, name: "__", }, &labeledExpr{ - pos: position{line: 1516, col: 38, offset: 36677}, + pos: position{line: 1511, col: 38, offset: 36566}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1516, col: 43, offset: 36682}, + pos: position{line: 1511, col: 43, offset: 36571}, name: "Identifier", }, }, @@ -10407,29 +10370,29 @@ var g = &grammar{ }, { name: "IdentifierName", - pos: position{line: 1520, col: 1, offset: 36760}, + pos: position{line: 1515, col: 1, offset: 36649}, expr: &choiceExpr{ - pos: position{line: 1521, col: 5, offset: 36779}, + pos: position{line: 1516, col: 5, offset: 36668}, alternatives: []any{ &actionExpr{ - pos: position{line: 1521, col: 5, offset: 36779}, + pos: position{line: 1516, col: 5, offset: 36668}, run: (*parser).callonIdentifierName2, expr: &seqExpr{ - pos: position{line: 1521, col: 5, offset: 36779}, + pos: position{line: 1516, col: 5, offset: 36668}, exprs: []any{ ¬Expr{ - pos: position{line: 1521, col: 5, offset: 36779}, + pos: position{line: 1516, col: 5, offset: 36668}, expr: &seqExpr{ - pos: position{line: 1521, col: 7, offset: 36781}, + pos: position{line: 1516, col: 7, offset: 36670}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1521, col: 7, offset: 36781}, + pos: position{line: 1516, col: 7, offset: 36670}, name: "IDGuard", }, ¬Expr{ - pos: position{line: 1521, col: 15, offset: 36789}, + pos: position{line: 1516, col: 15, offset: 36678}, expr: &ruleRefExpr{ - pos: position{line: 1521, col: 16, offset: 36790}, + pos: position{line: 1516, col: 16, offset: 36679}, name: "IdentifierRest", }, }, @@ -10437,13 +10400,13 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1521, col: 32, offset: 36806}, + pos: position{line: 1516, col: 32, offset: 36695}, name: "IdentifierStart", }, &zeroOrMoreExpr{ - pos: position{line: 1521, col: 48, offset: 36822}, + pos: position{line: 1516, col: 48, offset: 36711}, expr: &ruleRefExpr{ - pos: position{line: 1521, col: 48, offset: 36822}, + pos: position{line: 1516, col: 48, offset: 36711}, name: "IdentifierRest", }, }, @@ -10451,32 +10414,32 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1522, col: 5, offset: 36873}, + pos: position{line: 1517, col: 5, offset: 36762}, run: (*parser).callonIdentifierName12, expr: &litMatcher{ - pos: position{line: 1522, col: 5, offset: 36873}, + pos: position{line: 1517, col: 5, offset: 36762}, val: "$", ignoreCase: false, want: "\"$\"", }, }, &actionExpr{ - pos: position{line: 1523, col: 5, offset: 36912}, + pos: position{line: 1518, col: 5, offset: 36801}, run: (*parser).callonIdentifierName14, expr: &seqExpr{ - pos: position{line: 1523, col: 5, offset: 36912}, + pos: position{line: 1518, col: 5, offset: 36801}, exprs: []any{ &litMatcher{ - pos: position{line: 1523, col: 5, offset: 36912}, + pos: position{line: 1518, col: 5, offset: 36801}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1523, col: 10, offset: 36917}, + pos: position{line: 1518, col: 10, offset: 36806}, label: "id", expr: &ruleRefExpr{ - pos: position{line: 1523, col: 13, offset: 36920}, + pos: position{line: 1518, col: 13, offset: 36809}, name: "IDGuard", }, }, @@ -10484,17 +10447,17 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1525, col: 5, offset: 37011}, + pos: position{line: 1520, col: 5, offset: 36900}, run: (*parser).callonIdentifierName19, expr: &litMatcher{ - pos: position{line: 1525, col: 5, offset: 37011}, + pos: position{line: 1520, col: 5, offset: 36900}, val: "type", ignoreCase: false, want: "\"type\"", }, }, &ruleRefExpr{ - pos: position{line: 1526, col: 5, offset: 37053}, + pos: position{line: 1521, col: 5, offset: 36942}, name: "BacktickString", }, }, @@ -10504,22 +10467,22 @@ var g = &grammar{ }, { name: "IdentifierStart", - pos: position{line: 1528, col: 1, offset: 37070}, + pos: position{line: 1523, col: 1, offset: 36959}, expr: &choiceExpr{ - pos: position{line: 1529, col: 5, offset: 37090}, + pos: position{line: 1524, col: 5, offset: 36979}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1529, col: 5, offset: 37090}, + pos: position{line: 1524, col: 5, offset: 36979}, name: "UnicodeLetter", }, &litMatcher{ - pos: position{line: 1530, col: 5, offset: 37108}, + pos: position{line: 1525, col: 5, offset: 36997}, val: "$", ignoreCase: false, want: "\"$\"", }, &litMatcher{ - pos: position{line: 1531, col: 5, offset: 37116}, + pos: position{line: 1526, col: 5, offset: 37005}, val: "_", ignoreCase: false, want: "\"_\"", @@ -10531,24 +10494,24 @@ var g = &grammar{ }, { name: "IdentifierRest", - pos: position{line: 1533, col: 1, offset: 37121}, + pos: position{line: 1528, col: 1, offset: 37010}, expr: &choiceExpr{ - pos: position{line: 1534, col: 5, offset: 37140}, + pos: position{line: 1529, col: 5, offset: 37029}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1534, col: 5, offset: 37140}, + pos: position{line: 1529, col: 5, offset: 37029}, name: "IdentifierStart", }, &ruleRefExpr{ - pos: position{line: 1535, col: 5, offset: 37160}, + pos: position{line: 1530, col: 5, offset: 37049}, name: "UnicodeCombiningMark", }, &ruleRefExpr{ - pos: position{line: 1536, col: 5, offset: 37185}, + pos: position{line: 1531, col: 5, offset: 37074}, name: "UnicodeDigit", }, &ruleRefExpr{ - pos: position{line: 1537, col: 5, offset: 37202}, + pos: position{line: 1532, col: 5, offset: 37091}, name: "UnicodeConnectorPunctuation", }, }, @@ -10558,24 +10521,24 @@ var g = &grammar{ }, { name: "IDGuard", - pos: position{line: 1539, col: 1, offset: 37231}, + pos: position{line: 1534, col: 1, offset: 37120}, expr: &choiceExpr{ - pos: position{line: 1540, col: 5, offset: 37243}, + pos: position{line: 1535, col: 5, offset: 37132}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1540, col: 5, offset: 37243}, + pos: position{line: 1535, col: 5, offset: 37132}, name: "BooleanLiteral", }, &ruleRefExpr{ - pos: position{line: 1541, col: 5, offset: 37262}, + pos: position{line: 1536, col: 5, offset: 37151}, name: "NullLiteral", }, &ruleRefExpr{ - pos: position{line: 1542, col: 5, offset: 37278}, + pos: position{line: 1537, col: 5, offset: 37167}, name: "NaN", }, &ruleRefExpr{ - pos: position{line: 1543, col: 5, offset: 37286}, + pos: position{line: 1538, col: 5, offset: 37175}, name: "Infinity", }, }, @@ -10585,25 +10548,25 @@ var g = &grammar{ }, { name: "Time", - pos: position{line: 1545, col: 1, offset: 37296}, + pos: position{line: 1540, col: 1, offset: 37185}, expr: &actionExpr{ - pos: position{line: 1546, col: 5, offset: 37305}, + pos: position{line: 1541, col: 5, offset: 37194}, run: (*parser).callonTime1, expr: &seqExpr{ - pos: position{line: 1546, col: 5, offset: 37305}, + pos: position{line: 1541, col: 5, offset: 37194}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1546, col: 5, offset: 37305}, + pos: position{line: 1541, col: 5, offset: 37194}, name: "FullDate", }, &litMatcher{ - pos: position{line: 1546, col: 14, offset: 37314}, + pos: position{line: 1541, col: 14, offset: 37203}, val: "T", ignoreCase: false, want: "\"T\"", }, &ruleRefExpr{ - pos: position{line: 1546, col: 18, offset: 37318}, + pos: position{line: 1541, col: 18, offset: 37207}, name: "FullTime", }, }, @@ -10614,32 +10577,32 @@ var g = &grammar{ }, { name: "FullDate", - pos: position{line: 1550, col: 1, offset: 37394}, + pos: position{line: 1545, col: 1, offset: 37283}, expr: &seqExpr{ - pos: position{line: 1550, col: 12, offset: 37405}, + pos: position{line: 1545, col: 12, offset: 37294}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1550, col: 12, offset: 37405}, + pos: position{line: 1545, col: 12, offset: 37294}, name: "D4", }, &litMatcher{ - pos: position{line: 1550, col: 15, offset: 37408}, + pos: position{line: 1545, col: 15, offset: 37297}, val: "-", ignoreCase: false, want: "\"-\"", }, &ruleRefExpr{ - pos: position{line: 1550, col: 19, offset: 37412}, + pos: position{line: 1545, col: 19, offset: 37301}, name: "D2", }, &litMatcher{ - pos: position{line: 1550, col: 22, offset: 37415}, + pos: position{line: 1545, col: 22, offset: 37304}, val: "-", ignoreCase: false, want: "\"-\"", }, &ruleRefExpr{ - pos: position{line: 1550, col: 26, offset: 37419}, + pos: position{line: 1545, col: 26, offset: 37308}, name: "D2", }, }, @@ -10649,33 +10612,33 @@ var g = &grammar{ }, { name: "D4", - pos: position{line: 1552, col: 1, offset: 37423}, + pos: position{line: 1547, col: 1, offset: 37312}, expr: &seqExpr{ - pos: position{line: 1552, col: 6, offset: 37428}, + pos: position{line: 1547, col: 6, offset: 37317}, exprs: []any{ &charClassMatcher{ - pos: position{line: 1552, col: 6, offset: 37428}, + pos: position{line: 1547, col: 6, offset: 37317}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, inverted: false, }, &charClassMatcher{ - pos: position{line: 1552, col: 11, offset: 37433}, + pos: position{line: 1547, col: 11, offset: 37322}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, inverted: false, }, &charClassMatcher{ - pos: position{line: 1552, col: 16, offset: 37438}, + pos: position{line: 1547, col: 16, offset: 37327}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, inverted: false, }, &charClassMatcher{ - pos: position{line: 1552, col: 21, offset: 37443}, + pos: position{line: 1547, col: 21, offset: 37332}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -10688,19 +10651,19 @@ var g = &grammar{ }, { name: "D2", - pos: position{line: 1553, col: 1, offset: 37449}, + pos: position{line: 1548, col: 1, offset: 37338}, expr: &seqExpr{ - pos: position{line: 1553, col: 6, offset: 37454}, + pos: position{line: 1548, col: 6, offset: 37343}, exprs: []any{ &charClassMatcher{ - pos: position{line: 1553, col: 6, offset: 37454}, + pos: position{line: 1548, col: 6, offset: 37343}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, inverted: false, }, &charClassMatcher{ - pos: position{line: 1553, col: 11, offset: 37459}, + pos: position{line: 1548, col: 11, offset: 37348}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -10713,16 +10676,16 @@ var g = &grammar{ }, { name: "FullTime", - pos: position{line: 1555, col: 1, offset: 37466}, + pos: position{line: 1550, col: 1, offset: 37355}, expr: &seqExpr{ - pos: position{line: 1555, col: 12, offset: 37477}, + pos: position{line: 1550, col: 12, offset: 37366}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1555, col: 12, offset: 37477}, + pos: position{line: 1550, col: 12, offset: 37366}, name: "PartialTime", }, &ruleRefExpr{ - pos: position{line: 1555, col: 24, offset: 37489}, + pos: position{line: 1550, col: 24, offset: 37378}, name: "TimeOffset", }, }, @@ -10732,49 +10695,49 @@ var g = &grammar{ }, { name: "PartialTime", - pos: position{line: 1557, col: 1, offset: 37501}, + pos: position{line: 1552, col: 1, offset: 37390}, expr: &seqExpr{ - pos: position{line: 1557, col: 15, offset: 37515}, + pos: position{line: 1552, col: 15, offset: 37404}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1557, col: 15, offset: 37515}, + pos: position{line: 1552, col: 15, offset: 37404}, name: "D2", }, &litMatcher{ - pos: position{line: 1557, col: 18, offset: 37518}, + pos: position{line: 1552, col: 18, offset: 37407}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1557, col: 22, offset: 37522}, + pos: position{line: 1552, col: 22, offset: 37411}, name: "D2", }, &litMatcher{ - pos: position{line: 1557, col: 25, offset: 37525}, + pos: position{line: 1552, col: 25, offset: 37414}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1557, col: 29, offset: 37529}, + pos: position{line: 1552, col: 29, offset: 37418}, name: "D2", }, &zeroOrOneExpr{ - pos: position{line: 1557, col: 32, offset: 37532}, + pos: position{line: 1552, col: 32, offset: 37421}, expr: &seqExpr{ - pos: position{line: 1557, col: 33, offset: 37533}, + pos: position{line: 1552, col: 33, offset: 37422}, exprs: []any{ &litMatcher{ - pos: position{line: 1557, col: 33, offset: 37533}, + pos: position{line: 1552, col: 33, offset: 37422}, val: ".", ignoreCase: false, want: "\".\"", }, &oneOrMoreExpr{ - pos: position{line: 1557, col: 37, offset: 37537}, + pos: position{line: 1552, col: 37, offset: 37426}, expr: &charClassMatcher{ - pos: position{line: 1557, col: 37, offset: 37537}, + pos: position{line: 1552, col: 37, offset: 37426}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -10791,30 +10754,30 @@ var g = &grammar{ }, { name: "TimeOffset", - pos: position{line: 1559, col: 1, offset: 37547}, + pos: position{line: 1554, col: 1, offset: 37436}, expr: &choiceExpr{ - pos: position{line: 1560, col: 5, offset: 37562}, + pos: position{line: 1555, col: 5, offset: 37451}, alternatives: []any{ &litMatcher{ - pos: position{line: 1560, col: 5, offset: 37562}, + pos: position{line: 1555, col: 5, offset: 37451}, val: "Z", ignoreCase: false, want: "\"Z\"", }, &seqExpr{ - pos: position{line: 1561, col: 5, offset: 37570}, + pos: position{line: 1556, col: 5, offset: 37459}, exprs: []any{ &choiceExpr{ - pos: position{line: 1561, col: 6, offset: 37571}, + pos: position{line: 1556, col: 6, offset: 37460}, alternatives: []any{ &litMatcher{ - pos: position{line: 1561, col: 6, offset: 37571}, + pos: position{line: 1556, col: 6, offset: 37460}, val: "+", ignoreCase: false, want: "\"+\"", }, &litMatcher{ - pos: position{line: 1561, col: 12, offset: 37577}, + pos: position{line: 1556, col: 12, offset: 37466}, val: "-", ignoreCase: false, want: "\"-\"", @@ -10822,34 +10785,34 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1561, col: 17, offset: 37582}, + pos: position{line: 1556, col: 17, offset: 37471}, name: "D2", }, &litMatcher{ - pos: position{line: 1561, col: 20, offset: 37585}, + pos: position{line: 1556, col: 20, offset: 37474}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1561, col: 24, offset: 37589}, + pos: position{line: 1556, col: 24, offset: 37478}, name: "D2", }, &zeroOrOneExpr{ - pos: position{line: 1561, col: 27, offset: 37592}, + pos: position{line: 1556, col: 27, offset: 37481}, expr: &seqExpr{ - pos: position{line: 1561, col: 28, offset: 37593}, + pos: position{line: 1556, col: 28, offset: 37482}, exprs: []any{ &litMatcher{ - pos: position{line: 1561, col: 28, offset: 37593}, + pos: position{line: 1556, col: 28, offset: 37482}, val: ".", ignoreCase: false, want: "\".\"", }, &oneOrMoreExpr{ - pos: position{line: 1561, col: 32, offset: 37597}, + pos: position{line: 1556, col: 32, offset: 37486}, expr: &charClassMatcher{ - pos: position{line: 1561, col: 32, offset: 37597}, + pos: position{line: 1556, col: 32, offset: 37486}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -10868,33 +10831,33 @@ var g = &grammar{ }, { name: "Duration", - pos: position{line: 1563, col: 1, offset: 37607}, + pos: position{line: 1558, col: 1, offset: 37496}, expr: &actionExpr{ - pos: position{line: 1564, col: 5, offset: 37620}, + pos: position{line: 1559, col: 5, offset: 37509}, run: (*parser).callonDuration1, expr: &seqExpr{ - pos: position{line: 1564, col: 5, offset: 37620}, + pos: position{line: 1559, col: 5, offset: 37509}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 1564, col: 5, offset: 37620}, + pos: position{line: 1559, col: 5, offset: 37509}, expr: &litMatcher{ - pos: position{line: 1564, col: 5, offset: 37620}, + pos: position{line: 1559, col: 5, offset: 37509}, val: "-", ignoreCase: false, want: "\"-\"", }, }, &oneOrMoreExpr{ - pos: position{line: 1564, col: 10, offset: 37625}, + pos: position{line: 1559, col: 10, offset: 37514}, expr: &seqExpr{ - pos: position{line: 1564, col: 11, offset: 37626}, + pos: position{line: 1559, col: 11, offset: 37515}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1564, col: 11, offset: 37626}, + pos: position{line: 1559, col: 11, offset: 37515}, name: "Decimal", }, &ruleRefExpr{ - pos: position{line: 1564, col: 19, offset: 37634}, + pos: position{line: 1559, col: 19, offset: 37523}, name: "TimeUnit", }, }, @@ -10908,27 +10871,27 @@ var g = &grammar{ }, { name: "Decimal", - pos: position{line: 1568, col: 1, offset: 37716}, + pos: position{line: 1563, col: 1, offset: 37605}, expr: &seqExpr{ - pos: position{line: 1568, col: 11, offset: 37726}, + pos: position{line: 1563, col: 11, offset: 37615}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1568, col: 11, offset: 37726}, + pos: position{line: 1563, col: 11, offset: 37615}, name: "UInt", }, &zeroOrOneExpr{ - pos: position{line: 1568, col: 16, offset: 37731}, + pos: position{line: 1563, col: 16, offset: 37620}, expr: &seqExpr{ - pos: position{line: 1568, col: 17, offset: 37732}, + pos: position{line: 1563, col: 17, offset: 37621}, exprs: []any{ &litMatcher{ - pos: position{line: 1568, col: 17, offset: 37732}, + pos: position{line: 1563, col: 17, offset: 37621}, val: ".", ignoreCase: false, want: "\".\"", }, &ruleRefExpr{ - pos: position{line: 1568, col: 21, offset: 37736}, + pos: position{line: 1563, col: 21, offset: 37625}, name: "UInt", }, }, @@ -10941,60 +10904,60 @@ var g = &grammar{ }, { name: "TimeUnit", - pos: position{line: 1570, col: 1, offset: 37744}, + pos: position{line: 1565, col: 1, offset: 37633}, expr: &choiceExpr{ - pos: position{line: 1571, col: 5, offset: 37757}, + pos: position{line: 1566, col: 5, offset: 37646}, alternatives: []any{ &litMatcher{ - pos: position{line: 1571, col: 5, offset: 37757}, + pos: position{line: 1566, col: 5, offset: 37646}, val: "ns", ignoreCase: false, want: "\"ns\"", }, &litMatcher{ - pos: position{line: 1572, col: 5, offset: 37766}, + pos: position{line: 1567, col: 5, offset: 37655}, val: "us", ignoreCase: false, want: "\"us\"", }, &litMatcher{ - pos: position{line: 1573, col: 5, offset: 37775}, + pos: position{line: 1568, col: 5, offset: 37664}, val: "ms", ignoreCase: false, want: "\"ms\"", }, &litMatcher{ - pos: position{line: 1574, col: 5, offset: 37784}, + pos: position{line: 1569, col: 5, offset: 37673}, val: "s", ignoreCase: false, want: "\"s\"", }, &litMatcher{ - pos: position{line: 1575, col: 5, offset: 37792}, + pos: position{line: 1570, col: 5, offset: 37681}, val: "m", ignoreCase: false, want: "\"m\"", }, &litMatcher{ - pos: position{line: 1576, col: 5, offset: 37800}, + pos: position{line: 1571, col: 5, offset: 37689}, val: "h", ignoreCase: false, want: "\"h\"", }, &litMatcher{ - pos: position{line: 1577, col: 5, offset: 37808}, + pos: position{line: 1572, col: 5, offset: 37697}, val: "d", ignoreCase: false, want: "\"d\"", }, &litMatcher{ - pos: position{line: 1578, col: 5, offset: 37816}, + pos: position{line: 1573, col: 5, offset: 37705}, val: "w", ignoreCase: false, want: "\"w\"", }, &litMatcher{ - pos: position{line: 1579, col: 5, offset: 37824}, + pos: position{line: 1574, col: 5, offset: 37713}, val: "y", ignoreCase: false, want: "\"y\"", @@ -11006,45 +10969,45 @@ var g = &grammar{ }, { name: "IP", - pos: position{line: 1581, col: 1, offset: 37829}, + pos: position{line: 1576, col: 1, offset: 37718}, expr: &actionExpr{ - pos: position{line: 1582, col: 5, offset: 37836}, + pos: position{line: 1577, col: 5, offset: 37725}, run: (*parser).callonIP1, expr: &seqExpr{ - pos: position{line: 1582, col: 5, offset: 37836}, + pos: position{line: 1577, col: 5, offset: 37725}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1582, col: 5, offset: 37836}, + pos: position{line: 1577, col: 5, offset: 37725}, name: "UInt", }, &litMatcher{ - pos: position{line: 1582, col: 10, offset: 37841}, + pos: position{line: 1577, col: 10, offset: 37730}, val: ".", ignoreCase: false, want: "\".\"", }, &ruleRefExpr{ - pos: position{line: 1582, col: 14, offset: 37845}, + pos: position{line: 1577, col: 14, offset: 37734}, name: "UInt", }, &litMatcher{ - pos: position{line: 1582, col: 19, offset: 37850}, + pos: position{line: 1577, col: 19, offset: 37739}, val: ".", ignoreCase: false, want: "\".\"", }, &ruleRefExpr{ - pos: position{line: 1582, col: 23, offset: 37854}, + pos: position{line: 1577, col: 23, offset: 37743}, name: "UInt", }, &litMatcher{ - pos: position{line: 1582, col: 28, offset: 37859}, + pos: position{line: 1577, col: 28, offset: 37748}, val: ".", ignoreCase: false, want: "\".\"", }, &ruleRefExpr{ - pos: position{line: 1582, col: 32, offset: 37863}, + pos: position{line: 1577, col: 32, offset: 37752}, name: "UInt", }, }, @@ -11055,43 +11018,43 @@ var g = &grammar{ }, { name: "IP6", - pos: position{line: 1584, col: 1, offset: 37900}, + pos: position{line: 1579, col: 1, offset: 37789}, expr: &actionExpr{ - pos: position{line: 1585, col: 5, offset: 37908}, + pos: position{line: 1580, col: 5, offset: 37797}, run: (*parser).callonIP61, expr: &seqExpr{ - pos: position{line: 1585, col: 5, offset: 37908}, + pos: position{line: 1580, col: 5, offset: 37797}, exprs: []any{ ¬Expr{ - pos: position{line: 1585, col: 5, offset: 37908}, + pos: position{line: 1580, col: 5, offset: 37797}, expr: &seqExpr{ - pos: position{line: 1585, col: 7, offset: 37910}, + pos: position{line: 1580, col: 7, offset: 37799}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1585, col: 7, offset: 37910}, + pos: position{line: 1580, col: 7, offset: 37799}, name: "Hex", }, &litMatcher{ - pos: position{line: 1585, col: 11, offset: 37914}, + pos: position{line: 1580, col: 11, offset: 37803}, val: ":", ignoreCase: false, want: "\":\"", }, &ruleRefExpr{ - pos: position{line: 1585, col: 15, offset: 37918}, + pos: position{line: 1580, col: 15, offset: 37807}, name: "Hex", }, ¬Expr{ - pos: position{line: 1585, col: 19, offset: 37922}, + pos: position{line: 1580, col: 19, offset: 37811}, expr: &choiceExpr{ - pos: position{line: 1585, col: 21, offset: 37924}, + pos: position{line: 1580, col: 21, offset: 37813}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1585, col: 21, offset: 37924}, + pos: position{line: 1580, col: 21, offset: 37813}, name: "HexDigit", }, &litMatcher{ - pos: position{line: 1585, col: 32, offset: 37935}, + pos: position{line: 1580, col: 32, offset: 37824}, val: ":", ignoreCase: false, want: "\":\"", @@ -11103,10 +11066,10 @@ var g = &grammar{ }, }, &labeledExpr{ - pos: position{line: 1585, col: 38, offset: 37941}, + pos: position{line: 1580, col: 38, offset: 37830}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1585, col: 40, offset: 37943}, + pos: position{line: 1580, col: 40, offset: 37832}, name: "IP6Variations", }, }, @@ -11118,32 +11081,32 @@ var g = &grammar{ }, { name: "IP6Variations", - pos: position{line: 1589, col: 1, offset: 38107}, + pos: position{line: 1584, col: 1, offset: 37996}, expr: &choiceExpr{ - pos: position{line: 1590, col: 5, offset: 38125}, + pos: position{line: 1585, col: 5, offset: 38014}, alternatives: []any{ &actionExpr{ - pos: position{line: 1590, col: 5, offset: 38125}, + pos: position{line: 1585, col: 5, offset: 38014}, run: (*parser).callonIP6Variations2, expr: &seqExpr{ - pos: position{line: 1590, col: 5, offset: 38125}, + pos: position{line: 1585, col: 5, offset: 38014}, exprs: []any{ &labeledExpr{ - pos: position{line: 1590, col: 5, offset: 38125}, + pos: position{line: 1585, col: 5, offset: 38014}, label: "a", expr: &oneOrMoreExpr{ - pos: position{line: 1590, col: 7, offset: 38127}, + pos: position{line: 1585, col: 7, offset: 38016}, expr: &ruleRefExpr{ - pos: position{line: 1590, col: 7, offset: 38127}, + pos: position{line: 1585, col: 7, offset: 38016}, name: "HexColon", }, }, }, &labeledExpr{ - pos: position{line: 1590, col: 17, offset: 38137}, + pos: position{line: 1585, col: 17, offset: 38026}, label: "b", expr: &ruleRefExpr{ - pos: position{line: 1590, col: 19, offset: 38139}, + pos: position{line: 1585, col: 19, offset: 38028}, name: "IP6Tail", }, }, @@ -11151,52 +11114,52 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1593, col: 5, offset: 38203}, + pos: position{line: 1588, col: 5, offset: 38092}, run: (*parser).callonIP6Variations9, expr: &seqExpr{ - pos: position{line: 1593, col: 5, offset: 38203}, + pos: position{line: 1588, col: 5, offset: 38092}, exprs: []any{ &labeledExpr{ - pos: position{line: 1593, col: 5, offset: 38203}, + pos: position{line: 1588, col: 5, offset: 38092}, label: "a", expr: &ruleRefExpr{ - pos: position{line: 1593, col: 7, offset: 38205}, + pos: position{line: 1588, col: 7, offset: 38094}, name: "Hex", }, }, &labeledExpr{ - pos: position{line: 1593, col: 11, offset: 38209}, + pos: position{line: 1588, col: 11, offset: 38098}, label: "b", expr: &zeroOrMoreExpr{ - pos: position{line: 1593, col: 13, offset: 38211}, + pos: position{line: 1588, col: 13, offset: 38100}, expr: &ruleRefExpr{ - pos: position{line: 1593, col: 13, offset: 38211}, + pos: position{line: 1588, col: 13, offset: 38100}, name: "ColonHex", }, }, }, &litMatcher{ - pos: position{line: 1593, col: 23, offset: 38221}, + pos: position{line: 1588, col: 23, offset: 38110}, val: "::", ignoreCase: false, want: "\"::\"", }, &labeledExpr{ - pos: position{line: 1593, col: 28, offset: 38226}, + pos: position{line: 1588, col: 28, offset: 38115}, label: "d", expr: &zeroOrMoreExpr{ - pos: position{line: 1593, col: 30, offset: 38228}, + pos: position{line: 1588, col: 30, offset: 38117}, expr: &ruleRefExpr{ - pos: position{line: 1593, col: 30, offset: 38228}, + pos: position{line: 1588, col: 30, offset: 38117}, name: "HexColon", }, }, }, &labeledExpr{ - pos: position{line: 1593, col: 40, offset: 38238}, + pos: position{line: 1588, col: 40, offset: 38127}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 1593, col: 42, offset: 38240}, + pos: position{line: 1588, col: 42, offset: 38129}, name: "IP6Tail", }, }, @@ -11204,33 +11167,33 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1596, col: 5, offset: 38339}, + pos: position{line: 1591, col: 5, offset: 38228}, run: (*parser).callonIP6Variations22, expr: &seqExpr{ - pos: position{line: 1596, col: 5, offset: 38339}, + pos: position{line: 1591, col: 5, offset: 38228}, exprs: []any{ &litMatcher{ - pos: position{line: 1596, col: 5, offset: 38339}, + pos: position{line: 1591, col: 5, offset: 38228}, val: "::", ignoreCase: false, want: "\"::\"", }, &labeledExpr{ - pos: position{line: 1596, col: 10, offset: 38344}, + pos: position{line: 1591, col: 10, offset: 38233}, label: "a", expr: &zeroOrMoreExpr{ - pos: position{line: 1596, col: 12, offset: 38346}, + pos: position{line: 1591, col: 12, offset: 38235}, expr: &ruleRefExpr{ - pos: position{line: 1596, col: 12, offset: 38346}, + pos: position{line: 1591, col: 12, offset: 38235}, name: "HexColon", }, }, }, &labeledExpr{ - pos: position{line: 1596, col: 22, offset: 38356}, + pos: position{line: 1591, col: 22, offset: 38245}, label: "b", expr: &ruleRefExpr{ - pos: position{line: 1596, col: 24, offset: 38358}, + pos: position{line: 1591, col: 24, offset: 38247}, name: "IP6Tail", }, }, @@ -11238,32 +11201,32 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1599, col: 5, offset: 38429}, + pos: position{line: 1594, col: 5, offset: 38318}, run: (*parser).callonIP6Variations30, expr: &seqExpr{ - pos: position{line: 1599, col: 5, offset: 38429}, + pos: position{line: 1594, col: 5, offset: 38318}, exprs: []any{ &labeledExpr{ - pos: position{line: 1599, col: 5, offset: 38429}, + pos: position{line: 1594, col: 5, offset: 38318}, label: "a", expr: &ruleRefExpr{ - pos: position{line: 1599, col: 7, offset: 38431}, + pos: position{line: 1594, col: 7, offset: 38320}, name: "Hex", }, }, &labeledExpr{ - pos: position{line: 1599, col: 11, offset: 38435}, + pos: position{line: 1594, col: 11, offset: 38324}, label: "b", expr: &zeroOrMoreExpr{ - pos: position{line: 1599, col: 13, offset: 38437}, + pos: position{line: 1594, col: 13, offset: 38326}, expr: &ruleRefExpr{ - pos: position{line: 1599, col: 13, offset: 38437}, + pos: position{line: 1594, col: 13, offset: 38326}, name: "ColonHex", }, }, }, &litMatcher{ - pos: position{line: 1599, col: 23, offset: 38447}, + pos: position{line: 1594, col: 23, offset: 38336}, val: "::", ignoreCase: false, want: "\"::\"", @@ -11272,10 +11235,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1602, col: 5, offset: 38515}, + pos: position{line: 1597, col: 5, offset: 38404}, run: (*parser).callonIP6Variations38, expr: &litMatcher{ - pos: position{line: 1602, col: 5, offset: 38515}, + pos: position{line: 1597, col: 5, offset: 38404}, val: "::", ignoreCase: false, want: "\"::\"", @@ -11288,16 +11251,16 @@ var g = &grammar{ }, { name: "IP6Tail", - pos: position{line: 1606, col: 1, offset: 38552}, + pos: position{line: 1601, col: 1, offset: 38441}, expr: &choiceExpr{ - pos: position{line: 1607, col: 5, offset: 38564}, + pos: position{line: 1602, col: 5, offset: 38453}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1607, col: 5, offset: 38564}, + pos: position{line: 1602, col: 5, offset: 38453}, name: "IP", }, &ruleRefExpr{ - pos: position{line: 1608, col: 5, offset: 38571}, + pos: position{line: 1603, col: 5, offset: 38460}, name: "Hex", }, }, @@ -11307,24 +11270,24 @@ var g = &grammar{ }, { name: "ColonHex", - pos: position{line: 1610, col: 1, offset: 38576}, + pos: position{line: 1605, col: 1, offset: 38465}, expr: &actionExpr{ - pos: position{line: 1610, col: 12, offset: 38587}, + pos: position{line: 1605, col: 12, offset: 38476}, run: (*parser).callonColonHex1, expr: &seqExpr{ - pos: position{line: 1610, col: 12, offset: 38587}, + pos: position{line: 1605, col: 12, offset: 38476}, exprs: []any{ &litMatcher{ - pos: position{line: 1610, col: 12, offset: 38587}, + pos: position{line: 1605, col: 12, offset: 38476}, val: ":", ignoreCase: false, want: "\":\"", }, &labeledExpr{ - pos: position{line: 1610, col: 16, offset: 38591}, + pos: position{line: 1605, col: 16, offset: 38480}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1610, col: 18, offset: 38593}, + pos: position{line: 1605, col: 18, offset: 38482}, name: "Hex", }, }, @@ -11336,23 +11299,23 @@ var g = &grammar{ }, { name: "HexColon", - pos: position{line: 1612, col: 1, offset: 38631}, + pos: position{line: 1607, col: 1, offset: 38520}, expr: &actionExpr{ - pos: position{line: 1612, col: 12, offset: 38642}, + pos: position{line: 1607, col: 12, offset: 38531}, run: (*parser).callonHexColon1, expr: &seqExpr{ - pos: position{line: 1612, col: 12, offset: 38642}, + pos: position{line: 1607, col: 12, offset: 38531}, exprs: []any{ &labeledExpr{ - pos: position{line: 1612, col: 12, offset: 38642}, + pos: position{line: 1607, col: 12, offset: 38531}, label: "v", expr: &ruleRefExpr{ - pos: position{line: 1612, col: 14, offset: 38644}, + pos: position{line: 1607, col: 14, offset: 38533}, name: "Hex", }, }, &litMatcher{ - pos: position{line: 1612, col: 18, offset: 38648}, + pos: position{line: 1607, col: 18, offset: 38537}, val: ":", ignoreCase: false, want: "\":\"", @@ -11365,32 +11328,32 @@ var g = &grammar{ }, { name: "IP4Net", - pos: position{line: 1614, col: 1, offset: 38686}, + pos: position{line: 1609, col: 1, offset: 38575}, expr: &actionExpr{ - pos: position{line: 1615, col: 5, offset: 38697}, + pos: position{line: 1610, col: 5, offset: 38586}, run: (*parser).callonIP4Net1, expr: &seqExpr{ - pos: position{line: 1615, col: 5, offset: 38697}, + pos: position{line: 1610, col: 5, offset: 38586}, exprs: []any{ &labeledExpr{ - pos: position{line: 1615, col: 5, offset: 38697}, + pos: position{line: 1610, col: 5, offset: 38586}, label: "a", expr: &ruleRefExpr{ - pos: position{line: 1615, col: 7, offset: 38699}, + pos: position{line: 1610, col: 7, offset: 38588}, name: "IP", }, }, &litMatcher{ - pos: position{line: 1615, col: 10, offset: 38702}, + pos: position{line: 1610, col: 10, offset: 38591}, val: "/", ignoreCase: false, want: "\"/\"", }, &labeledExpr{ - pos: position{line: 1615, col: 14, offset: 38706}, + pos: position{line: 1610, col: 14, offset: 38595}, label: "m", expr: &ruleRefExpr{ - pos: position{line: 1615, col: 16, offset: 38708}, + pos: position{line: 1610, col: 16, offset: 38597}, name: "UIntString", }, }, @@ -11402,32 +11365,32 @@ var g = &grammar{ }, { name: "IP6Net", - pos: position{line: 1619, col: 1, offset: 38776}, + pos: position{line: 1614, col: 1, offset: 38665}, expr: &actionExpr{ - pos: position{line: 1620, col: 5, offset: 38787}, + pos: position{line: 1615, col: 5, offset: 38676}, run: (*parser).callonIP6Net1, expr: &seqExpr{ - pos: position{line: 1620, col: 5, offset: 38787}, + pos: position{line: 1615, col: 5, offset: 38676}, exprs: []any{ &labeledExpr{ - pos: position{line: 1620, col: 5, offset: 38787}, + pos: position{line: 1615, col: 5, offset: 38676}, label: "a", expr: &ruleRefExpr{ - pos: position{line: 1620, col: 7, offset: 38789}, + pos: position{line: 1615, col: 7, offset: 38678}, name: "IP6", }, }, &litMatcher{ - pos: position{line: 1620, col: 11, offset: 38793}, + pos: position{line: 1615, col: 11, offset: 38682}, val: "/", ignoreCase: false, want: "\"/\"", }, &labeledExpr{ - pos: position{line: 1620, col: 15, offset: 38797}, + pos: position{line: 1615, col: 15, offset: 38686}, label: "m", expr: &ruleRefExpr{ - pos: position{line: 1620, col: 17, offset: 38799}, + pos: position{line: 1615, col: 17, offset: 38688}, name: "UIntString", }, }, @@ -11439,15 +11402,15 @@ var g = &grammar{ }, { name: "UInt", - pos: position{line: 1624, col: 1, offset: 38867}, + pos: position{line: 1619, col: 1, offset: 38756}, expr: &actionExpr{ - pos: position{line: 1625, col: 4, offset: 38875}, + pos: position{line: 1620, col: 4, offset: 38764}, run: (*parser).callonUInt1, expr: &labeledExpr{ - pos: position{line: 1625, col: 4, offset: 38875}, + pos: position{line: 1620, col: 4, offset: 38764}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1625, col: 6, offset: 38877}, + pos: position{line: 1620, col: 6, offset: 38766}, name: "UIntString", }, }, @@ -11457,16 +11420,16 @@ var g = &grammar{ }, { name: "IntString", - pos: position{line: 1627, col: 1, offset: 38917}, + pos: position{line: 1622, col: 1, offset: 38806}, expr: &choiceExpr{ - pos: position{line: 1628, col: 5, offset: 38931}, + pos: position{line: 1623, col: 5, offset: 38820}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1628, col: 5, offset: 38931}, + pos: position{line: 1623, col: 5, offset: 38820}, name: "UIntString", }, &ruleRefExpr{ - pos: position{line: 1629, col: 5, offset: 38946}, + pos: position{line: 1624, col: 5, offset: 38835}, name: "MinusIntString", }, }, @@ -11476,14 +11439,14 @@ var g = &grammar{ }, { name: "UIntString", - pos: position{line: 1631, col: 1, offset: 38962}, + pos: position{line: 1626, col: 1, offset: 38851}, expr: &actionExpr{ - pos: position{line: 1631, col: 14, offset: 38975}, + pos: position{line: 1626, col: 14, offset: 38864}, run: (*parser).callonUIntString1, expr: &oneOrMoreExpr{ - pos: position{line: 1631, col: 14, offset: 38975}, + pos: position{line: 1626, col: 14, offset: 38864}, expr: &charClassMatcher{ - pos: position{line: 1631, col: 14, offset: 38975}, + pos: position{line: 1626, col: 14, offset: 38864}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -11496,21 +11459,21 @@ var g = &grammar{ }, { name: "MinusIntString", - pos: position{line: 1633, col: 1, offset: 39014}, + pos: position{line: 1628, col: 1, offset: 38903}, expr: &actionExpr{ - pos: position{line: 1634, col: 5, offset: 39033}, + pos: position{line: 1629, col: 5, offset: 38922}, run: (*parser).callonMinusIntString1, expr: &seqExpr{ - pos: position{line: 1634, col: 5, offset: 39033}, + pos: position{line: 1629, col: 5, offset: 38922}, exprs: []any{ &litMatcher{ - pos: position{line: 1634, col: 5, offset: 39033}, + pos: position{line: 1629, col: 5, offset: 38922}, val: "-", ignoreCase: false, want: "\"-\"", }, &ruleRefExpr{ - pos: position{line: 1634, col: 9, offset: 39037}, + pos: position{line: 1629, col: 9, offset: 38926}, name: "UIntString", }, }, @@ -11521,29 +11484,29 @@ var g = &grammar{ }, { name: "FloatString", - pos: position{line: 1636, col: 1, offset: 39080}, + pos: position{line: 1631, col: 1, offset: 38969}, expr: &choiceExpr{ - pos: position{line: 1637, col: 5, offset: 39096}, + pos: position{line: 1632, col: 5, offset: 38985}, alternatives: []any{ &actionExpr{ - pos: position{line: 1637, col: 5, offset: 39096}, + pos: position{line: 1632, col: 5, offset: 38985}, run: (*parser).callonFloatString2, expr: &seqExpr{ - pos: position{line: 1637, col: 5, offset: 39096}, + pos: position{line: 1632, col: 5, offset: 38985}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 1637, col: 5, offset: 39096}, + pos: position{line: 1632, col: 5, offset: 38985}, expr: &litMatcher{ - pos: position{line: 1637, col: 5, offset: 39096}, + pos: position{line: 1632, col: 5, offset: 38985}, val: "-", ignoreCase: false, want: "\"-\"", }, }, &oneOrMoreExpr{ - pos: position{line: 1637, col: 10, offset: 39101}, + pos: position{line: 1632, col: 10, offset: 38990}, expr: &charClassMatcher{ - pos: position{line: 1637, col: 10, offset: 39101}, + pos: position{line: 1632, col: 10, offset: 38990}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -11551,15 +11514,15 @@ var g = &grammar{ }, }, &litMatcher{ - pos: position{line: 1637, col: 17, offset: 39108}, + pos: position{line: 1632, col: 17, offset: 38997}, val: ".", ignoreCase: false, want: "\".\"", }, &zeroOrMoreExpr{ - pos: position{line: 1637, col: 21, offset: 39112}, + pos: position{line: 1632, col: 21, offset: 39001}, expr: &charClassMatcher{ - pos: position{line: 1637, col: 21, offset: 39112}, + pos: position{line: 1632, col: 21, offset: 39001}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -11567,9 +11530,9 @@ var g = &grammar{ }, }, &zeroOrOneExpr{ - pos: position{line: 1637, col: 28, offset: 39119}, + pos: position{line: 1632, col: 28, offset: 39008}, expr: &ruleRefExpr{ - pos: position{line: 1637, col: 28, offset: 39119}, + pos: position{line: 1632, col: 28, offset: 39008}, name: "ExponentPart", }, }, @@ -11577,30 +11540,30 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1638, col: 5, offset: 39168}, + pos: position{line: 1633, col: 5, offset: 39057}, run: (*parser).callonFloatString13, expr: &seqExpr{ - pos: position{line: 1638, col: 5, offset: 39168}, + pos: position{line: 1633, col: 5, offset: 39057}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 1638, col: 5, offset: 39168}, + pos: position{line: 1633, col: 5, offset: 39057}, expr: &litMatcher{ - pos: position{line: 1638, col: 5, offset: 39168}, + pos: position{line: 1633, col: 5, offset: 39057}, val: "-", ignoreCase: false, want: "\"-\"", }, }, &litMatcher{ - pos: position{line: 1638, col: 10, offset: 39173}, + pos: position{line: 1633, col: 10, offset: 39062}, val: ".", ignoreCase: false, want: "\".\"", }, &oneOrMoreExpr{ - pos: position{line: 1638, col: 14, offset: 39177}, + pos: position{line: 1633, col: 14, offset: 39066}, expr: &charClassMatcher{ - pos: position{line: 1638, col: 14, offset: 39177}, + pos: position{line: 1633, col: 14, offset: 39066}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -11608,9 +11571,9 @@ var g = &grammar{ }, }, &zeroOrOneExpr{ - pos: position{line: 1638, col: 21, offset: 39184}, + pos: position{line: 1633, col: 21, offset: 39073}, expr: &ruleRefExpr{ - pos: position{line: 1638, col: 21, offset: 39184}, + pos: position{line: 1633, col: 21, offset: 39073}, name: "ExponentPart", }, }, @@ -11618,17 +11581,17 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1639, col: 5, offset: 39233}, + pos: position{line: 1634, col: 5, offset: 39122}, run: (*parser).callonFloatString22, expr: &choiceExpr{ - pos: position{line: 1639, col: 6, offset: 39234}, + pos: position{line: 1634, col: 6, offset: 39123}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1639, col: 6, offset: 39234}, + pos: position{line: 1634, col: 6, offset: 39123}, name: "NaN", }, &ruleRefExpr{ - pos: position{line: 1639, col: 12, offset: 39240}, + pos: position{line: 1634, col: 12, offset: 39129}, name: "Infinity", }, }, @@ -11641,20 +11604,20 @@ var g = &grammar{ }, { name: "ExponentPart", - pos: position{line: 1642, col: 1, offset: 39283}, + pos: position{line: 1637, col: 1, offset: 39172}, expr: &seqExpr{ - pos: position{line: 1642, col: 16, offset: 39298}, + pos: position{line: 1637, col: 16, offset: 39187}, exprs: []any{ &litMatcher{ - pos: position{line: 1642, col: 16, offset: 39298}, + pos: position{line: 1637, col: 16, offset: 39187}, val: "e", ignoreCase: true, want: "\"e\"i", }, &zeroOrOneExpr{ - pos: position{line: 1642, col: 21, offset: 39303}, + pos: position{line: 1637, col: 21, offset: 39192}, expr: &charClassMatcher{ - pos: position{line: 1642, col: 21, offset: 39303}, + pos: position{line: 1637, col: 21, offset: 39192}, val: "[+-]", chars: []rune{'+', '-'}, ignoreCase: false, @@ -11662,7 +11625,7 @@ var g = &grammar{ }, }, &ruleRefExpr{ - pos: position{line: 1642, col: 27, offset: 39309}, + pos: position{line: 1637, col: 27, offset: 39198}, name: "UIntString", }, }, @@ -11672,9 +11635,9 @@ var g = &grammar{ }, { name: "NaN", - pos: position{line: 1644, col: 1, offset: 39321}, + pos: position{line: 1639, col: 1, offset: 39210}, expr: &litMatcher{ - pos: position{line: 1644, col: 7, offset: 39327}, + pos: position{line: 1639, col: 7, offset: 39216}, val: "NaN", ignoreCase: false, want: "\"NaN\"", @@ -11684,23 +11647,23 @@ var g = &grammar{ }, { name: "Infinity", - pos: position{line: 1646, col: 1, offset: 39334}, + pos: position{line: 1641, col: 1, offset: 39223}, expr: &seqExpr{ - pos: position{line: 1646, col: 12, offset: 39345}, + pos: position{line: 1641, col: 12, offset: 39234}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 1646, col: 12, offset: 39345}, + pos: position{line: 1641, col: 12, offset: 39234}, expr: &choiceExpr{ - pos: position{line: 1646, col: 13, offset: 39346}, + pos: position{line: 1641, col: 13, offset: 39235}, alternatives: []any{ &litMatcher{ - pos: position{line: 1646, col: 13, offset: 39346}, + pos: position{line: 1641, col: 13, offset: 39235}, val: "-", ignoreCase: false, want: "\"-\"", }, &litMatcher{ - pos: position{line: 1646, col: 19, offset: 39352}, + pos: position{line: 1641, col: 19, offset: 39241}, val: "+", ignoreCase: false, want: "\"+\"", @@ -11709,7 +11672,7 @@ var g = &grammar{ }, }, &litMatcher{ - pos: position{line: 1646, col: 25, offset: 39358}, + pos: position{line: 1641, col: 25, offset: 39247}, val: "Inf", ignoreCase: false, want: "\"Inf\"", @@ -11721,14 +11684,14 @@ var g = &grammar{ }, { name: "Hex", - pos: position{line: 1648, col: 1, offset: 39365}, + pos: position{line: 1643, col: 1, offset: 39254}, expr: &actionExpr{ - pos: position{line: 1648, col: 7, offset: 39371}, + pos: position{line: 1643, col: 7, offset: 39260}, run: (*parser).callonHex1, expr: &oneOrMoreExpr{ - pos: position{line: 1648, col: 7, offset: 39371}, + pos: position{line: 1643, col: 7, offset: 39260}, expr: &ruleRefExpr{ - pos: position{line: 1648, col: 7, offset: 39371}, + pos: position{line: 1643, col: 7, offset: 39260}, name: "HexDigit", }, }, @@ -11738,9 +11701,9 @@ var g = &grammar{ }, { name: "HexDigit", - pos: position{line: 1650, col: 1, offset: 39413}, + pos: position{line: 1645, col: 1, offset: 39302}, expr: &charClassMatcher{ - pos: position{line: 1650, col: 12, offset: 39424}, + pos: position{line: 1645, col: 12, offset: 39313}, val: "[0-9a-fA-F]", ranges: []rune{'0', '9', 'a', 'f', 'A', 'F'}, ignoreCase: false, @@ -11751,35 +11714,35 @@ var g = &grammar{ }, { name: "QuotedString", - pos: position{line: 1652, col: 1, offset: 39437}, + pos: position{line: 1647, col: 1, offset: 39326}, expr: &choiceExpr{ - pos: position{line: 1653, col: 5, offset: 39454}, + pos: position{line: 1648, col: 5, offset: 39343}, alternatives: []any{ &actionExpr{ - pos: position{line: 1653, col: 5, offset: 39454}, + pos: position{line: 1648, col: 5, offset: 39343}, run: (*parser).callonQuotedString2, expr: &seqExpr{ - pos: position{line: 1653, col: 5, offset: 39454}, + pos: position{line: 1648, col: 5, offset: 39343}, exprs: []any{ &litMatcher{ - pos: position{line: 1653, col: 5, offset: 39454}, + pos: position{line: 1648, col: 5, offset: 39343}, val: "\"", ignoreCase: false, want: "\"\\\"\"", }, &labeledExpr{ - pos: position{line: 1653, col: 9, offset: 39458}, + pos: position{line: 1648, col: 9, offset: 39347}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1653, col: 11, offset: 39460}, + pos: position{line: 1648, col: 11, offset: 39349}, expr: &ruleRefExpr{ - pos: position{line: 1653, col: 11, offset: 39460}, + pos: position{line: 1648, col: 11, offset: 39349}, name: "DoubleQuotedChar", }, }, }, &litMatcher{ - pos: position{line: 1653, col: 29, offset: 39478}, + pos: position{line: 1648, col: 29, offset: 39367}, val: "\"", ignoreCase: false, want: "\"\\\"\"", @@ -11788,30 +11751,30 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1654, col: 5, offset: 39515}, + pos: position{line: 1649, col: 5, offset: 39404}, run: (*parser).callonQuotedString9, expr: &seqExpr{ - pos: position{line: 1654, col: 5, offset: 39515}, + pos: position{line: 1649, col: 5, offset: 39404}, exprs: []any{ &litMatcher{ - pos: position{line: 1654, col: 5, offset: 39515}, + pos: position{line: 1649, col: 5, offset: 39404}, val: "'", ignoreCase: false, want: "\"'\"", }, &labeledExpr{ - pos: position{line: 1654, col: 9, offset: 39519}, + pos: position{line: 1649, col: 9, offset: 39408}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1654, col: 11, offset: 39521}, + pos: position{line: 1649, col: 11, offset: 39410}, expr: &ruleRefExpr{ - pos: position{line: 1654, col: 11, offset: 39521}, + pos: position{line: 1649, col: 11, offset: 39410}, name: "SingleQuotedChar", }, }, }, &litMatcher{ - pos: position{line: 1654, col: 29, offset: 39539}, + pos: position{line: 1649, col: 29, offset: 39428}, val: "'", ignoreCase: false, want: "\"'\"", @@ -11826,57 +11789,57 @@ var g = &grammar{ }, { name: "DoubleQuotedChar", - pos: position{line: 1656, col: 1, offset: 39573}, + pos: position{line: 1651, col: 1, offset: 39462}, expr: &choiceExpr{ - pos: position{line: 1657, col: 5, offset: 39594}, + pos: position{line: 1652, col: 5, offset: 39483}, alternatives: []any{ &actionExpr{ - pos: position{line: 1657, col: 5, offset: 39594}, + pos: position{line: 1652, col: 5, offset: 39483}, run: (*parser).callonDoubleQuotedChar2, expr: &seqExpr{ - pos: position{line: 1657, col: 5, offset: 39594}, + pos: position{line: 1652, col: 5, offset: 39483}, exprs: []any{ ¬Expr{ - pos: position{line: 1657, col: 5, offset: 39594}, + pos: position{line: 1652, col: 5, offset: 39483}, expr: &choiceExpr{ - pos: position{line: 1657, col: 7, offset: 39596}, + pos: position{line: 1652, col: 7, offset: 39485}, alternatives: []any{ &litMatcher{ - pos: position{line: 1657, col: 7, offset: 39596}, + pos: position{line: 1652, col: 7, offset: 39485}, val: "\"", ignoreCase: false, want: "\"\\\"\"", }, &ruleRefExpr{ - pos: position{line: 1657, col: 13, offset: 39602}, + pos: position{line: 1652, col: 13, offset: 39491}, name: "EscapedChar", }, }, }, }, &anyMatcher{ - line: 1657, col: 26, offset: 39615, + line: 1652, col: 26, offset: 39504, }, }, }, }, &actionExpr{ - pos: position{line: 1658, col: 5, offset: 39652}, + pos: position{line: 1653, col: 5, offset: 39541}, run: (*parser).callonDoubleQuotedChar9, expr: &seqExpr{ - pos: position{line: 1658, col: 5, offset: 39652}, + pos: position{line: 1653, col: 5, offset: 39541}, exprs: []any{ &litMatcher{ - pos: position{line: 1658, col: 5, offset: 39652}, + pos: position{line: 1653, col: 5, offset: 39541}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1658, col: 10, offset: 39657}, + pos: position{line: 1653, col: 10, offset: 39546}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1658, col: 12, offset: 39659}, + pos: position{line: 1653, col: 12, offset: 39548}, name: "EscapeSequence", }, }, @@ -11890,32 +11853,32 @@ var g = &grammar{ }, { name: "BacktickString", - pos: position{line: 1660, col: 1, offset: 39693}, + pos: position{line: 1655, col: 1, offset: 39582}, expr: &actionExpr{ - pos: position{line: 1661, col: 5, offset: 39712}, + pos: position{line: 1656, col: 5, offset: 39601}, run: (*parser).callonBacktickString1, expr: &seqExpr{ - pos: position{line: 1661, col: 5, offset: 39712}, + pos: position{line: 1656, col: 5, offset: 39601}, exprs: []any{ &litMatcher{ - pos: position{line: 1661, col: 5, offset: 39712}, + pos: position{line: 1656, col: 5, offset: 39601}, val: "`", ignoreCase: false, want: "\"`\"", }, &labeledExpr{ - pos: position{line: 1661, col: 9, offset: 39716}, + pos: position{line: 1656, col: 9, offset: 39605}, label: "v", expr: &zeroOrMoreExpr{ - pos: position{line: 1661, col: 11, offset: 39718}, + pos: position{line: 1656, col: 11, offset: 39607}, expr: &ruleRefExpr{ - pos: position{line: 1661, col: 11, offset: 39718}, + pos: position{line: 1656, col: 11, offset: 39607}, name: "BacktickChar", }, }, }, &litMatcher{ - pos: position{line: 1661, col: 25, offset: 39732}, + pos: position{line: 1656, col: 25, offset: 39621}, val: "`", ignoreCase: false, want: "\"`\"", @@ -11928,57 +11891,57 @@ var g = &grammar{ }, { name: "BacktickChar", - pos: position{line: 1663, col: 1, offset: 39766}, + pos: position{line: 1658, col: 1, offset: 39655}, expr: &choiceExpr{ - pos: position{line: 1664, col: 5, offset: 39783}, + pos: position{line: 1659, col: 5, offset: 39672}, alternatives: []any{ &actionExpr{ - pos: position{line: 1664, col: 5, offset: 39783}, + pos: position{line: 1659, col: 5, offset: 39672}, run: (*parser).callonBacktickChar2, expr: &seqExpr{ - pos: position{line: 1664, col: 5, offset: 39783}, + pos: position{line: 1659, col: 5, offset: 39672}, exprs: []any{ ¬Expr{ - pos: position{line: 1664, col: 5, offset: 39783}, + pos: position{line: 1659, col: 5, offset: 39672}, expr: &choiceExpr{ - pos: position{line: 1664, col: 7, offset: 39785}, + pos: position{line: 1659, col: 7, offset: 39674}, alternatives: []any{ &litMatcher{ - pos: position{line: 1664, col: 7, offset: 39785}, + pos: position{line: 1659, col: 7, offset: 39674}, val: "`", ignoreCase: false, want: "\"`\"", }, &ruleRefExpr{ - pos: position{line: 1664, col: 13, offset: 39791}, + pos: position{line: 1659, col: 13, offset: 39680}, name: "EscapedChar", }, }, }, }, &anyMatcher{ - line: 1664, col: 26, offset: 39804, + line: 1659, col: 26, offset: 39693, }, }, }, }, &actionExpr{ - pos: position{line: 1665, col: 5, offset: 39841}, + pos: position{line: 1660, col: 5, offset: 39730}, run: (*parser).callonBacktickChar9, expr: &seqExpr{ - pos: position{line: 1665, col: 5, offset: 39841}, + pos: position{line: 1660, col: 5, offset: 39730}, exprs: []any{ &litMatcher{ - pos: position{line: 1665, col: 5, offset: 39841}, + pos: position{line: 1660, col: 5, offset: 39730}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1665, col: 10, offset: 39846}, + pos: position{line: 1660, col: 10, offset: 39735}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1665, col: 12, offset: 39848}, + pos: position{line: 1660, col: 12, offset: 39737}, name: "EscapeSequence", }, }, @@ -11992,28 +11955,28 @@ var g = &grammar{ }, { name: "KeyWord", - pos: position{line: 1667, col: 1, offset: 39882}, + pos: position{line: 1662, col: 1, offset: 39771}, expr: &actionExpr{ - pos: position{line: 1668, col: 5, offset: 39894}, + pos: position{line: 1663, col: 5, offset: 39783}, run: (*parser).callonKeyWord1, expr: &seqExpr{ - pos: position{line: 1668, col: 5, offset: 39894}, + pos: position{line: 1663, col: 5, offset: 39783}, exprs: []any{ &labeledExpr{ - pos: position{line: 1668, col: 5, offset: 39894}, + pos: position{line: 1663, col: 5, offset: 39783}, label: "head", expr: &ruleRefExpr{ - pos: position{line: 1668, col: 10, offset: 39899}, + pos: position{line: 1663, col: 10, offset: 39788}, name: "KeyWordStart", }, }, &labeledExpr{ - pos: position{line: 1668, col: 23, offset: 39912}, + pos: position{line: 1663, col: 23, offset: 39801}, label: "tail", expr: &zeroOrMoreExpr{ - pos: position{line: 1668, col: 28, offset: 39917}, + pos: position{line: 1663, col: 28, offset: 39806}, expr: &ruleRefExpr{ - pos: position{line: 1668, col: 28, offset: 39917}, + pos: position{line: 1663, col: 28, offset: 39806}, name: "KeyWordRest", }, }, @@ -12026,16 +11989,16 @@ var g = &grammar{ }, { name: "KeyWordStart", - pos: position{line: 1670, col: 1, offset: 39979}, + pos: position{line: 1665, col: 1, offset: 39868}, expr: &choiceExpr{ - pos: position{line: 1671, col: 5, offset: 39996}, + pos: position{line: 1666, col: 5, offset: 39885}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1671, col: 5, offset: 39996}, + pos: position{line: 1666, col: 5, offset: 39885}, name: "KeyWordChars", }, &ruleRefExpr{ - pos: position{line: 1672, col: 5, offset: 40013}, + pos: position{line: 1667, col: 5, offset: 39902}, name: "KeyWordEsc", }, }, @@ -12045,16 +12008,16 @@ var g = &grammar{ }, { name: "KeyWordRest", - pos: position{line: 1674, col: 1, offset: 40025}, + pos: position{line: 1669, col: 1, offset: 39914}, expr: &choiceExpr{ - pos: position{line: 1675, col: 5, offset: 40041}, + pos: position{line: 1670, col: 5, offset: 39930}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1675, col: 5, offset: 40041}, + pos: position{line: 1670, col: 5, offset: 39930}, name: "KeyWordStart", }, &charClassMatcher{ - pos: position{line: 1676, col: 5, offset: 40058}, + pos: position{line: 1671, col: 5, offset: 39947}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -12067,19 +12030,19 @@ var g = &grammar{ }, { name: "KeyWordChars", - pos: position{line: 1678, col: 1, offset: 40065}, + pos: position{line: 1673, col: 1, offset: 39954}, expr: &actionExpr{ - pos: position{line: 1678, col: 16, offset: 40080}, + pos: position{line: 1673, col: 16, offset: 39969}, run: (*parser).callonKeyWordChars1, expr: &choiceExpr{ - pos: position{line: 1678, col: 17, offset: 40081}, + pos: position{line: 1673, col: 17, offset: 39970}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1678, col: 17, offset: 40081}, + pos: position{line: 1673, col: 17, offset: 39970}, name: "UnicodeLetter", }, &charClassMatcher{ - pos: position{line: 1678, col: 33, offset: 40097}, + pos: position{line: 1673, col: 33, offset: 39986}, val: "[_.:/%#@~]", chars: []rune{'_', '.', ':', '/', '%', '#', '@', '~'}, ignoreCase: false, @@ -12093,31 +12056,31 @@ var g = &grammar{ }, { name: "KeyWordEsc", - pos: position{line: 1680, col: 1, offset: 40141}, + pos: position{line: 1675, col: 1, offset: 40030}, expr: &actionExpr{ - pos: position{line: 1680, col: 14, offset: 40154}, + pos: position{line: 1675, col: 14, offset: 40043}, run: (*parser).callonKeyWordEsc1, expr: &seqExpr{ - pos: position{line: 1680, col: 14, offset: 40154}, + pos: position{line: 1675, col: 14, offset: 40043}, exprs: []any{ &litMatcher{ - pos: position{line: 1680, col: 14, offset: 40154}, + pos: position{line: 1675, col: 14, offset: 40043}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1680, col: 19, offset: 40159}, + pos: position{line: 1675, col: 19, offset: 40048}, label: "s", expr: &choiceExpr{ - pos: position{line: 1680, col: 22, offset: 40162}, + pos: position{line: 1675, col: 22, offset: 40051}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1680, col: 22, offset: 40162}, + pos: position{line: 1675, col: 22, offset: 40051}, name: "KeywordEscape", }, &ruleRefExpr{ - pos: position{line: 1680, col: 38, offset: 40178}, + pos: position{line: 1675, col: 38, offset: 40067}, name: "EscapeSequence", }, }, @@ -12131,42 +12094,42 @@ var g = &grammar{ }, { name: "GlobPattern", - pos: position{line: 1682, col: 1, offset: 40213}, + pos: position{line: 1677, col: 1, offset: 40102}, expr: &actionExpr{ - pos: position{line: 1683, col: 5, offset: 40229}, + pos: position{line: 1678, col: 5, offset: 40118}, run: (*parser).callonGlobPattern1, expr: &seqExpr{ - pos: position{line: 1683, col: 5, offset: 40229}, + pos: position{line: 1678, col: 5, offset: 40118}, exprs: []any{ &andExpr{ - pos: position{line: 1683, col: 5, offset: 40229}, + pos: position{line: 1678, col: 5, offset: 40118}, expr: &ruleRefExpr{ - pos: position{line: 1683, col: 6, offset: 40230}, + pos: position{line: 1678, col: 6, offset: 40119}, name: "GlobProperStart", }, }, &andExpr{ - pos: position{line: 1683, col: 22, offset: 40246}, + pos: position{line: 1678, col: 22, offset: 40135}, expr: &ruleRefExpr{ - pos: position{line: 1683, col: 23, offset: 40247}, + pos: position{line: 1678, col: 23, offset: 40136}, name: "GlobHasStar", }, }, &labeledExpr{ - pos: position{line: 1683, col: 35, offset: 40259}, + pos: position{line: 1678, col: 35, offset: 40148}, label: "head", expr: &ruleRefExpr{ - pos: position{line: 1683, col: 40, offset: 40264}, + pos: position{line: 1678, col: 40, offset: 40153}, name: "GlobStart", }, }, &labeledExpr{ - pos: position{line: 1683, col: 50, offset: 40274}, + pos: position{line: 1678, col: 50, offset: 40163}, label: "tail", expr: &zeroOrMoreExpr{ - pos: position{line: 1683, col: 55, offset: 40279}, + pos: position{line: 1678, col: 55, offset: 40168}, expr: &ruleRefExpr{ - pos: position{line: 1683, col: 55, offset: 40279}, + pos: position{line: 1678, col: 55, offset: 40168}, name: "GlobRest", }, }, @@ -12179,28 +12142,28 @@ var g = &grammar{ }, { name: "GlobProperStart", - pos: position{line: 1687, col: 1, offset: 40348}, + pos: position{line: 1682, col: 1, offset: 40237}, expr: &choiceExpr{ - pos: position{line: 1687, col: 19, offset: 40366}, + pos: position{line: 1682, col: 19, offset: 40255}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1687, col: 19, offset: 40366}, + pos: position{line: 1682, col: 19, offset: 40255}, name: "KeyWordStart", }, &seqExpr{ - pos: position{line: 1687, col: 34, offset: 40381}, + pos: position{line: 1682, col: 34, offset: 40270}, exprs: []any{ &oneOrMoreExpr{ - pos: position{line: 1687, col: 34, offset: 40381}, + pos: position{line: 1682, col: 34, offset: 40270}, expr: &litMatcher{ - pos: position{line: 1687, col: 34, offset: 40381}, + pos: position{line: 1682, col: 34, offset: 40270}, val: "*", ignoreCase: false, want: "\"*\"", }, }, &ruleRefExpr{ - pos: position{line: 1687, col: 39, offset: 40386}, + pos: position{line: 1682, col: 39, offset: 40275}, name: "KeyWordRest", }, }, @@ -12212,19 +12175,19 @@ var g = &grammar{ }, { name: "GlobHasStar", - pos: position{line: 1688, col: 1, offset: 40398}, + pos: position{line: 1683, col: 1, offset: 40287}, expr: &seqExpr{ - pos: position{line: 1688, col: 15, offset: 40412}, + pos: position{line: 1683, col: 15, offset: 40301}, exprs: []any{ &zeroOrMoreExpr{ - pos: position{line: 1688, col: 15, offset: 40412}, + pos: position{line: 1683, col: 15, offset: 40301}, expr: &ruleRefExpr{ - pos: position{line: 1688, col: 15, offset: 40412}, + pos: position{line: 1683, col: 15, offset: 40301}, name: "KeyWordRest", }, }, &litMatcher{ - pos: position{line: 1688, col: 28, offset: 40425}, + pos: position{line: 1683, col: 28, offset: 40314}, val: "*", ignoreCase: false, want: "\"*\"", @@ -12236,23 +12199,23 @@ var g = &grammar{ }, { name: "GlobStart", - pos: position{line: 1690, col: 1, offset: 40430}, + pos: position{line: 1685, col: 1, offset: 40319}, expr: &choiceExpr{ - pos: position{line: 1691, col: 5, offset: 40444}, + pos: position{line: 1686, col: 5, offset: 40333}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1691, col: 5, offset: 40444}, + pos: position{line: 1686, col: 5, offset: 40333}, name: "KeyWordChars", }, &ruleRefExpr{ - pos: position{line: 1692, col: 5, offset: 40461}, + pos: position{line: 1687, col: 5, offset: 40350}, name: "GlobEsc", }, &actionExpr{ - pos: position{line: 1693, col: 5, offset: 40473}, + pos: position{line: 1688, col: 5, offset: 40362}, run: (*parser).callonGlobStart4, expr: &litMatcher{ - pos: position{line: 1693, col: 5, offset: 40473}, + pos: position{line: 1688, col: 5, offset: 40362}, val: "*", ignoreCase: false, want: "\"*\"", @@ -12265,16 +12228,16 @@ var g = &grammar{ }, { name: "GlobRest", - pos: position{line: 1695, col: 1, offset: 40498}, + pos: position{line: 1690, col: 1, offset: 40387}, expr: &choiceExpr{ - pos: position{line: 1696, col: 5, offset: 40511}, + pos: position{line: 1691, col: 5, offset: 40400}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1696, col: 5, offset: 40511}, + pos: position{line: 1691, col: 5, offset: 40400}, name: "GlobStart", }, &charClassMatcher{ - pos: position{line: 1697, col: 5, offset: 40525}, + pos: position{line: 1692, col: 5, offset: 40414}, val: "[0-9]", ranges: []rune{'0', '9'}, ignoreCase: false, @@ -12287,31 +12250,31 @@ var g = &grammar{ }, { name: "GlobEsc", - pos: position{line: 1699, col: 1, offset: 40532}, + pos: position{line: 1694, col: 1, offset: 40421}, expr: &actionExpr{ - pos: position{line: 1699, col: 11, offset: 40542}, + pos: position{line: 1694, col: 11, offset: 40431}, run: (*parser).callonGlobEsc1, expr: &seqExpr{ - pos: position{line: 1699, col: 11, offset: 40542}, + pos: position{line: 1694, col: 11, offset: 40431}, exprs: []any{ &litMatcher{ - pos: position{line: 1699, col: 11, offset: 40542}, + pos: position{line: 1694, col: 11, offset: 40431}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1699, col: 16, offset: 40547}, + pos: position{line: 1694, col: 16, offset: 40436}, label: "s", expr: &choiceExpr{ - pos: position{line: 1699, col: 19, offset: 40550}, + pos: position{line: 1694, col: 19, offset: 40439}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1699, col: 19, offset: 40550}, + pos: position{line: 1694, col: 19, offset: 40439}, name: "GlobEscape", }, &ruleRefExpr{ - pos: position{line: 1699, col: 32, offset: 40563}, + pos: position{line: 1694, col: 32, offset: 40452}, name: "EscapeSequence", }, }, @@ -12325,32 +12288,32 @@ var g = &grammar{ }, { name: "GlobEscape", - pos: position{line: 1701, col: 1, offset: 40598}, + pos: position{line: 1696, col: 1, offset: 40487}, expr: &choiceExpr{ - pos: position{line: 1702, col: 5, offset: 40613}, + pos: position{line: 1697, col: 5, offset: 40502}, alternatives: []any{ &actionExpr{ - pos: position{line: 1702, col: 5, offset: 40613}, + pos: position{line: 1697, col: 5, offset: 40502}, run: (*parser).callonGlobEscape2, expr: &litMatcher{ - pos: position{line: 1702, col: 5, offset: 40613}, + pos: position{line: 1697, col: 5, offset: 40502}, val: "=", ignoreCase: false, want: "\"=\"", }, }, &actionExpr{ - pos: position{line: 1703, col: 5, offset: 40641}, + pos: position{line: 1698, col: 5, offset: 40530}, run: (*parser).callonGlobEscape4, expr: &litMatcher{ - pos: position{line: 1703, col: 5, offset: 40641}, + pos: position{line: 1698, col: 5, offset: 40530}, val: "*", ignoreCase: false, want: "\"*\"", }, }, &charClassMatcher{ - pos: position{line: 1704, col: 5, offset: 40671}, + pos: position{line: 1699, col: 5, offset: 40560}, val: "[+-]", chars: []rune{'+', '-'}, ignoreCase: false, @@ -12363,57 +12326,57 @@ var g = &grammar{ }, { name: "SingleQuotedChar", - pos: position{line: 1706, col: 1, offset: 40677}, + pos: position{line: 1701, col: 1, offset: 40566}, expr: &choiceExpr{ - pos: position{line: 1707, col: 5, offset: 40698}, + pos: position{line: 1702, col: 5, offset: 40587}, alternatives: []any{ &actionExpr{ - pos: position{line: 1707, col: 5, offset: 40698}, + pos: position{line: 1702, col: 5, offset: 40587}, run: (*parser).callonSingleQuotedChar2, expr: &seqExpr{ - pos: position{line: 1707, col: 5, offset: 40698}, + pos: position{line: 1702, col: 5, offset: 40587}, exprs: []any{ ¬Expr{ - pos: position{line: 1707, col: 5, offset: 40698}, + pos: position{line: 1702, col: 5, offset: 40587}, expr: &choiceExpr{ - pos: position{line: 1707, col: 7, offset: 40700}, + pos: position{line: 1702, col: 7, offset: 40589}, alternatives: []any{ &litMatcher{ - pos: position{line: 1707, col: 7, offset: 40700}, + pos: position{line: 1702, col: 7, offset: 40589}, val: "'", ignoreCase: false, want: "\"'\"", }, &ruleRefExpr{ - pos: position{line: 1707, col: 13, offset: 40706}, + pos: position{line: 1702, col: 13, offset: 40595}, name: "EscapedChar", }, }, }, }, &anyMatcher{ - line: 1707, col: 26, offset: 40719, + line: 1702, col: 26, offset: 40608, }, }, }, }, &actionExpr{ - pos: position{line: 1708, col: 5, offset: 40756}, + pos: position{line: 1703, col: 5, offset: 40645}, run: (*parser).callonSingleQuotedChar9, expr: &seqExpr{ - pos: position{line: 1708, col: 5, offset: 40756}, + pos: position{line: 1703, col: 5, offset: 40645}, exprs: []any{ &litMatcher{ - pos: position{line: 1708, col: 5, offset: 40756}, + pos: position{line: 1703, col: 5, offset: 40645}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &labeledExpr{ - pos: position{line: 1708, col: 10, offset: 40761}, + pos: position{line: 1703, col: 10, offset: 40650}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1708, col: 12, offset: 40763}, + pos: position{line: 1703, col: 12, offset: 40652}, name: "EscapeSequence", }, }, @@ -12427,16 +12390,16 @@ var g = &grammar{ }, { name: "EscapeSequence", - pos: position{line: 1710, col: 1, offset: 40797}, + pos: position{line: 1705, col: 1, offset: 40686}, expr: &choiceExpr{ - pos: position{line: 1711, col: 5, offset: 40816}, + pos: position{line: 1706, col: 5, offset: 40705}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1711, col: 5, offset: 40816}, + pos: position{line: 1706, col: 5, offset: 40705}, name: "SingleCharEscape", }, &ruleRefExpr{ - pos: position{line: 1712, col: 5, offset: 40837}, + pos: position{line: 1707, col: 5, offset: 40726}, name: "UnicodeEscape", }, }, @@ -12446,87 +12409,87 @@ var g = &grammar{ }, { name: "SingleCharEscape", - pos: position{line: 1714, col: 1, offset: 40852}, + pos: position{line: 1709, col: 1, offset: 40741}, expr: &choiceExpr{ - pos: position{line: 1715, col: 5, offset: 40873}, + pos: position{line: 1710, col: 5, offset: 40762}, alternatives: []any{ &litMatcher{ - pos: position{line: 1715, col: 5, offset: 40873}, + pos: position{line: 1710, col: 5, offset: 40762}, val: "'", ignoreCase: false, want: "\"'\"", }, &actionExpr{ - pos: position{line: 1716, col: 5, offset: 40881}, + pos: position{line: 1711, col: 5, offset: 40770}, run: (*parser).callonSingleCharEscape3, expr: &litMatcher{ - pos: position{line: 1716, col: 5, offset: 40881}, + pos: position{line: 1711, col: 5, offset: 40770}, val: "\"", ignoreCase: false, want: "\"\\\"\"", }, }, &litMatcher{ - pos: position{line: 1717, col: 5, offset: 40921}, + pos: position{line: 1712, col: 5, offset: 40810}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &actionExpr{ - pos: position{line: 1718, col: 5, offset: 40930}, + pos: position{line: 1713, col: 5, offset: 40819}, run: (*parser).callonSingleCharEscape6, expr: &litMatcher{ - pos: position{line: 1718, col: 5, offset: 40930}, + pos: position{line: 1713, col: 5, offset: 40819}, val: "b", ignoreCase: false, want: "\"b\"", }, }, &actionExpr{ - pos: position{line: 1719, col: 5, offset: 40959}, + pos: position{line: 1714, col: 5, offset: 40848}, run: (*parser).callonSingleCharEscape8, expr: &litMatcher{ - pos: position{line: 1719, col: 5, offset: 40959}, + pos: position{line: 1714, col: 5, offset: 40848}, val: "f", ignoreCase: false, want: "\"f\"", }, }, &actionExpr{ - pos: position{line: 1720, col: 5, offset: 40988}, + pos: position{line: 1715, col: 5, offset: 40877}, run: (*parser).callonSingleCharEscape10, expr: &litMatcher{ - pos: position{line: 1720, col: 5, offset: 40988}, + pos: position{line: 1715, col: 5, offset: 40877}, val: "n", ignoreCase: false, want: "\"n\"", }, }, &actionExpr{ - pos: position{line: 1721, col: 5, offset: 41017}, + pos: position{line: 1716, col: 5, offset: 40906}, run: (*parser).callonSingleCharEscape12, expr: &litMatcher{ - pos: position{line: 1721, col: 5, offset: 41017}, + pos: position{line: 1716, col: 5, offset: 40906}, val: "r", ignoreCase: false, want: "\"r\"", }, }, &actionExpr{ - pos: position{line: 1722, col: 5, offset: 41046}, + pos: position{line: 1717, col: 5, offset: 40935}, run: (*parser).callonSingleCharEscape14, expr: &litMatcher{ - pos: position{line: 1722, col: 5, offset: 41046}, + pos: position{line: 1717, col: 5, offset: 40935}, val: "t", ignoreCase: false, want: "\"t\"", }, }, &actionExpr{ - pos: position{line: 1723, col: 5, offset: 41075}, + pos: position{line: 1718, col: 5, offset: 40964}, run: (*parser).callonSingleCharEscape16, expr: &litMatcher{ - pos: position{line: 1723, col: 5, offset: 41075}, + pos: position{line: 1718, col: 5, offset: 40964}, val: "v", ignoreCase: false, want: "\"v\"", @@ -12539,32 +12502,32 @@ var g = &grammar{ }, { name: "KeywordEscape", - pos: position{line: 1725, col: 1, offset: 41101}, + pos: position{line: 1720, col: 1, offset: 40990}, expr: &choiceExpr{ - pos: position{line: 1726, col: 5, offset: 41119}, + pos: position{line: 1721, col: 5, offset: 41008}, alternatives: []any{ &actionExpr{ - pos: position{line: 1726, col: 5, offset: 41119}, + pos: position{line: 1721, col: 5, offset: 41008}, run: (*parser).callonKeywordEscape2, expr: &litMatcher{ - pos: position{line: 1726, col: 5, offset: 41119}, + pos: position{line: 1721, col: 5, offset: 41008}, val: "=", ignoreCase: false, want: "\"=\"", }, }, &actionExpr{ - pos: position{line: 1727, col: 5, offset: 41147}, + pos: position{line: 1722, col: 5, offset: 41036}, run: (*parser).callonKeywordEscape4, expr: &litMatcher{ - pos: position{line: 1727, col: 5, offset: 41147}, + pos: position{line: 1722, col: 5, offset: 41036}, val: "*", ignoreCase: false, want: "\"*\"", }, }, &charClassMatcher{ - pos: position{line: 1728, col: 5, offset: 41175}, + pos: position{line: 1723, col: 5, offset: 41064}, val: "[+-]", chars: []rune{'+', '-'}, ignoreCase: false, @@ -12577,42 +12540,42 @@ var g = &grammar{ }, { name: "UnicodeEscape", - pos: position{line: 1730, col: 1, offset: 41181}, + pos: position{line: 1725, col: 1, offset: 41070}, expr: &choiceExpr{ - pos: position{line: 1731, col: 5, offset: 41199}, + pos: position{line: 1726, col: 5, offset: 41088}, alternatives: []any{ &actionExpr{ - pos: position{line: 1731, col: 5, offset: 41199}, + pos: position{line: 1726, col: 5, offset: 41088}, run: (*parser).callonUnicodeEscape2, expr: &seqExpr{ - pos: position{line: 1731, col: 5, offset: 41199}, + pos: position{line: 1726, col: 5, offset: 41088}, exprs: []any{ &litMatcher{ - pos: position{line: 1731, col: 5, offset: 41199}, + pos: position{line: 1726, col: 5, offset: 41088}, val: "u", ignoreCase: false, want: "\"u\"", }, &labeledExpr{ - pos: position{line: 1731, col: 9, offset: 41203}, + pos: position{line: 1726, col: 9, offset: 41092}, label: "chars", expr: &seqExpr{ - pos: position{line: 1731, col: 16, offset: 41210}, + pos: position{line: 1726, col: 16, offset: 41099}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1731, col: 16, offset: 41210}, + pos: position{line: 1726, col: 16, offset: 41099}, name: "HexDigit", }, &ruleRefExpr{ - pos: position{line: 1731, col: 25, offset: 41219}, + pos: position{line: 1726, col: 25, offset: 41108}, name: "HexDigit", }, &ruleRefExpr{ - pos: position{line: 1731, col: 34, offset: 41228}, + pos: position{line: 1726, col: 34, offset: 41117}, name: "HexDigit", }, &ruleRefExpr{ - pos: position{line: 1731, col: 43, offset: 41237}, + pos: position{line: 1726, col: 43, offset: 41126}, name: "HexDigit", }, }, @@ -12622,65 +12585,65 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1734, col: 5, offset: 41300}, + pos: position{line: 1729, col: 5, offset: 41189}, run: (*parser).callonUnicodeEscape11, expr: &seqExpr{ - pos: position{line: 1734, col: 5, offset: 41300}, + pos: position{line: 1729, col: 5, offset: 41189}, exprs: []any{ &litMatcher{ - pos: position{line: 1734, col: 5, offset: 41300}, + pos: position{line: 1729, col: 5, offset: 41189}, val: "u", ignoreCase: false, want: "\"u\"", }, &litMatcher{ - pos: position{line: 1734, col: 9, offset: 41304}, + pos: position{line: 1729, col: 9, offset: 41193}, val: "{", ignoreCase: false, want: "\"{\"", }, &labeledExpr{ - pos: position{line: 1734, col: 13, offset: 41308}, + pos: position{line: 1729, col: 13, offset: 41197}, label: "chars", expr: &seqExpr{ - pos: position{line: 1734, col: 20, offset: 41315}, + pos: position{line: 1729, col: 20, offset: 41204}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1734, col: 20, offset: 41315}, + pos: position{line: 1729, col: 20, offset: 41204}, name: "HexDigit", }, &zeroOrOneExpr{ - pos: position{line: 1734, col: 29, offset: 41324}, + pos: position{line: 1729, col: 29, offset: 41213}, expr: &ruleRefExpr{ - pos: position{line: 1734, col: 29, offset: 41324}, + pos: position{line: 1729, col: 29, offset: 41213}, name: "HexDigit", }, }, &zeroOrOneExpr{ - pos: position{line: 1734, col: 39, offset: 41334}, + pos: position{line: 1729, col: 39, offset: 41223}, expr: &ruleRefExpr{ - pos: position{line: 1734, col: 39, offset: 41334}, + pos: position{line: 1729, col: 39, offset: 41223}, name: "HexDigit", }, }, &zeroOrOneExpr{ - pos: position{line: 1734, col: 49, offset: 41344}, + pos: position{line: 1729, col: 49, offset: 41233}, expr: &ruleRefExpr{ - pos: position{line: 1734, col: 49, offset: 41344}, + pos: position{line: 1729, col: 49, offset: 41233}, name: "HexDigit", }, }, &zeroOrOneExpr{ - pos: position{line: 1734, col: 59, offset: 41354}, + pos: position{line: 1729, col: 59, offset: 41243}, expr: &ruleRefExpr{ - pos: position{line: 1734, col: 59, offset: 41354}, + pos: position{line: 1729, col: 59, offset: 41243}, name: "HexDigit", }, }, &zeroOrOneExpr{ - pos: position{line: 1734, col: 69, offset: 41364}, + pos: position{line: 1729, col: 69, offset: 41253}, expr: &ruleRefExpr{ - pos: position{line: 1734, col: 69, offset: 41364}, + pos: position{line: 1729, col: 69, offset: 41253}, name: "HexDigit", }, }, @@ -12688,7 +12651,7 @@ var g = &grammar{ }, }, &litMatcher{ - pos: position{line: 1734, col: 80, offset: 41375}, + pos: position{line: 1729, col: 80, offset: 41264}, val: "}", ignoreCase: false, want: "\"}\"", @@ -12703,37 +12666,37 @@ var g = &grammar{ }, { name: "RegexpPattern", - pos: position{line: 1738, col: 1, offset: 41429}, + pos: position{line: 1733, col: 1, offset: 41318}, expr: &actionExpr{ - pos: position{line: 1739, col: 5, offset: 41447}, + pos: position{line: 1734, col: 5, offset: 41336}, run: (*parser).callonRegexpPattern1, expr: &seqExpr{ - pos: position{line: 1739, col: 5, offset: 41447}, + pos: position{line: 1734, col: 5, offset: 41336}, exprs: []any{ &litMatcher{ - pos: position{line: 1739, col: 5, offset: 41447}, + pos: position{line: 1734, col: 5, offset: 41336}, val: "/", ignoreCase: false, want: "\"/\"", }, &labeledExpr{ - pos: position{line: 1739, col: 9, offset: 41451}, + pos: position{line: 1734, col: 9, offset: 41340}, label: "body", expr: &ruleRefExpr{ - pos: position{line: 1739, col: 14, offset: 41456}, + pos: position{line: 1734, col: 14, offset: 41345}, name: "RegexpBody", }, }, &litMatcher{ - pos: position{line: 1739, col: 25, offset: 41467}, + pos: position{line: 1734, col: 25, offset: 41356}, val: "/", ignoreCase: false, want: "\"/\"", }, ¬Expr{ - pos: position{line: 1739, col: 29, offset: 41471}, + pos: position{line: 1734, col: 29, offset: 41360}, expr: &ruleRefExpr{ - pos: position{line: 1739, col: 30, offset: 41472}, + pos: position{line: 1734, col: 30, offset: 41361}, name: "KeyWordStart", }, }, @@ -12745,33 +12708,33 @@ var g = &grammar{ }, { name: "RegexpBody", - pos: position{line: 1741, col: 1, offset: 41507}, + pos: position{line: 1736, col: 1, offset: 41396}, expr: &actionExpr{ - pos: position{line: 1742, col: 5, offset: 41522}, + pos: position{line: 1737, col: 5, offset: 41411}, run: (*parser).callonRegexpBody1, expr: &oneOrMoreExpr{ - pos: position{line: 1742, col: 5, offset: 41522}, + pos: position{line: 1737, col: 5, offset: 41411}, expr: &choiceExpr{ - pos: position{line: 1742, col: 6, offset: 41523}, + pos: position{line: 1737, col: 6, offset: 41412}, alternatives: []any{ &charClassMatcher{ - pos: position{line: 1742, col: 6, offset: 41523}, + pos: position{line: 1737, col: 6, offset: 41412}, val: "[^/\\\\]", chars: []rune{'/', '\\'}, ignoreCase: false, inverted: true, }, &seqExpr{ - pos: position{line: 1742, col: 15, offset: 41532}, + pos: position{line: 1737, col: 15, offset: 41421}, exprs: []any{ &litMatcher{ - pos: position{line: 1742, col: 15, offset: 41532}, + pos: position{line: 1737, col: 15, offset: 41421}, val: "\\", ignoreCase: false, want: "\"\\\\\"", }, &anyMatcher{ - line: 1742, col: 20, offset: 41537, + line: 1737, col: 20, offset: 41426, }, }, }, @@ -12784,9 +12747,9 @@ var g = &grammar{ }, { name: "EscapedChar", - pos: position{line: 1744, col: 1, offset: 41573}, + pos: position{line: 1739, col: 1, offset: 41462}, expr: &charClassMatcher{ - pos: position{line: 1745, col: 5, offset: 41589}, + pos: position{line: 1740, col: 5, offset: 41478}, val: "[\\x00-\\x1f\\\\]", chars: []rune{'\\'}, ranges: []rune{'\x00', '\x1f'}, @@ -12798,11 +12761,11 @@ var g = &grammar{ }, { name: "_", - pos: position{line: 1747, col: 1, offset: 41604}, + pos: position{line: 1742, col: 1, offset: 41493}, expr: &oneOrMoreExpr{ - pos: position{line: 1747, col: 5, offset: 41608}, + pos: position{line: 1742, col: 5, offset: 41497}, expr: &ruleRefExpr{ - pos: position{line: 1747, col: 5, offset: 41608}, + pos: position{line: 1742, col: 5, offset: 41497}, name: "AnySpace", }, }, @@ -12811,11 +12774,11 @@ var g = &grammar{ }, { name: "__", - pos: position{line: 1749, col: 1, offset: 41619}, + pos: position{line: 1744, col: 1, offset: 41508}, expr: &zeroOrMoreExpr{ - pos: position{line: 1749, col: 6, offset: 41624}, + pos: position{line: 1744, col: 6, offset: 41513}, expr: &ruleRefExpr{ - pos: position{line: 1749, col: 6, offset: 41624}, + pos: position{line: 1744, col: 6, offset: 41513}, name: "AnySpace", }, }, @@ -12824,20 +12787,20 @@ var g = &grammar{ }, { name: "AnySpace", - pos: position{line: 1751, col: 1, offset: 41635}, + pos: position{line: 1746, col: 1, offset: 41524}, expr: &choiceExpr{ - pos: position{line: 1752, col: 5, offset: 41648}, + pos: position{line: 1747, col: 5, offset: 41537}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1752, col: 5, offset: 41648}, + pos: position{line: 1747, col: 5, offset: 41537}, name: "WhiteSpace", }, &ruleRefExpr{ - pos: position{line: 1753, col: 5, offset: 41663}, + pos: position{line: 1748, col: 5, offset: 41552}, name: "LineTerminator", }, &ruleRefExpr{ - pos: position{line: 1754, col: 5, offset: 41682}, + pos: position{line: 1749, col: 5, offset: 41571}, name: "Comment", }, }, @@ -12847,32 +12810,32 @@ var g = &grammar{ }, { name: "UnicodeLetter", - pos: position{line: 1756, col: 1, offset: 41691}, + pos: position{line: 1751, col: 1, offset: 41580}, expr: &choiceExpr{ - pos: position{line: 1757, col: 5, offset: 41709}, + pos: position{line: 1752, col: 5, offset: 41598}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1757, col: 5, offset: 41709}, + pos: position{line: 1752, col: 5, offset: 41598}, name: "Lu", }, &ruleRefExpr{ - pos: position{line: 1758, col: 5, offset: 41716}, + pos: position{line: 1753, col: 5, offset: 41605}, name: "Ll", }, &ruleRefExpr{ - pos: position{line: 1759, col: 5, offset: 41723}, + pos: position{line: 1754, col: 5, offset: 41612}, name: "Lt", }, &ruleRefExpr{ - pos: position{line: 1760, col: 5, offset: 41730}, + pos: position{line: 1755, col: 5, offset: 41619}, name: "Lm", }, &ruleRefExpr{ - pos: position{line: 1761, col: 5, offset: 41737}, + pos: position{line: 1756, col: 5, offset: 41626}, name: "Lo", }, &ruleRefExpr{ - pos: position{line: 1762, col: 5, offset: 41744}, + pos: position{line: 1757, col: 5, offset: 41633}, name: "Nl", }, }, @@ -12882,16 +12845,16 @@ var g = &grammar{ }, { name: "UnicodeCombiningMark", - pos: position{line: 1764, col: 1, offset: 41748}, + pos: position{line: 1759, col: 1, offset: 41637}, expr: &choiceExpr{ - pos: position{line: 1765, col: 5, offset: 41773}, + pos: position{line: 1760, col: 5, offset: 41662}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1765, col: 5, offset: 41773}, + pos: position{line: 1760, col: 5, offset: 41662}, name: "Mn", }, &ruleRefExpr{ - pos: position{line: 1766, col: 5, offset: 41780}, + pos: position{line: 1761, col: 5, offset: 41669}, name: "Mc", }, }, @@ -12901,9 +12864,9 @@ var g = &grammar{ }, { name: "UnicodeDigit", - pos: position{line: 1768, col: 1, offset: 41784}, + pos: position{line: 1763, col: 1, offset: 41673}, expr: &ruleRefExpr{ - pos: position{line: 1769, col: 5, offset: 41801}, + pos: position{line: 1764, col: 5, offset: 41690}, name: "Nd", }, leader: false, @@ -12911,9 +12874,9 @@ var g = &grammar{ }, { name: "UnicodeConnectorPunctuation", - pos: position{line: 1771, col: 1, offset: 41805}, + pos: position{line: 1766, col: 1, offset: 41694}, expr: &ruleRefExpr{ - pos: position{line: 1772, col: 5, offset: 41837}, + pos: position{line: 1767, col: 5, offset: 41726}, name: "Pc", }, leader: false, @@ -12921,9 +12884,9 @@ var g = &grammar{ }, { name: "Ll", - pos: position{line: 1778, col: 1, offset: 42018}, + pos: position{line: 1773, col: 1, offset: 41907}, expr: &charClassMatcher{ - pos: position{line: 1778, col: 6, offset: 42023}, + pos: position{line: 1773, col: 6, offset: 41912}, val: "[\\u0061-\\u007A\\u00B5\\u00DF-\\u00F6\\u00F8-\\u00FF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137-\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148-\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C-\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA-\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9-\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC-\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF-\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F-\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0-\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB-\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE-\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0560-\\u0588\\u10D0-\\u10FA\\u10FD-\\u10FF\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6-\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FC7\\u1FD0-\\u1FD3\\u1FD6-\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6-\\u1FF7\\u210A\\u210E-\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C-\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65-\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73-\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3-\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7AF\\uA7B5\\uA7B7\\uA7B9\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A]", chars: []rune{'µ', 'ā', 'ă', 'ą', 'ć', 'ĉ', 'ċ', 'č', 'ď', 'đ', 'ē', 'ĕ', 'ė', 'ę', 'ě', 'ĝ', 'ğ', 'ġ', 'ģ', 'ĥ', 'ħ', 'ĩ', 'ī', 'ĭ', 'į', 'ı', 'ij', 'ĵ', 'ĺ', 'ļ', 'ľ', 'ŀ', 'ł', 'ń', 'ņ', 'ŋ', 'ō', 'ŏ', 'ő', 'œ', 'ŕ', 'ŗ', 'ř', 'ś', 'ŝ', 'ş', 'š', 'ţ', 'ť', 'ŧ', 'ũ', 'ū', 'ŭ', 'ů', 'ű', 'ų', 'ŵ', 'ŷ', 'ź', 'ż', 'ƃ', 'ƅ', 'ƈ', 'ƒ', 'ƕ', 'ƞ', 'ơ', 'ƣ', 'ƥ', 'ƨ', 'ƭ', 'ư', 'ƴ', 'ƶ', 'dž', 'lj', 'nj', 'ǎ', 'ǐ', 'ǒ', 'ǔ', 'ǖ', 'ǘ', 'ǚ', 'ǟ', 'ǡ', 'ǣ', 'ǥ', 'ǧ', 'ǩ', 'ǫ', 'ǭ', 'dz', 'ǵ', 'ǹ', 'ǻ', 'ǽ', 'ǿ', 'ȁ', 'ȃ', 'ȅ', 'ȇ', 'ȉ', 'ȋ', 'ȍ', 'ȏ', 'ȑ', 'ȓ', 'ȕ', 'ȗ', 'ș', 'ț', 'ȝ', 'ȟ', 'ȡ', 'ȣ', 'ȥ', 'ȧ', 'ȩ', 'ȫ', 'ȭ', 'ȯ', 'ȱ', 'ȼ', 'ɂ', 'ɇ', 'ɉ', 'ɋ', 'ɍ', 'ͱ', 'ͳ', 'ͷ', 'ΐ', 'ϙ', 'ϛ', 'ϝ', 'ϟ', 'ϡ', 'ϣ', 'ϥ', 'ϧ', 'ϩ', 'ϫ', 'ϭ', 'ϵ', 'ϸ', 'ѡ', 'ѣ', 'ѥ', 'ѧ', 'ѩ', 'ѫ', 'ѭ', 'ѯ', 'ѱ', 'ѳ', 'ѵ', 'ѷ', 'ѹ', 'ѻ', 'ѽ', 'ѿ', 'ҁ', 'ҋ', 'ҍ', 'ҏ', 'ґ', 'ғ', 'ҕ', 'җ', 'ҙ', 'қ', 'ҝ', 'ҟ', 'ҡ', 'ң', 'ҥ', 'ҧ', 'ҩ', 'ҫ', 'ҭ', 'ү', 'ұ', 'ҳ', 'ҵ', 'ҷ', 'ҹ', 'һ', 'ҽ', 'ҿ', 'ӂ', 'ӄ', 'ӆ', 'ӈ', 'ӊ', 'ӌ', 'ӑ', 'ӓ', 'ӕ', 'ӗ', 'ә', 'ӛ', 'ӝ', 'ӟ', 'ӡ', 'ӣ', 'ӥ', 'ӧ', 'ө', 'ӫ', 'ӭ', 'ӯ', 'ӱ', 'ӳ', 'ӵ', 'ӷ', 'ӹ', 'ӻ', 'ӽ', 'ӿ', 'ԁ', 'ԃ', 'ԅ', 'ԇ', 'ԉ', 'ԋ', 'ԍ', 'ԏ', 'ԑ', 'ԓ', 'ԕ', 'ԗ', 'ԙ', 'ԛ', 'ԝ', 'ԟ', 'ԡ', 'ԣ', 'ԥ', 'ԧ', 'ԩ', 'ԫ', 'ԭ', 'ԯ', 'ḁ', 'ḃ', 'ḅ', 'ḇ', 'ḉ', 'ḋ', 'ḍ', 'ḏ', 'ḑ', 'ḓ', 'ḕ', 'ḗ', 'ḙ', 'ḛ', 'ḝ', 'ḟ', 'ḡ', 'ḣ', 'ḥ', 'ḧ', 'ḩ', 'ḫ', 'ḭ', 'ḯ', 'ḱ', 'ḳ', 'ḵ', 'ḷ', 'ḹ', 'ḻ', 'ḽ', 'ḿ', 'ṁ', 'ṃ', 'ṅ', 'ṇ', 'ṉ', 'ṋ', 'ṍ', 'ṏ', 'ṑ', 'ṓ', 'ṕ', 'ṗ', 'ṙ', 'ṛ', 'ṝ', 'ṟ', 'ṡ', 'ṣ', 'ṥ', 'ṧ', 'ṩ', 'ṫ', 'ṭ', 'ṯ', 'ṱ', 'ṳ', 'ṵ', 'ṷ', 'ṹ', 'ṻ', 'ṽ', 'ṿ', 'ẁ', 'ẃ', 'ẅ', 'ẇ', 'ẉ', 'ẋ', 'ẍ', 'ẏ', 'ẑ', 'ẓ', 'ẟ', 'ạ', 'ả', 'ấ', 'ầ', 'ẩ', 'ẫ', 'ậ', 'ắ', 'ằ', 'ẳ', 'ẵ', 'ặ', 'ẹ', 'ẻ', 'ẽ', 'ế', 'ề', 'ể', 'ễ', 'ệ', 'ỉ', 'ị', 'ọ', 'ỏ', 'ố', 'ồ', 'ổ', 'ỗ', 'ộ', 'ớ', 'ờ', 'ở', 'ỡ', 'ợ', 'ụ', 'ủ', 'ứ', 'ừ', 'ử', 'ữ', 'ự', 'ỳ', 'ỵ', 'ỷ', 'ỹ', 'ỻ', 'ỽ', 'ι', 'ℊ', 'ℓ', 'ℯ', 'ℴ', 'ℹ', 'ⅎ', 'ↄ', 'ⱡ', 'ⱨ', 'ⱪ', 'ⱬ', 'ⱱ', 'ⲁ', 'ⲃ', 'ⲅ', 'ⲇ', 'ⲉ', 'ⲋ', 'ⲍ', 'ⲏ', 'ⲑ', 'ⲓ', 'ⲕ', 'ⲗ', 'ⲙ', 'ⲛ', 'ⲝ', 'ⲟ', 'ⲡ', 'ⲣ', 'ⲥ', 'ⲧ', 'ⲩ', 'ⲫ', 'ⲭ', 'ⲯ', 'ⲱ', 'ⲳ', 'ⲵ', 'ⲷ', 'ⲹ', 'ⲻ', 'ⲽ', 'ⲿ', 'ⳁ', 'ⳃ', 'ⳅ', 'ⳇ', 'ⳉ', 'ⳋ', 'ⳍ', 'ⳏ', 'ⳑ', 'ⳓ', 'ⳕ', 'ⳗ', 'ⳙ', 'ⳛ', 'ⳝ', 'ⳟ', 'ⳡ', 'ⳬ', 'ⳮ', 'ⳳ', 'ⴧ', 'ⴭ', 'ꙁ', 'ꙃ', 'ꙅ', 'ꙇ', 'ꙉ', 'ꙋ', 'ꙍ', 'ꙏ', 'ꙑ', 'ꙓ', 'ꙕ', 'ꙗ', 'ꙙ', 'ꙛ', 'ꙝ', 'ꙟ', 'ꙡ', 'ꙣ', 'ꙥ', 'ꙧ', 'ꙩ', 'ꙫ', 'ꙭ', 'ꚁ', 'ꚃ', 'ꚅ', 'ꚇ', 'ꚉ', 'ꚋ', 'ꚍ', 'ꚏ', 'ꚑ', 'ꚓ', 'ꚕ', 'ꚗ', 'ꚙ', 'ꚛ', 'ꜣ', 'ꜥ', 'ꜧ', 'ꜩ', 'ꜫ', 'ꜭ', 'ꜳ', 'ꜵ', 'ꜷ', 'ꜹ', 'ꜻ', 'ꜽ', 'ꜿ', 'ꝁ', 'ꝃ', 'ꝅ', 'ꝇ', 'ꝉ', 'ꝋ', 'ꝍ', 'ꝏ', 'ꝑ', 'ꝓ', 'ꝕ', 'ꝗ', 'ꝙ', 'ꝛ', 'ꝝ', 'ꝟ', 'ꝡ', 'ꝣ', 'ꝥ', 'ꝧ', 'ꝩ', 'ꝫ', 'ꝭ', 'ꝯ', 'ꝺ', 'ꝼ', 'ꝿ', 'ꞁ', 'ꞃ', 'ꞅ', 'ꞇ', 'ꞌ', 'ꞎ', 'ꞑ', 'ꞗ', 'ꞙ', 'ꞛ', 'ꞝ', 'ꞟ', 'ꞡ', 'ꞣ', 'ꞥ', 'ꞧ', 'ꞩ', 'ꞯ', 'ꞵ', 'ꞷ', 'ꞹ', 'ꟺ'}, ranges: []rune{'a', 'z', 'ß', 'ö', 'ø', 'ÿ', 'ķ', 'ĸ', 'ň', 'ʼn', 'ž', 'ƀ', 'ƌ', 'ƍ', 'ƙ', 'ƛ', 'ƪ', 'ƫ', 'ƹ', 'ƺ', 'ƽ', 'ƿ', 'ǜ', 'ǝ', 'ǯ', 'ǰ', 'ȳ', 'ȹ', 'ȿ', 'ɀ', 'ɏ', 'ʓ', 'ʕ', 'ʯ', 'ͻ', 'ͽ', 'ά', 'ώ', 'ϐ', 'ϑ', 'ϕ', 'ϗ', 'ϯ', 'ϳ', 'ϻ', 'ϼ', 'а', 'џ', 'ӎ', 'ӏ', 'ՠ', 'ֈ', 'ა', 'ჺ', 'ჽ', 'ჿ', 'ᏸ', 'ᏽ', 'ᲀ', 'ᲈ', 'ᴀ', 'ᴫ', 'ᵫ', 'ᵷ', 'ᵹ', 'ᶚ', 'ẕ', 'ẝ', 'ỿ', 'ἇ', 'ἐ', 'ἕ', 'ἠ', 'ἧ', 'ἰ', 'ἷ', 'ὀ', 'ὅ', 'ὐ', 'ὗ', 'ὠ', 'ὧ', 'ὰ', 'ώ', 'ᾀ', 'ᾇ', 'ᾐ', 'ᾗ', 'ᾠ', 'ᾧ', 'ᾰ', 'ᾴ', 'ᾶ', 'ᾷ', 'ῂ', 'ῄ', 'ῆ', 'ῇ', 'ῐ', 'ΐ', 'ῖ', 'ῗ', 'ῠ', 'ῧ', 'ῲ', 'ῴ', 'ῶ', 'ῷ', 'ℎ', 'ℏ', 'ℼ', 'ℽ', 'ⅆ', 'ⅉ', 'ⰰ', 'ⱞ', 'ⱥ', 'ⱦ', 'ⱳ', 'ⱴ', 'ⱶ', 'ⱻ', 'ⳣ', 'ⳤ', 'ⴀ', 'ⴥ', 'ꜯ', 'ꜱ', 'ꝱ', 'ꝸ', 'ꞓ', 'ꞕ', 'ꬰ', 'ꭚ', 'ꭠ', 'ꭥ', 'ꭰ', 'ꮿ', 'ff', 'st', 'ﬓ', 'ﬗ', 'a', 'z'}, @@ -12935,9 +12898,9 @@ var g = &grammar{ }, { name: "Lm", - pos: position{line: 1781, col: 1, offset: 46175}, + pos: position{line: 1776, col: 1, offset: 46064}, expr: &charClassMatcher{ - pos: position{line: 1781, col: 6, offset: 46180}, + pos: position{line: 1776, col: 6, offset: 46069}, val: "[\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5-\\u06E6\\u07F4-\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C-\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D-\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C-\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8-\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3-\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E-\\uFF9F]", chars: []rune{'ˬ', 'ˮ', 'ʹ', 'ͺ', 'ՙ', 'ـ', 'ߺ', 'ࠚ', 'ࠤ', 'ࠨ', 'ॱ', 'ๆ', 'ໆ', 'ჼ', 'ៗ', 'ᡃ', 'ᪧ', 'ᵸ', 'ⁱ', 'ⁿ', 'ⵯ', 'ⸯ', '々', '〻', 'ꀕ', 'ꘌ', 'ꙿ', 'ꝰ', 'ꞈ', 'ꧏ', 'ꧦ', 'ꩰ', 'ꫝ', 'ー'}, ranges: []rune{'ʰ', 'ˁ', 'ˆ', 'ˑ', 'ˠ', 'ˤ', 'ۥ', 'ۦ', 'ߴ', 'ߵ', 'ᱸ', 'ᱽ', 'ᴬ', 'ᵪ', 'ᶛ', 'ᶿ', 'ₐ', 'ₜ', 'ⱼ', 'ⱽ', '〱', '〵', 'ゝ', 'ゞ', 'ー', 'ヾ', 'ꓸ', 'ꓽ', 'ꚜ', 'ꚝ', 'ꜗ', 'ꜟ', 'ꟸ', 'ꟹ', 'ꫳ', 'ꫴ', 'ꭜ', 'ꭟ', '゙', '゚'}, @@ -12949,9 +12912,9 @@ var g = &grammar{ }, { name: "Lo", - pos: position{line: 1784, col: 1, offset: 46665}, + pos: position{line: 1779, col: 1, offset: 46554}, expr: &charClassMatcher{ - pos: position{line: 1784, col: 6, offset: 46670}, + pos: position{line: 1779, col: 6, offset: 46559}, val: "[\\u00AA\\u00BA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09F0-\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0-\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60-\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0-\\u0CE1\\u0CF1-\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E45\\u0E81-\\u0E82\\u0E84\\u0E87-\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA-\\u0EAB\\u0EAD-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065-\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1100-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE-\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5-\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A-\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD-\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]", chars: []rune{'ª', 'º', 'ƻ', 'ʔ', 'ە', 'ۿ', 'ܐ', 'ޱ', 'ऽ', 'ॐ', 'ল', 'ঽ', 'ৎ', 'ৼ', 'ਫ਼', 'ઽ', 'ૐ', 'ૹ', 'ଽ', 'ୱ', 'ஃ', 'ஜ', 'ௐ', 'ఽ', 'ಀ', 'ಽ', 'ೞ', 'ഽ', 'ൎ', 'ල', 'ຄ', 'ຊ', 'ຍ', 'ລ', 'ວ', 'ຽ', 'ༀ', 'ဿ', 'ၡ', 'ႎ', 'ቘ', 'ዀ', 'ៜ', 'ᢪ', '〆', '〼', 'ゟ', 'ヿ', 'ꙮ', 'ꞏ', 'ꟷ', 'ꣻ', 'ꩺ', 'ꪱ', 'ꫀ', 'ꫂ', 'ꫲ', 'יִ', 'מּ'}, ranges: []rune{'ǀ', 'ǃ', 'א', 'ת', 'ׯ', 'ײ', 'ؠ', 'ؿ', 'ف', 'ي', 'ٮ', 'ٯ', 'ٱ', 'ۓ', 'ۮ', 'ۯ', 'ۺ', 'ۼ', 'ܒ', 'ܯ', 'ݍ', 'ޥ', 'ߊ', 'ߪ', 'ࠀ', 'ࠕ', 'ࡀ', 'ࡘ', 'ࡠ', 'ࡪ', 'ࢠ', 'ࢴ', 'ࢶ', 'ࢽ', 'ऄ', 'ह', 'क़', 'ॡ', 'ॲ', 'ঀ', 'অ', 'ঌ', 'এ', 'ঐ', 'ও', 'ন', 'প', 'র', 'শ', 'হ', 'ড়', 'ঢ়', 'য়', 'ৡ', 'ৰ', 'ৱ', 'ਅ', 'ਊ', 'ਏ', 'ਐ', 'ਓ', 'ਨ', 'ਪ', 'ਰ', 'ਲ', 'ਲ਼', 'ਵ', 'ਸ਼', 'ਸ', 'ਹ', 'ਖ਼', 'ੜ', 'ੲ', 'ੴ', 'અ', 'ઍ', 'એ', 'ઑ', 'ઓ', 'ન', 'પ', 'ર', 'લ', 'ળ', 'વ', 'હ', 'ૠ', 'ૡ', 'ଅ', 'ଌ', 'ଏ', 'ଐ', 'ଓ', 'ନ', 'ପ', 'ର', 'ଲ', 'ଳ', 'ଵ', 'ହ', 'ଡ଼', 'ଢ଼', 'ୟ', 'ୡ', 'அ', 'ஊ', 'எ', 'ஐ', 'ஒ', 'க', 'ங', 'ச', 'ஞ', 'ட', 'ண', 'த', 'ந', 'ப', 'ம', 'ஹ', 'అ', 'ఌ', 'ఎ', 'ఐ', 'ఒ', 'న', 'ప', 'హ', 'ౘ', 'ౚ', 'ౠ', 'ౡ', 'ಅ', 'ಌ', 'ಎ', 'ಐ', 'ಒ', 'ನ', 'ಪ', 'ಳ', 'ವ', 'ಹ', 'ೠ', 'ೡ', 'ೱ', 'ೲ', 'അ', 'ഌ', 'എ', 'ഐ', 'ഒ', 'ഺ', 'ൔ', 'ൖ', 'ൟ', 'ൡ', 'ൺ', 'ൿ', 'අ', 'ඖ', 'ක', 'න', 'ඳ', 'ර', 'ව', 'ෆ', 'ก', 'ะ', 'า', 'ำ', 'เ', 'ๅ', 'ກ', 'ຂ', 'ງ', 'ຈ', 'ດ', 'ທ', 'ນ', 'ຟ', 'ມ', 'ຣ', 'ສ', 'ຫ', 'ອ', 'ະ', 'າ', 'ຳ', 'ເ', 'ໄ', 'ໜ', 'ໟ', 'ཀ', 'ཇ', 'ཉ', 'ཬ', 'ྈ', 'ྌ', 'က', 'ဪ', 'ၐ', 'ၕ', 'ၚ', 'ၝ', 'ၥ', 'ၦ', 'ၮ', 'ၰ', 'ၵ', 'ႁ', 'ᄀ', 'ቈ', 'ቊ', 'ቍ', 'ቐ', 'ቖ', 'ቚ', 'ቝ', 'በ', 'ኈ', 'ኊ', 'ኍ', 'ነ', 'ኰ', 'ኲ', 'ኵ', 'ኸ', 'ኾ', 'ዂ', 'ዅ', 'ወ', 'ዖ', 'ዘ', 'ጐ', 'ጒ', 'ጕ', 'ጘ', 'ፚ', 'ᎀ', 'ᎏ', 'ᐁ', 'ᙬ', 'ᙯ', 'ᙿ', 'ᚁ', 'ᚚ', 'ᚠ', 'ᛪ', 'ᛱ', 'ᛸ', 'ᜀ', 'ᜌ', 'ᜎ', 'ᜑ', 'ᜠ', 'ᜱ', 'ᝀ', 'ᝑ', 'ᝠ', 'ᝬ', 'ᝮ', 'ᝰ', 'ក', 'ឳ', 'ᠠ', 'ᡂ', 'ᡄ', 'ᡸ', 'ᢀ', 'ᢄ', 'ᢇ', 'ᢨ', 'ᢰ', 'ᣵ', 'ᤀ', 'ᤞ', 'ᥐ', 'ᥭ', 'ᥰ', 'ᥴ', 'ᦀ', 'ᦫ', 'ᦰ', 'ᧉ', 'ᨀ', 'ᨖ', 'ᨠ', 'ᩔ', 'ᬅ', 'ᬳ', 'ᭅ', 'ᭋ', 'ᮃ', 'ᮠ', 'ᮮ', 'ᮯ', 'ᮺ', 'ᯥ', 'ᰀ', 'ᰣ', 'ᱍ', 'ᱏ', 'ᱚ', 'ᱷ', 'ᳩ', 'ᳬ', 'ᳮ', 'ᳱ', 'ᳵ', 'ᳶ', 'ℵ', 'ℸ', 'ⴰ', 'ⵧ', 'ⶀ', 'ⶖ', 'ⶠ', 'ⶦ', 'ⶨ', 'ⶮ', 'ⶰ', 'ⶶ', 'ⶸ', 'ⶾ', 'ⷀ', 'ⷆ', 'ⷈ', 'ⷎ', 'ⷐ', 'ⷖ', 'ⷘ', 'ⷞ', 'ぁ', 'ゖ', 'ァ', 'ヺ', 'ㄅ', 'ㄯ', 'ㄱ', 'ㆎ', 'ㆠ', 'ㆺ', 'ㇰ', 'ㇿ', '㐀', '䶵', '一', '鿯', 'ꀀ', 'ꀔ', 'ꀖ', 'ꒌ', 'ꓐ', 'ꓷ', 'ꔀ', 'ꘋ', 'ꘐ', 'ꘟ', 'ꘪ', 'ꘫ', 'ꚠ', 'ꛥ', 'ꟻ', 'ꠁ', 'ꠃ', 'ꠅ', 'ꠇ', 'ꠊ', 'ꠌ', 'ꠢ', 'ꡀ', 'ꡳ', 'ꢂ', 'ꢳ', 'ꣲ', 'ꣷ', 'ꣽ', 'ꣾ', 'ꤊ', 'ꤥ', 'ꤰ', 'ꥆ', 'ꥠ', 'ꥼ', 'ꦄ', 'ꦲ', 'ꧠ', 'ꧤ', 'ꧧ', 'ꧯ', 'ꧺ', 'ꧾ', 'ꨀ', 'ꨨ', 'ꩀ', 'ꩂ', 'ꩄ', 'ꩋ', 'ꩠ', 'ꩯ', 'ꩱ', 'ꩶ', 'ꩾ', 'ꪯ', 'ꪵ', 'ꪶ', 'ꪹ', 'ꪽ', 'ꫛ', 'ꫜ', 'ꫠ', 'ꫪ', 'ꬁ', 'ꬆ', 'ꬉ', 'ꬎ', 'ꬑ', 'ꬖ', 'ꬠ', 'ꬦ', 'ꬨ', 'ꬮ', 'ꯀ', 'ꯢ', '가', '힣', 'ힰ', 'ퟆ', 'ퟋ', 'ퟻ', '豈', '舘', '並', '龎', 'ײַ', 'ﬨ', 'שׁ', 'זּ', 'טּ', 'לּ', 'נּ', 'סּ', 'ףּ', 'פּ', 'צּ', 'ﮱ', 'ﯓ', 'ﴽ', 'ﵐ', 'ﶏ', 'ﶒ', 'ﷇ', 'ﷰ', 'ﷻ', 'ﹰ', 'ﹴ', 'ﹶ', 'ﻼ', 'ヲ', 'ッ', 'ア', 'ン', 'ᅠ', 'ᄒ', 'ᅡ', 'ᅦ', 'ᅧ', 'ᅬ', 'ᅭ', 'ᅲ', 'ᅳ', 'ᅵ'}, @@ -12963,9 +12926,9 @@ var g = &grammar{ }, { name: "Lt", - pos: position{line: 1787, col: 1, offset: 50117}, + pos: position{line: 1782, col: 1, offset: 50006}, expr: &charClassMatcher{ - pos: position{line: 1787, col: 6, offset: 50122}, + pos: position{line: 1782, col: 6, offset: 50011}, val: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC]", chars: []rune{'Dž', 'Lj', 'Nj', 'Dz', 'ᾼ', 'ῌ', 'ῼ'}, ranges: []rune{'ᾈ', 'ᾏ', 'ᾘ', 'ᾟ', 'ᾨ', 'ᾯ'}, @@ -12977,9 +12940,9 @@ var g = &grammar{ }, { name: "Lu", - pos: position{line: 1790, col: 1, offset: 50228}, + pos: position{line: 1785, col: 1, offset: 50117}, expr: &charClassMatcher{ - pos: position{line: 1790, col: 6, offset: 50233}, + pos: position{line: 1785, col: 6, offset: 50122}, val: "[\\u0041-\\u005A\\u00C0-\\u00D6\\u00D8-\\u00DE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178-\\u0179\\u017B\\u017D\\u0181-\\u0182\\u0184\\u0186-\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193-\\u0194\\u0196-\\u0198\\u019C-\\u019D\\u019F-\\u01A0\\u01A2\\u01A4\\u01A6-\\u01A7\\u01A9\\u01AC\\u01AE-\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7-\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A-\\u023B\\u023D-\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9-\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0-\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E-\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D-\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uA7B8\\uFF21-\\uFF3A]", chars: []rune{'Ā', 'Ă', 'Ą', 'Ć', 'Ĉ', 'Ċ', 'Č', 'Ď', 'Đ', 'Ē', 'Ĕ', 'Ė', 'Ę', 'Ě', 'Ĝ', 'Ğ', 'Ġ', 'Ģ', 'Ĥ', 'Ħ', 'Ĩ', 'Ī', 'Ĭ', 'Į', 'İ', 'IJ', 'Ĵ', 'Ķ', 'Ĺ', 'Ļ', 'Ľ', 'Ŀ', 'Ł', 'Ń', 'Ņ', 'Ň', 'Ŋ', 'Ō', 'Ŏ', 'Ő', 'Œ', 'Ŕ', 'Ŗ', 'Ř', 'Ś', 'Ŝ', 'Ş', 'Š', 'Ţ', 'Ť', 'Ŧ', 'Ũ', 'Ū', 'Ŭ', 'Ů', 'Ű', 'Ų', 'Ŵ', 'Ŷ', 'Ż', 'Ž', 'Ƅ', 'Ƣ', 'Ƥ', 'Ʃ', 'Ƭ', 'Ƶ', 'Ƽ', 'DŽ', 'LJ', 'NJ', 'Ǎ', 'Ǐ', 'Ǒ', 'Ǔ', 'Ǖ', 'Ǘ', 'Ǚ', 'Ǜ', 'Ǟ', 'Ǡ', 'Ǣ', 'Ǥ', 'Ǧ', 'Ǩ', 'Ǫ', 'Ǭ', 'Ǯ', 'DZ', 'Ǵ', 'Ǻ', 'Ǽ', 'Ǿ', 'Ȁ', 'Ȃ', 'Ȅ', 'Ȇ', 'Ȉ', 'Ȋ', 'Ȍ', 'Ȏ', 'Ȑ', 'Ȓ', 'Ȕ', 'Ȗ', 'Ș', 'Ț', 'Ȝ', 'Ȟ', 'Ƞ', 'Ȣ', 'Ȥ', 'Ȧ', 'Ȩ', 'Ȫ', 'Ȭ', 'Ȯ', 'Ȱ', 'Ȳ', 'Ɂ', 'Ɉ', 'Ɋ', 'Ɍ', 'Ɏ', 'Ͱ', 'Ͳ', 'Ͷ', 'Ϳ', 'Ά', 'Ό', 'Ϗ', 'Ϙ', 'Ϛ', 'Ϝ', 'Ϟ', 'Ϡ', 'Ϣ', 'Ϥ', 'Ϧ', 'Ϩ', 'Ϫ', 'Ϭ', 'Ϯ', 'ϴ', 'Ϸ', 'Ѡ', 'Ѣ', 'Ѥ', 'Ѧ', 'Ѩ', 'Ѫ', 'Ѭ', 'Ѯ', 'Ѱ', 'Ѳ', 'Ѵ', 'Ѷ', 'Ѹ', 'Ѻ', 'Ѽ', 'Ѿ', 'Ҁ', 'Ҋ', 'Ҍ', 'Ҏ', 'Ґ', 'Ғ', 'Ҕ', 'Җ', 'Ҙ', 'Қ', 'Ҝ', 'Ҟ', 'Ҡ', 'Ң', 'Ҥ', 'Ҧ', 'Ҩ', 'Ҫ', 'Ҭ', 'Ү', 'Ұ', 'Ҳ', 'Ҵ', 'Ҷ', 'Ҹ', 'Һ', 'Ҽ', 'Ҿ', 'Ӄ', 'Ӆ', 'Ӈ', 'Ӊ', 'Ӌ', 'Ӎ', 'Ӑ', 'Ӓ', 'Ӕ', 'Ӗ', 'Ә', 'Ӛ', 'Ӝ', 'Ӟ', 'Ӡ', 'Ӣ', 'Ӥ', 'Ӧ', 'Ө', 'Ӫ', 'Ӭ', 'Ӯ', 'Ӱ', 'Ӳ', 'Ӵ', 'Ӷ', 'Ӹ', 'Ӻ', 'Ӽ', 'Ӿ', 'Ԁ', 'Ԃ', 'Ԅ', 'Ԇ', 'Ԉ', 'Ԋ', 'Ԍ', 'Ԏ', 'Ԑ', 'Ԓ', 'Ԕ', 'Ԗ', 'Ԙ', 'Ԛ', 'Ԝ', 'Ԟ', 'Ԡ', 'Ԣ', 'Ԥ', 'Ԧ', 'Ԩ', 'Ԫ', 'Ԭ', 'Ԯ', 'Ⴧ', 'Ⴭ', 'Ḁ', 'Ḃ', 'Ḅ', 'Ḇ', 'Ḉ', 'Ḋ', 'Ḍ', 'Ḏ', 'Ḑ', 'Ḓ', 'Ḕ', 'Ḗ', 'Ḙ', 'Ḛ', 'Ḝ', 'Ḟ', 'Ḡ', 'Ḣ', 'Ḥ', 'Ḧ', 'Ḩ', 'Ḫ', 'Ḭ', 'Ḯ', 'Ḱ', 'Ḳ', 'Ḵ', 'Ḷ', 'Ḹ', 'Ḻ', 'Ḽ', 'Ḿ', 'Ṁ', 'Ṃ', 'Ṅ', 'Ṇ', 'Ṉ', 'Ṋ', 'Ṍ', 'Ṏ', 'Ṑ', 'Ṓ', 'Ṕ', 'Ṗ', 'Ṙ', 'Ṛ', 'Ṝ', 'Ṟ', 'Ṡ', 'Ṣ', 'Ṥ', 'Ṧ', 'Ṩ', 'Ṫ', 'Ṭ', 'Ṯ', 'Ṱ', 'Ṳ', 'Ṵ', 'Ṷ', 'Ṹ', 'Ṻ', 'Ṽ', 'Ṿ', 'Ẁ', 'Ẃ', 'Ẅ', 'Ẇ', 'Ẉ', 'Ẋ', 'Ẍ', 'Ẏ', 'Ẑ', 'Ẓ', 'Ẕ', 'ẞ', 'Ạ', 'Ả', 'Ấ', 'Ầ', 'Ẩ', 'Ẫ', 'Ậ', 'Ắ', 'Ằ', 'Ẳ', 'Ẵ', 'Ặ', 'Ẹ', 'Ẻ', 'Ẽ', 'Ế', 'Ề', 'Ể', 'Ễ', 'Ệ', 'Ỉ', 'Ị', 'Ọ', 'Ỏ', 'Ố', 'Ồ', 'Ổ', 'Ỗ', 'Ộ', 'Ớ', 'Ờ', 'Ở', 'Ỡ', 'Ợ', 'Ụ', 'Ủ', 'Ứ', 'Ừ', 'Ử', 'Ữ', 'Ự', 'Ỳ', 'Ỵ', 'Ỷ', 'Ỹ', 'Ỻ', 'Ỽ', 'Ỿ', 'Ὑ', 'Ὓ', 'Ὕ', 'Ὗ', 'ℂ', 'ℇ', 'ℕ', 'ℤ', 'Ω', 'ℨ', 'ⅅ', 'Ↄ', 'Ⱡ', 'Ⱨ', 'Ⱪ', 'Ⱬ', 'Ⱳ', 'Ⱶ', 'Ⲃ', 'Ⲅ', 'Ⲇ', 'Ⲉ', 'Ⲋ', 'Ⲍ', 'Ⲏ', 'Ⲑ', 'Ⲓ', 'Ⲕ', 'Ⲗ', 'Ⲙ', 'Ⲛ', 'Ⲝ', 'Ⲟ', 'Ⲡ', 'Ⲣ', 'Ⲥ', 'Ⲧ', 'Ⲩ', 'Ⲫ', 'Ⲭ', 'Ⲯ', 'Ⲱ', 'Ⲳ', 'Ⲵ', 'Ⲷ', 'Ⲹ', 'Ⲻ', 'Ⲽ', 'Ⲿ', 'Ⳁ', 'Ⳃ', 'Ⳅ', 'Ⳇ', 'Ⳉ', 'Ⳋ', 'Ⳍ', 'Ⳏ', 'Ⳑ', 'Ⳓ', 'Ⳕ', 'Ⳗ', 'Ⳙ', 'Ⳛ', 'Ⳝ', 'Ⳟ', 'Ⳡ', 'Ⳣ', 'Ⳬ', 'Ⳮ', 'Ⳳ', 'Ꙁ', 'Ꙃ', 'Ꙅ', 'Ꙇ', 'Ꙉ', 'Ꙋ', 'Ꙍ', 'Ꙏ', 'Ꙑ', 'Ꙓ', 'Ꙕ', 'Ꙗ', 'Ꙙ', 'Ꙛ', 'Ꙝ', 'Ꙟ', 'Ꙡ', 'Ꙣ', 'Ꙥ', 'Ꙧ', 'Ꙩ', 'Ꙫ', 'Ꙭ', 'Ꚁ', 'Ꚃ', 'Ꚅ', 'Ꚇ', 'Ꚉ', 'Ꚋ', 'Ꚍ', 'Ꚏ', 'Ꚑ', 'Ꚓ', 'Ꚕ', 'Ꚗ', 'Ꚙ', 'Ꚛ', 'Ꜣ', 'Ꜥ', 'Ꜧ', 'Ꜩ', 'Ꜫ', 'Ꜭ', 'Ꜯ', 'Ꜳ', 'Ꜵ', 'Ꜷ', 'Ꜹ', 'Ꜻ', 'Ꜽ', 'Ꜿ', 'Ꝁ', 'Ꝃ', 'Ꝅ', 'Ꝇ', 'Ꝉ', 'Ꝋ', 'Ꝍ', 'Ꝏ', 'Ꝑ', 'Ꝓ', 'Ꝕ', 'Ꝗ', 'Ꝙ', 'Ꝛ', 'Ꝝ', 'Ꝟ', 'Ꝡ', 'Ꝣ', 'Ꝥ', 'Ꝧ', 'Ꝩ', 'Ꝫ', 'Ꝭ', 'Ꝯ', 'Ꝺ', 'Ꝼ', 'Ꞁ', 'Ꞃ', 'Ꞅ', 'Ꞇ', 'Ꞌ', 'Ɥ', 'Ꞑ', 'Ꞓ', 'Ꞗ', 'Ꞙ', 'Ꞛ', 'Ꞝ', 'Ꞟ', 'Ꞡ', 'Ꞣ', 'Ꞥ', 'Ꞧ', 'Ꞩ', 'Ꞷ', 'Ꞹ'}, ranges: []rune{'A', 'Z', 'À', 'Ö', 'Ø', 'Þ', 'Ÿ', 'Ź', 'Ɓ', 'Ƃ', 'Ɔ', 'Ƈ', 'Ɖ', 'Ƌ', 'Ǝ', 'Ƒ', 'Ɠ', 'Ɣ', 'Ɩ', 'Ƙ', 'Ɯ', 'Ɲ', 'Ɵ', 'Ơ', 'Ʀ', 'Ƨ', 'Ʈ', 'Ư', 'Ʊ', 'Ƴ', 'Ʒ', 'Ƹ', 'Ƕ', 'Ǹ', 'Ⱥ', 'Ȼ', 'Ƚ', 'Ⱦ', 'Ƀ', 'Ɇ', 'Έ', 'Ί', 'Ύ', 'Ώ', 'Α', 'Ρ', 'Σ', 'Ϋ', 'ϒ', 'ϔ', 'Ϲ', 'Ϻ', 'Ͻ', 'Я', 'Ӏ', 'Ӂ', 'Ա', 'Ֆ', 'Ⴀ', 'Ⴥ', 'Ꭰ', 'Ᏽ', 'Ა', 'Ჺ', 'Ჽ', 'Ჿ', 'Ἀ', 'Ἇ', 'Ἐ', 'Ἕ', 'Ἠ', 'Ἧ', 'Ἰ', 'Ἷ', 'Ὀ', 'Ὅ', 'Ὠ', 'Ὧ', 'Ᾰ', 'Ά', 'Ὲ', 'Ή', 'Ῐ', 'Ί', 'Ῠ', 'Ῥ', 'Ὸ', 'Ώ', 'ℋ', 'ℍ', 'ℐ', 'ℒ', 'ℙ', 'ℝ', 'K', 'ℭ', 'ℰ', 'ℳ', 'ℾ', 'ℿ', 'Ⰰ', 'Ⱞ', 'Ɫ', 'Ɽ', 'Ɑ', 'Ɒ', 'Ȿ', 'Ⲁ', 'Ᵹ', 'Ꝿ', 'Ɦ', 'Ɪ', 'Ʞ', 'Ꞵ', 'A', 'Z'}, @@ -12991,9 +12954,9 @@ var g = &grammar{ }, { name: "Mc", - pos: position{line: 1793, col: 1, offset: 54234}, + pos: position{line: 1788, col: 1, offset: 54123}, expr: &charClassMatcher{ - pos: position{line: 1793, col: 6, offset: 54239}, + pos: position{line: 1788, col: 6, offset: 54128}, val: "[\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E-\\u094F\\u0982-\\u0983\\u09BE-\\u09C0\\u09C7-\\u09C8\\u09CB-\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB-\\u0ACC\\u0B02-\\u0B03\\u0B3E\\u0B40\\u0B47-\\u0B48\\u0B4B-\\u0B4C\\u0B57\\u0BBE-\\u0BBF\\u0BC1-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82-\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7-\\u0CC8\\u0CCA-\\u0CCB\\u0CD5-\\u0CD6\\u0D02-\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82-\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2-\\u0DF3\\u0F3E-\\u0F3F\\u0F7F\\u102B-\\u102C\\u1031\\u1038\\u103B-\\u103C\\u1056-\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083-\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7-\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930-\\u1931\\u1933-\\u1938\\u1A19-\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63-\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43-\\u1B44\\u1B82\\u1BA1\\u1BA6-\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2-\\u1BF3\\u1C24-\\u1C2B\\u1C34-\\u1C35\\u1CE1\\u1CF2-\\u1CF3\\u1CF7\\u302E-\\u302F\\uA823-\\uA824\\uA827\\uA880-\\uA881\\uA8B4-\\uA8C3\\uA952-\\uA953\\uA983\\uA9B4-\\uA9B5\\uA9BA-\\uA9BB\\uA9BD-\\uA9C0\\uAA2F-\\uAA30\\uAA33-\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE-\\uAAEF\\uAAF5\\uABE3-\\uABE4\\uABE6-\\uABE7\\uABE9-\\uABEA\\uABEC]", chars: []rune{'ः', 'ऻ', 'ৗ', 'ਃ', 'ઃ', 'ૉ', 'ା', 'ୀ', 'ୗ', 'ௗ', 'ಾ', 'ൗ', 'ཿ', 'ေ', 'း', 'ႏ', 'ា', 'ᩕ', 'ᩗ', 'ᩡ', 'ᬄ', 'ᬵ', 'ᬻ', 'ᮂ', 'ᮡ', '᮪', 'ᯧ', 'ᯮ', '᳡', '᳷', 'ꠧ', 'ꦃ', 'ꩍ', 'ꩻ', 'ꩽ', 'ꫫ', 'ꫵ', '꯬'}, ranges: []rune{'ा', 'ी', 'ॉ', 'ौ', 'ॎ', 'ॏ', 'ং', 'ঃ', 'া', 'ী', 'ে', 'ৈ', 'ো', 'ৌ', 'ਾ', 'ੀ', 'ા', 'ી', 'ો', 'ૌ', 'ଂ', 'ଃ', 'େ', 'ୈ', 'ୋ', 'ୌ', 'ா', 'ி', 'ு', 'ூ', 'ெ', 'ை', 'ொ', 'ௌ', 'ఁ', 'ః', 'ు', 'ౄ', 'ಂ', 'ಃ', 'ೀ', 'ೄ', 'ೇ', 'ೈ', 'ೊ', 'ೋ', 'ೕ', 'ೖ', 'ം', 'ഃ', 'ാ', 'ീ', 'െ', 'ൈ', 'ൊ', 'ൌ', 'ං', 'ඃ', 'ා', 'ෑ', 'ෘ', 'ෟ', 'ෲ', 'ෳ', '༾', '༿', 'ါ', 'ာ', 'ျ', 'ြ', 'ၖ', 'ၗ', 'ၢ', 'ၤ', 'ၧ', 'ၭ', 'ႃ', 'ႄ', 'ႇ', 'ႌ', 'ႚ', 'ႜ', 'ើ', 'ៅ', 'ះ', 'ៈ', 'ᤣ', 'ᤦ', 'ᤩ', 'ᤫ', 'ᤰ', 'ᤱ', 'ᤳ', 'ᤸ', 'ᨙ', 'ᨚ', 'ᩣ', 'ᩤ', 'ᩭ', 'ᩲ', 'ᬽ', 'ᭁ', 'ᭃ', '᭄', 'ᮦ', 'ᮧ', 'ᯪ', 'ᯬ', '᯲', '᯳', 'ᰤ', 'ᰫ', 'ᰴ', 'ᰵ', 'ᳲ', 'ᳳ', '〮', '〯', 'ꠣ', 'ꠤ', 'ꢀ', 'ꢁ', 'ꢴ', 'ꣃ', 'ꥒ', '꥓', 'ꦴ', 'ꦵ', 'ꦺ', 'ꦻ', 'ꦽ', '꧀', 'ꨯ', 'ꨰ', 'ꨳ', 'ꨴ', 'ꫮ', 'ꫯ', 'ꯣ', 'ꯤ', 'ꯦ', 'ꯧ', 'ꯩ', 'ꯪ'}, @@ -13005,9 +12968,9 @@ var g = &grammar{ }, { name: "Mn", - pos: position{line: 1796, col: 1, offset: 55427}, + pos: position{line: 1791, col: 1, offset: 55316}, expr: &charClassMatcher{ - pos: position{line: 1796, col: 6, offset: 55432}, + pos: position{line: 1791, col: 6, offset: 55321}, val: "[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1-\\u05C2\\u05C4-\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7-\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962-\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2-\\u09E3\\u09FE\\u0A01-\\u0A02\\u0A3C\\u0A41-\\u0A42\\u0A47-\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70-\\u0A71\\u0A75\\u0A81-\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7-\\u0AC8\\u0ACD\\u0AE2-\\u0AE3\\u0AFA-\\u0AFF\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62-\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C04\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55-\\u0C56\\u0C62-\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC-\\u0CCD\\u0CE2-\\u0CE3\\u0D00-\\u0D01\\u0D3B-\\u0D3C\\u0D41-\\u0D44\\u0D4D\\u0D62-\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB-\\u0EBC\\u0EC8-\\u0ECD\\u0F18-\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86-\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039-\\u103A\\u103D-\\u103E\\u1058-\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085-\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17B4-\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885-\\u1886\\u18A9\\u1920-\\u1922\\u1927-\\u1928\\u1932\\u1939-\\u193B\\u1A17-\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80-\\u1B81\\u1BA2-\\u1BA5\\u1BA8-\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8-\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099-\\u309A\\uA66F\\uA674-\\uA67D\\uA69E-\\uA69F\\uA6F0-\\uA6F1\\uA802\\uA806\\uA80B\\uA825-\\uA826\\uA8C4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31-\\uAA32\\uAA35-\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7-\\uAAB8\\uAABE-\\uAABF\\uAAC1\\uAAEC-\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]", chars: []rune{'ֿ', 'ׇ', 'ٰ', 'ܑ', '߽', 'ऺ', '़', '्', 'ঁ', '়', '্', '৾', '਼', 'ੑ', 'ੵ', '઼', '્', 'ଁ', '଼', 'ି', '୍', 'ୖ', 'ஂ', 'ீ', '்', 'ఀ', 'ఄ', 'ಁ', '಼', 'ಿ', 'ೆ', '്', '්', 'ූ', 'ั', 'ັ', '༵', '༷', '༹', '࿆', 'ႂ', 'ႍ', 'ႝ', 'ំ', '៝', 'ᢩ', 'ᤲ', 'ᨛ', 'ᩖ', '᩠', 'ᩢ', '᩿', '᬴', 'ᬼ', 'ᭂ', '᯦', 'ᯭ', '᳭', '᳴', '⃡', '⵿', '꙯', 'ꠂ', '꠆', 'ꠋ', 'ꣿ', '꦳', 'ꦼ', 'ꧥ', 'ꩃ', 'ꩌ', 'ꩼ', 'ꪰ', '꫁', '꫶', 'ꯥ', 'ꯨ', '꯭', 'ﬞ'}, ranges: []rune{'̀', 'ͯ', '҃', '҇', '֑', 'ֽ', 'ׁ', 'ׂ', 'ׄ', 'ׅ', 'ؐ', 'ؚ', 'ً', 'ٟ', 'ۖ', 'ۜ', '۟', 'ۤ', 'ۧ', 'ۨ', '۪', 'ۭ', 'ܰ', '݊', 'ަ', 'ް', '߫', '߳', 'ࠖ', '࠙', 'ࠛ', 'ࠣ', 'ࠥ', 'ࠧ', 'ࠩ', '࠭', '࡙', '࡛', '࣓', '࣡', 'ࣣ', 'ं', 'ु', 'ै', '॑', 'ॗ', 'ॢ', 'ॣ', 'ু', 'ৄ', 'ৢ', 'ৣ', 'ਁ', 'ਂ', 'ੁ', 'ੂ', 'ੇ', 'ੈ', 'ੋ', '੍', 'ੰ', 'ੱ', 'ઁ', 'ં', 'ુ', 'ૅ', 'ે', 'ૈ', 'ૢ', 'ૣ', 'ૺ', '૿', 'ୁ', 'ୄ', 'ୢ', 'ୣ', 'ా', 'ీ', 'ె', 'ై', 'ొ', '్', 'ౕ', 'ౖ', 'ౢ', 'ౣ', 'ೌ', '್', 'ೢ', 'ೣ', 'ഀ', 'ഁ', '഻', '഼', 'ു', 'ൄ', 'ൢ', 'ൣ', 'ි', 'ු', 'ิ', 'ฺ', '็', '๎', 'ິ', 'ູ', 'ົ', 'ຼ', '່', 'ໍ', '༘', '༙', 'ཱ', 'ཾ', 'ྀ', '྄', '྆', '྇', 'ྍ', 'ྗ', 'ྙ', 'ྼ', 'ိ', 'ူ', 'ဲ', '့', '္', '်', 'ွ', 'ှ', 'ၘ', 'ၙ', 'ၞ', 'ၠ', 'ၱ', 'ၴ', 'ႅ', 'ႆ', '፝', '፟', 'ᜒ', '᜔', 'ᜲ', '᜴', 'ᝒ', 'ᝓ', 'ᝲ', 'ᝳ', '឴', '឵', 'ិ', 'ួ', '៉', '៓', '᠋', '᠍', 'ᢅ', 'ᢆ', 'ᤠ', 'ᤢ', 'ᤧ', 'ᤨ', '᤹', '᤻', 'ᨗ', 'ᨘ', 'ᩘ', 'ᩞ', 'ᩥ', 'ᩬ', 'ᩳ', '᩼', '᪰', '᪽', 'ᬀ', 'ᬃ', 'ᬶ', 'ᬺ', '᭫', '᭳', 'ᮀ', 'ᮁ', 'ᮢ', 'ᮥ', 'ᮨ', 'ᮩ', '᮫', 'ᮭ', 'ᯨ', 'ᯩ', 'ᯯ', 'ᯱ', 'ᰬ', 'ᰳ', 'ᰶ', '᰷', '᳐', '᳒', '᳔', '᳠', '᳢', '᳨', '᳸', '᳹', '᷀', '᷹', '᷻', '᷿', '⃐', '⃜', '⃥', '⃰', '⳯', '⳱', 'ⷠ', 'ⷿ', '〪', '〭', '゙', '゚', 'ꙴ', '꙽', 'ꚞ', 'ꚟ', '꛰', '꛱', 'ꠥ', 'ꠦ', '꣄', 'ꣅ', '꣠', '꣱', 'ꤦ', '꤭', 'ꥇ', 'ꥑ', 'ꦀ', 'ꦂ', 'ꦶ', 'ꦹ', 'ꨩ', 'ꨮ', 'ꨱ', 'ꨲ', 'ꨵ', 'ꨶ', 'ꪲ', 'ꪴ', 'ꪷ', 'ꪸ', 'ꪾ', '꪿', 'ꫬ', 'ꫭ', '︀', '️', '︠', '︯'}, @@ -13019,9 +12982,9 @@ var g = &grammar{ }, { name: "Nd", - pos: position{line: 1799, col: 1, offset: 57612}, + pos: position{line: 1794, col: 1, offset: 57501}, expr: &charClassMatcher{ - pos: position{line: 1799, col: 6, offset: 57617}, + pos: position{line: 1794, col: 6, offset: 57506}, val: "[\\u0030-\\u0039\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]", ranges: []rune{'0', '9', '٠', '٩', '۰', '۹', '߀', '߉', '०', '९', '০', '৯', '੦', '੯', '૦', '૯', '୦', '୯', '௦', '௯', '౦', '౯', '೦', '೯', '൦', '൯', '෦', '෯', '๐', '๙', '໐', '໙', '༠', '༩', '၀', '၉', '႐', '႙', '០', '៩', '᠐', '᠙', '᥆', '᥏', '᧐', '᧙', '᪀', '᪉', '᪐', '᪙', '᭐', '᭙', '᮰', '᮹', '᱀', '᱉', '᱐', '᱙', '꘠', '꘩', '꣐', '꣙', '꤀', '꤉', '꧐', '꧙', '꧰', '꧹', '꩐', '꩙', '꯰', '꯹', '0', '9'}, ignoreCase: false, @@ -13032,9 +12995,9 @@ var g = &grammar{ }, { name: "Nl", - pos: position{line: 1802, col: 1, offset: 58120}, + pos: position{line: 1797, col: 1, offset: 58009}, expr: &charClassMatcher{ - pos: position{line: 1802, col: 6, offset: 58125}, + pos: position{line: 1797, col: 6, offset: 58014}, val: "[\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF]", chars: []rune{'〇'}, ranges: []rune{'ᛮ', 'ᛰ', 'Ⅰ', 'ↂ', 'ↅ', 'ↈ', '〡', '〩', '〸', '〺', 'ꛦ', 'ꛯ'}, @@ -13046,9 +13009,9 @@ var g = &grammar{ }, { name: "Pc", - pos: position{line: 1805, col: 1, offset: 58239}, + pos: position{line: 1800, col: 1, offset: 58128}, expr: &charClassMatcher{ - pos: position{line: 1805, col: 6, offset: 58244}, + pos: position{line: 1800, col: 6, offset: 58133}, val: "[\\u005F\\u203F-\\u2040\\u2054\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFF3F]", chars: []rune{'_', '⁔', '_'}, ranges: []rune{'‿', '⁀', '︳', '︴', '﹍', '﹏'}, @@ -13060,9 +13023,9 @@ var g = &grammar{ }, { name: "Zs", - pos: position{line: 1808, col: 1, offset: 58325}, + pos: position{line: 1803, col: 1, offset: 58214}, expr: &charClassMatcher{ - pos: position{line: 1808, col: 6, offset: 58330}, + pos: position{line: 1803, col: 6, offset: 58219}, val: "[\\u0020\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]", chars: []rune{' ', '\u00a0', '\u1680', '\u202f', '\u205f', '\u3000'}, ranges: []rune{'\u2000', '\u200a'}, @@ -13074,9 +13037,9 @@ var g = &grammar{ }, { name: "SourceCharacter", - pos: position{line: 1810, col: 1, offset: 58383}, + pos: position{line: 1805, col: 1, offset: 58272}, expr: &anyMatcher{ - line: 1811, col: 5, offset: 58403, + line: 1806, col: 5, offset: 58292, }, leader: false, leftRecursive: false, @@ -13084,48 +13047,48 @@ var g = &grammar{ { name: "WhiteSpace", displayName: "\"whitespace\"", - pos: position{line: 1813, col: 1, offset: 58406}, + pos: position{line: 1808, col: 1, offset: 58295}, expr: &choiceExpr{ - pos: position{line: 1814, col: 5, offset: 58434}, + pos: position{line: 1809, col: 5, offset: 58323}, alternatives: []any{ &litMatcher{ - pos: position{line: 1814, col: 5, offset: 58434}, + pos: position{line: 1809, col: 5, offset: 58323}, val: "\t", ignoreCase: false, want: "\"\\t\"", }, &litMatcher{ - pos: position{line: 1815, col: 5, offset: 58443}, + pos: position{line: 1810, col: 5, offset: 58332}, val: "\v", ignoreCase: false, want: "\"\\v\"", }, &litMatcher{ - pos: position{line: 1816, col: 5, offset: 58452}, + pos: position{line: 1811, col: 5, offset: 58341}, val: "\f", ignoreCase: false, want: "\"\\f\"", }, &litMatcher{ - pos: position{line: 1817, col: 5, offset: 58461}, + pos: position{line: 1812, col: 5, offset: 58350}, val: " ", ignoreCase: false, want: "\" \"", }, &litMatcher{ - pos: position{line: 1818, col: 5, offset: 58469}, + pos: position{line: 1813, col: 5, offset: 58358}, val: "\u00a0", ignoreCase: false, want: "\"\\u00a0\"", }, &litMatcher{ - pos: position{line: 1819, col: 5, offset: 58482}, + pos: position{line: 1814, col: 5, offset: 58371}, val: "\ufeff", ignoreCase: false, want: "\"\\ufeff\"", }, &ruleRefExpr{ - pos: position{line: 1820, col: 5, offset: 58495}, + pos: position{line: 1815, col: 5, offset: 58384}, name: "Zs", }, }, @@ -13135,9 +13098,9 @@ var g = &grammar{ }, { name: "LineTerminator", - pos: position{line: 1822, col: 1, offset: 58499}, + pos: position{line: 1817, col: 1, offset: 58388}, expr: &charClassMatcher{ - pos: position{line: 1823, col: 5, offset: 58518}, + pos: position{line: 1818, col: 5, offset: 58407}, val: "[\\n\\r\\u2028\\u2029]", chars: []rune{'\n', '\r', '\u2028', '\u2029'}, ignoreCase: false, @@ -13149,9 +13112,9 @@ var g = &grammar{ { name: "Comment", displayName: "\"comment\"", - pos: position{line: 1829, col: 1, offset: 58848}, + pos: position{line: 1824, col: 1, offset: 58737}, expr: &ruleRefExpr{ - pos: position{line: 1832, col: 5, offset: 58919}, + pos: position{line: 1827, col: 5, offset: 58808}, name: "SingleLineComment", }, leader: false, @@ -13159,39 +13122,39 @@ var g = &grammar{ }, { name: "MultiLineComment", - pos: position{line: 1834, col: 1, offset: 58938}, + pos: position{line: 1829, col: 1, offset: 58827}, expr: &seqExpr{ - pos: position{line: 1835, col: 5, offset: 58959}, + pos: position{line: 1830, col: 5, offset: 58848}, exprs: []any{ &litMatcher{ - pos: position{line: 1835, col: 5, offset: 58959}, + pos: position{line: 1830, col: 5, offset: 58848}, val: "/*", ignoreCase: false, want: "\"/*\"", }, &zeroOrMoreExpr{ - pos: position{line: 1835, col: 10, offset: 58964}, + pos: position{line: 1830, col: 10, offset: 58853}, expr: &seqExpr{ - pos: position{line: 1835, col: 11, offset: 58965}, + pos: position{line: 1830, col: 11, offset: 58854}, exprs: []any{ ¬Expr{ - pos: position{line: 1835, col: 11, offset: 58965}, + pos: position{line: 1830, col: 11, offset: 58854}, expr: &litMatcher{ - pos: position{line: 1835, col: 12, offset: 58966}, + pos: position{line: 1830, col: 12, offset: 58855}, val: "*/", ignoreCase: false, want: "\"*/\"", }, }, &ruleRefExpr{ - pos: position{line: 1835, col: 17, offset: 58971}, + pos: position{line: 1830, col: 17, offset: 58860}, name: "SourceCharacter", }, }, }, }, &litMatcher{ - pos: position{line: 1835, col: 35, offset: 58989}, + pos: position{line: 1830, col: 35, offset: 58878}, val: "*/", ignoreCase: false, want: "\"*/\"", @@ -13203,33 +13166,33 @@ var g = &grammar{ }, { name: "SingleLineComment", - pos: position{line: 1837, col: 1, offset: 58995}, + pos: position{line: 1832, col: 1, offset: 58884}, expr: &choiceExpr{ - pos: position{line: 1838, col: 5, offset: 59017}, + pos: position{line: 1833, col: 5, offset: 58906}, alternatives: []any{ &seqExpr{ - pos: position{line: 1838, col: 5, offset: 59017}, + pos: position{line: 1833, col: 5, offset: 58906}, exprs: []any{ &litMatcher{ - pos: position{line: 1838, col: 5, offset: 59017}, + pos: position{line: 1833, col: 5, offset: 58906}, val: "//", ignoreCase: false, want: "\"//\"", }, &zeroOrMoreExpr{ - pos: position{line: 1838, col: 10, offset: 59022}, + pos: position{line: 1833, col: 10, offset: 58911}, expr: &seqExpr{ - pos: position{line: 1838, col: 11, offset: 59023}, + pos: position{line: 1833, col: 11, offset: 58912}, exprs: []any{ ¬Expr{ - pos: position{line: 1838, col: 11, offset: 59023}, + pos: position{line: 1833, col: 11, offset: 58912}, expr: &ruleRefExpr{ - pos: position{line: 1838, col: 12, offset: 59024}, + pos: position{line: 1833, col: 12, offset: 58913}, name: "LineTerminator", }, }, &ruleRefExpr{ - pos: position{line: 1838, col: 27, offset: 59039}, + pos: position{line: 1833, col: 27, offset: 58928}, name: "SourceCharacter", }, }, @@ -13238,28 +13201,28 @@ var g = &grammar{ }, }, &seqExpr{ - pos: position{line: 1839, col: 5, offset: 59061}, + pos: position{line: 1834, col: 5, offset: 58950}, exprs: []any{ &litMatcher{ - pos: position{line: 1839, col: 5, offset: 59061}, + pos: position{line: 1834, col: 5, offset: 58950}, val: "--", ignoreCase: false, want: "\"--\"", }, &zeroOrMoreExpr{ - pos: position{line: 1839, col: 10, offset: 59066}, + pos: position{line: 1834, col: 10, offset: 58955}, expr: &seqExpr{ - pos: position{line: 1839, col: 11, offset: 59067}, + pos: position{line: 1834, col: 11, offset: 58956}, exprs: []any{ ¬Expr{ - pos: position{line: 1839, col: 11, offset: 59067}, + pos: position{line: 1834, col: 11, offset: 58956}, expr: &ruleRefExpr{ - pos: position{line: 1839, col: 12, offset: 59068}, + pos: position{line: 1834, col: 12, offset: 58957}, name: "LineTerminator", }, }, &ruleRefExpr{ - pos: position{line: 1839, col: 27, offset: 59083}, + pos: position{line: 1834, col: 27, offset: 58972}, name: "SourceCharacter", }, }, @@ -13274,19 +13237,19 @@ var g = &grammar{ }, { name: "EOL", - pos: position{line: 1841, col: 1, offset: 59102}, + pos: position{line: 1836, col: 1, offset: 58991}, expr: &seqExpr{ - pos: position{line: 1841, col: 7, offset: 59108}, + pos: position{line: 1836, col: 7, offset: 58997}, exprs: []any{ &zeroOrMoreExpr{ - pos: position{line: 1841, col: 7, offset: 59108}, + pos: position{line: 1836, col: 7, offset: 58997}, expr: &ruleRefExpr{ - pos: position{line: 1841, col: 7, offset: 59108}, + pos: position{line: 1836, col: 7, offset: 58997}, name: "WhiteSpace", }, }, &ruleRefExpr{ - pos: position{line: 1841, col: 19, offset: 59120}, + pos: position{line: 1836, col: 19, offset: 59009}, name: "LineTerminator", }, }, @@ -13296,16 +13259,16 @@ var g = &grammar{ }, { name: "EOT", - pos: position{line: 1843, col: 1, offset: 59136}, + pos: position{line: 1838, col: 1, offset: 59025}, expr: &choiceExpr{ - pos: position{line: 1843, col: 7, offset: 59142}, + pos: position{line: 1838, col: 7, offset: 59031}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1843, col: 7, offset: 59142}, + pos: position{line: 1838, col: 7, offset: 59031}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1843, col: 11, offset: 59146}, + pos: position{line: 1838, col: 11, offset: 59035}, name: "EOF", }, }, @@ -13315,11 +13278,11 @@ var g = &grammar{ }, { name: "EOF", - pos: position{line: 1845, col: 1, offset: 59151}, + pos: position{line: 1840, col: 1, offset: 59040}, expr: ¬Expr{ - pos: position{line: 1845, col: 7, offset: 59157}, + pos: position{line: 1840, col: 7, offset: 59046}, expr: &anyMatcher{ - line: 1845, col: 8, offset: 59158, + line: 1840, col: 8, offset: 59047, }, }, leader: false, @@ -13327,11 +13290,11 @@ var g = &grammar{ }, { name: "EOKW", - pos: position{line: 1847, col: 1, offset: 59161}, + pos: position{line: 1842, col: 1, offset: 59050}, expr: ¬Expr{ - pos: position{line: 1847, col: 8, offset: 59168}, + pos: position{line: 1842, col: 8, offset: 59057}, expr: &ruleRefExpr{ - pos: position{line: 1847, col: 9, offset: 59169}, + pos: position{line: 1842, col: 9, offset: 59058}, name: "KeyWordChars", }, }, @@ -13340,15 +13303,15 @@ var g = &grammar{ }, { name: "SQLPipe", - pos: position{line: 1851, col: 1, offset: 59205}, + pos: position{line: 1846, col: 1, offset: 59094}, expr: &actionExpr{ - pos: position{line: 1852, col: 5, offset: 59218}, + pos: position{line: 1847, col: 5, offset: 59107}, run: (*parser).callonSQLPipe1, expr: &labeledExpr{ - pos: position{line: 1852, col: 5, offset: 59218}, + pos: position{line: 1847, col: 5, offset: 59107}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1852, col: 7, offset: 59220}, + pos: position{line: 1847, col: 7, offset: 59109}, name: "Seq", }, }, @@ -13358,27 +13321,27 @@ var g = &grammar{ }, { name: "SelectOp", - pos: position{line: 1860, col: 1, offset: 59366}, + pos: position{line: 1855, col: 1, offset: 59255}, expr: &actionExpr{ - pos: position{line: 1860, col: 12, offset: 59377}, + pos: position{line: 1855, col: 12, offset: 59266}, run: (*parser).callonSelectOp1, expr: &seqExpr{ - pos: position{line: 1860, col: 12, offset: 59377}, + pos: position{line: 1855, col: 12, offset: 59266}, exprs: []any{ ¬Expr{ - pos: position{line: 1860, col: 12, offset: 59377}, + pos: position{line: 1855, col: 12, offset: 59266}, expr: &litMatcher{ - pos: position{line: 1860, col: 13, offset: 59378}, + pos: position{line: 1855, col: 13, offset: 59267}, val: "(", ignoreCase: false, want: "\"(\"", }, }, &labeledExpr{ - pos: position{line: 1860, col: 17, offset: 59382}, + pos: position{line: 1855, col: 17, offset: 59271}, label: "op", expr: &ruleRefExpr{ - pos: position{line: 1860, col: 20, offset: 59385}, + pos: position{line: 1855, col: 20, offset: 59274}, name: "SelectExpr", }, }, @@ -13390,65 +13353,65 @@ var g = &grammar{ }, { name: "SelectExpr", - pos: position{line: 1862, col: 1, offset: 59415}, + pos: position{line: 1857, col: 1, offset: 59304}, expr: &actionExpr{ - pos: position{line: 1863, col: 5, offset: 59431}, + pos: position{line: 1858, col: 5, offset: 59320}, run: (*parser).callonSelectExpr1, expr: &seqExpr{ - pos: position{line: 1863, col: 5, offset: 59431}, + pos: position{line: 1858, col: 5, offset: 59320}, exprs: []any{ &labeledExpr{ - pos: position{line: 1863, col: 5, offset: 59431}, + pos: position{line: 1858, col: 5, offset: 59320}, label: "with", expr: &ruleRefExpr{ - pos: position{line: 1863, col: 10, offset: 59436}, + pos: position{line: 1858, col: 10, offset: 59325}, name: "OptWithClause", }, }, &labeledExpr{ - pos: position{line: 1864, col: 5, offset: 59454}, + pos: position{line: 1859, col: 5, offset: 59343}, label: "body", expr: &choiceExpr{ - pos: position{line: 1865, col: 9, offset: 59469}, + pos: position{line: 1860, col: 9, offset: 59358}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1865, col: 9, offset: 59469}, + pos: position{line: 1860, col: 9, offset: 59358}, name: "SetOperation", }, &ruleRefExpr{ - pos: position{line: 1866, col: 9, offset: 59490}, + pos: position{line: 1861, col: 9, offset: 59379}, name: "Select", }, &actionExpr{ - pos: position{line: 1867, col: 9, offset: 59505}, + pos: position{line: 1862, col: 9, offset: 59394}, run: (*parser).callonSelectExpr9, expr: &seqExpr{ - pos: position{line: 1867, col: 9, offset: 59505}, + pos: position{line: 1862, col: 9, offset: 59394}, exprs: []any{ &litMatcher{ - pos: position{line: 1867, col: 9, offset: 59505}, + pos: position{line: 1862, col: 9, offset: 59394}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1867, col: 13, offset: 59509}, + pos: position{line: 1862, col: 13, offset: 59398}, name: "__", }, &labeledExpr{ - pos: position{line: 1867, col: 16, offset: 59512}, + pos: position{line: 1862, col: 16, offset: 59401}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1867, col: 18, offset: 59514}, + pos: position{line: 1862, col: 18, offset: 59403}, name: "SQLPipe", }, }, &ruleRefExpr{ - pos: position{line: 1867, col: 26, offset: 59522}, + pos: position{line: 1862, col: 26, offset: 59411}, name: "__", }, &litMatcher{ - pos: position{line: 1867, col: 28, offset: 59524}, + pos: position{line: 1862, col: 28, offset: 59413}, val: ")", ignoreCase: false, want: "\")\"", @@ -13460,97 +13423,97 @@ var g = &grammar{ }, }, &labeledExpr{ - pos: position{line: 1869, col: 5, offset: 59561}, + pos: position{line: 1864, col: 5, offset: 59450}, label: "orderby", expr: &ruleRefExpr{ - pos: position{line: 1869, col: 13, offset: 59569}, + pos: position{line: 1864, col: 13, offset: 59458}, name: "OptOrderByClause", }, }, &labeledExpr{ - pos: position{line: 1870, col: 5, offset: 59590}, + pos: position{line: 1865, col: 5, offset: 59479}, label: "limit", expr: &ruleRefExpr{ - pos: position{line: 1870, col: 11, offset: 59596}, + pos: position{line: 1865, col: 11, offset: 59485}, name: "OptLimitClause", }, }, }, }, }, - leader: false, + leader: true, leftRecursive: true, }, { name: "Select", - pos: position{line: 1890, col: 1, offset: 59982}, + pos: position{line: 1885, col: 1, offset: 59871}, expr: &actionExpr{ - pos: position{line: 1891, col: 5, offset: 59994}, + pos: position{line: 1886, col: 5, offset: 59883}, run: (*parser).callonSelect1, expr: &seqExpr{ - pos: position{line: 1891, col: 5, offset: 59994}, + pos: position{line: 1886, col: 5, offset: 59883}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1891, col: 5, offset: 59994}, + pos: position{line: 1886, col: 5, offset: 59883}, name: "SELECT", }, &labeledExpr{ - pos: position{line: 1892, col: 5, offset: 60006}, + pos: position{line: 1887, col: 5, offset: 59895}, label: "distinct", expr: &ruleRefExpr{ - pos: position{line: 1892, col: 14, offset: 60015}, + pos: position{line: 1887, col: 14, offset: 59904}, name: "OptDistinct", }, }, &labeledExpr{ - pos: position{line: 1893, col: 5, offset: 60031}, + pos: position{line: 1888, col: 5, offset: 59920}, label: "value", expr: &ruleRefExpr{ - pos: position{line: 1893, col: 11, offset: 60037}, + pos: position{line: 1888, col: 11, offset: 59926}, name: "OptSelectValue", }, }, &ruleRefExpr{ - pos: position{line: 1896, col: 5, offset: 60177}, + pos: position{line: 1891, col: 5, offset: 60066}, name: "_", }, &labeledExpr{ - pos: position{line: 1896, col: 7, offset: 60179}, + pos: position{line: 1891, col: 7, offset: 60068}, label: "selection", expr: &ruleRefExpr{ - pos: position{line: 1896, col: 17, offset: 60189}, + pos: position{line: 1891, col: 17, offset: 60078}, name: "Selection", }, }, &labeledExpr{ - pos: position{line: 1897, col: 5, offset: 60203}, + pos: position{line: 1892, col: 5, offset: 60092}, label: "from", expr: &ruleRefExpr{ - pos: position{line: 1897, col: 10, offset: 60208}, + pos: position{line: 1892, col: 10, offset: 60097}, name: "OptFromClause", }, }, &labeledExpr{ - pos: position{line: 1898, col: 5, offset: 60226}, + pos: position{line: 1893, col: 5, offset: 60115}, label: "where", expr: &ruleRefExpr{ - pos: position{line: 1898, col: 11, offset: 60232}, + pos: position{line: 1893, col: 11, offset: 60121}, name: "OptWhereClause", }, }, &labeledExpr{ - pos: position{line: 1899, col: 5, offset: 60251}, + pos: position{line: 1894, col: 5, offset: 60140}, label: "group", expr: &ruleRefExpr{ - pos: position{line: 1899, col: 11, offset: 60257}, + pos: position{line: 1894, col: 11, offset: 60146}, name: "OptGroupClause", }, }, &labeledExpr{ - pos: position{line: 1900, col: 5, offset: 60276}, + pos: position{line: 1895, col: 5, offset: 60165}, label: "having", expr: &ruleRefExpr{ - pos: position{line: 1900, col: 12, offset: 60283}, + pos: position{line: 1895, col: 12, offset: 60172}, name: "OptHavingClause", }, }, @@ -13562,49 +13525,49 @@ var g = &grammar{ }, { name: "OptDistinct", - pos: position{line: 1926, col: 1, offset: 60889}, + pos: position{line: 1921, col: 1, offset: 60778}, expr: &choiceExpr{ - pos: position{line: 1927, col: 5, offset: 60905}, + pos: position{line: 1922, col: 5, offset: 60794}, alternatives: []any{ &actionExpr{ - pos: position{line: 1927, col: 5, offset: 60905}, + pos: position{line: 1922, col: 5, offset: 60794}, run: (*parser).callonOptDistinct2, expr: &seqExpr{ - pos: position{line: 1927, col: 5, offset: 60905}, + pos: position{line: 1922, col: 5, offset: 60794}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1927, col: 5, offset: 60905}, + pos: position{line: 1922, col: 5, offset: 60794}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1927, col: 7, offset: 60907}, + pos: position{line: 1922, col: 7, offset: 60796}, name: "ALL", }, }, }, }, &actionExpr{ - pos: position{line: 1928, col: 5, offset: 60944}, + pos: position{line: 1923, col: 5, offset: 60833}, run: (*parser).callonOptDistinct6, expr: &seqExpr{ - pos: position{line: 1928, col: 5, offset: 60944}, + pos: position{line: 1923, col: 5, offset: 60833}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1928, col: 5, offset: 60944}, + pos: position{line: 1923, col: 5, offset: 60833}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1928, col: 7, offset: 60946}, + pos: position{line: 1923, col: 7, offset: 60835}, name: "DISTINCT", }, }, }, }, &actionExpr{ - pos: position{line: 1929, col: 5, offset: 60982}, + pos: position{line: 1924, col: 5, offset: 60871}, run: (*parser).callonOptDistinct10, expr: &litMatcher{ - pos: position{line: 1929, col: 5, offset: 60982}, + pos: position{line: 1924, col: 5, offset: 60871}, val: "", ignoreCase: false, want: "\"\"", @@ -13617,57 +13580,57 @@ var g = &grammar{ }, { name: "OptSelectValue", - pos: position{line: 1931, col: 1, offset: 61021}, + pos: position{line: 1926, col: 1, offset: 60910}, expr: &choiceExpr{ - pos: position{line: 1932, col: 5, offset: 61040}, + pos: position{line: 1927, col: 5, offset: 60929}, alternatives: []any{ &actionExpr{ - pos: position{line: 1932, col: 5, offset: 61040}, + pos: position{line: 1927, col: 5, offset: 60929}, run: (*parser).callonOptSelectValue2, expr: &seqExpr{ - pos: position{line: 1932, col: 5, offset: 61040}, + pos: position{line: 1927, col: 5, offset: 60929}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1932, col: 5, offset: 61040}, + pos: position{line: 1927, col: 5, offset: 60929}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1932, col: 7, offset: 61042}, + pos: position{line: 1927, col: 7, offset: 60931}, name: "AS", }, &ruleRefExpr{ - pos: position{line: 1932, col: 10, offset: 61045}, + pos: position{line: 1927, col: 10, offset: 60934}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1932, col: 12, offset: 61047}, + pos: position{line: 1927, col: 12, offset: 60936}, name: "VALUE", }, }, }, }, &actionExpr{ - pos: position{line: 1933, col: 5, offset: 61079}, + pos: position{line: 1928, col: 5, offset: 60968}, run: (*parser).callonOptSelectValue8, expr: &seqExpr{ - pos: position{line: 1933, col: 5, offset: 61079}, + pos: position{line: 1928, col: 5, offset: 60968}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1933, col: 5, offset: 61079}, + pos: position{line: 1928, col: 5, offset: 60968}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1933, col: 7, offset: 61081}, + pos: position{line: 1928, col: 7, offset: 60970}, name: "VALUE", }, }, }, }, &actionExpr{ - pos: position{line: 1934, col: 5, offset: 61152}, + pos: position{line: 1929, col: 5, offset: 61041}, run: (*parser).callonOptSelectValue12, expr: &litMatcher{ - pos: position{line: 1934, col: 5, offset: 61152}, + pos: position{line: 1929, col: 5, offset: 61041}, val: "", ignoreCase: false, want: "\"\"", @@ -13680,19 +13643,19 @@ var g = &grammar{ }, { name: "OptWithClause", - pos: position{line: 1936, col: 1, offset: 61195}, + pos: position{line: 1931, col: 1, offset: 61084}, expr: &choiceExpr{ - pos: position{line: 1937, col: 5, offset: 61214}, + pos: position{line: 1932, col: 5, offset: 61103}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 1937, col: 5, offset: 61214}, + pos: position{line: 1932, col: 5, offset: 61103}, name: "WithClause", }, &actionExpr{ - pos: position{line: 1938, col: 5, offset: 61230}, + pos: position{line: 1933, col: 5, offset: 61119}, run: (*parser).callonOptWithClause3, expr: &litMatcher{ - pos: position{line: 1938, col: 5, offset: 61230}, + pos: position{line: 1933, col: 5, offset: 61119}, val: "", ignoreCase: false, want: "\"\"", @@ -13705,38 +13668,38 @@ var g = &grammar{ }, { name: "WithClause", - pos: position{line: 1940, col: 1, offset: 61263}, + pos: position{line: 1935, col: 1, offset: 61152}, expr: &actionExpr{ - pos: position{line: 1941, col: 5, offset: 61279}, + pos: position{line: 1936, col: 5, offset: 61168}, run: (*parser).callonWithClause1, expr: &seqExpr{ - pos: position{line: 1941, col: 5, offset: 61279}, + pos: position{line: 1936, col: 5, offset: 61168}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1941, col: 5, offset: 61279}, + pos: position{line: 1936, col: 5, offset: 61168}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1941, col: 7, offset: 61281}, + pos: position{line: 1936, col: 7, offset: 61170}, name: "WITH", }, &labeledExpr{ - pos: position{line: 1941, col: 12, offset: 61286}, + pos: position{line: 1936, col: 12, offset: 61175}, label: "r", expr: &ruleRefExpr{ - pos: position{line: 1941, col: 14, offset: 61288}, + pos: position{line: 1936, col: 14, offset: 61177}, name: "OptRecursive", }, }, &ruleRefExpr{ - pos: position{line: 1941, col: 27, offset: 61301}, + pos: position{line: 1936, col: 27, offset: 61190}, name: "_", }, &labeledExpr{ - pos: position{line: 1941, col: 29, offset: 61303}, + pos: position{line: 1936, col: 29, offset: 61192}, label: "ctes", expr: &ruleRefExpr{ - pos: position{line: 1941, col: 34, offset: 61308}, + pos: position{line: 1936, col: 34, offset: 61197}, name: "CteList", }, }, @@ -13748,32 +13711,32 @@ var g = &grammar{ }, { name: "OptRecursive", - pos: position{line: 1950, col: 1, offset: 61493}, + pos: position{line: 1945, col: 1, offset: 61382}, expr: &choiceExpr{ - pos: position{line: 1951, col: 5, offset: 61511}, + pos: position{line: 1946, col: 5, offset: 61400}, alternatives: []any{ &actionExpr{ - pos: position{line: 1951, col: 5, offset: 61511}, + pos: position{line: 1946, col: 5, offset: 61400}, run: (*parser).callonOptRecursive2, expr: &seqExpr{ - pos: position{line: 1951, col: 5, offset: 61511}, + pos: position{line: 1946, col: 5, offset: 61400}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1951, col: 5, offset: 61511}, + pos: position{line: 1946, col: 5, offset: 61400}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1951, col: 7, offset: 61513}, + pos: position{line: 1946, col: 7, offset: 61402}, name: "RECURSIVE", }, }, }, }, &actionExpr{ - pos: position{line: 1952, col: 5, offset: 61549}, + pos: position{line: 1947, col: 5, offset: 61438}, run: (*parser).callonOptRecursive6, expr: &litMatcher{ - pos: position{line: 1952, col: 5, offset: 61549}, + pos: position{line: 1947, col: 5, offset: 61438}, val: "", ignoreCase: false, want: "\"\"", @@ -13786,51 +13749,51 @@ var g = &grammar{ }, { name: "CteList", - pos: position{line: 1954, col: 1, offset: 61588}, + pos: position{line: 1949, col: 1, offset: 61477}, expr: &actionExpr{ - pos: position{line: 1954, col: 11, offset: 61598}, + pos: position{line: 1949, col: 11, offset: 61487}, run: (*parser).callonCteList1, expr: &seqExpr{ - pos: position{line: 1954, col: 11, offset: 61598}, + pos: position{line: 1949, col: 11, offset: 61487}, exprs: []any{ &labeledExpr{ - pos: position{line: 1954, col: 11, offset: 61598}, + pos: position{line: 1949, col: 11, offset: 61487}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1954, col: 17, offset: 61604}, + pos: position{line: 1949, col: 17, offset: 61493}, name: "Cte", }, }, &labeledExpr{ - pos: position{line: 1954, col: 21, offset: 61608}, + pos: position{line: 1949, col: 21, offset: 61497}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1954, col: 26, offset: 61613}, + pos: position{line: 1949, col: 26, offset: 61502}, expr: &actionExpr{ - pos: position{line: 1954, col: 28, offset: 61615}, + pos: position{line: 1949, col: 28, offset: 61504}, run: (*parser).callonCteList7, expr: &seqExpr{ - pos: position{line: 1954, col: 28, offset: 61615}, + pos: position{line: 1949, col: 28, offset: 61504}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1954, col: 28, offset: 61615}, + pos: position{line: 1949, col: 28, offset: 61504}, name: "__", }, &litMatcher{ - pos: position{line: 1954, col: 31, offset: 61618}, + pos: position{line: 1949, col: 31, offset: 61507}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1954, col: 35, offset: 61622}, + pos: position{line: 1949, col: 35, offset: 61511}, name: "__", }, &labeledExpr{ - pos: position{line: 1954, col: 38, offset: 61625}, + pos: position{line: 1949, col: 38, offset: 61514}, label: "cte", expr: &ruleRefExpr{ - pos: position{line: 1954, col: 42, offset: 61629}, + pos: position{line: 1949, col: 42, offset: 61518}, name: "Cte", }, }, @@ -13847,65 +13810,65 @@ var g = &grammar{ }, { name: "Cte", - pos: position{line: 1958, col: 1, offset: 61698}, + pos: position{line: 1953, col: 1, offset: 61587}, expr: &actionExpr{ - pos: position{line: 1959, col: 5, offset: 61706}, + pos: position{line: 1954, col: 5, offset: 61595}, run: (*parser).callonCte1, expr: &seqExpr{ - pos: position{line: 1959, col: 5, offset: 61706}, + pos: position{line: 1954, col: 5, offset: 61595}, exprs: []any{ &labeledExpr{ - pos: position{line: 1959, col: 5, offset: 61706}, + pos: position{line: 1954, col: 5, offset: 61595}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 1959, col: 10, offset: 61711}, + pos: position{line: 1954, col: 10, offset: 61600}, name: "AliasName", }, }, &ruleRefExpr{ - pos: position{line: 1959, col: 20, offset: 61721}, + pos: position{line: 1954, col: 20, offset: 61610}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1959, col: 22, offset: 61723}, + pos: position{line: 1954, col: 22, offset: 61612}, name: "AS", }, &labeledExpr{ - pos: position{line: 1959, col: 25, offset: 61726}, + pos: position{line: 1954, col: 25, offset: 61615}, label: "m", expr: &ruleRefExpr{ - pos: position{line: 1959, col: 27, offset: 61728}, + pos: position{line: 1954, col: 27, offset: 61617}, name: "OptMaterialized", }, }, &ruleRefExpr{ - pos: position{line: 1959, col: 43, offset: 61744}, + pos: position{line: 1954, col: 43, offset: 61633}, name: "__", }, &litMatcher{ - pos: position{line: 1959, col: 46, offset: 61747}, + pos: position{line: 1954, col: 46, offset: 61636}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 1959, col: 50, offset: 61751}, + pos: position{line: 1954, col: 50, offset: 61640}, name: "__", }, &labeledExpr{ - pos: position{line: 1959, col: 53, offset: 61754}, + pos: position{line: 1954, col: 53, offset: 61643}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 1959, col: 55, offset: 61756}, + pos: position{line: 1954, col: 55, offset: 61645}, name: "SQLPipe", }, }, &ruleRefExpr{ - pos: position{line: 1959, col: 63, offset: 61764}, + pos: position{line: 1954, col: 63, offset: 61653}, name: "__", }, &litMatcher{ - pos: position{line: 1959, col: 66, offset: 61767}, + pos: position{line: 1954, col: 66, offset: 61656}, val: ")", ignoreCase: false, want: "\")\"", @@ -13918,9 +13881,9 @@ var g = &grammar{ }, { name: "AliasName", - pos: position{line: 1968, col: 1, offset: 61942}, + pos: position{line: 1963, col: 1, offset: 61831}, expr: &ruleRefExpr{ - pos: position{line: 1968, col: 13, offset: 61954}, + pos: position{line: 1963, col: 13, offset: 61843}, name: "Identifier", }, leader: false, @@ -13928,65 +13891,65 @@ var g = &grammar{ }, { name: "OptMaterialized", - pos: position{line: 1970, col: 1, offset: 61966}, + pos: position{line: 1965, col: 1, offset: 61855}, expr: &choiceExpr{ - pos: position{line: 1971, col: 5, offset: 61987}, + pos: position{line: 1966, col: 5, offset: 61876}, alternatives: []any{ &actionExpr{ - pos: position{line: 1971, col: 5, offset: 61987}, + pos: position{line: 1966, col: 5, offset: 61876}, run: (*parser).callonOptMaterialized2, expr: &seqExpr{ - pos: position{line: 1971, col: 5, offset: 61987}, + pos: position{line: 1966, col: 5, offset: 61876}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1971, col: 5, offset: 61987}, + pos: position{line: 1966, col: 5, offset: 61876}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1971, col: 7, offset: 61989}, + pos: position{line: 1966, col: 7, offset: 61878}, name: "MATERIALIZED", }, &ruleRefExpr{ - pos: position{line: 1971, col: 20, offset: 62002}, + pos: position{line: 1966, col: 20, offset: 61891}, name: "_", }, }, }, }, &actionExpr{ - pos: position{line: 1972, col: 5, offset: 62041}, + pos: position{line: 1967, col: 5, offset: 61930}, run: (*parser).callonOptMaterialized7, expr: &seqExpr{ - pos: position{line: 1972, col: 5, offset: 62041}, + pos: position{line: 1967, col: 5, offset: 61930}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1972, col: 5, offset: 62041}, + pos: position{line: 1967, col: 5, offset: 61930}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1972, col: 7, offset: 62043}, + pos: position{line: 1967, col: 7, offset: 61932}, name: "NOT", }, &ruleRefExpr{ - pos: position{line: 1972, col: 11, offset: 62047}, + pos: position{line: 1967, col: 11, offset: 61936}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1972, col: 13, offset: 62049}, + pos: position{line: 1967, col: 13, offset: 61938}, name: "MATERIALIZED", }, &ruleRefExpr{ - pos: position{line: 1972, col: 26, offset: 62062}, + pos: position{line: 1967, col: 26, offset: 61951}, name: "_", }, }, }, }, &actionExpr{ - pos: position{line: 1973, col: 5, offset: 62093}, + pos: position{line: 1968, col: 5, offset: 61982}, run: (*parser).callonOptMaterialized14, expr: &litMatcher{ - pos: position{line: 1973, col: 5, offset: 62093}, + pos: position{line: 1968, col: 5, offset: 61982}, val: "", ignoreCase: false, want: "\"\"", @@ -13999,25 +13962,25 @@ var g = &grammar{ }, { name: "OptAllClause", - pos: position{line: 1975, col: 1, offset: 62148}, + pos: position{line: 1970, col: 1, offset: 62037}, expr: &choiceExpr{ - pos: position{line: 1976, col: 5, offset: 62165}, + pos: position{line: 1971, col: 5, offset: 62054}, alternatives: []any{ &seqExpr{ - pos: position{line: 1976, col: 5, offset: 62165}, + pos: position{line: 1971, col: 5, offset: 62054}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1976, col: 5, offset: 62165}, + pos: position{line: 1971, col: 5, offset: 62054}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1976, col: 7, offset: 62167}, + pos: position{line: 1971, col: 7, offset: 62056}, name: "ALL", }, }, }, &litMatcher{ - pos: position{line: 1977, col: 5, offset: 62176}, + pos: position{line: 1972, col: 5, offset: 62065}, val: "", ignoreCase: false, want: "\"\"", @@ -14029,25 +13992,25 @@ var g = &grammar{ }, { name: "OptFromClause", - pos: position{line: 1979, col: 1, offset: 62180}, + pos: position{line: 1974, col: 1, offset: 62069}, expr: &choiceExpr{ - pos: position{line: 1980, col: 5, offset: 62198}, + pos: position{line: 1975, col: 5, offset: 62087}, alternatives: []any{ &actionExpr{ - pos: position{line: 1980, col: 5, offset: 62198}, + pos: position{line: 1975, col: 5, offset: 62087}, run: (*parser).callonOptFromClause2, expr: &seqExpr{ - pos: position{line: 1980, col: 5, offset: 62198}, + pos: position{line: 1975, col: 5, offset: 62087}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1980, col: 5, offset: 62198}, + pos: position{line: 1975, col: 5, offset: 62087}, name: "_", }, &labeledExpr{ - pos: position{line: 1980, col: 7, offset: 62200}, + pos: position{line: 1975, col: 7, offset: 62089}, label: "from", expr: &ruleRefExpr{ - pos: position{line: 1980, col: 12, offset: 62205}, + pos: position{line: 1975, col: 12, offset: 62094}, name: "FromOp", }, }, @@ -14055,10 +14018,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1983, col: 5, offset: 62247}, + pos: position{line: 1978, col: 5, offset: 62136}, run: (*parser).callonOptFromClause7, expr: &litMatcher{ - pos: position{line: 1983, col: 5, offset: 62247}, + pos: position{line: 1978, col: 5, offset: 62136}, val: "", ignoreCase: false, want: "\"\"", @@ -14071,27 +14034,27 @@ var g = &grammar{ }, { name: "OptWhereClause", - pos: position{line: 1985, col: 1, offset: 62288}, + pos: position{line: 1980, col: 1, offset: 62177}, expr: &choiceExpr{ - pos: position{line: 1986, col: 5, offset: 62307}, + pos: position{line: 1981, col: 5, offset: 62196}, alternatives: []any{ &actionExpr{ - pos: position{line: 1986, col: 5, offset: 62307}, + pos: position{line: 1981, col: 5, offset: 62196}, run: (*parser).callonOptWhereClause2, expr: &labeledExpr{ - pos: position{line: 1986, col: 5, offset: 62307}, + pos: position{line: 1981, col: 5, offset: 62196}, label: "where", expr: &ruleRefExpr{ - pos: position{line: 1986, col: 11, offset: 62313}, + pos: position{line: 1981, col: 11, offset: 62202}, name: "WhereClause", }, }, }, &actionExpr{ - pos: position{line: 1987, col: 5, offset: 62355}, + pos: position{line: 1982, col: 5, offset: 62244}, run: (*parser).callonOptWhereClause5, expr: &litMatcher{ - pos: position{line: 1987, col: 5, offset: 62355}, + pos: position{line: 1982, col: 5, offset: 62244}, val: "", ignoreCase: false, want: "\"\"", @@ -14104,25 +14067,25 @@ var g = &grammar{ }, { name: "OptGroupClause", - pos: position{line: 1989, col: 1, offset: 62400}, + pos: position{line: 1984, col: 1, offset: 62289}, expr: &choiceExpr{ - pos: position{line: 1990, col: 5, offset: 62419}, + pos: position{line: 1985, col: 5, offset: 62308}, alternatives: []any{ &actionExpr{ - pos: position{line: 1990, col: 5, offset: 62419}, + pos: position{line: 1985, col: 5, offset: 62308}, run: (*parser).callonOptGroupClause2, expr: &seqExpr{ - pos: position{line: 1990, col: 5, offset: 62419}, + pos: position{line: 1985, col: 5, offset: 62308}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1990, col: 5, offset: 62419}, + pos: position{line: 1985, col: 5, offset: 62308}, name: "_", }, &labeledExpr{ - pos: position{line: 1990, col: 7, offset: 62421}, + pos: position{line: 1985, col: 7, offset: 62310}, label: "group", expr: &ruleRefExpr{ - pos: position{line: 1990, col: 13, offset: 62427}, + pos: position{line: 1985, col: 13, offset: 62316}, name: "GroupClause", }, }, @@ -14130,10 +14093,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 1991, col: 5, offset: 62465}, + pos: position{line: 1986, col: 5, offset: 62354}, run: (*parser).callonOptGroupClause7, expr: &litMatcher{ - pos: position{line: 1991, col: 5, offset: 62465}, + pos: position{line: 1986, col: 5, offset: 62354}, val: "", ignoreCase: false, want: "\"\"", @@ -14146,34 +14109,34 @@ var g = &grammar{ }, { name: "GroupClause", - pos: position{line: 1993, col: 1, offset: 62506}, + pos: position{line: 1988, col: 1, offset: 62395}, expr: &actionExpr{ - pos: position{line: 1994, col: 5, offset: 62522}, + pos: position{line: 1989, col: 5, offset: 62411}, run: (*parser).callonGroupClause1, expr: &seqExpr{ - pos: position{line: 1994, col: 5, offset: 62522}, + pos: position{line: 1989, col: 5, offset: 62411}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1994, col: 5, offset: 62522}, + pos: position{line: 1989, col: 5, offset: 62411}, name: "GROUP", }, &ruleRefExpr{ - pos: position{line: 1994, col: 11, offset: 62528}, + pos: position{line: 1989, col: 11, offset: 62417}, name: "_", }, &ruleRefExpr{ - pos: position{line: 1994, col: 13, offset: 62530}, + pos: position{line: 1989, col: 13, offset: 62419}, name: "BY", }, &ruleRefExpr{ - pos: position{line: 1994, col: 16, offset: 62533}, + pos: position{line: 1989, col: 16, offset: 62422}, name: "_", }, &labeledExpr{ - pos: position{line: 1994, col: 18, offset: 62535}, + pos: position{line: 1989, col: 18, offset: 62424}, label: "list", expr: &ruleRefExpr{ - pos: position{line: 1994, col: 23, offset: 62540}, + pos: position{line: 1989, col: 23, offset: 62429}, name: "GroupByList", }, }, @@ -14185,51 +14148,51 @@ var g = &grammar{ }, { name: "GroupByList", - pos: position{line: 1996, col: 1, offset: 62574}, + pos: position{line: 1991, col: 1, offset: 62463}, expr: &actionExpr{ - pos: position{line: 1997, col: 5, offset: 62591}, + pos: position{line: 1992, col: 5, offset: 62480}, run: (*parser).callonGroupByList1, expr: &seqExpr{ - pos: position{line: 1997, col: 5, offset: 62591}, + pos: position{line: 1992, col: 5, offset: 62480}, exprs: []any{ &labeledExpr{ - pos: position{line: 1997, col: 5, offset: 62591}, + pos: position{line: 1992, col: 5, offset: 62480}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 1997, col: 11, offset: 62597}, + pos: position{line: 1992, col: 11, offset: 62486}, name: "GroupByItem", }, }, &labeledExpr{ - pos: position{line: 1997, col: 23, offset: 62609}, + pos: position{line: 1992, col: 23, offset: 62498}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 1997, col: 28, offset: 62614}, + pos: position{line: 1992, col: 28, offset: 62503}, expr: &actionExpr{ - pos: position{line: 1997, col: 30, offset: 62616}, + pos: position{line: 1992, col: 30, offset: 62505}, run: (*parser).callonGroupByList7, expr: &seqExpr{ - pos: position{line: 1997, col: 30, offset: 62616}, + pos: position{line: 1992, col: 30, offset: 62505}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 1997, col: 30, offset: 62616}, + pos: position{line: 1992, col: 30, offset: 62505}, name: "__", }, &litMatcher{ - pos: position{line: 1997, col: 33, offset: 62619}, + pos: position{line: 1992, col: 33, offset: 62508}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 1997, col: 37, offset: 62623}, + pos: position{line: 1992, col: 37, offset: 62512}, name: "__", }, &labeledExpr{ - pos: position{line: 1997, col: 40, offset: 62626}, + pos: position{line: 1992, col: 40, offset: 62515}, label: "g", expr: &ruleRefExpr{ - pos: position{line: 1997, col: 42, offset: 62628}, + pos: position{line: 1992, col: 42, offset: 62517}, name: "GroupByItem", }, }, @@ -14246,9 +14209,9 @@ var g = &grammar{ }, { name: "GroupByItem", - pos: position{line: 2001, col: 1, offset: 62709}, + pos: position{line: 1996, col: 1, offset: 62598}, expr: &ruleRefExpr{ - pos: position{line: 2001, col: 15, offset: 62723}, + pos: position{line: 1996, col: 15, offset: 62612}, name: "Expr", }, leader: false, @@ -14256,25 +14219,25 @@ var g = &grammar{ }, { name: "OptHavingClause", - pos: position{line: 2003, col: 1, offset: 62729}, + pos: position{line: 1998, col: 1, offset: 62618}, expr: &choiceExpr{ - pos: position{line: 2004, col: 5, offset: 62749}, + pos: position{line: 1999, col: 5, offset: 62638}, alternatives: []any{ &actionExpr{ - pos: position{line: 2004, col: 5, offset: 62749}, + pos: position{line: 1999, col: 5, offset: 62638}, run: (*parser).callonOptHavingClause2, expr: &seqExpr{ - pos: position{line: 2004, col: 5, offset: 62749}, + pos: position{line: 1999, col: 5, offset: 62638}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2004, col: 5, offset: 62749}, + pos: position{line: 1999, col: 5, offset: 62638}, name: "_", }, &labeledExpr{ - pos: position{line: 2004, col: 7, offset: 62751}, + pos: position{line: 1999, col: 7, offset: 62640}, label: "h", expr: &ruleRefExpr{ - pos: position{line: 2004, col: 9, offset: 62753}, + pos: position{line: 1999, col: 9, offset: 62642}, name: "HavingClause", }, }, @@ -14282,10 +14245,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2005, col: 5, offset: 62788}, + pos: position{line: 2000, col: 5, offset: 62677}, run: (*parser).callonOptHavingClause7, expr: &litMatcher{ - pos: position{line: 2005, col: 5, offset: 62788}, + pos: position{line: 2000, col: 5, offset: 62677}, val: "", ignoreCase: false, want: "\"\"", @@ -14298,26 +14261,26 @@ var g = &grammar{ }, { name: "HavingClause", - pos: position{line: 2007, col: 1, offset: 62812}, + pos: position{line: 2002, col: 1, offset: 62701}, expr: &actionExpr{ - pos: position{line: 2008, col: 5, offset: 62829}, + pos: position{line: 2003, col: 5, offset: 62718}, run: (*parser).callonHavingClause1, expr: &seqExpr{ - pos: position{line: 2008, col: 5, offset: 62829}, + pos: position{line: 2003, col: 5, offset: 62718}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2008, col: 5, offset: 62829}, + pos: position{line: 2003, col: 5, offset: 62718}, name: "HAVING", }, &ruleRefExpr{ - pos: position{line: 2008, col: 12, offset: 62836}, + pos: position{line: 2003, col: 12, offset: 62725}, name: "_", }, &labeledExpr{ - pos: position{line: 2008, col: 14, offset: 62838}, + pos: position{line: 2003, col: 14, offset: 62727}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2008, col: 16, offset: 62840}, + pos: position{line: 2003, col: 16, offset: 62729}, name: "Expr", }, }, @@ -14329,16 +14292,16 @@ var g = &grammar{ }, { name: "JoinOperation", - pos: position{line: 2010, col: 1, offset: 62864}, + pos: position{line: 2005, col: 1, offset: 62753}, expr: &choiceExpr{ - pos: position{line: 2011, col: 5, offset: 62882}, + pos: position{line: 2006, col: 5, offset: 62771}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 2011, col: 5, offset: 62882}, + pos: position{line: 2006, col: 5, offset: 62771}, name: "CrossJoin", }, &ruleRefExpr{ - pos: position{line: 2012, col: 5, offset: 62896}, + pos: position{line: 2007, col: 5, offset: 62785}, name: "ConditionJoin", }, }, @@ -14348,30 +14311,30 @@ var g = &grammar{ }, { name: "CrossJoin", - pos: position{line: 2014, col: 1, offset: 62911}, + pos: position{line: 2009, col: 1, offset: 62800}, expr: &actionExpr{ - pos: position{line: 2015, col: 5, offset: 62925}, + pos: position{line: 2010, col: 5, offset: 62814}, run: (*parser).callonCrossJoin1, expr: &seqExpr{ - pos: position{line: 2015, col: 5, offset: 62925}, + pos: position{line: 2010, col: 5, offset: 62814}, exprs: []any{ &labeledExpr{ - pos: position{line: 2015, col: 5, offset: 62925}, + pos: position{line: 2010, col: 5, offset: 62814}, label: "left", expr: &ruleRefExpr{ - pos: position{line: 2015, col: 10, offset: 62930}, + pos: position{line: 2010, col: 10, offset: 62819}, name: "FromElem", }, }, &ruleRefExpr{ - pos: position{line: 2015, col: 19, offset: 62939}, + pos: position{line: 2010, col: 19, offset: 62828}, name: "CrossJoinOp", }, &labeledExpr{ - pos: position{line: 2015, col: 31, offset: 62951}, + pos: position{line: 2010, col: 31, offset: 62840}, label: "right", expr: &ruleRefExpr{ - pos: position{line: 2015, col: 37, offset: 62957}, + pos: position{line: 2010, col: 37, offset: 62846}, name: "FromElem", }, }, @@ -14383,50 +14346,50 @@ var g = &grammar{ }, { name: "CrossJoinOp", - pos: position{line: 2024, col: 1, offset: 63159}, + pos: position{line: 2019, col: 1, offset: 63048}, expr: &choiceExpr{ - pos: position{line: 2025, col: 5, offset: 63176}, + pos: position{line: 2020, col: 5, offset: 63065}, alternatives: []any{ &seqExpr{ - pos: position{line: 2025, col: 5, offset: 63176}, + pos: position{line: 2020, col: 5, offset: 63065}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2025, col: 5, offset: 63176}, + pos: position{line: 2020, col: 5, offset: 63065}, name: "__", }, &litMatcher{ - pos: position{line: 2025, col: 8, offset: 63179}, + pos: position{line: 2020, col: 8, offset: 63068}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 2025, col: 12, offset: 63183}, + pos: position{line: 2020, col: 12, offset: 63072}, name: "__", }, }, }, &seqExpr{ - pos: position{line: 2026, col: 5, offset: 63191}, + pos: position{line: 2021, col: 5, offset: 63080}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2026, col: 5, offset: 63191}, + pos: position{line: 2021, col: 5, offset: 63080}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2026, col: 7, offset: 63193}, + pos: position{line: 2021, col: 7, offset: 63082}, name: "CROSS", }, &ruleRefExpr{ - pos: position{line: 2026, col: 13, offset: 63199}, + pos: position{line: 2021, col: 13, offset: 63088}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2026, col: 15, offset: 63201}, + pos: position{line: 2021, col: 15, offset: 63090}, name: "JOIN", }, &ruleRefExpr{ - pos: position{line: 2026, col: 20, offset: 63206}, + pos: position{line: 2021, col: 20, offset: 63095}, name: "_", }, }, @@ -14438,46 +14401,46 @@ var g = &grammar{ }, { name: "ConditionJoin", - pos: position{line: 2028, col: 1, offset: 63210}, + pos: position{line: 2023, col: 1, offset: 63099}, expr: &actionExpr{ - pos: position{line: 2029, col: 5, offset: 63228}, + pos: position{line: 2024, col: 5, offset: 63117}, run: (*parser).callonConditionJoin1, expr: &seqExpr{ - pos: position{line: 2029, col: 5, offset: 63228}, + pos: position{line: 2024, col: 5, offset: 63117}, exprs: []any{ &labeledExpr{ - pos: position{line: 2029, col: 5, offset: 63228}, + pos: position{line: 2024, col: 5, offset: 63117}, label: "left", expr: &ruleRefExpr{ - pos: position{line: 2029, col: 10, offset: 63233}, + pos: position{line: 2024, col: 10, offset: 63122}, name: "FromElem", }, }, &labeledExpr{ - pos: position{line: 2029, col: 19, offset: 63242}, + pos: position{line: 2024, col: 19, offset: 63131}, label: "style", expr: &ruleRefExpr{ - pos: position{line: 2029, col: 25, offset: 63248}, + pos: position{line: 2024, col: 25, offset: 63137}, name: "SQLJoinStyle", }, }, &ruleRefExpr{ - pos: position{line: 2029, col: 38, offset: 63261}, + pos: position{line: 2024, col: 38, offset: 63150}, name: "_", }, &labeledExpr{ - pos: position{line: 2029, col: 40, offset: 63263}, + pos: position{line: 2024, col: 40, offset: 63152}, label: "right", expr: &ruleRefExpr{ - pos: position{line: 2029, col: 46, offset: 63269}, + pos: position{line: 2024, col: 46, offset: 63158}, name: "FromElem", }, }, &labeledExpr{ - pos: position{line: 2029, col: 55, offset: 63278}, + pos: position{line: 2024, col: 55, offset: 63167}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2029, col: 57, offset: 63280}, + pos: position{line: 2024, col: 57, offset: 63169}, name: "JoinExpr", }, }, @@ -14489,161 +14452,161 @@ var g = &grammar{ }, { name: "SQLJoinStyle", - pos: position{line: 2040, col: 1, offset: 63549}, + pos: position{line: 2035, col: 1, offset: 63438}, expr: &choiceExpr{ - pos: position{line: 2041, col: 5, offset: 63567}, + pos: position{line: 2036, col: 5, offset: 63456}, alternatives: []any{ &actionExpr{ - pos: position{line: 2041, col: 5, offset: 63567}, + pos: position{line: 2036, col: 5, offset: 63456}, run: (*parser).callonSQLJoinStyle2, expr: &seqExpr{ - pos: position{line: 2041, col: 5, offset: 63567}, + pos: position{line: 2036, col: 5, offset: 63456}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 2041, col: 5, offset: 63567}, + pos: position{line: 2036, col: 5, offset: 63456}, expr: &seqExpr{ - pos: position{line: 2041, col: 6, offset: 63568}, + pos: position{line: 2036, col: 6, offset: 63457}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2041, col: 6, offset: 63568}, + pos: position{line: 2036, col: 6, offset: 63457}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2041, col: 8, offset: 63570}, + pos: position{line: 2036, col: 8, offset: 63459}, name: "INNER", }, }, }, }, &ruleRefExpr{ - pos: position{line: 2041, col: 16, offset: 63578}, + pos: position{line: 2036, col: 16, offset: 63467}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2041, col: 18, offset: 63580}, + pos: position{line: 2036, col: 18, offset: 63469}, name: "JOIN", }, }, }, }, &actionExpr{ - pos: position{line: 2042, col: 5, offset: 63625}, + pos: position{line: 2037, col: 5, offset: 63514}, run: (*parser).callonSQLJoinStyle10, expr: &seqExpr{ - pos: position{line: 2042, col: 5, offset: 63625}, + pos: position{line: 2037, col: 5, offset: 63514}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2042, col: 5, offset: 63625}, + pos: position{line: 2037, col: 5, offset: 63514}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2042, col: 7, offset: 63627}, + pos: position{line: 2037, col: 7, offset: 63516}, name: "FULL", }, &zeroOrOneExpr{ - pos: position{line: 2042, col: 12, offset: 63632}, + pos: position{line: 2037, col: 12, offset: 63521}, expr: &seqExpr{ - pos: position{line: 2042, col: 13, offset: 63633}, + pos: position{line: 2037, col: 13, offset: 63522}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2042, col: 13, offset: 63633}, + pos: position{line: 2037, col: 13, offset: 63522}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2042, col: 15, offset: 63635}, + pos: position{line: 2037, col: 15, offset: 63524}, name: "OUTER", }, }, }, }, &ruleRefExpr{ - pos: position{line: 2042, col: 23, offset: 63643}, + pos: position{line: 2037, col: 23, offset: 63532}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2042, col: 25, offset: 63645}, + pos: position{line: 2037, col: 25, offset: 63534}, name: "JOIN", }, }, }, }, &actionExpr{ - pos: position{line: 2043, col: 5, offset: 63679}, + pos: position{line: 2038, col: 5, offset: 63568}, run: (*parser).callonSQLJoinStyle20, expr: &seqExpr{ - pos: position{line: 2043, col: 5, offset: 63679}, + pos: position{line: 2038, col: 5, offset: 63568}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2043, col: 5, offset: 63679}, + pos: position{line: 2038, col: 5, offset: 63568}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2043, col: 7, offset: 63681}, + pos: position{line: 2038, col: 7, offset: 63570}, name: "LEFT", }, &zeroOrOneExpr{ - pos: position{line: 2043, col: 12, offset: 63686}, + pos: position{line: 2038, col: 12, offset: 63575}, expr: &seqExpr{ - pos: position{line: 2043, col: 13, offset: 63687}, + pos: position{line: 2038, col: 13, offset: 63576}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2043, col: 13, offset: 63687}, + pos: position{line: 2038, col: 13, offset: 63576}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2043, col: 15, offset: 63689}, + pos: position{line: 2038, col: 15, offset: 63578}, name: "OUTER", }, }, }, }, &ruleRefExpr{ - pos: position{line: 2043, col: 23, offset: 63697}, + pos: position{line: 2038, col: 23, offset: 63586}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2043, col: 25, offset: 63699}, + pos: position{line: 2038, col: 25, offset: 63588}, name: "JOIN", }, }, }, }, &actionExpr{ - pos: position{line: 2044, col: 5, offset: 63733}, + pos: position{line: 2039, col: 5, offset: 63622}, run: (*parser).callonSQLJoinStyle30, expr: &seqExpr{ - pos: position{line: 2044, col: 5, offset: 63733}, + pos: position{line: 2039, col: 5, offset: 63622}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2044, col: 5, offset: 63733}, + pos: position{line: 2039, col: 5, offset: 63622}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2044, col: 7, offset: 63735}, + pos: position{line: 2039, col: 7, offset: 63624}, name: "RIGHT", }, &zeroOrOneExpr{ - pos: position{line: 2044, col: 13, offset: 63741}, + pos: position{line: 2039, col: 13, offset: 63630}, expr: &seqExpr{ - pos: position{line: 2044, col: 14, offset: 63742}, + pos: position{line: 2039, col: 14, offset: 63631}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2044, col: 14, offset: 63742}, + pos: position{line: 2039, col: 14, offset: 63631}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2044, col: 16, offset: 63744}, + pos: position{line: 2039, col: 16, offset: 63633}, name: "OUTER", }, }, }, }, &ruleRefExpr{ - pos: position{line: 2044, col: 24, offset: 63752}, + pos: position{line: 2039, col: 24, offset: 63641}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2044, col: 26, offset: 63754}, + pos: position{line: 2039, col: 26, offset: 63643}, name: "JOIN", }, }, @@ -14656,33 +14619,33 @@ var g = &grammar{ }, { name: "JoinExpr", - pos: position{line: 2046, col: 1, offset: 63786}, + pos: position{line: 2041, col: 1, offset: 63675}, expr: &choiceExpr{ - pos: position{line: 2047, col: 5, offset: 63800}, + pos: position{line: 2042, col: 5, offset: 63689}, alternatives: []any{ &actionExpr{ - pos: position{line: 2047, col: 5, offset: 63800}, + pos: position{line: 2042, col: 5, offset: 63689}, run: (*parser).callonJoinExpr2, expr: &seqExpr{ - pos: position{line: 2047, col: 5, offset: 63800}, + pos: position{line: 2042, col: 5, offset: 63689}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2047, col: 5, offset: 63800}, + pos: position{line: 2042, col: 5, offset: 63689}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2047, col: 7, offset: 63802}, + pos: position{line: 2042, col: 7, offset: 63691}, name: "ON", }, &ruleRefExpr{ - pos: position{line: 2047, col: 10, offset: 63805}, + pos: position{line: 2042, col: 10, offset: 63694}, name: "_", }, &labeledExpr{ - pos: position{line: 2047, col: 12, offset: 63807}, + pos: position{line: 2042, col: 12, offset: 63696}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2047, col: 14, offset: 63809}, + pos: position{line: 2042, col: 14, offset: 63698}, name: "Expr", }, }, @@ -14690,47 +14653,47 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2053, col: 5, offset: 63939}, + pos: position{line: 2048, col: 5, offset: 63828}, run: (*parser).callonJoinExpr9, expr: &seqExpr{ - pos: position{line: 2053, col: 5, offset: 63939}, + pos: position{line: 2048, col: 5, offset: 63828}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2053, col: 5, offset: 63939}, + pos: position{line: 2048, col: 5, offset: 63828}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2053, col: 7, offset: 63941}, + pos: position{line: 2048, col: 7, offset: 63830}, name: "USING", }, &ruleRefExpr{ - pos: position{line: 2053, col: 13, offset: 63947}, + pos: position{line: 2048, col: 13, offset: 63836}, name: "__", }, &litMatcher{ - pos: position{line: 2053, col: 16, offset: 63950}, + pos: position{line: 2048, col: 16, offset: 63839}, val: "(", ignoreCase: false, want: "\"(\"", }, &ruleRefExpr{ - pos: position{line: 2053, col: 20, offset: 63954}, + pos: position{line: 2048, col: 20, offset: 63843}, name: "__", }, &labeledExpr{ - pos: position{line: 2053, col: 23, offset: 63957}, + pos: position{line: 2048, col: 23, offset: 63846}, label: "fields", expr: &ruleRefExpr{ - pos: position{line: 2053, col: 30, offset: 63964}, + pos: position{line: 2048, col: 30, offset: 63853}, name: "Lvals", }, }, &ruleRefExpr{ - pos: position{line: 2053, col: 36, offset: 63970}, + pos: position{line: 2048, col: 36, offset: 63859}, name: "__", }, &litMatcher{ - pos: position{line: 2053, col: 39, offset: 63973}, + pos: position{line: 2048, col: 39, offset: 63862}, val: ")", ignoreCase: false, want: "\")\"", @@ -14745,40 +14708,40 @@ var g = &grammar{ }, { name: "OptOrdinality", - pos: position{line: 2060, col: 1, offset: 64118}, + pos: position{line: 2055, col: 1, offset: 64007}, expr: &choiceExpr{ - pos: position{line: 2061, col: 5, offset: 64137}, + pos: position{line: 2056, col: 5, offset: 64026}, alternatives: []any{ &actionExpr{ - pos: position{line: 2061, col: 5, offset: 64137}, + pos: position{line: 2056, col: 5, offset: 64026}, run: (*parser).callonOptOrdinality2, expr: &seqExpr{ - pos: position{line: 2061, col: 5, offset: 64137}, + pos: position{line: 2056, col: 5, offset: 64026}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2061, col: 5, offset: 64137}, + pos: position{line: 2056, col: 5, offset: 64026}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2061, col: 7, offset: 64139}, + pos: position{line: 2056, col: 7, offset: 64028}, name: "WITH", }, &ruleRefExpr{ - pos: position{line: 2061, col: 12, offset: 64144}, + pos: position{line: 2056, col: 12, offset: 64033}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2061, col: 14, offset: 64146}, + pos: position{line: 2056, col: 14, offset: 64035}, name: "ORDINALITY", }, }, }, }, &actionExpr{ - pos: position{line: 2067, col: 5, offset: 64275}, + pos: position{line: 2062, col: 5, offset: 64164}, run: (*parser).callonOptOrdinality8, expr: &litMatcher{ - pos: position{line: 2067, col: 5, offset: 64275}, + pos: position{line: 2062, col: 5, offset: 64164}, val: "", ignoreCase: false, want: "\"\"", @@ -14791,25 +14754,25 @@ var g = &grammar{ }, { name: "OptAlias", - pos: position{line: 2069, col: 1, offset: 64324}, + pos: position{line: 2064, col: 1, offset: 64213}, expr: &choiceExpr{ - pos: position{line: 2070, col: 5, offset: 64337}, + pos: position{line: 2065, col: 5, offset: 64226}, alternatives: []any{ &actionExpr{ - pos: position{line: 2070, col: 5, offset: 64337}, + pos: position{line: 2065, col: 5, offset: 64226}, run: (*parser).callonOptAlias2, expr: &seqExpr{ - pos: position{line: 2070, col: 5, offset: 64337}, + pos: position{line: 2065, col: 5, offset: 64226}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2070, col: 5, offset: 64337}, + pos: position{line: 2065, col: 5, offset: 64226}, name: "_", }, &labeledExpr{ - pos: position{line: 2070, col: 7, offset: 64339}, + pos: position{line: 2065, col: 7, offset: 64228}, label: "a", expr: &ruleRefExpr{ - pos: position{line: 2070, col: 9, offset: 64341}, + pos: position{line: 2065, col: 9, offset: 64230}, name: "AliasClause", }, }, @@ -14817,10 +14780,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2071, col: 5, offset: 64375}, + pos: position{line: 2066, col: 5, offset: 64264}, run: (*parser).callonOptAlias7, expr: &litMatcher{ - pos: position{line: 2071, col: 5, offset: 64375}, + pos: position{line: 2066, col: 5, offset: 64264}, val: "", ignoreCase: false, want: "\"\"", @@ -14833,50 +14796,50 @@ var g = &grammar{ }, { name: "AliasClause", - pos: position{line: 2073, col: 1, offset: 64412}, + pos: position{line: 2068, col: 1, offset: 64301}, expr: &actionExpr{ - pos: position{line: 2074, col: 5, offset: 64429}, + pos: position{line: 2069, col: 5, offset: 64318}, run: (*parser).callonAliasClause1, expr: &seqExpr{ - pos: position{line: 2074, col: 5, offset: 64429}, + pos: position{line: 2069, col: 5, offset: 64318}, exprs: []any{ &zeroOrOneExpr{ - pos: position{line: 2074, col: 5, offset: 64429}, + pos: position{line: 2069, col: 5, offset: 64318}, expr: &seqExpr{ - pos: position{line: 2074, col: 6, offset: 64430}, + pos: position{line: 2069, col: 6, offset: 64319}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2074, col: 6, offset: 64430}, + pos: position{line: 2069, col: 6, offset: 64319}, name: "AS", }, &ruleRefExpr{ - pos: position{line: 2074, col: 9, offset: 64433}, + pos: position{line: 2069, col: 9, offset: 64322}, name: "_", }, }, }, }, ¬Expr{ - pos: position{line: 2074, col: 13, offset: 64437}, + pos: position{line: 2069, col: 13, offset: 64326}, expr: &choiceExpr{ - pos: position{line: 2074, col: 15, offset: 64439}, + pos: position{line: 2069, col: 15, offset: 64328}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 2074, col: 15, offset: 64439}, + pos: position{line: 2069, col: 15, offset: 64328}, name: "SQLGuard", }, &ruleRefExpr{ - pos: position{line: 2074, col: 26, offset: 64450}, + pos: position{line: 2069, col: 26, offset: 64339}, name: "DeprecatedFroms", }, }, }, }, &labeledExpr{ - pos: position{line: 2074, col: 43, offset: 64467}, + pos: position{line: 2069, col: 43, offset: 64356}, label: "name", expr: &ruleRefExpr{ - pos: position{line: 2074, col: 48, offset: 64472}, + pos: position{line: 2069, col: 48, offset: 64361}, name: "IdentifierName", }, }, @@ -14888,51 +14851,51 @@ var g = &grammar{ }, { name: "Selection", - pos: position{line: 2078, col: 1, offset: 64605}, + pos: position{line: 2073, col: 1, offset: 64494}, expr: &actionExpr{ - pos: position{line: 2079, col: 5, offset: 64619}, + pos: position{line: 2074, col: 5, offset: 64508}, run: (*parser).callonSelection1, expr: &seqExpr{ - pos: position{line: 2079, col: 5, offset: 64619}, + pos: position{line: 2074, col: 5, offset: 64508}, exprs: []any{ &labeledExpr{ - pos: position{line: 2079, col: 5, offset: 64619}, + pos: position{line: 2074, col: 5, offset: 64508}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 2079, col: 11, offset: 64625}, + pos: position{line: 2074, col: 11, offset: 64514}, name: "SelectElem", }, }, &labeledExpr{ - pos: position{line: 2079, col: 22, offset: 64636}, + pos: position{line: 2074, col: 22, offset: 64525}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 2079, col: 27, offset: 64641}, + pos: position{line: 2074, col: 27, offset: 64530}, expr: &actionExpr{ - pos: position{line: 2079, col: 29, offset: 64643}, + pos: position{line: 2074, col: 29, offset: 64532}, run: (*parser).callonSelection7, expr: &seqExpr{ - pos: position{line: 2079, col: 29, offset: 64643}, + pos: position{line: 2074, col: 29, offset: 64532}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2079, col: 29, offset: 64643}, + pos: position{line: 2074, col: 29, offset: 64532}, name: "__", }, &litMatcher{ - pos: position{line: 2079, col: 32, offset: 64646}, + pos: position{line: 2074, col: 32, offset: 64535}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 2079, col: 36, offset: 64650}, + pos: position{line: 2074, col: 36, offset: 64539}, name: "__", }, &labeledExpr{ - pos: position{line: 2079, col: 39, offset: 64653}, + pos: position{line: 2074, col: 39, offset: 64542}, label: "s", expr: &ruleRefExpr{ - pos: position{line: 2079, col: 41, offset: 64655}, + pos: position{line: 2074, col: 41, offset: 64544}, name: "SelectElem", }, }, @@ -14949,29 +14912,29 @@ var g = &grammar{ }, { name: "SelectElem", - pos: position{line: 2088, col: 1, offset: 64881}, + pos: position{line: 2083, col: 1, offset: 64770}, expr: &choiceExpr{ - pos: position{line: 2089, col: 5, offset: 64897}, + pos: position{line: 2084, col: 5, offset: 64786}, alternatives: []any{ &actionExpr{ - pos: position{line: 2089, col: 5, offset: 64897}, + pos: position{line: 2084, col: 5, offset: 64786}, run: (*parser).callonSelectElem2, expr: &seqExpr{ - pos: position{line: 2089, col: 5, offset: 64897}, + pos: position{line: 2084, col: 5, offset: 64786}, exprs: []any{ &labeledExpr{ - pos: position{line: 2089, col: 5, offset: 64897}, + pos: position{line: 2084, col: 5, offset: 64786}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2089, col: 7, offset: 64899}, + pos: position{line: 2084, col: 7, offset: 64788}, name: "Expr", }, }, &labeledExpr{ - pos: position{line: 2089, col: 12, offset: 64904}, + pos: position{line: 2084, col: 12, offset: 64793}, label: "as", expr: &ruleRefExpr{ - pos: position{line: 2089, col: 15, offset: 64907}, + pos: position{line: 2084, col: 15, offset: 64796}, name: "OptAsClause", }, }, @@ -14979,10 +14942,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2100, col: 5, offset: 65123}, + pos: position{line: 2095, col: 5, offset: 65012}, run: (*parser).callonSelectElem8, expr: &litMatcher{ - pos: position{line: 2100, col: 5, offset: 65123}, + pos: position{line: 2095, col: 5, offset: 65012}, val: "*", ignoreCase: false, want: "\"*\"", @@ -14995,33 +14958,33 @@ var g = &grammar{ }, { name: "OptAsClause", - pos: position{line: 2105, col: 1, offset: 65225}, + pos: position{line: 2100, col: 1, offset: 65114}, expr: &choiceExpr{ - pos: position{line: 2106, col: 5, offset: 65242}, + pos: position{line: 2101, col: 5, offset: 65131}, alternatives: []any{ &actionExpr{ - pos: position{line: 2106, col: 5, offset: 65242}, + pos: position{line: 2101, col: 5, offset: 65131}, run: (*parser).callonOptAsClause2, expr: &seqExpr{ - pos: position{line: 2106, col: 5, offset: 65242}, + pos: position{line: 2101, col: 5, offset: 65131}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2106, col: 5, offset: 65242}, + pos: position{line: 2101, col: 5, offset: 65131}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2106, col: 7, offset: 65244}, + pos: position{line: 2101, col: 7, offset: 65133}, name: "AS", }, &ruleRefExpr{ - pos: position{line: 2106, col: 10, offset: 65247}, + pos: position{line: 2101, col: 10, offset: 65136}, name: "_", }, &labeledExpr{ - pos: position{line: 2106, col: 12, offset: 65249}, + pos: position{line: 2101, col: 12, offset: 65138}, label: "id", expr: &ruleRefExpr{ - pos: position{line: 2106, col: 15, offset: 65252}, + pos: position{line: 2101, col: 15, offset: 65141}, name: "Identifier", }, }, @@ -15029,10 +14992,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2107, col: 5, offset: 65286}, + pos: position{line: 2102, col: 5, offset: 65175}, run: (*parser).callonOptAsClause9, expr: &litMatcher{ - pos: position{line: 2107, col: 5, offset: 65286}, + pos: position{line: 2102, col: 5, offset: 65175}, val: "", ignoreCase: false, want: "\"\"", @@ -15045,41 +15008,41 @@ var g = &grammar{ }, { name: "OptOrderByClause", - pos: position{line: 2109, col: 1, offset: 65311}, + pos: position{line: 2104, col: 1, offset: 65200}, expr: &choiceExpr{ - pos: position{line: 2110, col: 5, offset: 65333}, + pos: position{line: 2105, col: 5, offset: 65222}, alternatives: []any{ &actionExpr{ - pos: position{line: 2110, col: 5, offset: 65333}, + pos: position{line: 2105, col: 5, offset: 65222}, run: (*parser).callonOptOrderByClause2, expr: &seqExpr{ - pos: position{line: 2110, col: 5, offset: 65333}, + pos: position{line: 2105, col: 5, offset: 65222}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2110, col: 5, offset: 65333}, + pos: position{line: 2105, col: 5, offset: 65222}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2110, col: 7, offset: 65335}, + pos: position{line: 2105, col: 7, offset: 65224}, name: "ORDER", }, &ruleRefExpr{ - pos: position{line: 2110, col: 13, offset: 65341}, + pos: position{line: 2105, col: 13, offset: 65230}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2110, col: 15, offset: 65343}, + pos: position{line: 2105, col: 15, offset: 65232}, name: "BY", }, &ruleRefExpr{ - pos: position{line: 2110, col: 18, offset: 65346}, + pos: position{line: 2105, col: 18, offset: 65235}, name: "_", }, &labeledExpr{ - pos: position{line: 2110, col: 20, offset: 65348}, + pos: position{line: 2105, col: 20, offset: 65237}, label: "list", expr: &ruleRefExpr{ - pos: position{line: 2110, col: 25, offset: 65353}, + pos: position{line: 2105, col: 25, offset: 65242}, name: "OrderByList", }, }, @@ -15087,10 +15050,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2117, col: 5, offset: 65512}, + pos: position{line: 2112, col: 5, offset: 65401}, run: (*parser).callonOptOrderByClause11, expr: &litMatcher{ - pos: position{line: 2117, col: 5, offset: 65512}, + pos: position{line: 2112, col: 5, offset: 65401}, val: "", ignoreCase: false, want: "\"\"", @@ -15103,51 +15066,51 @@ var g = &grammar{ }, { name: "OrderByList", - pos: position{line: 2119, col: 1, offset: 65545}, + pos: position{line: 2114, col: 1, offset: 65434}, expr: &actionExpr{ - pos: position{line: 2120, col: 5, offset: 65562}, + pos: position{line: 2115, col: 5, offset: 65451}, run: (*parser).callonOrderByList1, expr: &seqExpr{ - pos: position{line: 2120, col: 5, offset: 65562}, + pos: position{line: 2115, col: 5, offset: 65451}, exprs: []any{ &labeledExpr{ - pos: position{line: 2120, col: 5, offset: 65562}, + pos: position{line: 2115, col: 5, offset: 65451}, label: "first", expr: &ruleRefExpr{ - pos: position{line: 2120, col: 11, offset: 65568}, + pos: position{line: 2115, col: 11, offset: 65457}, name: "OrderByItem", }, }, &labeledExpr{ - pos: position{line: 2120, col: 23, offset: 65580}, + pos: position{line: 2115, col: 23, offset: 65469}, label: "rest", expr: &zeroOrMoreExpr{ - pos: position{line: 2120, col: 28, offset: 65585}, + pos: position{line: 2115, col: 28, offset: 65474}, expr: &actionExpr{ - pos: position{line: 2120, col: 30, offset: 65587}, + pos: position{line: 2115, col: 30, offset: 65476}, run: (*parser).callonOrderByList7, expr: &seqExpr{ - pos: position{line: 2120, col: 30, offset: 65587}, + pos: position{line: 2115, col: 30, offset: 65476}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2120, col: 30, offset: 65587}, + pos: position{line: 2115, col: 30, offset: 65476}, name: "__", }, &litMatcher{ - pos: position{line: 2120, col: 33, offset: 65590}, + pos: position{line: 2115, col: 33, offset: 65479}, val: ",", ignoreCase: false, want: "\",\"", }, &ruleRefExpr{ - pos: position{line: 2120, col: 37, offset: 65594}, + pos: position{line: 2115, col: 37, offset: 65483}, name: "__", }, &labeledExpr{ - pos: position{line: 2120, col: 40, offset: 65597}, + pos: position{line: 2115, col: 40, offset: 65486}, label: "o", expr: &ruleRefExpr{ - pos: position{line: 2120, col: 42, offset: 65599}, + pos: position{line: 2115, col: 42, offset: 65488}, name: "OrderByItem", }, }, @@ -15164,34 +15127,34 @@ var g = &grammar{ }, { name: "OrderByItem", - pos: position{line: 2124, col: 1, offset: 65700}, + pos: position{line: 2119, col: 1, offset: 65589}, expr: &actionExpr{ - pos: position{line: 2125, col: 5, offset: 65716}, + pos: position{line: 2120, col: 5, offset: 65605}, run: (*parser).callonOrderByItem1, expr: &seqExpr{ - pos: position{line: 2125, col: 5, offset: 65716}, + pos: position{line: 2120, col: 5, offset: 65605}, exprs: []any{ &labeledExpr{ - pos: position{line: 2125, col: 5, offset: 65716}, + pos: position{line: 2120, col: 5, offset: 65605}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2125, col: 7, offset: 65718}, + pos: position{line: 2120, col: 7, offset: 65607}, name: "Expr", }, }, &labeledExpr{ - pos: position{line: 2125, col: 12, offset: 65723}, + pos: position{line: 2120, col: 12, offset: 65612}, label: "order", expr: &ruleRefExpr{ - pos: position{line: 2125, col: 18, offset: 65729}, + pos: position{line: 2120, col: 18, offset: 65618}, name: "OptAscDesc", }, }, &labeledExpr{ - pos: position{line: 2125, col: 29, offset: 65740}, + pos: position{line: 2120, col: 29, offset: 65629}, label: "nulls", expr: &ruleRefExpr{ - pos: position{line: 2125, col: 35, offset: 65746}, + pos: position{line: 2120, col: 35, offset: 65635}, name: "OptNullsOrder", }, }, @@ -15203,49 +15166,49 @@ var g = &grammar{ }, { name: "OptAscDesc", - pos: position{line: 2136, col: 1, offset: 65996}, + pos: position{line: 2131, col: 1, offset: 65885}, expr: &choiceExpr{ - pos: position{line: 2137, col: 5, offset: 66011}, + pos: position{line: 2132, col: 5, offset: 65900}, alternatives: []any{ &actionExpr{ - pos: position{line: 2137, col: 5, offset: 66011}, + pos: position{line: 2132, col: 5, offset: 65900}, run: (*parser).callonOptAscDesc2, expr: &seqExpr{ - pos: position{line: 2137, col: 5, offset: 66011}, + pos: position{line: 2132, col: 5, offset: 65900}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2137, col: 5, offset: 66011}, + pos: position{line: 2132, col: 5, offset: 65900}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2137, col: 7, offset: 66013}, + pos: position{line: 2132, col: 7, offset: 65902}, name: "ASC", }, }, }, }, &actionExpr{ - pos: position{line: 2138, col: 5, offset: 66085}, + pos: position{line: 2133, col: 5, offset: 65974}, run: (*parser).callonOptAscDesc6, expr: &seqExpr{ - pos: position{line: 2138, col: 5, offset: 66085}, + pos: position{line: 2133, col: 5, offset: 65974}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2138, col: 5, offset: 66085}, + pos: position{line: 2133, col: 5, offset: 65974}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2138, col: 7, offset: 66087}, + pos: position{line: 2133, col: 7, offset: 65976}, name: "DESC", }, }, }, }, &actionExpr{ - pos: position{line: 2139, col: 5, offset: 66159}, + pos: position{line: 2134, col: 5, offset: 66048}, run: (*parser).callonOptAscDesc10, expr: &litMatcher{ - pos: position{line: 2139, col: 5, offset: 66159}, + pos: position{line: 2134, col: 5, offset: 66048}, val: "", ignoreCase: false, want: "\"\"", @@ -15258,65 +15221,65 @@ var g = &grammar{ }, { name: "OptNullsOrder", - pos: position{line: 2141, col: 1, offset: 66191}, + pos: position{line: 2136, col: 1, offset: 66080}, expr: &choiceExpr{ - pos: position{line: 2142, col: 5, offset: 66209}, + pos: position{line: 2137, col: 5, offset: 66098}, alternatives: []any{ &actionExpr{ - pos: position{line: 2142, col: 5, offset: 66209}, + pos: position{line: 2137, col: 5, offset: 66098}, run: (*parser).callonOptNullsOrder2, expr: &seqExpr{ - pos: position{line: 2142, col: 5, offset: 66209}, + pos: position{line: 2137, col: 5, offset: 66098}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2142, col: 5, offset: 66209}, + pos: position{line: 2137, col: 5, offset: 66098}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2142, col: 7, offset: 66211}, + pos: position{line: 2137, col: 7, offset: 66100}, name: "NULLS", }, &ruleRefExpr{ - pos: position{line: 2142, col: 13, offset: 66217}, + pos: position{line: 2137, col: 13, offset: 66106}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2142, col: 15, offset: 66219}, + pos: position{line: 2137, col: 15, offset: 66108}, name: "FIRST", }, }, }, }, &actionExpr{ - pos: position{line: 2143, col: 5, offset: 66295}, + pos: position{line: 2138, col: 5, offset: 66184}, run: (*parser).callonOptNullsOrder8, expr: &seqExpr{ - pos: position{line: 2143, col: 5, offset: 66295}, + pos: position{line: 2138, col: 5, offset: 66184}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2143, col: 5, offset: 66295}, + pos: position{line: 2138, col: 5, offset: 66184}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2143, col: 7, offset: 66297}, + pos: position{line: 2138, col: 7, offset: 66186}, name: "NULLS", }, &ruleRefExpr{ - pos: position{line: 2143, col: 13, offset: 66303}, + pos: position{line: 2138, col: 13, offset: 66192}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2143, col: 15, offset: 66305}, + pos: position{line: 2138, col: 15, offset: 66194}, name: "LAST", }, }, }, }, &actionExpr{ - pos: position{line: 2144, col: 5, offset: 66380}, + pos: position{line: 2139, col: 5, offset: 66269}, run: (*parser).callonOptNullsOrder14, expr: &litMatcher{ - pos: position{line: 2144, col: 5, offset: 66380}, + pos: position{line: 2139, col: 5, offset: 66269}, val: "", ignoreCase: false, want: "\"\"", @@ -15329,29 +15292,29 @@ var g = &grammar{ }, { name: "SelectLimit", - pos: position{line: 2146, col: 1, offset: 66425}, + pos: position{line: 2141, col: 1, offset: 66314}, expr: &choiceExpr{ - pos: position{line: 2147, col: 5, offset: 66441}, + pos: position{line: 2142, col: 5, offset: 66330}, alternatives: []any{ &actionExpr{ - pos: position{line: 2147, col: 5, offset: 66441}, + pos: position{line: 2142, col: 5, offset: 66330}, run: (*parser).callonSelectLimit2, expr: &seqExpr{ - pos: position{line: 2147, col: 5, offset: 66441}, + pos: position{line: 2142, col: 5, offset: 66330}, exprs: []any{ &labeledExpr{ - pos: position{line: 2147, col: 5, offset: 66441}, + pos: position{line: 2142, col: 5, offset: 66330}, label: "l", expr: &ruleRefExpr{ - pos: position{line: 2147, col: 7, offset: 66443}, + pos: position{line: 2142, col: 7, offset: 66332}, name: "LimitClause", }, }, &labeledExpr{ - pos: position{line: 2147, col: 19, offset: 66455}, + pos: position{line: 2142, col: 19, offset: 66344}, label: "o", expr: &ruleRefExpr{ - pos: position{line: 2147, col: 21, offset: 66457}, + pos: position{line: 2142, col: 21, offset: 66346}, name: "OptOffsetClause", }, }, @@ -15359,24 +15322,24 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2154, col: 5, offset: 66603}, + pos: position{line: 2149, col: 5, offset: 66492}, run: (*parser).callonSelectLimit8, expr: &seqExpr{ - pos: position{line: 2154, col: 5, offset: 66603}, + pos: position{line: 2149, col: 5, offset: 66492}, exprs: []any{ &labeledExpr{ - pos: position{line: 2154, col: 5, offset: 66603}, + pos: position{line: 2149, col: 5, offset: 66492}, label: "o", expr: &ruleRefExpr{ - pos: position{line: 2154, col: 7, offset: 66605}, + pos: position{line: 2149, col: 7, offset: 66494}, name: "OffsetClause", }, }, &labeledExpr{ - pos: position{line: 2154, col: 20, offset: 66618}, + pos: position{line: 2149, col: 20, offset: 66507}, label: "l", expr: &ruleRefExpr{ - pos: position{line: 2154, col: 22, offset: 66620}, + pos: position{line: 2149, col: 22, offset: 66509}, name: "OptLimitClause", }, }, @@ -15390,25 +15353,25 @@ var g = &grammar{ }, { name: "OptLimitClause", - pos: position{line: 2167, col: 1, offset: 66892}, + pos: position{line: 2162, col: 1, offset: 66781}, expr: &choiceExpr{ - pos: position{line: 2168, col: 5, offset: 66912}, + pos: position{line: 2163, col: 5, offset: 66801}, alternatives: []any{ &actionExpr{ - pos: position{line: 2168, col: 5, offset: 66912}, + pos: position{line: 2163, col: 5, offset: 66801}, run: (*parser).callonOptLimitClause2, expr: &seqExpr{ - pos: position{line: 2168, col: 5, offset: 66912}, + pos: position{line: 2163, col: 5, offset: 66801}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2168, col: 5, offset: 66912}, + pos: position{line: 2163, col: 5, offset: 66801}, name: "_", }, &labeledExpr{ - pos: position{line: 2168, col: 7, offset: 66914}, + pos: position{line: 2163, col: 7, offset: 66803}, label: "l", expr: &ruleRefExpr{ - pos: position{line: 2168, col: 9, offset: 66916}, + pos: position{line: 2163, col: 9, offset: 66805}, name: "LimitClause", }, }, @@ -15416,10 +15379,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2169, col: 5, offset: 66950}, + pos: position{line: 2164, col: 5, offset: 66839}, run: (*parser).callonOptLimitClause7, expr: &litMatcher{ - pos: position{line: 2169, col: 5, offset: 66950}, + pos: position{line: 2164, col: 5, offset: 66839}, val: "", ignoreCase: false, want: "\"\"", @@ -15432,50 +15395,50 @@ var g = &grammar{ }, { name: "LimitClause", - pos: position{line: 2171, col: 1, offset: 66987}, + pos: position{line: 2166, col: 1, offset: 66876}, expr: &choiceExpr{ - pos: position{line: 2172, col: 5, offset: 67004}, + pos: position{line: 2167, col: 5, offset: 66893}, alternatives: []any{ &actionExpr{ - pos: position{line: 2172, col: 5, offset: 67004}, + pos: position{line: 2167, col: 5, offset: 66893}, run: (*parser).callonLimitClause2, expr: &seqExpr{ - pos: position{line: 2172, col: 5, offset: 67004}, + pos: position{line: 2167, col: 5, offset: 66893}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2172, col: 5, offset: 67004}, + pos: position{line: 2167, col: 5, offset: 66893}, name: "LIMIT", }, &ruleRefExpr{ - pos: position{line: 2172, col: 11, offset: 67010}, + pos: position{line: 2167, col: 11, offset: 66899}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2172, col: 13, offset: 67012}, + pos: position{line: 2167, col: 13, offset: 66901}, name: "ALL", }, }, }, }, &actionExpr{ - pos: position{line: 2173, col: 5, offset: 67074}, + pos: position{line: 2168, col: 5, offset: 66963}, run: (*parser).callonLimitClause7, expr: &seqExpr{ - pos: position{line: 2173, col: 5, offset: 67074}, + pos: position{line: 2168, col: 5, offset: 66963}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2173, col: 5, offset: 67074}, + pos: position{line: 2168, col: 5, offset: 66963}, name: "LIMIT", }, &ruleRefExpr{ - pos: position{line: 2173, col: 11, offset: 67080}, + pos: position{line: 2168, col: 11, offset: 66969}, name: "_", }, &labeledExpr{ - pos: position{line: 2173, col: 13, offset: 67082}, + pos: position{line: 2168, col: 13, offset: 66971}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2173, col: 15, offset: 67084}, + pos: position{line: 2168, col: 15, offset: 66973}, name: "Expr", }, }, @@ -15489,25 +15452,25 @@ var g = &grammar{ }, { name: "OptOffsetClause", - pos: position{line: 2181, col: 1, offset: 67209}, + pos: position{line: 2176, col: 1, offset: 67098}, expr: &choiceExpr{ - pos: position{line: 2182, col: 5, offset: 67230}, + pos: position{line: 2177, col: 5, offset: 67119}, alternatives: []any{ &actionExpr{ - pos: position{line: 2182, col: 5, offset: 67230}, + pos: position{line: 2177, col: 5, offset: 67119}, run: (*parser).callonOptOffsetClause2, expr: &seqExpr{ - pos: position{line: 2182, col: 5, offset: 67230}, + pos: position{line: 2177, col: 5, offset: 67119}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2182, col: 5, offset: 67230}, + pos: position{line: 2177, col: 5, offset: 67119}, name: "_", }, &labeledExpr{ - pos: position{line: 2182, col: 7, offset: 67232}, + pos: position{line: 2177, col: 7, offset: 67121}, label: "o", expr: &ruleRefExpr{ - pos: position{line: 2182, col: 9, offset: 67234}, + pos: position{line: 2177, col: 9, offset: 67123}, name: "OffsetClause", }, }, @@ -15515,10 +15478,10 @@ var g = &grammar{ }, }, &actionExpr{ - pos: position{line: 2183, col: 5, offset: 67270}, + pos: position{line: 2178, col: 5, offset: 67159}, run: (*parser).callonOptOffsetClause7, expr: &litMatcher{ - pos: position{line: 2183, col: 5, offset: 67270}, + pos: position{line: 2178, col: 5, offset: 67159}, val: "", ignoreCase: false, want: "\"\"", @@ -15531,26 +15494,26 @@ var g = &grammar{ }, { name: "OffsetClause", - pos: position{line: 2185, col: 1, offset: 67295}, + pos: position{line: 2180, col: 1, offset: 67184}, expr: &actionExpr{ - pos: position{line: 2186, col: 5, offset: 67313}, + pos: position{line: 2181, col: 5, offset: 67202}, run: (*parser).callonOffsetClause1, expr: &seqExpr{ - pos: position{line: 2186, col: 5, offset: 67313}, + pos: position{line: 2181, col: 5, offset: 67202}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2186, col: 5, offset: 67313}, + pos: position{line: 2181, col: 5, offset: 67202}, name: "OFFSET", }, &ruleRefExpr{ - pos: position{line: 2186, col: 12, offset: 67320}, + pos: position{line: 2181, col: 12, offset: 67209}, name: "_", }, &labeledExpr{ - pos: position{line: 2186, col: 14, offset: 67322}, + pos: position{line: 2181, col: 14, offset: 67211}, label: "e", expr: &ruleRefExpr{ - pos: position{line: 2186, col: 16, offset: 67324}, + pos: position{line: 2181, col: 16, offset: 67213}, name: "Expr", }, }, @@ -15562,108 +15525,108 @@ var g = &grammar{ }, { name: "SetOperation", - pos: position{line: 2188, col: 1, offset: 67349}, + pos: position{line: 2183, col: 1, offset: 67238}, expr: &actionExpr{ - pos: position{line: 2189, col: 5, offset: 67366}, + pos: position{line: 2184, col: 5, offset: 67255}, run: (*parser).callonSetOperation1, expr: &seqExpr{ - pos: position{line: 2189, col: 5, offset: 67366}, + pos: position{line: 2184, col: 5, offset: 67255}, exprs: []any{ &labeledExpr{ - pos: position{line: 2189, col: 5, offset: 67366}, + pos: position{line: 2184, col: 5, offset: 67255}, label: "left", expr: &ruleRefExpr{ - pos: position{line: 2189, col: 10, offset: 67371}, + pos: position{line: 2184, col: 10, offset: 67260}, name: "SelectExpr", }, }, &labeledExpr{ - pos: position{line: 2189, col: 21, offset: 67382}, + pos: position{line: 2184, col: 21, offset: 67271}, label: "distinct", expr: &ruleRefExpr{ - pos: position{line: 2189, col: 30, offset: 67391}, + pos: position{line: 2184, col: 30, offset: 67280}, name: "SetOp", }, }, &ruleRefExpr{ - pos: position{line: 2189, col: 36, offset: 67397}, + pos: position{line: 2184, col: 36, offset: 67286}, name: "_", }, &labeledExpr{ - pos: position{line: 2189, col: 38, offset: 67399}, + pos: position{line: 2184, col: 38, offset: 67288}, label: "right", expr: &ruleRefExpr{ - pos: position{line: 2189, col: 44, offset: 67405}, + pos: position{line: 2184, col: 44, offset: 67294}, name: "SelectExpr", }, }, }, }, }, - leader: true, + leader: false, leftRecursive: true, }, { name: "SetOp", - pos: position{line: 2199, col: 1, offset: 67626}, + pos: position{line: 2194, col: 1, offset: 67515}, expr: &choiceExpr{ - pos: position{line: 2200, col: 5, offset: 67637}, + pos: position{line: 2195, col: 5, offset: 67526}, alternatives: []any{ &actionExpr{ - pos: position{line: 2200, col: 5, offset: 67637}, + pos: position{line: 2195, col: 5, offset: 67526}, run: (*parser).callonSetOp2, expr: &seqExpr{ - pos: position{line: 2200, col: 5, offset: 67637}, + pos: position{line: 2195, col: 5, offset: 67526}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2200, col: 5, offset: 67637}, + pos: position{line: 2195, col: 5, offset: 67526}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2200, col: 7, offset: 67639}, + pos: position{line: 2195, col: 7, offset: 67528}, name: "UNION", }, &ruleRefExpr{ - pos: position{line: 2200, col: 13, offset: 67645}, + pos: position{line: 2195, col: 13, offset: 67534}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2200, col: 15, offset: 67647}, + pos: position{line: 2195, col: 15, offset: 67536}, name: "ALL", }, }, }, }, &actionExpr{ - pos: position{line: 2201, col: 5, offset: 67683}, + pos: position{line: 2196, col: 5, offset: 67572}, run: (*parser).callonSetOp8, expr: &seqExpr{ - pos: position{line: 2201, col: 5, offset: 67683}, + pos: position{line: 2196, col: 5, offset: 67572}, exprs: []any{ &ruleRefExpr{ - pos: position{line: 2201, col: 5, offset: 67683}, + pos: position{line: 2196, col: 5, offset: 67572}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2201, col: 7, offset: 67685}, + pos: position{line: 2196, col: 7, offset: 67574}, name: "UNION", }, &ruleRefExpr{ - pos: position{line: 2201, col: 13, offset: 67691}, + pos: position{line: 2196, col: 13, offset: 67580}, name: "_", }, &ruleRefExpr{ - pos: position{line: 2201, col: 15, offset: 67693}, + pos: position{line: 2196, col: 15, offset: 67582}, name: "DISTINCT", }, }, }, }, &actionExpr{ - pos: position{line: 2202, col: 5, offset: 67728}, + pos: position{line: 2197, col: 5, offset: 67617}, run: (*parser).callonSetOp14, expr: &litMatcher{ - pos: position{line: 2202, col: 5, offset: 67728}, + pos: position{line: 2197, col: 5, offset: 67617}, val: "", ignoreCase: false, want: "\"\"", @@ -15676,80 +15639,80 @@ var g = &grammar{ }, { name: "SQLGuard", - pos: position{line: 2205, col: 1, offset: 67791}, + pos: position{line: 2200, col: 1, offset: 67680}, expr: &choiceExpr{ - pos: position{line: 2206, col: 5, offset: 67806}, + pos: position{line: 2201, col: 5, offset: 67695}, alternatives: []any{ &ruleRefExpr{ - pos: position{line: 2206, col: 5, offset: 67806}, + pos: position{line: 2201, col: 5, offset: 67695}, name: "FROM", }, &ruleRefExpr{ - pos: position{line: 2206, col: 12, offset: 67813}, + pos: position{line: 2201, col: 12, offset: 67702}, name: "GROUP", }, &ruleRefExpr{ - pos: position{line: 2206, col: 20, offset: 67821}, + pos: position{line: 2201, col: 20, offset: 67710}, name: "HAVING", }, &ruleRefExpr{ - pos: position{line: 2206, col: 29, offset: 67830}, + pos: position{line: 2201, col: 29, offset: 67719}, name: "SELECT", }, &ruleRefExpr{ - pos: position{line: 2206, col: 38, offset: 67839}, + pos: position{line: 2201, col: 38, offset: 67728}, name: "RECURSIVE", }, &ruleRefExpr{ - pos: position{line: 2207, col: 5, offset: 67853}, + pos: position{line: 2202, col: 5, offset: 67742}, name: "INNER", }, &ruleRefExpr{ - pos: position{line: 2207, col: 13, offset: 67861}, + pos: position{line: 2202, col: 13, offset: 67750}, name: "LEFT", }, &ruleRefExpr{ - pos: position{line: 2207, col: 20, offset: 67868}, + pos: position{line: 2202, col: 20, offset: 67757}, name: "RIGHT", }, &ruleRefExpr{ - pos: position{line: 2207, col: 28, offset: 67876}, + pos: position{line: 2202, col: 28, offset: 67765}, name: "OUTER", }, &ruleRefExpr{ - pos: position{line: 2207, col: 36, offset: 67884}, + pos: position{line: 2202, col: 36, offset: 67773}, name: "CROSS", }, &ruleRefExpr{ - pos: position{line: 2207, col: 44, offset: 67892}, + pos: position{line: 2202, col: 44, offset: 67781}, name: "JOIN", }, &ruleRefExpr{ - pos: position{line: 2208, col: 5, offset: 67901}, + pos: position{line: 2203, col: 5, offset: 67790}, name: "UNION", }, &ruleRefExpr{ - pos: position{line: 2209, col: 5, offset: 67911}, + pos: position{line: 2204, col: 5, offset: 67800}, name: "ORDER", }, &ruleRefExpr{ - pos: position{line: 2210, col: 5, offset: 67921}, + pos: position{line: 2205, col: 5, offset: 67810}, name: "LIMIT", }, &ruleRefExpr{ - pos: position{line: 2211, col: 5, offset: 67931}, + pos: position{line: 2206, col: 5, offset: 67820}, name: "WHERE", }, &ruleRefExpr{ - pos: position{line: 2212, col: 5, offset: 67942}, + pos: position{line: 2207, col: 5, offset: 67831}, name: "WITH", }, &ruleRefExpr{ - pos: position{line: 2213, col: 5, offset: 67951}, + pos: position{line: 2208, col: 5, offset: 67840}, name: "USING", }, &ruleRefExpr{ - pos: position{line: 2214, col: 5, offset: 67961}, + pos: position{line: 2209, col: 5, offset: 67850}, name: "ON", }, }, @@ -15759,20 +15722,20 @@ var g = &grammar{ }, { name: "AGGREGATE", - pos: position{line: 2216, col: 1, offset: 67965}, + pos: position{line: 2211, col: 1, offset: 67854}, expr: &seqExpr{ - pos: position{line: 2216, col: 14, offset: 67978}, + pos: position{line: 2211, col: 14, offset: 67867}, exprs: []any{ &litMatcher{ - pos: position{line: 2216, col: 14, offset: 67978}, + pos: position{line: 2211, col: 14, offset: 67867}, val: "aggregate", ignoreCase: true, want: "\"AGGREGATE\"i", }, ¬Expr{ - pos: position{line: 2216, col: 33, offset: 67997}, + pos: position{line: 2211, col: 33, offset: 67886}, expr: &ruleRefExpr{ - pos: position{line: 2216, col: 34, offset: 67998}, + pos: position{line: 2211, col: 34, offset: 67887}, name: "IdentifierRest", }, }, @@ -15783,20 +15746,20 @@ var g = &grammar{ }, { name: "ALL", - pos: position{line: 2217, col: 1, offset: 68013}, + pos: position{line: 2212, col: 1, offset: 67902}, expr: &seqExpr{ - pos: position{line: 2217, col: 14, offset: 68026}, + pos: position{line: 2212, col: 14, offset: 67915}, exprs: []any{ &litMatcher{ - pos: position{line: 2217, col: 14, offset: 68026}, + pos: position{line: 2212, col: 14, offset: 67915}, val: "all", ignoreCase: true, want: "\"ALL\"i", }, ¬Expr{ - pos: position{line: 2217, col: 33, offset: 68045}, + pos: position{line: 2212, col: 33, offset: 67934}, expr: &ruleRefExpr{ - pos: position{line: 2217, col: 34, offset: 68046}, + pos: position{line: 2212, col: 34, offset: 67935}, name: "IdentifierRest", }, }, @@ -15807,23 +15770,23 @@ var g = &grammar{ }, { name: "AND", - pos: position{line: 2218, col: 1, offset: 68061}, + pos: position{line: 2213, col: 1, offset: 67950}, expr: &actionExpr{ - pos: position{line: 2218, col: 14, offset: 68074}, + pos: position{line: 2213, col: 14, offset: 67963}, run: (*parser).callonAND1, expr: &seqExpr{ - pos: position{line: 2218, col: 14, offset: 68074}, + pos: position{line: 2213, col: 14, offset: 67963}, exprs: []any{ &litMatcher{ - pos: position{line: 2218, col: 14, offset: 68074}, + pos: position{line: 2213, col: 14, offset: 67963}, val: "and", ignoreCase: true, want: "\"AND\"i", }, ¬Expr{ - pos: position{line: 2218, col: 33, offset: 68093}, + pos: position{line: 2213, col: 33, offset: 67982}, expr: &ruleRefExpr{ - pos: position{line: 2218, col: 34, offset: 68094}, + pos: position{line: 2213, col: 34, offset: 67983}, name: "IdentifierRest", }, }, @@ -15835,20 +15798,20 @@ var g = &grammar{ }, { name: "ANTI", - pos: position{line: 2219, col: 1, offset: 68131}, + pos: position{line: 2214, col: 1, offset: 68020}, expr: &seqExpr{ - pos: position{line: 2219, col: 14, offset: 68144}, + pos: position{line: 2214, col: 14, offset: 68033}, exprs: []any{ &litMatcher{ - pos: position{line: 2219, col: 14, offset: 68144}, + pos: position{line: 2214, col: 14, offset: 68033}, val: "anti", ignoreCase: true, want: "\"ANTI\"i", }, ¬Expr{ - pos: position{line: 2219, col: 33, offset: 68163}, + pos: position{line: 2214, col: 33, offset: 68052}, expr: &ruleRefExpr{ - pos: position{line: 2219, col: 34, offset: 68164}, + pos: position{line: 2214, col: 34, offset: 68053}, name: "IdentifierRest", }, }, @@ -15859,20 +15822,20 @@ var g = &grammar{ }, { name: "AS", - pos: position{line: 2220, col: 1, offset: 68179}, + pos: position{line: 2215, col: 1, offset: 68068}, expr: &seqExpr{ - pos: position{line: 2220, col: 14, offset: 68192}, + pos: position{line: 2215, col: 14, offset: 68081}, exprs: []any{ &litMatcher{ - pos: position{line: 2220, col: 14, offset: 68192}, + pos: position{line: 2215, col: 14, offset: 68081}, val: "as", ignoreCase: true, want: "\"AS\"i", }, ¬Expr{ - pos: position{line: 2220, col: 33, offset: 68211}, + pos: position{line: 2215, col: 33, offset: 68100}, expr: &ruleRefExpr{ - pos: position{line: 2220, col: 34, offset: 68212}, + pos: position{line: 2215, col: 34, offset: 68101}, name: "IdentifierRest", }, }, @@ -15883,23 +15846,23 @@ var g = &grammar{ }, { name: "ASC", - pos: position{line: 2221, col: 1, offset: 68227}, + pos: position{line: 2216, col: 1, offset: 68116}, expr: &actionExpr{ - pos: position{line: 2221, col: 14, offset: 68240}, + pos: position{line: 2216, col: 14, offset: 68129}, run: (*parser).callonASC1, expr: &seqExpr{ - pos: position{line: 2221, col: 14, offset: 68240}, + pos: position{line: 2216, col: 14, offset: 68129}, exprs: []any{ &litMatcher{ - pos: position{line: 2221, col: 14, offset: 68240}, + pos: position{line: 2216, col: 14, offset: 68129}, val: "asc", ignoreCase: true, want: "\"ASC\"i", }, ¬Expr{ - pos: position{line: 2221, col: 33, offset: 68259}, + pos: position{line: 2216, col: 33, offset: 68148}, expr: &ruleRefExpr{ - pos: position{line: 2221, col: 34, offset: 68260}, + pos: position{line: 2216, col: 34, offset: 68149}, name: "IdentifierRest", }, }, @@ -15911,20 +15874,20 @@ var g = &grammar{ }, { name: "ASSERT", - pos: position{line: 2222, col: 1, offset: 68297}, + pos: position{line: 2217, col: 1, offset: 68186}, expr: &seqExpr{ - pos: position{line: 2222, col: 14, offset: 68310}, + pos: position{line: 2217, col: 14, offset: 68199}, exprs: []any{ &litMatcher{ - pos: position{line: 2222, col: 14, offset: 68310}, + pos: position{line: 2217, col: 14, offset: 68199}, val: "assert", ignoreCase: true, want: "\"ASSERT\"i", }, ¬Expr{ - pos: position{line: 2222, col: 33, offset: 68329}, + pos: position{line: 2217, col: 33, offset: 68218}, expr: &ruleRefExpr{ - pos: position{line: 2222, col: 34, offset: 68330}, + pos: position{line: 2217, col: 34, offset: 68219}, name: "IdentifierRest", }, }, @@ -15935,20 +15898,20 @@ var g = &grammar{ }, { name: "AT", - pos: position{line: 2223, col: 1, offset: 68345}, + pos: position{line: 2218, col: 1, offset: 68234}, expr: &seqExpr{ - pos: position{line: 2223, col: 14, offset: 68358}, + pos: position{line: 2218, col: 14, offset: 68247}, exprs: []any{ &litMatcher{ - pos: position{line: 2223, col: 14, offset: 68358}, + pos: position{line: 2218, col: 14, offset: 68247}, val: "at", ignoreCase: true, want: "\"AT\"i", }, ¬Expr{ - pos: position{line: 2223, col: 33, offset: 68377}, + pos: position{line: 2218, col: 33, offset: 68266}, expr: &ruleRefExpr{ - pos: position{line: 2223, col: 34, offset: 68378}, + pos: position{line: 2218, col: 34, offset: 68267}, name: "IdentifierRest", }, }, @@ -15959,20 +15922,20 @@ var g = &grammar{ }, { name: "AUTHOR", - pos: position{line: 2224, col: 1, offset: 68393}, + pos: position{line: 2219, col: 1, offset: 68282}, expr: &seqExpr{ - pos: position{line: 2224, col: 14, offset: 68406}, + pos: position{line: 2219, col: 14, offset: 68295}, exprs: []any{ &litMatcher{ - pos: position{line: 2224, col: 14, offset: 68406}, + pos: position{line: 2219, col: 14, offset: 68295}, val: "author", ignoreCase: true, want: "\"AUTHOR\"i", }, ¬Expr{ - pos: position{line: 2224, col: 33, offset: 68425}, + pos: position{line: 2219, col: 33, offset: 68314}, expr: &ruleRefExpr{ - pos: position{line: 2224, col: 34, offset: 68426}, + pos: position{line: 2219, col: 34, offset: 68315}, name: "IdentifierRest", }, }, @@ -15983,20 +15946,20 @@ var g = &grammar{ }, { name: "BETWEEN", - pos: position{line: 2225, col: 1, offset: 68441}, + pos: position{line: 2220, col: 1, offset: 68330}, expr: &seqExpr{ - pos: position{line: 2225, col: 14, offset: 68454}, + pos: position{line: 2220, col: 14, offset: 68343}, exprs: []any{ &litMatcher{ - pos: position{line: 2225, col: 14, offset: 68454}, + pos: position{line: 2220, col: 14, offset: 68343}, val: "between", ignoreCase: true, want: "\"BETWEEN\"i", }, ¬Expr{ - pos: position{line: 2225, col: 33, offset: 68473}, + pos: position{line: 2220, col: 33, offset: 68362}, expr: &ruleRefExpr{ - pos: position{line: 2225, col: 34, offset: 68474}, + pos: position{line: 2220, col: 34, offset: 68363}, name: "IdentifierRest", }, }, @@ -16007,20 +15970,20 @@ var g = &grammar{ }, { name: "BODY", - pos: position{line: 2226, col: 1, offset: 68489}, + pos: position{line: 2221, col: 1, offset: 68378}, expr: &seqExpr{ - pos: position{line: 2226, col: 14, offset: 68502}, + pos: position{line: 2221, col: 14, offset: 68391}, exprs: []any{ &litMatcher{ - pos: position{line: 2226, col: 14, offset: 68502}, + pos: position{line: 2221, col: 14, offset: 68391}, val: "body", ignoreCase: true, want: "\"BODY\"i", }, ¬Expr{ - pos: position{line: 2226, col: 33, offset: 68521}, + pos: position{line: 2221, col: 33, offset: 68410}, expr: &ruleRefExpr{ - pos: position{line: 2226, col: 34, offset: 68522}, + pos: position{line: 2221, col: 34, offset: 68411}, name: "IdentifierRest", }, }, @@ -16031,20 +15994,20 @@ var g = &grammar{ }, { name: "BY", - pos: position{line: 2227, col: 1, offset: 68537}, + pos: position{line: 2222, col: 1, offset: 68426}, expr: &seqExpr{ - pos: position{line: 2227, col: 14, offset: 68550}, + pos: position{line: 2222, col: 14, offset: 68439}, exprs: []any{ &litMatcher{ - pos: position{line: 2227, col: 14, offset: 68550}, + pos: position{line: 2222, col: 14, offset: 68439}, val: "by", ignoreCase: true, want: "\"BY\"i", }, ¬Expr{ - pos: position{line: 2227, col: 33, offset: 68569}, + pos: position{line: 2222, col: 33, offset: 68458}, expr: &ruleRefExpr{ - pos: position{line: 2227, col: 34, offset: 68570}, + pos: position{line: 2222, col: 34, offset: 68459}, name: "IdentifierRest", }, }, @@ -16055,20 +16018,20 @@ var g = &grammar{ }, { name: "CASE", - pos: position{line: 2228, col: 1, offset: 68585}, + pos: position{line: 2223, col: 1, offset: 68474}, expr: &seqExpr{ - pos: position{line: 2228, col: 14, offset: 68598}, + pos: position{line: 2223, col: 14, offset: 68487}, exprs: []any{ &litMatcher{ - pos: position{line: 2228, col: 14, offset: 68598}, + pos: position{line: 2223, col: 14, offset: 68487}, val: "case", ignoreCase: true, want: "\"CASE\"i", }, ¬Expr{ - pos: position{line: 2228, col: 33, offset: 68617}, + pos: position{line: 2223, col: 33, offset: 68506}, expr: &ruleRefExpr{ - pos: position{line: 2228, col: 34, offset: 68618}, + pos: position{line: 2223, col: 34, offset: 68507}, name: "IdentifierRest", }, }, @@ -16079,20 +16042,20 @@ var g = &grammar{ }, { name: "CONST", - pos: position{line: 2229, col: 1, offset: 68633}, + pos: position{line: 2224, col: 1, offset: 68522}, expr: &seqExpr{ - pos: position{line: 2229, col: 14, offset: 68646}, + pos: position{line: 2224, col: 14, offset: 68535}, exprs: []any{ &litMatcher{ - pos: position{line: 2229, col: 14, offset: 68646}, + pos: position{line: 2224, col: 14, offset: 68535}, val: "const", ignoreCase: true, want: "\"CONST\"i", }, ¬Expr{ - pos: position{line: 2229, col: 33, offset: 68665}, + pos: position{line: 2224, col: 33, offset: 68554}, expr: &ruleRefExpr{ - pos: position{line: 2229, col: 34, offset: 68666}, + pos: position{line: 2224, col: 34, offset: 68555}, name: "IdentifierRest", }, }, @@ -16103,20 +16066,20 @@ var g = &grammar{ }, { name: "COUNT", - pos: position{line: 2230, col: 1, offset: 68681}, + pos: position{line: 2225, col: 1, offset: 68570}, expr: &seqExpr{ - pos: position{line: 2230, col: 14, offset: 68694}, + pos: position{line: 2225, col: 14, offset: 68583}, exprs: []any{ &litMatcher{ - pos: position{line: 2230, col: 14, offset: 68694}, + pos: position{line: 2225, col: 14, offset: 68583}, val: "count", ignoreCase: true, want: "\"COUNT\"i", }, ¬Expr{ - pos: position{line: 2230, col: 33, offset: 68713}, + pos: position{line: 2225, col: 33, offset: 68602}, expr: &ruleRefExpr{ - pos: position{line: 2230, col: 34, offset: 68714}, + pos: position{line: 2225, col: 34, offset: 68603}, name: "IdentifierRest", }, }, @@ -16127,20 +16090,20 @@ var g = &grammar{ }, { name: "CROSS", - pos: position{line: 2231, col: 1, offset: 68729}, + pos: position{line: 2226, col: 1, offset: 68618}, expr: &seqExpr{ - pos: position{line: 2231, col: 14, offset: 68742}, + pos: position{line: 2226, col: 14, offset: 68631}, exprs: []any{ &litMatcher{ - pos: position{line: 2231, col: 14, offset: 68742}, + pos: position{line: 2226, col: 14, offset: 68631}, val: "cross", ignoreCase: true, want: "\"CROSS\"i", }, ¬Expr{ - pos: position{line: 2231, col: 33, offset: 68761}, + pos: position{line: 2226, col: 33, offset: 68650}, expr: &ruleRefExpr{ - pos: position{line: 2231, col: 34, offset: 68762}, + pos: position{line: 2226, col: 34, offset: 68651}, name: "IdentifierRest", }, }, @@ -16151,20 +16114,20 @@ var g = &grammar{ }, { name: "CUT", - pos: position{line: 2232, col: 1, offset: 68777}, + pos: position{line: 2227, col: 1, offset: 68666}, expr: &seqExpr{ - pos: position{line: 2232, col: 14, offset: 68790}, + pos: position{line: 2227, col: 14, offset: 68679}, exprs: []any{ &litMatcher{ - pos: position{line: 2232, col: 14, offset: 68790}, + pos: position{line: 2227, col: 14, offset: 68679}, val: "cut", ignoreCase: true, want: "\"CUT\"i", }, ¬Expr{ - pos: position{line: 2232, col: 33, offset: 68809}, + pos: position{line: 2227, col: 33, offset: 68698}, expr: &ruleRefExpr{ - pos: position{line: 2232, col: 34, offset: 68810}, + pos: position{line: 2227, col: 34, offset: 68699}, name: "IdentifierRest", }, }, @@ -16175,20 +16138,20 @@ var g = &grammar{ }, { name: "DEBUG", - pos: position{line: 2233, col: 1, offset: 68825}, + pos: position{line: 2228, col: 1, offset: 68714}, expr: &seqExpr{ - pos: position{line: 2233, col: 14, offset: 68838}, + pos: position{line: 2228, col: 14, offset: 68727}, exprs: []any{ &litMatcher{ - pos: position{line: 2233, col: 14, offset: 68838}, + pos: position{line: 2228, col: 14, offset: 68727}, val: "debug", ignoreCase: true, want: "\"DEBUG\"i", }, ¬Expr{ - pos: position{line: 2233, col: 33, offset: 68857}, + pos: position{line: 2228, col: 33, offset: 68746}, expr: &ruleRefExpr{ - pos: position{line: 2233, col: 34, offset: 68858}, + pos: position{line: 2228, col: 34, offset: 68747}, name: "IdentifierRest", }, }, @@ -16199,20 +16162,20 @@ var g = &grammar{ }, { name: "DEFAULT", - pos: position{line: 2234, col: 1, offset: 68873}, + pos: position{line: 2229, col: 1, offset: 68762}, expr: &seqExpr{ - pos: position{line: 2234, col: 14, offset: 68886}, + pos: position{line: 2229, col: 14, offset: 68775}, exprs: []any{ &litMatcher{ - pos: position{line: 2234, col: 14, offset: 68886}, + pos: position{line: 2229, col: 14, offset: 68775}, val: "default", ignoreCase: true, want: "\"DEFAULT\"i", }, ¬Expr{ - pos: position{line: 2234, col: 33, offset: 68905}, + pos: position{line: 2229, col: 33, offset: 68794}, expr: &ruleRefExpr{ - pos: position{line: 2234, col: 34, offset: 68906}, + pos: position{line: 2229, col: 34, offset: 68795}, name: "IdentifierRest", }, }, @@ -16223,23 +16186,23 @@ var g = &grammar{ }, { name: "DESC", - pos: position{line: 2235, col: 1, offset: 68921}, + pos: position{line: 2230, col: 1, offset: 68810}, expr: &actionExpr{ - pos: position{line: 2235, col: 14, offset: 68934}, + pos: position{line: 2230, col: 14, offset: 68823}, run: (*parser).callonDESC1, expr: &seqExpr{ - pos: position{line: 2235, col: 14, offset: 68934}, + pos: position{line: 2230, col: 14, offset: 68823}, exprs: []any{ &litMatcher{ - pos: position{line: 2235, col: 14, offset: 68934}, + pos: position{line: 2230, col: 14, offset: 68823}, val: "desc", ignoreCase: true, want: "\"DESC\"i", }, ¬Expr{ - pos: position{line: 2235, col: 33, offset: 68953}, + pos: position{line: 2230, col: 33, offset: 68842}, expr: &ruleRefExpr{ - pos: position{line: 2235, col: 34, offset: 68954}, + pos: position{line: 2230, col: 34, offset: 68843}, name: "IdentifierRest", }, }, @@ -16251,20 +16214,20 @@ var g = &grammar{ }, { name: "DISTINCT", - pos: position{line: 2236, col: 1, offset: 68992}, + pos: position{line: 2231, col: 1, offset: 68881}, expr: &seqExpr{ - pos: position{line: 2236, col: 14, offset: 69005}, + pos: position{line: 2231, col: 14, offset: 68894}, exprs: []any{ &litMatcher{ - pos: position{line: 2236, col: 14, offset: 69005}, + pos: position{line: 2231, col: 14, offset: 68894}, val: "distinct", ignoreCase: true, want: "\"DISTINCT\"i", }, ¬Expr{ - pos: position{line: 2236, col: 33, offset: 69024}, + pos: position{line: 2231, col: 33, offset: 68913}, expr: &ruleRefExpr{ - pos: position{line: 2236, col: 34, offset: 69025}, + pos: position{line: 2231, col: 34, offset: 68914}, name: "IdentifierRest", }, }, @@ -16275,20 +16238,20 @@ var g = &grammar{ }, { name: "DROP", - pos: position{line: 2237, col: 1, offset: 69040}, + pos: position{line: 2232, col: 1, offset: 68929}, expr: &seqExpr{ - pos: position{line: 2237, col: 14, offset: 69053}, + pos: position{line: 2232, col: 14, offset: 68942}, exprs: []any{ &litMatcher{ - pos: position{line: 2237, col: 14, offset: 69053}, + pos: position{line: 2232, col: 14, offset: 68942}, val: "drop", ignoreCase: true, want: "\"DROP\"i", }, ¬Expr{ - pos: position{line: 2237, col: 33, offset: 69072}, + pos: position{line: 2232, col: 33, offset: 68961}, expr: &ruleRefExpr{ - pos: position{line: 2237, col: 34, offset: 69073}, + pos: position{line: 2232, col: 34, offset: 68962}, name: "IdentifierRest", }, }, @@ -16299,20 +16262,20 @@ var g = &grammar{ }, { name: "ELSE", - pos: position{line: 2238, col: 1, offset: 69089}, + pos: position{line: 2233, col: 1, offset: 68978}, expr: &seqExpr{ - pos: position{line: 2238, col: 14, offset: 69102}, + pos: position{line: 2233, col: 14, offset: 68991}, exprs: []any{ &litMatcher{ - pos: position{line: 2238, col: 14, offset: 69102}, + pos: position{line: 2233, col: 14, offset: 68991}, val: "else", ignoreCase: true, want: "\"ELSE\"i", }, ¬Expr{ - pos: position{line: 2238, col: 33, offset: 69121}, + pos: position{line: 2233, col: 33, offset: 69010}, expr: &ruleRefExpr{ - pos: position{line: 2238, col: 34, offset: 69122}, + pos: position{line: 2233, col: 34, offset: 69011}, name: "IdentifierRest", }, }, @@ -16323,20 +16286,20 @@ var g = &grammar{ }, { name: "END", - pos: position{line: 2239, col: 1, offset: 69137}, + pos: position{line: 2234, col: 1, offset: 69026}, expr: &seqExpr{ - pos: position{line: 2239, col: 14, offset: 69150}, + pos: position{line: 2234, col: 14, offset: 69039}, exprs: []any{ &litMatcher{ - pos: position{line: 2239, col: 14, offset: 69150}, + pos: position{line: 2234, col: 14, offset: 69039}, val: "end", ignoreCase: true, want: "\"END\"i", }, ¬Expr{ - pos: position{line: 2239, col: 33, offset: 69169}, + pos: position{line: 2234, col: 33, offset: 69058}, expr: &ruleRefExpr{ - pos: position{line: 2239, col: 34, offset: 69170}, + pos: position{line: 2234, col: 34, offset: 69059}, name: "IdentifierRest", }, }, @@ -16347,20 +16310,20 @@ var g = &grammar{ }, { name: "ERROR", - pos: position{line: 2240, col: 1, offset: 69185}, + pos: position{line: 2235, col: 1, offset: 69074}, expr: &seqExpr{ - pos: position{line: 2240, col: 14, offset: 69198}, + pos: position{line: 2235, col: 14, offset: 69087}, exprs: []any{ &litMatcher{ - pos: position{line: 2240, col: 14, offset: 69198}, + pos: position{line: 2235, col: 14, offset: 69087}, val: "error", ignoreCase: true, want: "\"ERROR\"i", }, ¬Expr{ - pos: position{line: 2240, col: 33, offset: 69217}, + pos: position{line: 2235, col: 33, offset: 69106}, expr: &ruleRefExpr{ - pos: position{line: 2240, col: 34, offset: 69218}, + pos: position{line: 2235, col: 34, offset: 69107}, name: "IdentifierRest", }, }, @@ -16371,20 +16334,20 @@ var g = &grammar{ }, { name: "EVAL", - pos: position{line: 2241, col: 1, offset: 69233}, + pos: position{line: 2236, col: 1, offset: 69122}, expr: &seqExpr{ - pos: position{line: 2241, col: 14, offset: 69246}, + pos: position{line: 2236, col: 14, offset: 69135}, exprs: []any{ &litMatcher{ - pos: position{line: 2241, col: 14, offset: 69246}, + pos: position{line: 2236, col: 14, offset: 69135}, val: "eval", ignoreCase: true, want: "\"EVAL\"i", }, ¬Expr{ - pos: position{line: 2241, col: 33, offset: 69265}, + pos: position{line: 2236, col: 33, offset: 69154}, expr: &ruleRefExpr{ - pos: position{line: 2241, col: 34, offset: 69266}, + pos: position{line: 2236, col: 34, offset: 69155}, name: "IdentifierRest", }, }, @@ -16395,20 +16358,20 @@ var g = &grammar{ }, { name: "EXPLODE", - pos: position{line: 2242, col: 1, offset: 69281}, + pos: position{line: 2237, col: 1, offset: 69170}, expr: &seqExpr{ - pos: position{line: 2242, col: 14, offset: 69294}, + pos: position{line: 2237, col: 14, offset: 69183}, exprs: []any{ &litMatcher{ - pos: position{line: 2242, col: 14, offset: 69294}, + pos: position{line: 2237, col: 14, offset: 69183}, val: "explode", ignoreCase: true, want: "\"EXPLODE\"i", }, ¬Expr{ - pos: position{line: 2242, col: 33, offset: 69313}, + pos: position{line: 2237, col: 33, offset: 69202}, expr: &ruleRefExpr{ - pos: position{line: 2242, col: 34, offset: 69314}, + pos: position{line: 2237, col: 34, offset: 69203}, name: "IdentifierRest", }, }, @@ -16419,20 +16382,20 @@ var g = &grammar{ }, { name: "FALSE", - pos: position{line: 2243, col: 1, offset: 69329}, + pos: position{line: 2238, col: 1, offset: 69218}, expr: &seqExpr{ - pos: position{line: 2243, col: 14, offset: 69342}, + pos: position{line: 2238, col: 14, offset: 69231}, exprs: []any{ &litMatcher{ - pos: position{line: 2243, col: 14, offset: 69342}, + pos: position{line: 2238, col: 14, offset: 69231}, val: "false", ignoreCase: true, want: "\"FALSE\"i", }, ¬Expr{ - pos: position{line: 2243, col: 33, offset: 69361}, + pos: position{line: 2238, col: 33, offset: 69250}, expr: &ruleRefExpr{ - pos: position{line: 2243, col: 34, offset: 69362}, + pos: position{line: 2238, col: 34, offset: 69251}, name: "IdentifierRest", }, }, @@ -16443,20 +16406,20 @@ var g = &grammar{ }, { name: "FIRST", - pos: position{line: 2244, col: 1, offset: 69377}, + pos: position{line: 2239, col: 1, offset: 69266}, expr: &seqExpr{ - pos: position{line: 2244, col: 14, offset: 69390}, + pos: position{line: 2239, col: 14, offset: 69279}, exprs: []any{ &litMatcher{ - pos: position{line: 2244, col: 14, offset: 69390}, + pos: position{line: 2239, col: 14, offset: 69279}, val: "first", ignoreCase: true, want: "\"FIRST\"i", }, ¬Expr{ - pos: position{line: 2244, col: 33, offset: 69409}, + pos: position{line: 2239, col: 33, offset: 69298}, expr: &ruleRefExpr{ - pos: position{line: 2244, col: 34, offset: 69410}, + pos: position{line: 2239, col: 34, offset: 69299}, name: "IdentifierRest", }, }, @@ -16467,20 +16430,20 @@ var g = &grammar{ }, { name: "FORK", - pos: position{line: 2245, col: 1, offset: 69425}, + pos: position{line: 2240, col: 1, offset: 69314}, expr: &seqExpr{ - pos: position{line: 2245, col: 14, offset: 69438}, + pos: position{line: 2240, col: 14, offset: 69327}, exprs: []any{ &litMatcher{ - pos: position{line: 2245, col: 14, offset: 69438}, + pos: position{line: 2240, col: 14, offset: 69327}, val: "fork", ignoreCase: true, want: "\"FORK\"i", }, ¬Expr{ - pos: position{line: 2245, col: 33, offset: 69457}, + pos: position{line: 2240, col: 33, offset: 69346}, expr: &ruleRefExpr{ - pos: position{line: 2245, col: 34, offset: 69458}, + pos: position{line: 2240, col: 34, offset: 69347}, name: "IdentifierRest", }, }, @@ -16491,20 +16454,20 @@ var g = &grammar{ }, { name: "FORMAT", - pos: position{line: 2246, col: 1, offset: 69473}, + pos: position{line: 2241, col: 1, offset: 69362}, expr: &seqExpr{ - pos: position{line: 2246, col: 14, offset: 69486}, + pos: position{line: 2241, col: 14, offset: 69375}, exprs: []any{ &litMatcher{ - pos: position{line: 2246, col: 14, offset: 69486}, + pos: position{line: 2241, col: 14, offset: 69375}, val: "format", ignoreCase: true, want: "\"FORMAT\"i", }, ¬Expr{ - pos: position{line: 2246, col: 33, offset: 69505}, + pos: position{line: 2241, col: 33, offset: 69394}, expr: &ruleRefExpr{ - pos: position{line: 2246, col: 34, offset: 69506}, + pos: position{line: 2241, col: 34, offset: 69395}, name: "IdentifierRest", }, }, @@ -16515,20 +16478,20 @@ var g = &grammar{ }, { name: "FROM", - pos: position{line: 2247, col: 1, offset: 69521}, + pos: position{line: 2242, col: 1, offset: 69410}, expr: &seqExpr{ - pos: position{line: 2247, col: 14, offset: 69534}, + pos: position{line: 2242, col: 14, offset: 69423}, exprs: []any{ &litMatcher{ - pos: position{line: 2247, col: 14, offset: 69534}, + pos: position{line: 2242, col: 14, offset: 69423}, val: "from", ignoreCase: true, want: "\"FROM\"i", }, ¬Expr{ - pos: position{line: 2247, col: 33, offset: 69553}, + pos: position{line: 2242, col: 33, offset: 69442}, expr: &ruleRefExpr{ - pos: position{line: 2247, col: 34, offset: 69554}, + pos: position{line: 2242, col: 34, offset: 69443}, name: "IdentifierRest", }, }, @@ -16539,20 +16502,20 @@ var g = &grammar{ }, { name: "FULL", - pos: position{line: 2248, col: 1, offset: 69569}, + pos: position{line: 2243, col: 1, offset: 69458}, expr: &seqExpr{ - pos: position{line: 2248, col: 14, offset: 69582}, + pos: position{line: 2243, col: 14, offset: 69471}, exprs: []any{ &litMatcher{ - pos: position{line: 2248, col: 14, offset: 69582}, + pos: position{line: 2243, col: 14, offset: 69471}, val: "full", ignoreCase: true, want: "\"FULL\"i", }, ¬Expr{ - pos: position{line: 2248, col: 33, offset: 69601}, + pos: position{line: 2243, col: 33, offset: 69490}, expr: &ruleRefExpr{ - pos: position{line: 2248, col: 34, offset: 69602}, + pos: position{line: 2243, col: 34, offset: 69491}, name: "IdentifierRest", }, }, @@ -16563,20 +16526,20 @@ var g = &grammar{ }, { name: "FUNC", - pos: position{line: 2249, col: 1, offset: 69617}, + pos: position{line: 2244, col: 1, offset: 69506}, expr: &seqExpr{ - pos: position{line: 2249, col: 14, offset: 69630}, + pos: position{line: 2244, col: 14, offset: 69519}, exprs: []any{ &litMatcher{ - pos: position{line: 2249, col: 14, offset: 69630}, + pos: position{line: 2244, col: 14, offset: 69519}, val: "func", ignoreCase: true, want: "\"FUNC\"i", }, ¬Expr{ - pos: position{line: 2249, col: 33, offset: 69649}, + pos: position{line: 2244, col: 33, offset: 69538}, expr: &ruleRefExpr{ - pos: position{line: 2249, col: 34, offset: 69650}, + pos: position{line: 2244, col: 34, offset: 69539}, name: "IdentifierRest", }, }, @@ -16587,20 +16550,20 @@ var g = &grammar{ }, { name: "FUSE", - pos: position{line: 2250, col: 1, offset: 69665}, + pos: position{line: 2245, col: 1, offset: 69554}, expr: &seqExpr{ - pos: position{line: 2250, col: 14, offset: 69678}, + pos: position{line: 2245, col: 14, offset: 69567}, exprs: []any{ &litMatcher{ - pos: position{line: 2250, col: 14, offset: 69678}, + pos: position{line: 2245, col: 14, offset: 69567}, val: "fuse", ignoreCase: true, want: "\"FUSE\"i", }, ¬Expr{ - pos: position{line: 2250, col: 33, offset: 69697}, + pos: position{line: 2245, col: 33, offset: 69586}, expr: &ruleRefExpr{ - pos: position{line: 2250, col: 34, offset: 69698}, + pos: position{line: 2245, col: 34, offset: 69587}, name: "IdentifierRest", }, }, @@ -16611,20 +16574,20 @@ var g = &grammar{ }, { name: "GREP", - pos: position{line: 2251, col: 1, offset: 69713}, + pos: position{line: 2246, col: 1, offset: 69602}, expr: &seqExpr{ - pos: position{line: 2251, col: 14, offset: 69726}, + pos: position{line: 2246, col: 14, offset: 69615}, exprs: []any{ &litMatcher{ - pos: position{line: 2251, col: 14, offset: 69726}, + pos: position{line: 2246, col: 14, offset: 69615}, val: "grep", ignoreCase: true, want: "\"GREP\"i", }, ¬Expr{ - pos: position{line: 2251, col: 33, offset: 69745}, + pos: position{line: 2246, col: 33, offset: 69634}, expr: &ruleRefExpr{ - pos: position{line: 2251, col: 34, offset: 69746}, + pos: position{line: 2246, col: 34, offset: 69635}, name: "IdentifierRest", }, }, @@ -16635,20 +16598,20 @@ var g = &grammar{ }, { name: "GROUP", - pos: position{line: 2252, col: 1, offset: 69761}, + pos: position{line: 2247, col: 1, offset: 69650}, expr: &seqExpr{ - pos: position{line: 2252, col: 14, offset: 69774}, + pos: position{line: 2247, col: 14, offset: 69663}, exprs: []any{ &litMatcher{ - pos: position{line: 2252, col: 14, offset: 69774}, + pos: position{line: 2247, col: 14, offset: 69663}, val: "group", ignoreCase: true, want: "\"GROUP\"i", }, ¬Expr{ - pos: position{line: 2252, col: 33, offset: 69793}, + pos: position{line: 2247, col: 33, offset: 69682}, expr: &ruleRefExpr{ - pos: position{line: 2252, col: 34, offset: 69794}, + pos: position{line: 2247, col: 34, offset: 69683}, name: "IdentifierRest", }, }, @@ -16659,20 +16622,20 @@ var g = &grammar{ }, { name: "HAVING", - pos: position{line: 2253, col: 1, offset: 69809}, + pos: position{line: 2248, col: 1, offset: 69698}, expr: &seqExpr{ - pos: position{line: 2253, col: 14, offset: 69822}, + pos: position{line: 2248, col: 14, offset: 69711}, exprs: []any{ &litMatcher{ - pos: position{line: 2253, col: 14, offset: 69822}, + pos: position{line: 2248, col: 14, offset: 69711}, val: "having", ignoreCase: true, want: "\"HAVING\"i", }, ¬Expr{ - pos: position{line: 2253, col: 33, offset: 69841}, + pos: position{line: 2248, col: 33, offset: 69730}, expr: &ruleRefExpr{ - pos: position{line: 2253, col: 34, offset: 69842}, + pos: position{line: 2248, col: 34, offset: 69731}, name: "IdentifierRest", }, }, @@ -16683,20 +16646,20 @@ var g = &grammar{ }, { name: "HEAD", - pos: position{line: 2254, col: 1, offset: 69857}, + pos: position{line: 2249, col: 1, offset: 69746}, expr: &seqExpr{ - pos: position{line: 2254, col: 14, offset: 69870}, + pos: position{line: 2249, col: 14, offset: 69759}, exprs: []any{ &litMatcher{ - pos: position{line: 2254, col: 14, offset: 69870}, + pos: position{line: 2249, col: 14, offset: 69759}, val: "head", ignoreCase: true, want: "\"HEAD\"i", }, ¬Expr{ - pos: position{line: 2254, col: 33, offset: 69889}, + pos: position{line: 2249, col: 33, offset: 69778}, expr: &ruleRefExpr{ - pos: position{line: 2254, col: 34, offset: 69890}, + pos: position{line: 2249, col: 34, offset: 69779}, name: "IdentifierRest", }, }, @@ -16707,20 +16670,20 @@ var g = &grammar{ }, { name: "HEADERS", - pos: position{line: 2255, col: 1, offset: 69906}, + pos: position{line: 2250, col: 1, offset: 69795}, expr: &seqExpr{ - pos: position{line: 2255, col: 14, offset: 69919}, + pos: position{line: 2250, col: 14, offset: 69808}, exprs: []any{ &litMatcher{ - pos: position{line: 2255, col: 14, offset: 69919}, + pos: position{line: 2250, col: 14, offset: 69808}, val: "headers", ignoreCase: true, want: "\"HEADERS\"i", }, ¬Expr{ - pos: position{line: 2255, col: 33, offset: 69938}, + pos: position{line: 2250, col: 33, offset: 69827}, expr: &ruleRefExpr{ - pos: position{line: 2255, col: 34, offset: 69939}, + pos: position{line: 2250, col: 34, offset: 69828}, name: "IdentifierRest", }, }, @@ -16731,20 +16694,20 @@ var g = &grammar{ }, { name: "IN", - pos: position{line: 2256, col: 1, offset: 69954}, + pos: position{line: 2251, col: 1, offset: 69843}, expr: &seqExpr{ - pos: position{line: 2256, col: 14, offset: 69967}, + pos: position{line: 2251, col: 14, offset: 69856}, exprs: []any{ &litMatcher{ - pos: position{line: 2256, col: 14, offset: 69967}, + pos: position{line: 2251, col: 14, offset: 69856}, val: "in", ignoreCase: true, want: "\"IN\"i", }, ¬Expr{ - pos: position{line: 2256, col: 33, offset: 69986}, + pos: position{line: 2251, col: 33, offset: 69875}, expr: &ruleRefExpr{ - pos: position{line: 2256, col: 34, offset: 69987}, + pos: position{line: 2251, col: 34, offset: 69876}, name: "IdentifierRest", }, }, @@ -16755,20 +16718,20 @@ var g = &grammar{ }, { name: "INNER", - pos: position{line: 2257, col: 1, offset: 70002}, + pos: position{line: 2252, col: 1, offset: 69891}, expr: &seqExpr{ - pos: position{line: 2257, col: 14, offset: 70015}, + pos: position{line: 2252, col: 14, offset: 69904}, exprs: []any{ &litMatcher{ - pos: position{line: 2257, col: 14, offset: 70015}, + pos: position{line: 2252, col: 14, offset: 69904}, val: "inner", ignoreCase: true, want: "\"INNER\"i", }, ¬Expr{ - pos: position{line: 2257, col: 33, offset: 70034}, + pos: position{line: 2252, col: 33, offset: 69923}, expr: &ruleRefExpr{ - pos: position{line: 2257, col: 34, offset: 70035}, + pos: position{line: 2252, col: 34, offset: 69924}, name: "IdentifierRest", }, }, @@ -16779,20 +16742,20 @@ var g = &grammar{ }, { name: "IS", - pos: position{line: 2258, col: 1, offset: 70050}, + pos: position{line: 2253, col: 1, offset: 69939}, expr: &seqExpr{ - pos: position{line: 2258, col: 14, offset: 70063}, + pos: position{line: 2253, col: 14, offset: 69952}, exprs: []any{ &litMatcher{ - pos: position{line: 2258, col: 14, offset: 70063}, + pos: position{line: 2253, col: 14, offset: 69952}, val: "is", ignoreCase: true, want: "\"IS\"i", }, ¬Expr{ - pos: position{line: 2258, col: 33, offset: 70082}, + pos: position{line: 2253, col: 33, offset: 69971}, expr: &ruleRefExpr{ - pos: position{line: 2258, col: 34, offset: 70083}, + pos: position{line: 2253, col: 34, offset: 69972}, name: "IdentifierRest", }, }, @@ -16803,20 +16766,20 @@ var g = &grammar{ }, { name: "JOIN", - pos: position{line: 2259, col: 1, offset: 70098}, + pos: position{line: 2254, col: 1, offset: 69987}, expr: &seqExpr{ - pos: position{line: 2259, col: 14, offset: 70111}, + pos: position{line: 2254, col: 14, offset: 70000}, exprs: []any{ &litMatcher{ - pos: position{line: 2259, col: 14, offset: 70111}, + pos: position{line: 2254, col: 14, offset: 70000}, val: "join", ignoreCase: true, want: "\"JOIN\"i", }, ¬Expr{ - pos: position{line: 2259, col: 33, offset: 70130}, + pos: position{line: 2254, col: 33, offset: 70019}, expr: &ruleRefExpr{ - pos: position{line: 2259, col: 34, offset: 70131}, + pos: position{line: 2254, col: 34, offset: 70020}, name: "IdentifierRest", }, }, @@ -16827,20 +16790,20 @@ var g = &grammar{ }, { name: "LAST", - pos: position{line: 2260, col: 1, offset: 70146}, + pos: position{line: 2255, col: 1, offset: 70035}, expr: &seqExpr{ - pos: position{line: 2260, col: 14, offset: 70159}, + pos: position{line: 2255, col: 14, offset: 70048}, exprs: []any{ &litMatcher{ - pos: position{line: 2260, col: 14, offset: 70159}, + pos: position{line: 2255, col: 14, offset: 70048}, val: "last", ignoreCase: true, want: "\"LAST\"i", }, ¬Expr{ - pos: position{line: 2260, col: 33, offset: 70178}, + pos: position{line: 2255, col: 33, offset: 70067}, expr: &ruleRefExpr{ - pos: position{line: 2260, col: 34, offset: 70179}, + pos: position{line: 2255, col: 34, offset: 70068}, name: "IdentifierRest", }, }, @@ -16851,20 +16814,20 @@ var g = &grammar{ }, { name: "LEFT", - pos: position{line: 2261, col: 1, offset: 70194}, + pos: position{line: 2256, col: 1, offset: 70083}, expr: &seqExpr{ - pos: position{line: 2261, col: 14, offset: 70207}, + pos: position{line: 2256, col: 14, offset: 70096}, exprs: []any{ &litMatcher{ - pos: position{line: 2261, col: 14, offset: 70207}, + pos: position{line: 2256, col: 14, offset: 70096}, val: "left", ignoreCase: true, want: "\"LEFT\"i", }, ¬Expr{ - pos: position{line: 2261, col: 33, offset: 70226}, + pos: position{line: 2256, col: 33, offset: 70115}, expr: &ruleRefExpr{ - pos: position{line: 2261, col: 34, offset: 70227}, + pos: position{line: 2256, col: 34, offset: 70116}, name: "IdentifierRest", }, }, @@ -16875,20 +16838,20 @@ var g = &grammar{ }, { name: "LIKE", - pos: position{line: 2262, col: 1, offset: 70242}, + pos: position{line: 2257, col: 1, offset: 70131}, expr: &seqExpr{ - pos: position{line: 2262, col: 14, offset: 70255}, + pos: position{line: 2257, col: 14, offset: 70144}, exprs: []any{ &litMatcher{ - pos: position{line: 2262, col: 14, offset: 70255}, + pos: position{line: 2257, col: 14, offset: 70144}, val: "like", ignoreCase: true, want: "\"LIKE\"i", }, ¬Expr{ - pos: position{line: 2262, col: 32, offset: 70273}, + pos: position{line: 2257, col: 32, offset: 70162}, expr: &ruleRefExpr{ - pos: position{line: 2262, col: 33, offset: 70274}, + pos: position{line: 2257, col: 33, offset: 70163}, name: "IdentifierRest", }, }, @@ -16899,20 +16862,20 @@ var g = &grammar{ }, { name: "LIMIT", - pos: position{line: 2263, col: 1, offset: 70289}, + pos: position{line: 2258, col: 1, offset: 70178}, expr: &seqExpr{ - pos: position{line: 2263, col: 14, offset: 70302}, + pos: position{line: 2258, col: 14, offset: 70191}, exprs: []any{ &litMatcher{ - pos: position{line: 2263, col: 14, offset: 70302}, + pos: position{line: 2258, col: 14, offset: 70191}, val: "limit", ignoreCase: true, want: "\"LIMIT\"i", }, ¬Expr{ - pos: position{line: 2263, col: 33, offset: 70321}, + pos: position{line: 2258, col: 33, offset: 70210}, expr: &ruleRefExpr{ - pos: position{line: 2263, col: 34, offset: 70322}, + pos: position{line: 2258, col: 34, offset: 70211}, name: "IdentifierRest", }, }, @@ -16923,20 +16886,20 @@ var g = &grammar{ }, { name: "LOAD", - pos: position{line: 2264, col: 1, offset: 70337}, + pos: position{line: 2259, col: 1, offset: 70226}, expr: &seqExpr{ - pos: position{line: 2264, col: 14, offset: 70350}, + pos: position{line: 2259, col: 14, offset: 70239}, exprs: []any{ &litMatcher{ - pos: position{line: 2264, col: 14, offset: 70350}, + pos: position{line: 2259, col: 14, offset: 70239}, val: "load", ignoreCase: true, want: "\"LOAD\"i", }, ¬Expr{ - pos: position{line: 2264, col: 33, offset: 70369}, + pos: position{line: 2259, col: 33, offset: 70258}, expr: &ruleRefExpr{ - pos: position{line: 2264, col: 34, offset: 70370}, + pos: position{line: 2259, col: 34, offset: 70259}, name: "IdentifierRest", }, }, @@ -16947,20 +16910,20 @@ var g = &grammar{ }, { name: "MATERIALIZED", - pos: position{line: 2265, col: 1, offset: 70385}, + pos: position{line: 2260, col: 1, offset: 70274}, expr: &seqExpr{ - pos: position{line: 2265, col: 16, offset: 70400}, + pos: position{line: 2260, col: 16, offset: 70289}, exprs: []any{ &litMatcher{ - pos: position{line: 2265, col: 16, offset: 70400}, + pos: position{line: 2260, col: 16, offset: 70289}, val: "materialized", ignoreCase: true, want: "\"MATERIALIZED\"i", }, ¬Expr{ - pos: position{line: 2265, col: 33, offset: 70417}, + pos: position{line: 2260, col: 33, offset: 70306}, expr: &ruleRefExpr{ - pos: position{line: 2265, col: 34, offset: 70418}, + pos: position{line: 2260, col: 34, offset: 70307}, name: "IdentifierRest", }, }, @@ -16971,20 +16934,20 @@ var g = &grammar{ }, { name: "MERGE", - pos: position{line: 2266, col: 1, offset: 70433}, + pos: position{line: 2261, col: 1, offset: 70322}, expr: &seqExpr{ - pos: position{line: 2266, col: 14, offset: 70446}, + pos: position{line: 2261, col: 14, offset: 70335}, exprs: []any{ &litMatcher{ - pos: position{line: 2266, col: 14, offset: 70446}, + pos: position{line: 2261, col: 14, offset: 70335}, val: "merge", ignoreCase: true, want: "\"MERGE\"i", }, ¬Expr{ - pos: position{line: 2266, col: 33, offset: 70465}, + pos: position{line: 2261, col: 33, offset: 70354}, expr: &ruleRefExpr{ - pos: position{line: 2266, col: 34, offset: 70466}, + pos: position{line: 2261, col: 34, offset: 70355}, name: "IdentifierRest", }, }, @@ -16995,20 +16958,20 @@ var g = &grammar{ }, { name: "MESSAGE", - pos: position{line: 2267, col: 1, offset: 70481}, + pos: position{line: 2262, col: 1, offset: 70370}, expr: &seqExpr{ - pos: position{line: 2267, col: 14, offset: 70494}, + pos: position{line: 2262, col: 14, offset: 70383}, exprs: []any{ &litMatcher{ - pos: position{line: 2267, col: 14, offset: 70494}, + pos: position{line: 2262, col: 14, offset: 70383}, val: "message", ignoreCase: true, want: "\"MESSAGE\"i", }, ¬Expr{ - pos: position{line: 2267, col: 33, offset: 70513}, + pos: position{line: 2262, col: 33, offset: 70402}, expr: &ruleRefExpr{ - pos: position{line: 2267, col: 34, offset: 70514}, + pos: position{line: 2262, col: 34, offset: 70403}, name: "IdentifierRest", }, }, @@ -17019,20 +16982,20 @@ var g = &grammar{ }, { name: "META", - pos: position{line: 2268, col: 1, offset: 70529}, + pos: position{line: 2263, col: 1, offset: 70418}, expr: &seqExpr{ - pos: position{line: 2268, col: 14, offset: 70542}, + pos: position{line: 2263, col: 14, offset: 70431}, exprs: []any{ &litMatcher{ - pos: position{line: 2268, col: 14, offset: 70542}, + pos: position{line: 2263, col: 14, offset: 70431}, val: "meta", ignoreCase: true, want: "\"META\"i", }, ¬Expr{ - pos: position{line: 2268, col: 33, offset: 70561}, + pos: position{line: 2263, col: 33, offset: 70450}, expr: &ruleRefExpr{ - pos: position{line: 2268, col: 34, offset: 70562}, + pos: position{line: 2263, col: 34, offset: 70451}, name: "IdentifierRest", }, }, @@ -17043,20 +17006,20 @@ var g = &grammar{ }, { name: "METHOD", - pos: position{line: 2269, col: 1, offset: 70577}, + pos: position{line: 2264, col: 1, offset: 70466}, expr: &seqExpr{ - pos: position{line: 2269, col: 14, offset: 70590}, + pos: position{line: 2264, col: 14, offset: 70479}, exprs: []any{ &litMatcher{ - pos: position{line: 2269, col: 14, offset: 70590}, + pos: position{line: 2264, col: 14, offset: 70479}, val: "method", ignoreCase: true, want: "\"METHOD\"i", }, ¬Expr{ - pos: position{line: 2269, col: 33, offset: 70609}, + pos: position{line: 2264, col: 33, offset: 70498}, expr: &ruleRefExpr{ - pos: position{line: 2269, col: 34, offset: 70610}, + pos: position{line: 2264, col: 34, offset: 70499}, name: "IdentifierRest", }, }, @@ -17067,20 +17030,20 @@ var g = &grammar{ }, { name: "NOT", - pos: position{line: 2270, col: 1, offset: 70625}, + pos: position{line: 2265, col: 1, offset: 70514}, expr: &seqExpr{ - pos: position{line: 2270, col: 14, offset: 70638}, + pos: position{line: 2265, col: 14, offset: 70527}, exprs: []any{ &litMatcher{ - pos: position{line: 2270, col: 14, offset: 70638}, + pos: position{line: 2265, col: 14, offset: 70527}, val: "not", ignoreCase: true, want: "\"NOT\"i", }, ¬Expr{ - pos: position{line: 2270, col: 33, offset: 70657}, + pos: position{line: 2265, col: 33, offset: 70546}, expr: &ruleRefExpr{ - pos: position{line: 2270, col: 34, offset: 70658}, + pos: position{line: 2265, col: 34, offset: 70547}, name: "IdentifierRest", }, }, @@ -17091,20 +17054,20 @@ var g = &grammar{ }, { name: "NULL", - pos: position{line: 2271, col: 1, offset: 70673}, + pos: position{line: 2266, col: 1, offset: 70562}, expr: &seqExpr{ - pos: position{line: 2271, col: 14, offset: 70686}, + pos: position{line: 2266, col: 14, offset: 70575}, exprs: []any{ &litMatcher{ - pos: position{line: 2271, col: 14, offset: 70686}, + pos: position{line: 2266, col: 14, offset: 70575}, val: "null", ignoreCase: true, want: "\"NULL\"i", }, ¬Expr{ - pos: position{line: 2271, col: 33, offset: 70705}, + pos: position{line: 2266, col: 33, offset: 70594}, expr: &ruleRefExpr{ - pos: position{line: 2271, col: 34, offset: 70706}, + pos: position{line: 2266, col: 34, offset: 70595}, name: "IdentifierRest", }, }, @@ -17115,20 +17078,20 @@ var g = &grammar{ }, { name: "NULLS", - pos: position{line: 2272, col: 1, offset: 70721}, + pos: position{line: 2267, col: 1, offset: 70610}, expr: &seqExpr{ - pos: position{line: 2272, col: 14, offset: 70734}, + pos: position{line: 2267, col: 14, offset: 70623}, exprs: []any{ &litMatcher{ - pos: position{line: 2272, col: 14, offset: 70734}, + pos: position{line: 2267, col: 14, offset: 70623}, val: "nulls", ignoreCase: true, want: "\"NULLS\"i", }, ¬Expr{ - pos: position{line: 2272, col: 33, offset: 70753}, + pos: position{line: 2267, col: 33, offset: 70642}, expr: &ruleRefExpr{ - pos: position{line: 2272, col: 34, offset: 70754}, + pos: position{line: 2267, col: 34, offset: 70643}, name: "IdentifierRest", }, }, @@ -17139,20 +17102,20 @@ var g = &grammar{ }, { name: "OFFSET", - pos: position{line: 2273, col: 1, offset: 70769}, + pos: position{line: 2268, col: 1, offset: 70658}, expr: &seqExpr{ - pos: position{line: 2273, col: 14, offset: 70782}, + pos: position{line: 2268, col: 14, offset: 70671}, exprs: []any{ &litMatcher{ - pos: position{line: 2273, col: 14, offset: 70782}, + pos: position{line: 2268, col: 14, offset: 70671}, val: "offset", ignoreCase: true, want: "\"OFFSET\"i", }, ¬Expr{ - pos: position{line: 2273, col: 33, offset: 70801}, + pos: position{line: 2268, col: 33, offset: 70690}, expr: &ruleRefExpr{ - pos: position{line: 2273, col: 34, offset: 70802}, + pos: position{line: 2268, col: 34, offset: 70691}, name: "IdentifierRest", }, }, @@ -17163,20 +17126,20 @@ var g = &grammar{ }, { name: "ON", - pos: position{line: 2274, col: 1, offset: 70817}, + pos: position{line: 2269, col: 1, offset: 70706}, expr: &seqExpr{ - pos: position{line: 2274, col: 14, offset: 70830}, + pos: position{line: 2269, col: 14, offset: 70719}, exprs: []any{ &litMatcher{ - pos: position{line: 2274, col: 14, offset: 70830}, + pos: position{line: 2269, col: 14, offset: 70719}, val: "on", ignoreCase: true, want: "\"ON\"i", }, ¬Expr{ - pos: position{line: 2274, col: 33, offset: 70849}, + pos: position{line: 2269, col: 33, offset: 70738}, expr: &ruleRefExpr{ - pos: position{line: 2274, col: 34, offset: 70850}, + pos: position{line: 2269, col: 34, offset: 70739}, name: "IdentifierRest", }, }, @@ -17187,20 +17150,20 @@ var g = &grammar{ }, { name: "OP", - pos: position{line: 2275, col: 1, offset: 70865}, + pos: position{line: 2270, col: 1, offset: 70754}, expr: &seqExpr{ - pos: position{line: 2275, col: 14, offset: 70878}, + pos: position{line: 2270, col: 14, offset: 70767}, exprs: []any{ &litMatcher{ - pos: position{line: 2275, col: 14, offset: 70878}, + pos: position{line: 2270, col: 14, offset: 70767}, val: "op", ignoreCase: true, want: "\"OP\"i", }, ¬Expr{ - pos: position{line: 2275, col: 33, offset: 70897}, + pos: position{line: 2270, col: 33, offset: 70786}, expr: &ruleRefExpr{ - pos: position{line: 2275, col: 34, offset: 70898}, + pos: position{line: 2270, col: 34, offset: 70787}, name: "IdentifierRest", }, }, @@ -17211,23 +17174,23 @@ var g = &grammar{ }, { name: "OR", - pos: position{line: 2276, col: 1, offset: 70913}, + pos: position{line: 2271, col: 1, offset: 70802}, expr: &actionExpr{ - pos: position{line: 2276, col: 14, offset: 70926}, + pos: position{line: 2271, col: 14, offset: 70815}, run: (*parser).callonOR1, expr: &seqExpr{ - pos: position{line: 2276, col: 14, offset: 70926}, + pos: position{line: 2271, col: 14, offset: 70815}, exprs: []any{ &litMatcher{ - pos: position{line: 2276, col: 14, offset: 70926}, + pos: position{line: 2271, col: 14, offset: 70815}, val: "or", ignoreCase: true, want: "\"OR\"i", }, ¬Expr{ - pos: position{line: 2276, col: 33, offset: 70945}, + pos: position{line: 2271, col: 33, offset: 70834}, expr: &ruleRefExpr{ - pos: position{line: 2276, col: 34, offset: 70946}, + pos: position{line: 2271, col: 34, offset: 70835}, name: "IdentifierRest", }, }, @@ -17239,20 +17202,20 @@ var g = &grammar{ }, { name: "ORDER", - pos: position{line: 2277, col: 1, offset: 70982}, + pos: position{line: 2272, col: 1, offset: 70871}, expr: &seqExpr{ - pos: position{line: 2277, col: 14, offset: 70995}, + pos: position{line: 2272, col: 14, offset: 70884}, exprs: []any{ &litMatcher{ - pos: position{line: 2277, col: 14, offset: 70995}, + pos: position{line: 2272, col: 14, offset: 70884}, val: "order", ignoreCase: true, want: "\"ORDER\"i", }, ¬Expr{ - pos: position{line: 2277, col: 33, offset: 71014}, + pos: position{line: 2272, col: 33, offset: 70903}, expr: &ruleRefExpr{ - pos: position{line: 2277, col: 34, offset: 71015}, + pos: position{line: 2272, col: 34, offset: 70904}, name: "IdentifierRest", }, }, @@ -17263,20 +17226,20 @@ var g = &grammar{ }, { name: "ORDINALITY", - pos: position{line: 2278, col: 1, offset: 71030}, + pos: position{line: 2273, col: 1, offset: 70919}, expr: &seqExpr{ - pos: position{line: 2278, col: 14, offset: 71043}, + pos: position{line: 2273, col: 14, offset: 70932}, exprs: []any{ &litMatcher{ - pos: position{line: 2278, col: 14, offset: 71043}, + pos: position{line: 2273, col: 14, offset: 70932}, val: "ordinality", ignoreCase: true, want: "\"ORDINALITY\"i", }, ¬Expr{ - pos: position{line: 2278, col: 33, offset: 71062}, + pos: position{line: 2273, col: 33, offset: 70951}, expr: &ruleRefExpr{ - pos: position{line: 2278, col: 34, offset: 71063}, + pos: position{line: 2273, col: 34, offset: 70952}, name: "IdentifierRest", }, }, @@ -17287,20 +17250,20 @@ var g = &grammar{ }, { name: "OUTER", - pos: position{line: 2279, col: 1, offset: 71078}, + pos: position{line: 2274, col: 1, offset: 70967}, expr: &seqExpr{ - pos: position{line: 2279, col: 14, offset: 71091}, + pos: position{line: 2274, col: 14, offset: 70980}, exprs: []any{ &litMatcher{ - pos: position{line: 2279, col: 14, offset: 71091}, + pos: position{line: 2274, col: 14, offset: 70980}, val: "outer", ignoreCase: true, want: "\"OUTER\"i", }, ¬Expr{ - pos: position{line: 2279, col: 33, offset: 71110}, + pos: position{line: 2274, col: 33, offset: 70999}, expr: &ruleRefExpr{ - pos: position{line: 2279, col: 34, offset: 71111}, + pos: position{line: 2274, col: 34, offset: 71000}, name: "IdentifierRest", }, }, @@ -17311,20 +17274,20 @@ var g = &grammar{ }, { name: "OUTPUT", - pos: position{line: 2280, col: 1, offset: 71126}, + pos: position{line: 2275, col: 1, offset: 71015}, expr: &seqExpr{ - pos: position{line: 2280, col: 14, offset: 71139}, + pos: position{line: 2275, col: 14, offset: 71028}, exprs: []any{ &litMatcher{ - pos: position{line: 2280, col: 14, offset: 71139}, + pos: position{line: 2275, col: 14, offset: 71028}, val: "output", ignoreCase: true, want: "\"OUTPUT\"i", }, ¬Expr{ - pos: position{line: 2280, col: 33, offset: 71158}, + pos: position{line: 2275, col: 33, offset: 71047}, expr: &ruleRefExpr{ - pos: position{line: 2280, col: 34, offset: 71159}, + pos: position{line: 2275, col: 34, offset: 71048}, name: "IdentifierRest", }, }, @@ -17335,20 +17298,20 @@ var g = &grammar{ }, { name: "OVER", - pos: position{line: 2281, col: 1, offset: 71174}, + pos: position{line: 2276, col: 1, offset: 71063}, expr: &seqExpr{ - pos: position{line: 2281, col: 14, offset: 71187}, + pos: position{line: 2276, col: 14, offset: 71076}, exprs: []any{ &litMatcher{ - pos: position{line: 2281, col: 14, offset: 71187}, + pos: position{line: 2276, col: 14, offset: 71076}, val: "over", ignoreCase: true, want: "\"OVER\"i", }, ¬Expr{ - pos: position{line: 2281, col: 33, offset: 71206}, + pos: position{line: 2276, col: 33, offset: 71095}, expr: &ruleRefExpr{ - pos: position{line: 2281, col: 34, offset: 71207}, + pos: position{line: 2276, col: 34, offset: 71096}, name: "IdentifierRest", }, }, @@ -17359,20 +17322,20 @@ var g = &grammar{ }, { name: "PASS", - pos: position{line: 2282, col: 1, offset: 71222}, + pos: position{line: 2277, col: 1, offset: 71111}, expr: &seqExpr{ - pos: position{line: 2282, col: 14, offset: 71235}, + pos: position{line: 2277, col: 14, offset: 71124}, exprs: []any{ &litMatcher{ - pos: position{line: 2282, col: 14, offset: 71235}, + pos: position{line: 2277, col: 14, offset: 71124}, val: "pass", ignoreCase: true, want: "\"PASS\"i", }, ¬Expr{ - pos: position{line: 2282, col: 33, offset: 71254}, + pos: position{line: 2277, col: 33, offset: 71143}, expr: &ruleRefExpr{ - pos: position{line: 2282, col: 34, offset: 71255}, + pos: position{line: 2277, col: 34, offset: 71144}, name: "IdentifierRest", }, }, @@ -17383,20 +17346,20 @@ var g = &grammar{ }, { name: "PUT", - pos: position{line: 2283, col: 1, offset: 71270}, + pos: position{line: 2278, col: 1, offset: 71159}, expr: &seqExpr{ - pos: position{line: 2283, col: 14, offset: 71283}, + pos: position{line: 2278, col: 14, offset: 71172}, exprs: []any{ &litMatcher{ - pos: position{line: 2283, col: 14, offset: 71283}, + pos: position{line: 2278, col: 14, offset: 71172}, val: "put", ignoreCase: true, want: "\"PUT\"i", }, ¬Expr{ - pos: position{line: 2283, col: 33, offset: 71302}, + pos: position{line: 2278, col: 33, offset: 71191}, expr: &ruleRefExpr{ - pos: position{line: 2283, col: 34, offset: 71303}, + pos: position{line: 2278, col: 34, offset: 71192}, name: "IdentifierRest", }, }, @@ -17407,20 +17370,20 @@ var g = &grammar{ }, { name: "RECURSIVE", - pos: position{line: 2284, col: 1, offset: 71318}, + pos: position{line: 2279, col: 1, offset: 71207}, expr: &seqExpr{ - pos: position{line: 2284, col: 14, offset: 71331}, + pos: position{line: 2279, col: 14, offset: 71220}, exprs: []any{ &litMatcher{ - pos: position{line: 2284, col: 14, offset: 71331}, + pos: position{line: 2279, col: 14, offset: 71220}, val: "RECURSIVE", ignoreCase: false, want: "\"RECURSIVE\"", }, ¬Expr{ - pos: position{line: 2284, col: 33, offset: 71350}, + pos: position{line: 2279, col: 33, offset: 71239}, expr: &ruleRefExpr{ - pos: position{line: 2284, col: 34, offset: 71351}, + pos: position{line: 2279, col: 34, offset: 71240}, name: "IdentifierRest", }, }, @@ -17431,20 +17394,20 @@ var g = &grammar{ }, { name: "REGEXP", - pos: position{line: 2285, col: 1, offset: 71366}, + pos: position{line: 2280, col: 1, offset: 71255}, expr: &seqExpr{ - pos: position{line: 2285, col: 14, offset: 71379}, + pos: position{line: 2280, col: 14, offset: 71268}, exprs: []any{ &litMatcher{ - pos: position{line: 2285, col: 14, offset: 71379}, + pos: position{line: 2280, col: 14, offset: 71268}, val: "regexp", ignoreCase: true, want: "\"REGEXP\"i", }, ¬Expr{ - pos: position{line: 2285, col: 33, offset: 71398}, + pos: position{line: 2280, col: 33, offset: 71287}, expr: &ruleRefExpr{ - pos: position{line: 2285, col: 34, offset: 71399}, + pos: position{line: 2280, col: 34, offset: 71288}, name: "IdentifierRest", }, }, @@ -17455,20 +17418,20 @@ var g = &grammar{ }, { name: "REGEXP_REPLACE", - pos: position{line: 2286, col: 1, offset: 71414}, + pos: position{line: 2281, col: 1, offset: 71303}, expr: &seqExpr{ - pos: position{line: 2286, col: 18, offset: 71431}, + pos: position{line: 2281, col: 18, offset: 71320}, exprs: []any{ &litMatcher{ - pos: position{line: 2286, col: 18, offset: 71431}, + pos: position{line: 2281, col: 18, offset: 71320}, val: "regexp_replace", ignoreCase: true, want: "\"REGEXP_REPLACE\"i", }, ¬Expr{ - pos: position{line: 2286, col: 36, offset: 71449}, + pos: position{line: 2281, col: 36, offset: 71338}, expr: &ruleRefExpr{ - pos: position{line: 2286, col: 37, offset: 71450}, + pos: position{line: 2281, col: 37, offset: 71339}, name: "IdentifierRest", }, }, @@ -17479,20 +17442,20 @@ var g = &grammar{ }, { name: "RENAME", - pos: position{line: 2287, col: 1, offset: 71465}, + pos: position{line: 2282, col: 1, offset: 71354}, expr: &seqExpr{ - pos: position{line: 2287, col: 14, offset: 71478}, + pos: position{line: 2282, col: 14, offset: 71367}, exprs: []any{ &litMatcher{ - pos: position{line: 2287, col: 14, offset: 71478}, + pos: position{line: 2282, col: 14, offset: 71367}, val: "rename", ignoreCase: true, want: "\"RENAME\"i", }, ¬Expr{ - pos: position{line: 2287, col: 33, offset: 71497}, + pos: position{line: 2282, col: 33, offset: 71386}, expr: &ruleRefExpr{ - pos: position{line: 2287, col: 34, offset: 71498}, + pos: position{line: 2282, col: 34, offset: 71387}, name: "IdentifierRest", }, }, @@ -17503,20 +17466,20 @@ var g = &grammar{ }, { name: "RIGHT", - pos: position{line: 2288, col: 1, offset: 71513}, + pos: position{line: 2283, col: 1, offset: 71402}, expr: &seqExpr{ - pos: position{line: 2288, col: 14, offset: 71526}, + pos: position{line: 2283, col: 14, offset: 71415}, exprs: []any{ &litMatcher{ - pos: position{line: 2288, col: 14, offset: 71526}, + pos: position{line: 2283, col: 14, offset: 71415}, val: "right", ignoreCase: true, want: "\"RIGHT\"i", }, ¬Expr{ - pos: position{line: 2288, col: 33, offset: 71545}, + pos: position{line: 2283, col: 33, offset: 71434}, expr: &ruleRefExpr{ - pos: position{line: 2288, col: 34, offset: 71546}, + pos: position{line: 2283, col: 34, offset: 71435}, name: "IdentifierRest", }, }, @@ -17527,20 +17490,20 @@ var g = &grammar{ }, { name: "SAMPLE", - pos: position{line: 2289, col: 1, offset: 71561}, + pos: position{line: 2284, col: 1, offset: 71450}, expr: &seqExpr{ - pos: position{line: 2289, col: 14, offset: 71574}, + pos: position{line: 2284, col: 14, offset: 71463}, exprs: []any{ &litMatcher{ - pos: position{line: 2289, col: 14, offset: 71574}, + pos: position{line: 2284, col: 14, offset: 71463}, val: "sample", ignoreCase: true, want: "\"SAMPLE\"i", }, ¬Expr{ - pos: position{line: 2289, col: 33, offset: 71593}, + pos: position{line: 2284, col: 33, offset: 71482}, expr: &ruleRefExpr{ - pos: position{line: 2289, col: 34, offset: 71594}, + pos: position{line: 2284, col: 34, offset: 71483}, name: "IdentifierRest", }, }, @@ -17551,20 +17514,20 @@ var g = &grammar{ }, { name: "SEARCH", - pos: position{line: 2290, col: 1, offset: 71609}, + pos: position{line: 2285, col: 1, offset: 71498}, expr: &seqExpr{ - pos: position{line: 2290, col: 14, offset: 71622}, + pos: position{line: 2285, col: 14, offset: 71511}, exprs: []any{ &litMatcher{ - pos: position{line: 2290, col: 14, offset: 71622}, + pos: position{line: 2285, col: 14, offset: 71511}, val: "search", ignoreCase: true, want: "\"SEARCH\"i", }, ¬Expr{ - pos: position{line: 2290, col: 33, offset: 71641}, + pos: position{line: 2285, col: 33, offset: 71530}, expr: &ruleRefExpr{ - pos: position{line: 2290, col: 34, offset: 71642}, + pos: position{line: 2285, col: 34, offset: 71531}, name: "IdentifierRest", }, }, @@ -17575,20 +17538,20 @@ var g = &grammar{ }, { name: "SELECT", - pos: position{line: 2291, col: 1, offset: 71657}, + pos: position{line: 2286, col: 1, offset: 71546}, expr: &seqExpr{ - pos: position{line: 2291, col: 14, offset: 71670}, + pos: position{line: 2286, col: 14, offset: 71559}, exprs: []any{ &litMatcher{ - pos: position{line: 2291, col: 14, offset: 71670}, + pos: position{line: 2286, col: 14, offset: 71559}, val: "select", ignoreCase: true, want: "\"SELECT\"i", }, ¬Expr{ - pos: position{line: 2291, col: 33, offset: 71689}, + pos: position{line: 2286, col: 33, offset: 71578}, expr: &ruleRefExpr{ - pos: position{line: 2291, col: 34, offset: 71690}, + pos: position{line: 2286, col: 34, offset: 71579}, name: "IdentifierRest", }, }, @@ -17599,20 +17562,20 @@ var g = &grammar{ }, { name: "SHAPE", - pos: position{line: 2292, col: 1, offset: 71705}, + pos: position{line: 2287, col: 1, offset: 71594}, expr: &seqExpr{ - pos: position{line: 2292, col: 14, offset: 71718}, + pos: position{line: 2287, col: 14, offset: 71607}, exprs: []any{ &litMatcher{ - pos: position{line: 2292, col: 14, offset: 71718}, + pos: position{line: 2287, col: 14, offset: 71607}, val: "shape", ignoreCase: true, want: "\"SHAPE\"i", }, ¬Expr{ - pos: position{line: 2292, col: 33, offset: 71737}, + pos: position{line: 2287, col: 33, offset: 71626}, expr: &ruleRefExpr{ - pos: position{line: 2292, col: 34, offset: 71738}, + pos: position{line: 2287, col: 34, offset: 71627}, name: "IdentifierRest", }, }, @@ -17623,20 +17586,20 @@ var g = &grammar{ }, { name: "SORT", - pos: position{line: 2293, col: 1, offset: 71753}, + pos: position{line: 2288, col: 1, offset: 71642}, expr: &seqExpr{ - pos: position{line: 2293, col: 14, offset: 71766}, + pos: position{line: 2288, col: 14, offset: 71655}, exprs: []any{ &litMatcher{ - pos: position{line: 2293, col: 14, offset: 71766}, + pos: position{line: 2288, col: 14, offset: 71655}, val: "sort", ignoreCase: true, want: "\"SORT\"i", }, ¬Expr{ - pos: position{line: 2293, col: 33, offset: 71785}, + pos: position{line: 2288, col: 33, offset: 71674}, expr: &ruleRefExpr{ - pos: position{line: 2293, col: 34, offset: 71786}, + pos: position{line: 2288, col: 34, offset: 71675}, name: "IdentifierRest", }, }, @@ -17647,20 +17610,20 @@ var g = &grammar{ }, { name: "SUMMARIZE", - pos: position{line: 2294, col: 1, offset: 71801}, + pos: position{line: 2289, col: 1, offset: 71690}, expr: &seqExpr{ - pos: position{line: 2294, col: 14, offset: 71814}, + pos: position{line: 2289, col: 14, offset: 71703}, exprs: []any{ &litMatcher{ - pos: position{line: 2294, col: 14, offset: 71814}, + pos: position{line: 2289, col: 14, offset: 71703}, val: "summarize", ignoreCase: true, want: "\"SUMMARIZE\"i", }, ¬Expr{ - pos: position{line: 2294, col: 33, offset: 71833}, + pos: position{line: 2289, col: 33, offset: 71722}, expr: &ruleRefExpr{ - pos: position{line: 2294, col: 34, offset: 71834}, + pos: position{line: 2289, col: 34, offset: 71723}, name: "IdentifierRest", }, }, @@ -17671,20 +17634,20 @@ var g = &grammar{ }, { name: "SWITCH", - pos: position{line: 2295, col: 1, offset: 71849}, + pos: position{line: 2290, col: 1, offset: 71738}, expr: &seqExpr{ - pos: position{line: 2295, col: 14, offset: 71862}, + pos: position{line: 2290, col: 14, offset: 71751}, exprs: []any{ &litMatcher{ - pos: position{line: 2295, col: 14, offset: 71862}, + pos: position{line: 2290, col: 14, offset: 71751}, val: "switch", ignoreCase: true, want: "\"SWITCH\"i", }, ¬Expr{ - pos: position{line: 2295, col: 33, offset: 71881}, + pos: position{line: 2290, col: 33, offset: 71770}, expr: &ruleRefExpr{ - pos: position{line: 2295, col: 34, offset: 71882}, + pos: position{line: 2290, col: 34, offset: 71771}, name: "IdentifierRest", }, }, @@ -17695,20 +17658,20 @@ var g = &grammar{ }, { name: "TAIL", - pos: position{line: 2296, col: 1, offset: 71897}, + pos: position{line: 2291, col: 1, offset: 71786}, expr: &seqExpr{ - pos: position{line: 2296, col: 14, offset: 71910}, + pos: position{line: 2291, col: 14, offset: 71799}, exprs: []any{ &litMatcher{ - pos: position{line: 2296, col: 14, offset: 71910}, + pos: position{line: 2291, col: 14, offset: 71799}, val: "tail", ignoreCase: true, want: "\"TAIL\"i", }, ¬Expr{ - pos: position{line: 2296, col: 33, offset: 71929}, + pos: position{line: 2291, col: 33, offset: 71818}, expr: &ruleRefExpr{ - pos: position{line: 2296, col: 34, offset: 71930}, + pos: position{line: 2291, col: 34, offset: 71819}, name: "IdentifierRest", }, }, @@ -17719,20 +17682,20 @@ var g = &grammar{ }, { name: "TAP", - pos: position{line: 2297, col: 1, offset: 71946}, + pos: position{line: 2292, col: 1, offset: 71835}, expr: &seqExpr{ - pos: position{line: 2297, col: 14, offset: 71959}, + pos: position{line: 2292, col: 14, offset: 71848}, exprs: []any{ &litMatcher{ - pos: position{line: 2297, col: 14, offset: 71959}, + pos: position{line: 2292, col: 14, offset: 71848}, val: "tap", ignoreCase: true, want: "\"TAP\"i", }, ¬Expr{ - pos: position{line: 2297, col: 33, offset: 71978}, + pos: position{line: 2292, col: 33, offset: 71867}, expr: &ruleRefExpr{ - pos: position{line: 2297, col: 34, offset: 71979}, + pos: position{line: 2292, col: 34, offset: 71868}, name: "IdentifierRest", }, }, @@ -17743,20 +17706,20 @@ var g = &grammar{ }, { name: "THEN", - pos: position{line: 2298, col: 1, offset: 71994}, + pos: position{line: 2293, col: 1, offset: 71883}, expr: &seqExpr{ - pos: position{line: 2298, col: 14, offset: 72007}, + pos: position{line: 2293, col: 14, offset: 71896}, exprs: []any{ &litMatcher{ - pos: position{line: 2298, col: 14, offset: 72007}, + pos: position{line: 2293, col: 14, offset: 71896}, val: "then", ignoreCase: true, want: "\"THEN\"i", }, ¬Expr{ - pos: position{line: 2298, col: 33, offset: 72026}, + pos: position{line: 2293, col: 33, offset: 71915}, expr: &ruleRefExpr{ - pos: position{line: 2298, col: 34, offset: 72027}, + pos: position{line: 2293, col: 34, offset: 71916}, name: "IdentifierRest", }, }, @@ -17767,20 +17730,20 @@ var g = &grammar{ }, { name: "TOP", - pos: position{line: 2299, col: 1, offset: 72042}, + pos: position{line: 2294, col: 1, offset: 71931}, expr: &seqExpr{ - pos: position{line: 2299, col: 14, offset: 72055}, + pos: position{line: 2294, col: 14, offset: 71944}, exprs: []any{ &litMatcher{ - pos: position{line: 2299, col: 14, offset: 72055}, + pos: position{line: 2294, col: 14, offset: 71944}, val: "top", ignoreCase: true, want: "\"TOP\"i", }, ¬Expr{ - pos: position{line: 2299, col: 33, offset: 72074}, + pos: position{line: 2294, col: 33, offset: 71963}, expr: &ruleRefExpr{ - pos: position{line: 2299, col: 34, offset: 72075}, + pos: position{line: 2294, col: 34, offset: 71964}, name: "IdentifierRest", }, }, @@ -17791,20 +17754,20 @@ var g = &grammar{ }, { name: "TRUE", - pos: position{line: 2300, col: 1, offset: 72090}, + pos: position{line: 2295, col: 1, offset: 71979}, expr: &seqExpr{ - pos: position{line: 2300, col: 14, offset: 72103}, + pos: position{line: 2295, col: 14, offset: 71992}, exprs: []any{ &litMatcher{ - pos: position{line: 2300, col: 14, offset: 72103}, + pos: position{line: 2295, col: 14, offset: 71992}, val: "true", ignoreCase: true, want: "\"TRUE\"i", }, ¬Expr{ - pos: position{line: 2300, col: 33, offset: 72122}, + pos: position{line: 2295, col: 33, offset: 72011}, expr: &ruleRefExpr{ - pos: position{line: 2300, col: 34, offset: 72123}, + pos: position{line: 2295, col: 34, offset: 72012}, name: "IdentifierRest", }, }, @@ -17815,20 +17778,20 @@ var g = &grammar{ }, { name: "TYPE", - pos: position{line: 2301, col: 1, offset: 72138}, + pos: position{line: 2296, col: 1, offset: 72027}, expr: &seqExpr{ - pos: position{line: 2301, col: 14, offset: 72151}, + pos: position{line: 2296, col: 14, offset: 72040}, exprs: []any{ &litMatcher{ - pos: position{line: 2301, col: 14, offset: 72151}, + pos: position{line: 2296, col: 14, offset: 72040}, val: "type", ignoreCase: true, want: "\"TYPE\"i", }, ¬Expr{ - pos: position{line: 2301, col: 33, offset: 72170}, + pos: position{line: 2296, col: 33, offset: 72059}, expr: &ruleRefExpr{ - pos: position{line: 2301, col: 34, offset: 72171}, + pos: position{line: 2296, col: 34, offset: 72060}, name: "IdentifierRest", }, }, @@ -17839,20 +17802,20 @@ var g = &grammar{ }, { name: "UNION", - pos: position{line: 2302, col: 1, offset: 72186}, + pos: position{line: 2297, col: 1, offset: 72075}, expr: &seqExpr{ - pos: position{line: 2302, col: 14, offset: 72199}, + pos: position{line: 2297, col: 14, offset: 72088}, exprs: []any{ &litMatcher{ - pos: position{line: 2302, col: 14, offset: 72199}, + pos: position{line: 2297, col: 14, offset: 72088}, val: "union", ignoreCase: true, want: "\"UNION\"i", }, ¬Expr{ - pos: position{line: 2302, col: 33, offset: 72218}, + pos: position{line: 2297, col: 33, offset: 72107}, expr: &ruleRefExpr{ - pos: position{line: 2302, col: 34, offset: 72219}, + pos: position{line: 2297, col: 34, offset: 72108}, name: "IdentifierRest", }, }, @@ -17863,20 +17826,20 @@ var g = &grammar{ }, { name: "UNIQ", - pos: position{line: 2303, col: 1, offset: 72234}, + pos: position{line: 2298, col: 1, offset: 72123}, expr: &seqExpr{ - pos: position{line: 2303, col: 14, offset: 72247}, + pos: position{line: 2298, col: 14, offset: 72136}, exprs: []any{ &litMatcher{ - pos: position{line: 2303, col: 14, offset: 72247}, + pos: position{line: 2298, col: 14, offset: 72136}, val: "uniq", ignoreCase: true, want: "\"UNIQ\"i", }, ¬Expr{ - pos: position{line: 2303, col: 33, offset: 72266}, + pos: position{line: 2298, col: 33, offset: 72155}, expr: &ruleRefExpr{ - pos: position{line: 2303, col: 34, offset: 72267}, + pos: position{line: 2298, col: 34, offset: 72156}, name: "IdentifierRest", }, }, @@ -17887,20 +17850,20 @@ var g = &grammar{ }, { name: "UNNEST", - pos: position{line: 2304, col: 1, offset: 72283}, + pos: position{line: 2299, col: 1, offset: 72172}, expr: &seqExpr{ - pos: position{line: 2304, col: 14, offset: 72296}, + pos: position{line: 2299, col: 14, offset: 72185}, exprs: []any{ &litMatcher{ - pos: position{line: 2304, col: 14, offset: 72296}, + pos: position{line: 2299, col: 14, offset: 72185}, val: "unnest", ignoreCase: true, want: "\"UNNEST\"i", }, ¬Expr{ - pos: position{line: 2304, col: 33, offset: 72315}, + pos: position{line: 2299, col: 33, offset: 72204}, expr: &ruleRefExpr{ - pos: position{line: 2304, col: 34, offset: 72316}, + pos: position{line: 2299, col: 34, offset: 72205}, name: "IdentifierRest", }, }, @@ -17911,20 +17874,20 @@ var g = &grammar{ }, { name: "USING", - pos: position{line: 2305, col: 1, offset: 72331}, + pos: position{line: 2300, col: 1, offset: 72220}, expr: &seqExpr{ - pos: position{line: 2305, col: 14, offset: 72344}, + pos: position{line: 2300, col: 14, offset: 72233}, exprs: []any{ &litMatcher{ - pos: position{line: 2305, col: 14, offset: 72344}, + pos: position{line: 2300, col: 14, offset: 72233}, val: "using", ignoreCase: true, want: "\"USING\"i", }, ¬Expr{ - pos: position{line: 2305, col: 33, offset: 72363}, + pos: position{line: 2300, col: 33, offset: 72252}, expr: &ruleRefExpr{ - pos: position{line: 2305, col: 34, offset: 72364}, + pos: position{line: 2300, col: 34, offset: 72253}, name: "IdentifierRest", }, }, @@ -17935,20 +17898,20 @@ var g = &grammar{ }, { name: "VALUE", - pos: position{line: 2306, col: 1, offset: 72379}, + pos: position{line: 2301, col: 1, offset: 72268}, expr: &seqExpr{ - pos: position{line: 2306, col: 14, offset: 72392}, + pos: position{line: 2301, col: 14, offset: 72281}, exprs: []any{ &litMatcher{ - pos: position{line: 2306, col: 14, offset: 72392}, + pos: position{line: 2301, col: 14, offset: 72281}, val: "value", ignoreCase: true, want: "\"VALUE\"i", }, ¬Expr{ - pos: position{line: 2306, col: 33, offset: 72411}, + pos: position{line: 2301, col: 33, offset: 72300}, expr: &ruleRefExpr{ - pos: position{line: 2306, col: 34, offset: 72412}, + pos: position{line: 2301, col: 34, offset: 72301}, name: "IdentifierRest", }, }, @@ -17959,20 +17922,20 @@ var g = &grammar{ }, { name: "WHEN", - pos: position{line: 2307, col: 1, offset: 72427}, + pos: position{line: 2302, col: 1, offset: 72316}, expr: &seqExpr{ - pos: position{line: 2307, col: 14, offset: 72440}, + pos: position{line: 2302, col: 14, offset: 72329}, exprs: []any{ &litMatcher{ - pos: position{line: 2307, col: 14, offset: 72440}, + pos: position{line: 2302, col: 14, offset: 72329}, val: "when", ignoreCase: true, want: "\"WHEN\"i", }, ¬Expr{ - pos: position{line: 2307, col: 33, offset: 72459}, + pos: position{line: 2302, col: 33, offset: 72348}, expr: &ruleRefExpr{ - pos: position{line: 2307, col: 34, offset: 72460}, + pos: position{line: 2302, col: 34, offset: 72349}, name: "IdentifierRest", }, }, @@ -17983,20 +17946,20 @@ var g = &grammar{ }, { name: "WHERE", - pos: position{line: 2308, col: 1, offset: 72475}, + pos: position{line: 2303, col: 1, offset: 72364}, expr: &seqExpr{ - pos: position{line: 2308, col: 14, offset: 72488}, + pos: position{line: 2303, col: 14, offset: 72377}, exprs: []any{ &litMatcher{ - pos: position{line: 2308, col: 14, offset: 72488}, + pos: position{line: 2303, col: 14, offset: 72377}, val: "where", ignoreCase: true, want: "\"WHERE\"i", }, ¬Expr{ - pos: position{line: 2308, col: 33, offset: 72507}, + pos: position{line: 2303, col: 33, offset: 72396}, expr: &ruleRefExpr{ - pos: position{line: 2308, col: 34, offset: 72508}, + pos: position{line: 2303, col: 34, offset: 72397}, name: "IdentifierRest", }, }, @@ -18007,20 +17970,20 @@ var g = &grammar{ }, { name: "WITH", - pos: position{line: 2309, col: 1, offset: 72523}, + pos: position{line: 2304, col: 1, offset: 72412}, expr: &seqExpr{ - pos: position{line: 2309, col: 14, offset: 72536}, + pos: position{line: 2304, col: 14, offset: 72425}, exprs: []any{ &litMatcher{ - pos: position{line: 2309, col: 14, offset: 72536}, + pos: position{line: 2304, col: 14, offset: 72425}, val: "with", ignoreCase: true, want: "\"WITH\"i", }, ¬Expr{ - pos: position{line: 2309, col: 33, offset: 72555}, + pos: position{line: 2304, col: 33, offset: 72444}, expr: &ruleRefExpr{ - pos: position{line: 2309, col: 34, offset: 72556}, + pos: position{line: 2304, col: 34, offset: 72445}, name: "IdentifierRest", }, }, @@ -18031,20 +17994,20 @@ var g = &grammar{ }, { name: "YIELD", - pos: position{line: 2310, col: 1, offset: 72571}, + pos: position{line: 2305, col: 1, offset: 72460}, expr: &seqExpr{ - pos: position{line: 2310, col: 14, offset: 72584}, + pos: position{line: 2305, col: 14, offset: 72473}, exprs: []any{ &litMatcher{ - pos: position{line: 2310, col: 14, offset: 72584}, + pos: position{line: 2305, col: 14, offset: 72473}, val: "yield", ignoreCase: true, want: "\"YIELD\"i", }, ¬Expr{ - pos: position{line: 2310, col: 33, offset: 72603}, + pos: position{line: 2305, col: 33, offset: 72492}, expr: &ruleRefExpr{ - pos: position{line: 2310, col: 34, offset: 72604}, + pos: position{line: 2305, col: 34, offset: 72493}, name: "IdentifierRest", }, }, @@ -20026,12 +19989,11 @@ func (p *parser) callonBetweenExpr2() (any, error) { return p.cur.onBetweenExpr2(stack["expr"], stack["lower"], stack["upper"]) } -func (c *current) onComparisonExpr2(lhs, op any) (any, error) { - return &ast.BinaryExpr{ - Kind: "BinaryExpr", - Op: op.(string), - LHS: lhs.(ast.Expr), - RHS: newPrimitive(c, "null", ""), +func (c *current) onComparisonExpr2(expr, not any) (any, error) { + return &ast.IsNullExpr{ + Kind: "IsNullExpr", + Expr: expr.(ast.Expr), + Not: not != nil, Loc: loc(c), }, nil @@ -20040,20 +20002,20 @@ func (c *current) onComparisonExpr2(lhs, op any) (any, error) { func (p *parser) callonComparisonExpr2() (any, error) { stack := p.vstack[len(p.vstack)-1] _ = stack - return p.cur.onComparisonExpr2(stack["lhs"], stack["op"]) + return p.cur.onComparisonExpr2(stack["expr"], stack["not"]) } -func (c *current) onComparisonExpr23() (any, error) { +func (c *current) onComparisonExpr29() (any, error) { return string(c.text), nil } -func (p *parser) callonComparisonExpr23() (any, error) { +func (p *parser) callonComparisonExpr29() (any, error) { stack := p.vstack[len(p.vstack)-1] _ = stack - return p.cur.onComparisonExpr23() + return p.cur.onComparisonExpr29() } -func (c *current) onComparisonExpr9(lhs, opAndRHS any) (any, error) { +func (c *current) onComparisonExpr15(lhs, opAndRHS any) (any, error) { if opAndRHS == nil { return lhs, nil } @@ -20067,30 +20029,10 @@ func (c *current) onComparisonExpr9(lhs, opAndRHS any) (any, error) { } -func (p *parser) callonComparisonExpr9() (any, error) { - stack := p.vstack[len(p.vstack)-1] - _ = stack - return p.cur.onComparisonExpr9(stack["lhs"], stack["opAndRHS"]) -} - -func (c *current) onIsNull2() (any, error) { - return "==", nil -} - -func (p *parser) callonIsNull2() (any, error) { - stack := p.vstack[len(p.vstack)-1] - _ = stack - return p.cur.onIsNull2() -} - -func (c *current) onIsNull7() (any, error) { - return "!=", nil -} - -func (p *parser) callonIsNull7() (any, error) { +func (p *parser) callonComparisonExpr15() (any, error) { stack := p.vstack[len(p.vstack)-1] _ = stack - return p.cur.onIsNull7() + return p.cur.onComparisonExpr15(stack["lhs"], stack["opAndRHS"]) } func (c *current) onAdditiveExpr7(op, expr any) (any, error) { diff --git a/compiler/parser/parser.peg b/compiler/parser/parser.peg index 48f668337f..ddf1f216dd 100644 --- a/compiler/parser/parser.peg +++ b/compiler/parser/parser.peg @@ -948,12 +948,11 @@ BetweenExpr / ComparisonExpr ComparisonExpr - = lhs:AdditiveExpr _ op:IsNull { - return &ast.BinaryExpr{ - Kind: "BinaryExpr", - Op: op.(string), - LHS: lhs.(ast.Expr), - RHS: newPrimitive(c, "null", ""), + = expr:AdditiveExpr _ IS not:(_ NOT)? _ NULL { + return &ast.IsNullExpr{ + Kind: "IsNullExpr", + Expr: expr.(ast.Expr), + Not: not != nil, Loc: loc(c), }, nil } @@ -970,10 +969,6 @@ ComparisonExpr }, nil } - IsNull - = IS _ NULL { return "==", nil } - / IS _ NOT _ NULL { return "!=", nil } - AdditiveExpr = first:MultiplicativeExpr rest:(__ op:AdditiveOperator __ expr:MultiplicativeExpr { return []any{op, expr}, nil })* { diff --git a/compiler/semantic/expr.go b/compiler/semantic/expr.go index 017a05fc61..e0bf6fb351 100644 --- a/compiler/semantic/expr.go +++ b/compiler/semantic/expr.go @@ -145,6 +145,17 @@ func (a *analyzer) semExpr(e ast.Expr) dag.Expr { Expr: expr, Index: index, } + case *ast.IsNullExpr: + expr := a.semExpr(e.Expr) + var out dag.Expr = &dag.IsNullExpr{Kind: "IsNullExpr", Expr: expr} + if e.Not { + out = &dag.UnaryExpr{ + Kind: "UnaryExpr", + Op: "!", + Operand: out, + } + } + return out case *ast.SliceExpr: expr := a.semExpr(e.Expr) // XXX Literal indices should be type checked as int. diff --git a/compiler/semantic/op.go b/compiler/semantic/op.go index 83b8e7df16..17573b9f8d 100644 --- a/compiler/semantic/op.go +++ b/compiler/semantic/op.go @@ -1184,6 +1184,8 @@ func (a *analyzer) isBool(e dag.Expr) bool { return false } return function.HasBoolResult(e.Name) + case *dag.IsNullExpr: + return true case *dag.Search, *dag.RegexpMatch, *dag.RegexpSearch: return true default: diff --git a/runtime/sam/expr/boolean.go b/runtime/sam/expr/boolean.go index be2d2aafc2..bd52a5e312 100644 --- a/runtime/sam/expr/boolean.go +++ b/runtime/sam/expr/boolean.go @@ -15,7 +15,7 @@ import ( // Boolean is a function that takes a Value and returns a boolean result // based on the typed value. -type Boolean func(super.Value) bool +type Boolean func(super.Value) super.Value var compareBool = map[string]func(bool, bool) bool{ "==": func(a, b bool) bool { return a == b }, @@ -34,12 +34,18 @@ func CompareBool(op string, pattern bool) (Boolean, error) { if !ok { return nil, fmt.Errorf("unknown bool comparator: %s", op) } - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } if val.Type().ID() != super.IDBool { - return false + return super.False } b := val.Bool() - return compare(b, pattern) + return super.NewBool(compare(b, pattern)) }, nil } @@ -69,18 +75,24 @@ func CompareInt64(op string, pattern int64) (Boolean, error) { return nil, fmt.Errorf("unknown int comparator: %s", op) } // many different Zed data types can be compared with integers - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } switch val.Type().ID() { case super.IDUint8, super.IDUint16, super.IDUint32, super.IDUint64: if v := val.Uint(); v <= math.MaxInt64 { - return CompareInt(int64(v), pattern) + return super.NewBool(CompareInt(int64(v), pattern)) } case super.IDInt8, super.IDInt16, super.IDInt32, super.IDInt64, super.IDTime, super.IDDuration: - return CompareInt(val.Int(), pattern) + return super.NewBool(CompareInt(val.Int(), pattern)) case super.IDFloat16, super.IDFloat32, super.IDFloat64: - return CompareFloat(val.Float(), float64(pattern)) + return super.NewBool(CompareFloat(val.Float(), float64(pattern))) } - return false + return super.False }, nil } @@ -103,11 +115,17 @@ func CompareIP(op string, pattern netip.Addr) (Boolean, error) { if !ok { return nil, fmt.Errorf("unknown addr comparator: %s", op) } - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } if val.Type().ID() != super.IDIP { - return false + return super.False } - return compare(super.DecodeIP(val.Bytes()), pattern) + return super.NewBool(compare(super.DecodeIP(val.Bytes()), pattern)) }, nil } @@ -120,7 +138,13 @@ func CompareFloat64(op string, pattern float64) (Boolean, error) { if !ok { return nil, fmt.Errorf("unknown double comparator: %s", op) } - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } switch val.Type().ID() { // We allow comparison of float constant with integer-y // fields and just use typeDouble to parse since it will do @@ -129,13 +153,13 @@ func CompareFloat64(op string, pattern float64) (Boolean, error) { // use an integer constant instead of a float constant to // compare with the integer-y field. case super.IDUint8, super.IDUint16, super.IDUint32, super.IDUint64: - return compare(float64(val.Uint()), pattern) + return super.NewBool(compare(float64(val.Uint()), pattern)) case super.IDInt8, super.IDInt16, super.IDInt32, super.IDInt64, super.IDTime, super.IDDuration: - return compare(float64(val.Int()), pattern) + return super.NewBool(compare(float64(val.Int()), pattern)) case super.IDFloat16, super.IDFloat32, super.IDFloat64: - return compare(val.Float(), pattern) + return super.NewBool(compare(val.Float(), pattern)) } - return false + return super.False }, nil } @@ -154,11 +178,17 @@ func CompareString(op string, pattern []byte) (Boolean, error) { return nil, fmt.Errorf("unknown string comparator: %s", op) } s := string(pattern) - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } if val.Type().ID() == super.IDString { - return compare(byteconv.UnsafeString(val.Bytes()), s) + return super.NewBool(compare(byteconv.UnsafeString(val.Bytes()), s)) } - return false + return super.False }, nil } @@ -176,12 +206,19 @@ func CompareBytes(op string, pattern []byte) (Boolean, error) { if !ok { return nil, fmt.Errorf("unknown bytes comparator: %s", op) } - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + if val.IsError() { + return val + } + v := false switch val.Type().ID() { case super.IDBytes, super.IDType: - return compare(val.Bytes(), pattern) + v = compare(val.Bytes(), pattern) } - return false + return super.NewBool(v) }, nil } @@ -199,39 +236,38 @@ func CompileRegexp(pattern string) (*regexp.Regexp, error) { // NewRegexpBoolean returns a Boolean that compares values that must // be a stringy the given regexp. func NewRegexpBoolean(re *regexp.Regexp) Boolean { - return func(val super.Value) bool { + return func(val super.Value) super.Value { + if val.IsNull() { + return super.NullBool + } + v := false if val.IsString() { - return re.Match(val.Bytes()) + v = re.Match(val.Bytes()) } - return false + return super.NewBool(v) } } func CompareNull(op string) (Boolean, error) { - switch op { - case "==": - return func(val super.Value) bool { - return val.IsNull() - }, nil - case "!=": - return func(val super.Value) bool { - return !val.IsNull() - }, nil - default: - return nil, fmt.Errorf("unknown null comparator: %s", op) - } + return func(val super.Value) super.Value { + if val.IsError() { + return val + } + return super.NullBool + }, nil } // Given a predicate for comparing individual elements, produce a new // predicate that implements the "in" comparison. func Contains(compare Boolean) Boolean { - return func(val super.Value) bool { - return errMatch == val.Walk(func(typ super.Type, body zcode.Bytes) error { - if compare(super.NewValue(typ, body)) { + return func(val super.Value) super.Value { + err := val.Walk(func(typ super.Type, body zcode.Bytes) error { + if compare(super.NewValue(typ, body)) == super.True { return errMatch } return nil }) + return super.NewBool(err == errMatch) } } @@ -241,6 +277,9 @@ func Contains(compare Boolean) Boolean { // of this method as some types limit the operand to equality and // the various types handle coercion in different ways. func Comparison(op string, val super.Value) (Boolean, error) { + if val.IsNull() { + return CompareNull(op) + } switch super.TypeUnder(val.Type()).(type) { case *super.TypeOfNull: return CompareNull(op) diff --git a/runtime/sam/expr/eval.go b/runtime/sam/expr/eval.go index 1aadb68576..b5077347f0 100644 --- a/runtime/sam/expr/eval.go +++ b/runtime/sam/expr/eval.go @@ -175,6 +175,9 @@ func (e *Equal) Eval(ectx Context, this super.Value) super.Value { if errVal != nil { return *errVal } + if lhsVal.IsNull() || rhsVal.IsNull() { + return super.NullBool + } result := coerce.Equal(lhsVal, rhsVal) if !e.equality { result = !result @@ -292,17 +295,9 @@ func (c *Compare) Eval(ectx Context, this super.Value) super.Value { return rhs } lhs, rhs = lhs.Under(), rhs.Under() - - if lhs.IsNull() { - if rhs.IsNull() { - return c.result(0) - } - return super.False - } else if rhs.IsNull() { - // We know lhs isn't null. - return super.False + if lhs.IsNull() || rhs.IsNull() { + return super.NullBool } - switch lid, rid := lhs.Type().ID(), rhs.Type().ID(); { case super.IsNumber(lid) && super.IsNumber(rid): return c.result(compareNumbers(lhs, rhs, lid, rid)) @@ -355,6 +350,23 @@ func compareNumbers(a, b super.Value, aid, bid int) int { return cmp.Compare(a.Uint(), b.Uint()) } +type isNullExpr struct { + eval Evaluator +} + +func NewIsNullExpr(e Evaluator) Evaluator { + return &isNullExpr{e} +} + +func (i *isNullExpr) Eval(ectx Context, this super.Value) super.Value { + val := i.eval.Eval(ectx, this) + if val.IsError() { + return val + } + return super.NewBool(val.IsNull()) + +} + func toFloat(val super.Value) float64 { return coerce.ToNumeric[float64](val) } func toInt(val super.Value) int64 { return coerce.ToNumeric[int64](val) } func toUint(val super.Value) uint64 { return coerce.ToNumeric[uint64](val) } diff --git a/runtime/sam/expr/filter.go b/runtime/sam/expr/filter.go index eeab60025e..20aeb71d6d 100644 --- a/runtime/sam/expr/filter.go +++ b/runtime/sam/expr/filter.go @@ -36,7 +36,7 @@ func (s *searchByPred) Eval(ectx Context, val super.Value) super.Value { if s.searchType(typ) { return errMatch } - if s.pred(super.NewValue(typ, body)) { + if s.pred(super.NewValue(typ, body)).Ptr().AsBool() { return errMatch } return nil @@ -56,7 +56,7 @@ func (s *searchByPred) searchType(typ super.Type) bool { var nameIter FieldNameIter nameIter.Init(recType) for !nameIter.Done() { - if s.pred(super.NewString(string(nameIter.Next()))) { + if s.pred(super.NewString(string(nameIter.Next()))).Ptr().AsBool() { match = true break } @@ -129,7 +129,7 @@ func (s *search) Eval(ectx Context, val super.Value) super.Value { } return nil } - if s.compare(super.NewValue(typ, body)) { + if s.compare(super.NewValue(typ, body)).Ptr().AsBool() { return errMatch } return nil @@ -241,10 +241,7 @@ func (f *filter) Eval(ectx Context, this super.Value) super.Value { if val.IsError() { return val } - if f.pred(val) { - return super.True - } - return super.False + return f.pred(val) } type filterApplier struct { diff --git a/runtime/sam/expr/ztests/compare-null-int64.yaml b/runtime/sam/expr/ztests/compare-null-int64.yaml index e718f26b96..f174981b67 100644 --- a/runtime/sam/expr/ztests/compare-null-int64.yaml +++ b/runtime/sam/expr/ztests/compare-null-int64.yaml @@ -5,5 +5,5 @@ input: | {a:1,b:null} output: | - {a:1,b:null(int64),eq:false,ne:true,lt:false,lte:false,gt:false,gte:false} - {a:1,b:null,eq:false,ne:true,lt:false,lte:false,gt:false,gte:false} + {a:1,b:null(int64),eq:null(bool),ne:null(bool),lt:null(bool),lte:null(bool),gt:null(bool),gte:null(bool)} + {a:1,b:null,eq:null(bool),ne:null(bool),lt:null(bool),lte:null(bool),gt:null(bool),gte:null(bool)} diff --git a/runtime/sam/expr/ztests/compare-null-string.yaml b/runtime/sam/expr/ztests/compare-null-string.yaml index de7e46a279..2e5f2f9492 100644 --- a/runtime/sam/expr/ztests/compare-null-string.yaml +++ b/runtime/sam/expr/ztests/compare-null-string.yaml @@ -5,5 +5,5 @@ input: | {a:"s",b:null} output: | - {a:"s",b:null(string),eq:false,ne:true} - {a:"s",b:null,eq:false,ne:true} + {a:"s",b:null(string),eq:null(bool),ne:null(bool)} + {a:"s",b:null,eq:null(bool),ne:null(bool)} diff --git a/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml b/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml index a55eaee531..cd290bc72a 100644 --- a/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml +++ b/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml @@ -1,4 +1,4 @@ -zed: s==null +zed: s IS NULL input: | {s:"A=B"} diff --git a/runtime/sam/expr/ztests/is-null.yaml b/runtime/sam/expr/ztests/is-null.yaml new file mode 100644 index 0000000000..16a3885500 --- /dev/null +++ b/runtime/sam/expr/ztests/is-null.yaml @@ -0,0 +1,19 @@ +zed: yield this IS NULL, this IS NOT NULL + +input: | + "foo" + null(string) + error("missing") + error("foo") + +output: | + false + true + true + false + error("missing") + error("missing") + error("foo") + error("foo") + + diff --git a/runtime/sam/expr/ztests/slice.yaml b/runtime/sam/expr/ztests/slice.yaml index 5ad689e99e..a67e6725b3 100644 --- a/runtime/sam/expr/ztests/slice.yaml +++ b/runtime/sam/expr/ztests/slice.yaml @@ -1,4 +1,4 @@ -zed: "cut a1:=a[1:-1],a2:=a[1:],a3:=a[:1],a4:=a[:-1],a5:=a[:-100],a6:=a[-1:],a7:=a[-2:-1],a8:=(a!=null and len(a)>0) ? a[:a[0]-8] : null" +zed: "cut a1:=a[1:-1],a2:=a[1:],a3:=a[:1],a4:=a[:-1],a5:=a[:-100],a6:=a[-1:],a7:=a[-2:-1],a8:=(a IS NOT NULL and len(a)>0) ? a[:a[0]-8] : null" input: | {a:null} diff --git a/zfmt/ast.go b/zfmt/ast.go index bed28ed979..3f2587324c 100644 --- a/zfmt/ast.go +++ b/zfmt/ast.go @@ -137,6 +137,13 @@ func (c *canon) expr(e ast.Expr, parent string) { c.write("[") c.expr(e.Index, "") c.write("]") + case *ast.IsNullExpr: + c.expr(e.Expr, "") + c.write("IS ") + if e.Not { + c.write("NOT ") + } + c.write("NULL") case *ast.SliceExpr: c.expr(e.Expr, "") c.write("[") diff --git a/zfmt/dag.go b/zfmt/dag.go index 0047142d69..6d3b81864f 100644 --- a/zfmt/dag.go +++ b/zfmt/dag.go @@ -85,8 +85,13 @@ func (c *canonDAG) expr(e dag.Expr, parent string) { case *ast.Primitive: c.literal(*e) case *dag.UnaryExpr: - c.write(e.Op) - c.expr(e.Operand, "not") + if isnull, ok := e.Operand.(*dag.IsNullExpr); ok && e.Op == "!" { + c.expr(isnull.Expr, "") + c.write(" IS NOT NULL") + } else { + c.write(e.Op) + c.expr(e.Operand, "not") + } case *dag.BinaryExpr: c.binary(e, parent) case *dag.Conditional: @@ -105,6 +110,9 @@ func (c *canonDAG) expr(e dag.Expr, parent string) { c.write("[") c.expr(e.Index, "") c.write("]") + case *dag.IsNullExpr: + c.expr(e.Expr, "") + c.write("IS NULL") case *dag.SliceExpr: c.expr(e.Expr, "") c.write("[") From c06e81af5e6e7b25427917be70e79117d062685f Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Thu, 21 Nov 2024 10:39:02 -0500 Subject: [PATCH 03/22] vam: Add SQL semantics for nulls in comparisons (#5492) Also add support for IS NULL expressions in vector runtime --- compiler/kernel/vexpr.go | 10 +++++ runtime/sam/expr/ztests/is-null.yaml | 19 --------- runtime/vam/expr/coerce.go | 2 + runtime/vam/expr/compare.go | 41 ++++++++++++++++--- runtime/ztests/expr/compare-incompatible.yaml | 12 ++++++ .../expr}/compare-null-int64.yaml | 2 + .../expr}/compare-null-string.yaml | 6 +++ .../expr}/filter-null-with-unset-field.yaml | 2 + runtime/ztests/expr/is-null.yaml | 17 ++++++++ vector/bool.go | 11 ++++- vector/builder.go | 2 +- 11 files changed, 97 insertions(+), 27 deletions(-) delete mode 100644 runtime/sam/expr/ztests/is-null.yaml create mode 100644 runtime/ztests/expr/compare-incompatible.yaml rename runtime/{sam/expr/ztests => ztests/expr}/compare-null-int64.yaml (96%) rename runtime/{sam/expr/ztests => ztests/expr}/compare-null-string.yaml (59%) rename runtime/{sam/expr/ztests => ztests/expr}/filter-null-with-unset-field.yaml (88%) create mode 100644 runtime/ztests/expr/is-null.yaml diff --git a/compiler/kernel/vexpr.go b/compiler/kernel/vexpr.go index 3adf354fdd..ea61b44f69 100644 --- a/compiler/kernel/vexpr.go +++ b/compiler/kernel/vexpr.go @@ -35,6 +35,8 @@ func (b *Builder) compileVamExpr(e dag.Expr) (vamexpr.Evaluator, error) { return b.compileVamDotExpr(e) case *dag.IndexExpr: return b.compileVamIndexExpr(e) + case *dag.IsNullExpr: + return b.compileVamIsNullExpr(e) case *dag.UnaryExpr: return b.compileVamUnary(*e) case *dag.BinaryExpr: @@ -145,6 +147,14 @@ func (b *Builder) compileVamIndexExpr(idx *dag.IndexExpr) (vamexpr.Evaluator, er return vamexpr.NewIndexExpr(b.zctx(), e, index), nil } +func (b *Builder) compileVamIsNullExpr(idx *dag.IsNullExpr) (vamexpr.Evaluator, error) { + e, err := b.compileVamExpr(idx.Expr) + if err != nil { + return nil, err + } + return vamexpr.NewIsNull(e), nil +} + func (b *Builder) compileVamExprs(in []dag.Expr) ([]vamexpr.Evaluator, error) { var exprs []vamexpr.Evaluator for _, e := range in { diff --git a/runtime/sam/expr/ztests/is-null.yaml b/runtime/sam/expr/ztests/is-null.yaml deleted file mode 100644 index 16a3885500..0000000000 --- a/runtime/sam/expr/ztests/is-null.yaml +++ /dev/null @@ -1,19 +0,0 @@ -zed: yield this IS NULL, this IS NOT NULL - -input: | - "foo" - null(string) - error("missing") - error("foo") - -output: | - false - true - true - false - error("missing") - error("missing") - error("foo") - error("foo") - - diff --git a/runtime/vam/expr/coerce.go b/runtime/vam/expr/coerce.go index a6aa1b6cb2..8c10c9829a 100644 --- a/runtime/vam/expr/coerce.go +++ b/runtime/vam/expr/coerce.go @@ -25,9 +25,11 @@ func coerceVals(zctx *super.Context, a, b vector.Any) (vector.Any, vector.Any, v return a, b, nil } if aid == super.IDNull { + a = vector.NewConst(super.NewValue(b.Type(), nil), b.Len(), nil) return a, b, nil //XXX } if bid == super.IDNull { + b = vector.NewConst(super.NewValue(a.Type(), nil), a.Len(), nil) return a, b, nil //XXX } if !super.IsNumber(aid) || !super.IsNumber(bid) { diff --git a/runtime/vam/expr/compare.go b/runtime/vam/expr/compare.go index 67fe916981..da692793f2 100644 --- a/runtime/vam/expr/compare.go +++ b/runtime/vam/expr/compare.go @@ -26,13 +26,19 @@ func (c *Compare) Eval(val vector.Any) vector.Any { func (c *Compare) eval(vecs ...vector.Any) vector.Any { lhs := vector.Under(vecs[0]) rhs := vector.Under(vecs[1]) + if _, ok := lhs.(*vector.Error); ok { + return vecs[0] + } + if _, ok := rhs.(*vector.Error); ok { + return vecs[1] + } + nulls := vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs)) lhs, rhs, errVal := coerceVals(c.zctx, lhs, rhs) if errVal != nil { - return errVal + // if incompatible types return false + return vector.NewConst(super.False, vecs[0].Len(), nulls) } //XXX need to handle overflow (see sam) - //XXX nulls... for primitives we just do the compare but we need - // to or the nulls together kind := vector.KindOf(lhs) if kind != vector.KindOf(rhs) { panic("vector kind mismatch after coerce") @@ -47,7 +53,32 @@ func (c *Compare) eval(vecs ...vector.Any) vector.Any { } f, ok := compareFuncs[vector.FuncCode(c.opCode, kind, lform, rform)] if !ok { - return vector.NewStringError(c.zctx, coerce.ErrIncompatibleTypes.Error(), lhs.Len()) + return vector.NewConst(super.False, lhs.Len(), nulls) + } + out := f(lhs, rhs) + vector.SetNulls(out, nulls) + return out +} + +type isNull struct { + expr Evaluator +} + +func NewIsNull(e Evaluator) Evaluator { + return &isNull{e} +} + +func (i *isNull) Eval(this vector.Any) vector.Any { + return vector.Apply(false, i.eval, i.expr.Eval(this)) +} + +func (i *isNull) eval(vecs ...vector.Any) vector.Any { + vec := vector.Under(vecs[0]) + if _, ok := vec.(*vector.Error); ok { + return vec + } + if c, ok := vec.(*vector.Const); ok && c.Value().IsNull() { + return vector.NewConst(super.True, vec.Len(), nil) } - return f(lhs, rhs) + return vector.NullsOf(vec) } diff --git a/runtime/ztests/expr/compare-incompatible.yaml b/runtime/ztests/expr/compare-incompatible.yaml new file mode 100644 index 0000000000..fc7448e819 --- /dev/null +++ b/runtime/ztests/expr/compare-incompatible.yaml @@ -0,0 +1,12 @@ +zed: yield a == b + +vector: true + +input: | + {a:"1",b:1(uint8)} + {a:127.0.0.1,b:} + +output: | + false + false + diff --git a/runtime/sam/expr/ztests/compare-null-int64.yaml b/runtime/ztests/expr/compare-null-int64.yaml similarity index 96% rename from runtime/sam/expr/ztests/compare-null-int64.yaml rename to runtime/ztests/expr/compare-null-int64.yaml index f174981b67..4f349a7d08 100644 --- a/runtime/sam/expr/ztests/compare-null-int64.yaml +++ b/runtime/ztests/expr/compare-null-int64.yaml @@ -1,5 +1,7 @@ zed: put eq := (a == b), ne := (a != b), lt := (a < b), lte := (a <= b), gt := (a > b), gte := (a >= b) +vector: true + input: | {a:1,b:null(int64)} {a:1,b:null} diff --git a/runtime/sam/expr/ztests/compare-null-string.yaml b/runtime/ztests/expr/compare-null-string.yaml similarity index 59% rename from runtime/sam/expr/ztests/compare-null-string.yaml rename to runtime/ztests/expr/compare-null-string.yaml index 2e5f2f9492..c02241832d 100644 --- a/runtime/sam/expr/ztests/compare-null-string.yaml +++ b/runtime/ztests/expr/compare-null-string.yaml @@ -1,9 +1,15 @@ zed: put eq := (a == b), ne := (a != b) +vector: true + input: | {a:"s",b:null(string)} {a:"s",b:null} + {a:"s"} + {b:null} output: | {a:"s",b:null(string),eq:null(bool),ne:null(bool)} {a:"s",b:null,eq:null(bool),ne:null(bool)} + {a:"s",eq:error("missing"),ne:error("missing")} + {b:null,eq:error("missing"),ne:error("missing")} diff --git a/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml b/runtime/ztests/expr/filter-null-with-unset-field.yaml similarity index 88% rename from runtime/sam/expr/ztests/filter-null-with-unset-field.yaml rename to runtime/ztests/expr/filter-null-with-unset-field.yaml index cd290bc72a..153bbdf981 100644 --- a/runtime/sam/expr/ztests/filter-null-with-unset-field.yaml +++ b/runtime/ztests/expr/filter-null-with-unset-field.yaml @@ -1,5 +1,7 @@ zed: s IS NULL +vector: true + input: | {s:"A=B"} {s:"A=*"} diff --git a/runtime/ztests/expr/is-null.yaml b/runtime/ztests/expr/is-null.yaml new file mode 100644 index 0000000000..bcd9e6b54b --- /dev/null +++ b/runtime/ztests/expr/is-null.yaml @@ -0,0 +1,17 @@ +# not for vam needs does not properly handle Const bools and errors. Re-enable +# the IS NOT NULL test once this works. +zed: yield this IS NULL #, this IS NOT NULL + +vector: true + +input: | + "foo" + null(string) + error("missing") + error("foo") + +output: | + false + true + error("missing") + error("foo") diff --git a/vector/bool.go b/vector/bool.go index 4c4440743a..96c6203061 100644 --- a/vector/bool.go +++ b/vector/bool.go @@ -137,6 +137,13 @@ func NullsOf(v Any) *Bool { case *Bytes: return v.Nulls case *Const: + if v.Value().IsNull() { + out := NewBoolEmpty(v.Len(), nil) + for i := range out.Bits { + out.Bits[i] = ^uint64(0) + } + return out + } return v.Nulls case *Dict: return v.Nulls @@ -172,7 +179,7 @@ func NullsOf(v Any) *Bool { panic(v) } -func setNulls(v Any, nulls *Bool) { +func SetNulls(v Any, nulls *Bool) { switch v := v.(type) { case *Array: v.Nulls = nulls @@ -195,7 +202,7 @@ func setNulls(v Any, nulls *Bool) { case *Map: v.Nulls = nulls case *Named: - setNulls(v.Any, nulls) + SetNulls(v.Any, nulls) case *Net: v.Nulls = nulls case *Record: diff --git a/vector/builder.go b/vector/builder.go index a9b7847937..562cabf485 100644 --- a/vector/builder.go +++ b/vector/builder.go @@ -132,7 +132,7 @@ func (n *nullsBuilder) Build() Any { if !n.nulls.IsEmpty() { bits := make([]uint64, (n.n+63)/64) n.nulls.WriteDenseTo(bits) - setNulls(vec, NewBool(bits, n.n, nil)) + SetNulls(vec, NewBool(bits, n.n, nil)) } return vec } From 98f94ff9299489ed4f4cae7cef2be11434f7c362 Mon Sep 17 00:00:00 2001 From: Noah Treuhaft Date: Thu, 21 Nov 2024 12:03:07 -0500 Subject: [PATCH 04/22] Move dag.Assignment to compiler/dag/op.go (#5480) It doesn't implement dag.Expr and grouping it with types that do is misleading. --- compiler/dag/expr.go | 5 ----- compiler/dag/op.go | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/dag/expr.go b/compiler/dag/expr.go index 85cefc4bdf..390bdf9689 100644 --- a/compiler/dag/expr.go +++ b/compiler/dag/expr.go @@ -27,11 +27,6 @@ type ( Kind string `json:"kind" unpack:""` Elems []VectorElem `json:"elems"` } - Assignment struct { - Kind string `json:"kind" unpack:""` - LHS Expr `json:"lhs"` - RHS Expr `json:"rhs"` - } // A BadExpr node is a placeholder for an expression containing semantic // errors. BadExpr struct { diff --git a/compiler/dag/op.go b/compiler/dag/op.go index dee0cb686d..c8149b0e6e 100644 --- a/compiler/dag/op.go +++ b/compiler/dag/op.go @@ -294,6 +294,11 @@ func (*Deleter) OpNode() {} // Various Op fields type ( + Assignment struct { + Kind string `json:"kind" unpack:""` + LHS Expr `json:"lhs"` + RHS Expr `json:"rhs"` + } Case struct { Expr Expr `json:"expr"` Path Seq `json:"seq"` From b74d0b40c04c8711708f27fd653d12cdd8a4f2f6 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Fri, 22 Nov 2024 11:17:30 -0500 Subject: [PATCH 05/22] vam: Add support for conditionals (case expr) (#5494) vam: Add support for conditionals (case exprs) --- compiler/kernel/vexpr.go | 20 ++- runtime/vam/expr/conditional.go | 125 ++++++++++++++++++ runtime/vam/op/filter.go | 15 +-- .../ztests => runtime/ztests/expr}/case.yaml | 2 + 4 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 runtime/vam/expr/conditional.go rename {compiler/parser/ztests => runtime/ztests/expr}/case.yaml (94%) diff --git a/compiler/kernel/vexpr.go b/compiler/kernel/vexpr.go index ea61b44f69..7b39a55681 100644 --- a/compiler/kernel/vexpr.go +++ b/compiler/kernel/vexpr.go @@ -41,8 +41,8 @@ func (b *Builder) compileVamExpr(e dag.Expr) (vamexpr.Evaluator, error) { return b.compileVamUnary(*e) case *dag.BinaryExpr: return b.compileVamBinary(e) - //case *dag.Conditional: - // return b.compileVamConditional(*e) + case *dag.Conditional: + return b.compileVamConditional(*e) case *dag.Call: return b.compileVamCall(e) //case *dag.RegexpMatch: @@ -111,6 +111,22 @@ func (b *Builder) compileVamBinary(e *dag.BinaryExpr) (vamexpr.Evaluator, error) } } +func (b *Builder) compileVamConditional(node dag.Conditional) (vamexpr.Evaluator, error) { + predicate, err := b.compileVamExpr(node.Cond) + if err != nil { + return nil, err + } + thenExpr, err := b.compileVamExpr(node.Then) + if err != nil { + return nil, err + } + elseExpr, err := b.compileVamExpr(node.Else) + if err != nil { + return nil, err + } + return vamexpr.NewConditional(b.zctx(), predicate, thenExpr, elseExpr), nil +} + func (b *Builder) compileVamUnary(unary dag.UnaryExpr) (vamexpr.Evaluator, error) { e, err := b.compileVamExpr(unary.Operand) if err != nil { diff --git a/runtime/vam/expr/conditional.go b/runtime/vam/expr/conditional.go new file mode 100644 index 0000000000..346614dd95 --- /dev/null +++ b/runtime/vam/expr/conditional.go @@ -0,0 +1,125 @@ +package expr + +import ( + "github.com/RoaringBitmap/roaring" + "github.com/brimdata/super" + "github.com/brimdata/super/vector" +) + +type conditional struct { + zctx *super.Context + predicate Evaluator + thenExpr Evaluator + elseExpr Evaluator +} + +func NewConditional(zctx *super.Context, predicate, thenExpr, elseExpr Evaluator) Evaluator { + return &conditional{ + zctx: zctx, + predicate: predicate, + thenExpr: thenExpr, + elseExpr: elseExpr, + } +} + +func (c *conditional) Eval(this vector.Any) vector.Any { + predVec := c.predicate.Eval(this) + boolsMap, errsMap := BoolMask(predVec) + if errsMap.GetCardinality() == uint64(this.Len()) { + return c.predicateError(predVec) + } + if boolsMap.GetCardinality() == uint64(this.Len()) { + return c.thenExpr.Eval(this) + } + if boolsMap.IsEmpty() && errsMap.IsEmpty() { + return c.elseExpr.Eval(this) + } + thenVec := c.thenExpr.Eval(vector.NewView(this, boolsMap.ToArray())) + // elseMap is the difference between boolsMap or errsMap + elseMap := roaring.Or(boolsMap, errsMap) + elseMap.Flip(0, uint64(this.Len())) + elseIndex := elseMap.ToArray() + elseVec := c.elseExpr.Eval(vector.NewView(this, elseIndex)) + tags := make([]uint32, this.Len()) + for _, idx := range elseIndex { + tags[idx] = 1 + } + vecs := []vector.Any{thenVec, elseVec} + if !errsMap.IsEmpty() { + errsIndex := errsMap.ToArray() + for _, idx := range errsIndex { + tags[idx] = 2 + } + vecs = append(vecs, c.predicateError(vector.NewView(predVec, errsIndex))) + } + return vector.NewDynamic(tags, vecs) +} + +func (c *conditional) predicateError(vec vector.Any) vector.Any { + return vector.Apply(false, func(vecs ...vector.Any) vector.Any { + return vector.NewWrappedError(c.zctx, "?-operator: bool predicate required", vecs[0]) + }, vec) +} + +func BoolMask(mask vector.Any) (*roaring.Bitmap, *roaring.Bitmap) { + bools := roaring.New() + errs := roaring.New() + if dynamic, ok := mask.(*vector.Dynamic); ok { + for i, val := range dynamic.Values { + boolMaskRidx(dynamic.TagMap.Reverse[i], bools, errs, val) + } + } else { + boolMaskRidx(nil, bools, errs, mask) + } + return bools, errs +} + +func boolMaskRidx(ridx []uint32, bools, errs *roaring.Bitmap, vec vector.Any) { + switch vec := vec.(type) { + case *vector.Const: + if !vec.Value().Ptr().AsBool() { + return + } + if vec.Nulls != nil { + if ridx != nil { + for i, idx := range ridx { + if !vec.Nulls.Value(uint32(i)) { + bools.Add(idx) + } + } + } else { + for i := range vec.Len() { + if !vec.Nulls.Value(i) { + bools.Add(i) + } + } + } + } else { + if ridx != nil { + bools.AddMany(ridx) + } else { + bools.AddRange(0, uint64(vec.Len())) + } + } + case *vector.Bool: + if ridx != nil { + for i, idx := range ridx { + if vec.Value(uint32(i)) { + bools.Add(idx) + } + } + } else { + for i := range vec.Len() { + if vec.Value(i) { + bools.Add(i) + } + } + } + case *vector.Error: + if ridx != nil { + errs.AddMany(ridx) + } else { + errs.AddRange(0, uint64(vec.Len())) + } + } +} diff --git a/runtime/vam/op/filter.go b/runtime/vam/op/filter.go index bc9a8a3d30..c4b23460e7 100644 --- a/runtime/vam/op/filter.go +++ b/runtime/vam/op/filter.go @@ -31,18 +31,13 @@ func (f *Filter) Pull(done bool) (vector.Any, error) { // applyMask applies the mask vector mask to vec. Elements of mask that are not // Boolean are considered false. func applyMask(vec, mask vector.Any) (vector.Any, bool) { - n := mask.Len() - var index []uint32 - for k := uint32(0); k < n; k++ { - if vector.BoolValue(mask, k) { - index = append(index, k) - } - } - if len(index) == 0 { + // errors are ignored for filters + b, _ := expr.BoolMask(mask) + if b.IsEmpty() { return nil, false } - if len(index) == int(n) { + if b.GetCardinality() == uint64(mask.Len()) { return vec, true } - return vector.NewView(vec, index), true + return vector.NewView(vec, b.ToArray()), true } diff --git a/compiler/parser/ztests/case.yaml b/runtime/ztests/expr/case.yaml similarity index 94% rename from compiler/parser/ztests/case.yaml rename to runtime/ztests/expr/case.yaml index 9b9e1068bb..7f57084d6b 100644 --- a/compiler/parser/ztests/case.yaml +++ b/runtime/ztests/expr/case.yaml @@ -1,5 +1,7 @@ zed: 'yield case when x==1 then "foo" when x==2 then "bar" else {y:12} end' +vector: true + input: | {x:1} {x:2,y:3} From a6e7be7a2d23e4ae9569b5a742c5c6fff585d1ea Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Fri, 22 Nov 2024 11:49:43 -0500 Subject: [PATCH 06/22] vam: type value comparisons (#5495) --- runtime/vam/expr/compare.go | 24 +++++++++++++++++++++++ runtime/ztests/expr/compare-typevals.yaml | 16 +++++++++++++++ vector/kind.go | 4 ++++ 3 files changed, 44 insertions(+) create mode 100644 runtime/ztests/expr/compare-typevals.yaml diff --git a/runtime/vam/expr/compare.go b/runtime/vam/expr/compare.go index da692793f2..47d78fae04 100644 --- a/runtime/vam/expr/compare.go +++ b/runtime/vam/expr/compare.go @@ -3,6 +3,8 @@ package expr //go:generate go run gencomparefuncs.go import ( + "bytes" + "github.com/brimdata/super" "github.com/brimdata/super/runtime/sam/expr/coerce" "github.com/brimdata/super/vector" @@ -43,6 +45,9 @@ func (c *Compare) eval(vecs ...vector.Any) vector.Any { if kind != vector.KindOf(rhs) { panic("vector kind mismatch after coerce") } + if kind == vector.KindType { + return c.compareTypeVals(lhs, rhs) + } lform, ok := vector.FormOf(lhs) if !ok { return vector.NewStringError(c.zctx, coerce.ErrIncompatibleTypes.Error(), lhs.Len()) @@ -60,6 +65,25 @@ func (c *Compare) eval(vecs ...vector.Any) vector.Any { return out } +func (c *Compare) compareTypeVals(lhs, rhs vector.Any) vector.Any { + if c.opCode == vector.CompLT || c.opCode == vector.CompGT { + return vector.NewConst(super.False, lhs.Len(), nil) + } + out := vector.NewBoolEmpty(lhs.Len(), nil) + for i := range lhs.Len() { + l, _ := vector.TypeValueValue(lhs, i) + r, _ := vector.TypeValueValue(rhs, i) + v := bytes.Equal(l, r) + if c.opCode == vector.CompNE { + v = !v + } + if v { + out.Set(i) + } + } + return out +} + type isNull struct { expr Evaluator } diff --git a/runtime/ztests/expr/compare-typevals.yaml b/runtime/ztests/expr/compare-typevals.yaml new file mode 100644 index 0000000000..dff80b0d20 --- /dev/null +++ b/runtime/ztests/expr/compare-typevals.yaml @@ -0,0 +1,16 @@ +zed: yield a == b, a != b + +vector: true + +input: | + {a:,b:} + {a:<{x:ip}>,b:<{x:ip}>} + {a:<{x:net}>,b:<{y:net}>} + +output: | + true + false + true + false + false + true diff --git a/vector/kind.go b/vector/kind.go index d906e98d9a..03bcf53884 100644 --- a/vector/kind.go +++ b/vector/kind.go @@ -40,6 +40,8 @@ func KindOf(v Any) Kind { return KindBytes case *String: return KindString + case *TypeValue: + return KindType case *Dict: return KindOf(v.Any) case *View: @@ -63,6 +65,8 @@ func KindFromString(v string) Kind { return KindBytes case "String": return KindString + case "TypeValue": + return KindType default: return KindInvalid } From c6e0c735ccdbaf5824e303c87bd45315a6446558 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Fri, 22 Nov 2024 12:31:17 -0500 Subject: [PATCH 07/22] Rename: NullsView to BoolView (#5496) Rename NullsView to BoolView since this can be used for creating views of Bool vectors as well. In addition have all an false value views of a boolean vector return a non-nil vector. When dealing with boolean values there's a difference between a false values and a nil vector. Also have NewView of a boolean vector create a new boolean vector. --- runtime/vam/expr/arith.go | 4 +- runtime/vam/expr/arithfuncs.go | 720 ++++++++++-------------------- runtime/vam/expr/cast/bool.go | 2 +- runtime/vam/expr/cast/bytes.go | 2 +- runtime/vam/expr/cast/number.go | 6 +- runtime/vam/expr/cast/string.go | 2 +- runtime/vam/expr/genarithfuncs.go | 7 +- vector/bool.go | 2 +- vector/view.go | 22 +- 9 files changed, 265 insertions(+), 502 deletions(-) diff --git a/runtime/vam/expr/arith.go b/runtime/vam/expr/arith.go index 59c65db48d..71437894a3 100644 --- a/runtime/vam/expr/arith.go +++ b/runtime/vam/expr/arith.go @@ -63,7 +63,9 @@ func (a *Arith) eval(vecs ...vector.Any) (out vector.Any) { } }() } - return f(lhs, rhs) + out = f(lhs, rhs) + vector.SetNulls(out, vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs))) + return out } func (a *Arith) evalDivideByZero(kind vector.Kind, lhs, rhs vector.Any) vector.Any { diff --git a/runtime/vam/expr/arithfuncs.go b/runtime/vam/expr/arithfuncs.go index c3fef5965c..0ef8a2ba4c 100644 --- a/runtime/vam/expr/arithfuncs.go +++ b/runtime/vam/expr/arithfuncs.go @@ -10,9 +10,8 @@ import ( func arithAddIntFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(k)) } @@ -24,9 +23,8 @@ func arithAddIntFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -38,9 +36,8 @@ func arithAddIntFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -51,9 +48,8 @@ func arithAddIntFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + rconst) } @@ -65,9 +61,8 @@ func arithAddIntDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -81,9 +76,8 @@ func arithAddIntDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -97,9 +91,8 @@ func arithAddIntDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -112,9 +105,8 @@ func arithAddIntDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -126,9 +118,8 @@ func arithAddIntViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -142,9 +133,8 @@ func arithAddIntViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -158,9 +148,8 @@ func arithAddIntViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -173,9 +162,8 @@ func arithAddIntViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -186,9 +174,8 @@ func arithAddIntConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsInt() r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(k)) } @@ -201,9 +188,8 @@ func arithAddIntConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -216,9 +202,8 @@ func arithAddIntConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -230,17 +215,15 @@ func arithAddIntConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsInt() r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewInt64(lconst + rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithAddUintFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(k)) } @@ -252,9 +235,8 @@ func arithAddUintFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -266,9 +248,8 @@ func arithAddUintFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -279,9 +260,8 @@ func arithAddUintFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + rconst) } @@ -293,9 +273,8 @@ func arithAddUintDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -309,9 +288,8 @@ func arithAddUintDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -325,9 +303,8 @@ func arithAddUintDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -340,9 +317,8 @@ func arithAddUintDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -354,9 +330,8 @@ func arithAddUintViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -370,9 +345,8 @@ func arithAddUintViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -386,9 +360,8 @@ func arithAddUintViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -401,9 +374,8 @@ func arithAddUintViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -414,9 +386,8 @@ func arithAddUintConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsUint() r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(k)) } @@ -429,9 +400,8 @@ func arithAddUintConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -444,9 +414,8 @@ func arithAddUintConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -458,17 +427,15 @@ func arithAddUintConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsUint() r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewUint64(lconst + rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithAddFloatFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(k)) } @@ -480,9 +447,8 @@ func arithAddFloatFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -494,9 +460,8 @@ func arithAddFloatFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -507,9 +472,8 @@ func arithAddFloatFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + rconst) } @@ -521,9 +485,8 @@ func arithAddFloatDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -537,9 +500,8 @@ func arithAddFloatDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -553,9 +515,8 @@ func arithAddFloatDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -568,9 +529,8 @@ func arithAddFloatDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -582,9 +542,8 @@ func arithAddFloatViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -598,9 +557,8 @@ func arithAddFloatViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -614,9 +572,8 @@ func arithAddFloatViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -629,9 +586,8 @@ func arithAddFloatViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -642,9 +598,8 @@ func arithAddFloatConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsFloat() r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(k)) } @@ -657,9 +612,8 @@ func arithAddFloatConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -672,9 +626,8 @@ func arithAddFloatConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -686,17 +639,15 @@ func arithAddFloatConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsFloat() r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewFloat64(lconst + rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithAddStringFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.String) r := rhs.(*vector.String) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(k)) } @@ -708,9 +659,8 @@ func arithAddStringFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -722,9 +672,8 @@ func arithAddStringFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + r.Value(uint32(rx[k]))) } @@ -735,9 +684,8 @@ func arithAddStringFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.String) r := rhs.(*vector.Const) rconst, _ := r.AsString() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) + rconst) } @@ -749,9 +697,8 @@ func arithAddStringDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.String) lx := ld.Index r := rhs.(*vector.String) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -765,9 +712,8 @@ func arithAddStringDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -781,9 +727,8 @@ func arithAddStringDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -796,9 +741,8 @@ func arithAddStringDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsString() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -810,9 +754,8 @@ func arithAddStringViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.String) lx := ld.Index r := rhs.(*vector.String) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(k)) } @@ -826,9 +769,8 @@ func arithAddStringViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -842,9 +784,8 @@ func arithAddStringViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + r.Value(uint32(rx[k]))) } @@ -857,9 +798,8 @@ func arithAddStringViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsString() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) + rconst) } @@ -870,9 +810,8 @@ func arithAddStringConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsString() r := rhs.(*vector.String) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(k)) } @@ -885,9 +824,8 @@ func arithAddStringConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -900,9 +838,8 @@ func arithAddStringConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.String) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewStringEmpty(n, nulls) + out := vector.NewStringEmpty(n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst + r.Value(uint32(rx[k]))) } @@ -914,17 +851,15 @@ func arithAddStringConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsString() r := rhs.(*vector.Const) rconst, _ := r.AsString() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewString(lconst + rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithSubIntFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(k)) } @@ -936,9 +871,8 @@ func arithSubIntFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -950,9 +884,8 @@ func arithSubIntFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -963,9 +896,8 @@ func arithSubIntFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - rconst) } @@ -977,9 +909,8 @@ func arithSubIntDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -993,9 +924,8 @@ func arithSubIntDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1009,9 +939,8 @@ func arithSubIntDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1024,9 +953,8 @@ func arithSubIntDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1038,9 +966,8 @@ func arithSubIntViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -1054,9 +981,8 @@ func arithSubIntViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1070,9 +996,8 @@ func arithSubIntViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1085,9 +1010,8 @@ func arithSubIntViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1098,9 +1022,8 @@ func arithSubIntConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsInt() r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(k)) } @@ -1113,9 +1036,8 @@ func arithSubIntConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1128,9 +1050,8 @@ func arithSubIntConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1142,17 +1063,15 @@ func arithSubIntConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsInt() r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewInt64(lconst - rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithSubUintFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(k)) } @@ -1164,9 +1083,8 @@ func arithSubUintFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -1178,9 +1096,8 @@ func arithSubUintFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -1191,9 +1108,8 @@ func arithSubUintFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - rconst) } @@ -1205,9 +1121,8 @@ func arithSubUintDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -1221,9 +1136,8 @@ func arithSubUintDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1237,9 +1151,8 @@ func arithSubUintDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1252,9 +1165,8 @@ func arithSubUintDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1266,9 +1178,8 @@ func arithSubUintViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -1282,9 +1193,8 @@ func arithSubUintViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1298,9 +1208,8 @@ func arithSubUintViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1313,9 +1222,8 @@ func arithSubUintViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1326,9 +1234,8 @@ func arithSubUintConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsUint() r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(k)) } @@ -1341,9 +1248,8 @@ func arithSubUintConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1356,9 +1262,8 @@ func arithSubUintConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1370,17 +1275,15 @@ func arithSubUintConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsUint() r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewUint64(lconst - rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithSubFloatFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(k)) } @@ -1392,9 +1295,8 @@ func arithSubFloatFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -1406,9 +1308,8 @@ func arithSubFloatFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - r.Value(uint32(rx[k]))) } @@ -1419,9 +1320,8 @@ func arithSubFloatFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) - rconst) } @@ -1433,9 +1333,8 @@ func arithSubFloatDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -1449,9 +1348,8 @@ func arithSubFloatDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1465,9 +1363,8 @@ func arithSubFloatDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1480,9 +1377,8 @@ func arithSubFloatDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1494,9 +1390,8 @@ func arithSubFloatViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(k)) } @@ -1510,9 +1405,8 @@ func arithSubFloatViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1526,9 +1420,8 @@ func arithSubFloatViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - r.Value(uint32(rx[k]))) } @@ -1541,9 +1434,8 @@ func arithSubFloatViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) - rconst) } @@ -1554,9 +1446,8 @@ func arithSubFloatConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsFloat() r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(k)) } @@ -1569,9 +1460,8 @@ func arithSubFloatConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1584,9 +1474,8 @@ func arithSubFloatConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst - r.Value(uint32(rx[k]))) } @@ -1598,17 +1487,15 @@ func arithSubFloatConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsFloat() r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewFloat64(lconst - rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithMulIntFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(k)) } @@ -1620,9 +1507,8 @@ func arithMulIntFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -1634,9 +1520,8 @@ func arithMulIntFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -1647,9 +1532,8 @@ func arithMulIntFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * rconst) } @@ -1661,9 +1545,8 @@ func arithMulIntDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -1677,9 +1560,8 @@ func arithMulIntDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1693,9 +1575,8 @@ func arithMulIntDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1708,9 +1589,8 @@ func arithMulIntDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -1722,9 +1602,8 @@ func arithMulIntViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -1738,9 +1617,8 @@ func arithMulIntViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1754,9 +1632,8 @@ func arithMulIntViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1769,9 +1646,8 @@ func arithMulIntViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -1782,9 +1658,8 @@ func arithMulIntConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsInt() r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(k)) } @@ -1797,9 +1672,8 @@ func arithMulIntConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -1812,9 +1686,8 @@ func arithMulIntConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -1826,17 +1699,15 @@ func arithMulIntConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsInt() r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewInt64(lconst * rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithMulUintFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(k)) } @@ -1848,9 +1719,8 @@ func arithMulUintFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -1862,9 +1732,8 @@ func arithMulUintFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -1875,9 +1744,8 @@ func arithMulUintFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * rconst) } @@ -1889,9 +1757,8 @@ func arithMulUintDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -1905,9 +1772,8 @@ func arithMulUintDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1921,9 +1787,8 @@ func arithMulUintDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1936,9 +1801,8 @@ func arithMulUintDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -1950,9 +1814,8 @@ func arithMulUintViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -1966,9 +1829,8 @@ func arithMulUintViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1982,9 +1844,8 @@ func arithMulUintViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -1997,9 +1858,8 @@ func arithMulUintViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -2010,9 +1870,8 @@ func arithMulUintConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsUint() r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(k)) } @@ -2025,9 +1884,8 @@ func arithMulUintConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -2040,9 +1898,8 @@ func arithMulUintConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -2054,17 +1911,15 @@ func arithMulUintConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsUint() r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewUint64(lconst * rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithMulFloatFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(k)) } @@ -2076,9 +1931,8 @@ func arithMulFloatFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -2090,9 +1944,8 @@ func arithMulFloatFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * r.Value(uint32(rx[k]))) } @@ -2103,9 +1956,8 @@ func arithMulFloatFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) * rconst) } @@ -2117,9 +1969,8 @@ func arithMulFloatDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -2133,9 +1984,8 @@ func arithMulFloatDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -2149,9 +1999,8 @@ func arithMulFloatDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -2164,9 +2013,8 @@ func arithMulFloatDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -2178,9 +2026,8 @@ func arithMulFloatViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(k)) } @@ -2194,9 +2041,8 @@ func arithMulFloatViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -2210,9 +2056,8 @@ func arithMulFloatViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * r.Value(uint32(rx[k]))) } @@ -2225,9 +2070,8 @@ func arithMulFloatViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) * rconst) } @@ -2238,9 +2082,8 @@ func arithMulFloatConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsFloat() r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(k)) } @@ -2253,9 +2096,8 @@ func arithMulFloatConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -2268,9 +2110,8 @@ func arithMulFloatConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst * r.Value(uint32(rx[k]))) } @@ -2282,17 +2123,15 @@ func arithMulFloatConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsFloat() r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewFloat64(lconst * rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithDivIntFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(k)) } @@ -2304,9 +2143,8 @@ func arithDivIntFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2318,9 +2156,8 @@ func arithDivIntFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2331,9 +2168,8 @@ func arithDivIntFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / rconst) } @@ -2345,9 +2181,8 @@ func arithDivIntDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2361,9 +2196,8 @@ func arithDivIntDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2377,9 +2211,8 @@ func arithDivIntDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2392,9 +2225,8 @@ func arithDivIntDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2406,9 +2238,8 @@ func arithDivIntViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2422,9 +2253,8 @@ func arithDivIntViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2438,9 +2268,8 @@ func arithDivIntViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2453,9 +2282,8 @@ func arithDivIntViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2466,9 +2294,8 @@ func arithDivIntConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsInt() r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(k)) } @@ -2481,9 +2308,8 @@ func arithDivIntConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2496,9 +2322,8 @@ func arithDivIntConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2510,17 +2335,15 @@ func arithDivIntConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsInt() r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewInt64(lconst / rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithDivUintFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(k)) } @@ -2532,9 +2355,8 @@ func arithDivUintFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2546,9 +2368,8 @@ func arithDivUintFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2559,9 +2380,8 @@ func arithDivUintFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / rconst) } @@ -2573,9 +2393,8 @@ func arithDivUintDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2589,9 +2408,8 @@ func arithDivUintDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2605,9 +2423,8 @@ func arithDivUintDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2620,9 +2437,8 @@ func arithDivUintDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2634,9 +2450,8 @@ func arithDivUintViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2650,9 +2465,8 @@ func arithDivUintViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2666,9 +2480,8 @@ func arithDivUintViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2681,9 +2494,8 @@ func arithDivUintViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2694,9 +2506,8 @@ func arithDivUintConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsUint() r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(k)) } @@ -2709,9 +2520,8 @@ func arithDivUintConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2724,9 +2534,8 @@ func arithDivUintConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2738,17 +2547,15 @@ func arithDivUintConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsUint() r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewUint64(lconst / rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithDivFloatFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(k)) } @@ -2760,9 +2567,8 @@ func arithDivFloatFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2774,9 +2580,8 @@ func arithDivFloatFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / r.Value(uint32(rx[k]))) } @@ -2787,9 +2592,8 @@ func arithDivFloatFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Float) r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) / rconst) } @@ -2801,9 +2605,8 @@ func arithDivFloatDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2817,9 +2620,8 @@ func arithDivFloatDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2833,9 +2635,8 @@ func arithDivFloatDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2848,9 +2649,8 @@ func arithDivFloatDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2862,9 +2662,8 @@ func arithDivFloatViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Float) lx := ld.Index r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(k)) } @@ -2878,9 +2677,8 @@ func arithDivFloatViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2894,9 +2692,8 @@ func arithDivFloatViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / r.Value(uint32(rx[k]))) } @@ -2909,9 +2706,8 @@ func arithDivFloatViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) / rconst) } @@ -2922,9 +2718,8 @@ func arithDivFloatConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsFloat() r := rhs.(*vector.Float) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(k)) } @@ -2937,9 +2732,8 @@ func arithDivFloatConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2952,9 +2746,8 @@ func arithDivFloatConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Float) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewFloatEmpty(super.TypeFloat64, n, nulls) + out := vector.NewFloatEmpty(super.TypeFloat64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst / r.Value(uint32(rx[k]))) } @@ -2966,17 +2759,15 @@ func arithDivFloatConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsFloat() r := rhs.(*vector.Const) rconst, _ := r.AsFloat() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewFloat64(lconst / rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithModIntFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(k)) } @@ -2988,9 +2779,8 @@ func arithModIntFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(uint32(rx[k]))) } @@ -3002,9 +2792,8 @@ func arithModIntFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(uint32(rx[k]))) } @@ -3015,9 +2804,8 @@ func arithModIntFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Int) r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % rconst) } @@ -3029,9 +2817,8 @@ func arithModIntDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(k)) } @@ -3045,9 +2832,8 @@ func arithModIntDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3061,9 +2847,8 @@ func arithModIntDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3076,9 +2861,8 @@ func arithModIntDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % rconst) } @@ -3090,9 +2874,8 @@ func arithModIntViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Int) lx := ld.Index r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(k)) } @@ -3106,9 +2889,8 @@ func arithModIntViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3122,9 +2904,8 @@ func arithModIntViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3137,9 +2918,8 @@ func arithModIntViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % rconst) } @@ -3150,9 +2930,8 @@ func arithModIntConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsInt() r := rhs.(*vector.Int) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(k)) } @@ -3165,9 +2944,8 @@ func arithModIntConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(uint32(rx[k]))) } @@ -3180,9 +2958,8 @@ func arithModIntConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Int) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewIntEmpty(super.TypeInt64, n, nulls) + out := vector.NewIntEmpty(super.TypeInt64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(uint32(rx[k]))) } @@ -3194,17 +2971,15 @@ func arithModIntConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsInt() r := rhs.(*vector.Const) rconst, _ := r.AsInt() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewInt64(lconst % rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } func arithModUintFlatFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(k)) } @@ -3216,9 +2991,8 @@ func arithModUintFlatDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(uint32(rx[k]))) } @@ -3230,9 +3004,8 @@ func arithModUintFlatView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % r.Value(uint32(rx[k]))) } @@ -3243,9 +3016,8 @@ func arithModUintFlatConst(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Uint) r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(k) % rconst) } @@ -3257,9 +3029,8 @@ func arithModUintDictFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(k)) } @@ -3273,9 +3044,8 @@ func arithModUintDictDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3289,9 +3059,8 @@ func arithModUintDictView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3304,9 +3073,8 @@ func arithModUintDictConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % rconst) } @@ -3318,9 +3086,8 @@ func arithModUintViewFlat(lhs, rhs vector.Any) vector.Any { l := ld.Any.(*vector.Uint) lx := ld.Index r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(k)) } @@ -3334,9 +3101,8 @@ func arithModUintViewDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3350,9 +3116,8 @@ func arithModUintViewView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % r.Value(uint32(rx[k]))) } @@ -3365,9 +3130,8 @@ func arithModUintViewConst(lhs, rhs vector.Any) vector.Any { lx := ld.Index r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(l.Value(uint32(lx[k])) % rconst) } @@ -3378,9 +3142,8 @@ func arithModUintConstFlat(lhs, rhs vector.Any) vector.Any { l := lhs.(*vector.Const) lconst, _ := l.AsUint() r := rhs.(*vector.Uint) - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(k)) } @@ -3393,9 +3156,8 @@ func arithModUintConstDict(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.Dict) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(uint32(rx[k]))) } @@ -3408,9 +3170,8 @@ func arithModUintConstView(lhs, rhs vector.Any) vector.Any { rd := rhs.(*vector.View) r := rd.Any.(*vector.Uint) rx := rd.Index - nulls := vector.Or(l.Nulls, r.Nulls) n := lhs.Len() - out := vector.NewUintEmpty(super.TypeUint64, n, nulls) + out := vector.NewUintEmpty(super.TypeUint64, n, nil) for k := uint32(0); k < n; k++ { out.Append(lconst % r.Value(uint32(rx[k]))) } @@ -3422,9 +3183,8 @@ func arithModUintConstConst(lhs, rhs vector.Any) vector.Any { lconst, _ := l.AsUint() r := rhs.(*vector.Const) rconst, _ := r.AsUint() - nulls := vector.Or(l.Nulls, r.Nulls) val := super.NewUint64(lconst % rconst) - return vector.NewConst(val, lhs.Len(), nulls) + return vector.NewConst(val, lhs.Len(), nil) } var arithFuncs = map[int]func(vector.Any, vector.Any) vector.Any{ diff --git a/runtime/vam/expr/cast/bool.go b/runtime/vam/expr/cast/bool.go index 34b6efac99..245619c66c 100644 --- a/runtime/vam/expr/cast/bool.go +++ b/runtime/vam/expr/cast/bool.go @@ -22,7 +22,7 @@ func castToBool(vec vector.Any, index []uint32) (vector.Any, []uint32, bool) { } out.Nulls = vector.NullsOf(vec) if index != nil { - out.Nulls = vector.NullsView(out.Nulls, index) + out.Nulls = vector.NewBoolView(out.Nulls, index) } return out, nil, true } diff --git a/runtime/vam/expr/cast/bytes.go b/runtime/vam/expr/cast/bytes.go index 483b4d4018..9c8834d34e 100644 --- a/runtime/vam/expr/cast/bytes.go +++ b/runtime/vam/expr/cast/bytes.go @@ -9,7 +9,7 @@ func castToBytes(vec vector.Any, index []uint32) (vector.Any, []uint32, bool) { n := lengthOf(vec, index) nulls := vector.NullsOf(vec) if index != nil { - nulls = vector.NullsView(nulls, index) + nulls = vector.NewBoolView(nulls, index) } out := vector.NewBytesEmpty(n, nulls) var b zcode.Builder diff --git a/runtime/vam/expr/cast/number.go b/runtime/vam/expr/cast/number.go index 10a6f9a604..ed401b72c6 100644 --- a/runtime/vam/expr/cast/number.go +++ b/runtime/vam/expr/cast/number.go @@ -26,19 +26,19 @@ func castToNumber(vec vector.Any, typ super.Type, index []uint32) (vector.Any, [ case super.IsSigned(id): vals, errs := toNumeric[int64](vec, typ, index) if len(errs) > 0 { - nulls = vector.NullsView(nulls, inverseIndex(errs, nulls)) + nulls = vector.NewBoolView(nulls, inverseIndex(errs, nulls)) } return vector.NewInt(typ, vals, nulls), errs, true case super.IsUnsigned(id): vals, errs := toNumeric[uint64](vec, typ, index) if len(errs) > 0 { - nulls = vector.NullsView(nulls, inverseIndex(errs, nulls)) + nulls = vector.NewBoolView(nulls, inverseIndex(errs, nulls)) } return vector.NewUint(typ, vals, nulls), errs, true case super.IsFloat(id): vals, errs := toNumeric[float64](vec, typ, index) if errs != nil { - nulls = vector.NullsView(nulls, inverseIndex(errs, nulls)) + nulls = vector.NewBoolView(nulls, inverseIndex(errs, nulls)) } return vector.NewFloat(typ, vals, nulls), errs, true default: diff --git a/runtime/vam/expr/cast/string.go b/runtime/vam/expr/cast/string.go index bad969fff4..b516f2c74b 100644 --- a/runtime/vam/expr/cast/string.go +++ b/runtime/vam/expr/cast/string.go @@ -14,7 +14,7 @@ import ( func castToString(vec vector.Any, index []uint32) (vector.Any, []uint32, bool) { nulls := vector.NullsOf(vec) if index != nil { - nulls = vector.NullsView(nulls, index) + nulls = vector.NewBoolView(nulls, index) } n := lengthOf(vec, index) var bytes []byte diff --git a/runtime/vam/expr/genarithfuncs.go b/runtime/vam/expr/genarithfuncs.go index afe6bee2fc..9e430b6d01 100644 --- a/runtime/vam/expr/genarithfuncs.go +++ b/runtime/vam/expr/genarithfuncs.go @@ -71,20 +71,19 @@ func genFunc(name, op, typ string, lhs, rhs vector.Form) string { s := fmt.Sprintf("func %s(lhs, rhs vector.Any) vector.Any {\n", name) s += genVarInit("l", typ, lhs) s += genVarInit("r", typ, rhs) - s += "nulls := vector.Or(l.Nulls, r.Nulls)\n" if lhs == vector.FormConst && rhs == vector.FormConst { if typ == "String" { s += fmt.Sprintf("val := super.NewString(lconst %s rconst)\n", op) } else { s += fmt.Sprintf("val := super.New%s64(lconst %s rconst)\n", typ, op) } - s += "return vector.NewConst(val, lhs.Len(), nulls)\n" + s += "return vector.NewConst(val, lhs.Len(), nil)\n" } else { s += "n := lhs.Len()\n" if typ == "String" { - s += "out := vector.NewStringEmpty(n, nulls)\n" + s += "out := vector.NewStringEmpty(n, nil)\n" } else { - s += fmt.Sprintf("out := vector.New%sEmpty(super.Type%s64, n, nulls)\n", typ, typ) + s += fmt.Sprintf("out := vector.New%sEmpty(super.Type%s64, n, nil)\n", typ, typ) } s += genLoop(op, typ, lhs, rhs) s += "return out\n" diff --git a/vector/bool.go b/vector/bool.go index 96c6203061..038d76d570 100644 --- a/vector/bool.go +++ b/vector/bool.go @@ -174,7 +174,7 @@ func NullsOf(v Any) *Bool { case *Union: return v.Nulls case *View: - return NullsView(NullsOf(v.Any), v.Index) + return NewBoolView(NullsOf(v.Any), v.Index) } panic(v) } diff --git a/vector/view.go b/vector/view.go index 6b450d3e8a..624a9f072a 100644 --- a/vector/view.go +++ b/vector/view.go @@ -13,8 +13,10 @@ var _ Any = (*View)(nil) func NewView(val Any, index []uint32) Any { switch val := val.(type) { + case *Bool: + return NewBoolView(val, index) case *Const: - return NewConst(val.val, uint32(len(index)), NullsView(val.Nulls, index)) + return NewConst(val.val, uint32(len(index)), NewBoolView(val.Nulls, index)) case *Dict: index2 := make([]byte, len(index)) var nulls *Bool @@ -33,10 +35,10 @@ func NewView(val Any, index []uint32) Any { } return NewDict(val.Any, index2, nil, nulls) case *Error: - return NewError(val.Typ, NewView(val.Vals, index), NullsView(val.Nulls, index)) + return NewError(val.Typ, NewView(val.Vals, index), NewBoolView(val.Nulls, index)) case *Union: tags, values := viewForUnionOrDynamic(index, val.Tags, val.TagMap.Forward, val.Values) - return NewUnion(val.Typ, tags, values, NullsView(val.Nulls, index)) + return NewUnion(val.Typ, tags, values, NewBoolView(val.Nulls, index)) case *Dynamic: return NewDynamic(viewForUnionOrDynamic(index, val.Tags, val.TagMap.Forward, val.Values)) case *View: @@ -52,19 +54,19 @@ func NewView(val Any, index []uint32) Any { return &View{val, index} } -func NullsView(nulls *Bool, index []uint32) *Bool { - if nulls == nil { +func NewBoolView(vec *Bool, index []uint32) *Bool { + if vec == nil { return nil } - var out *Bool + out := NewBoolEmpty(uint32(len(index)), nil) for k, slot := range index { - if nulls.Value(slot) { - if out == nil { - out = NewBoolEmpty(uint32(len(index)), nil) - } + if vec.Value(slot) { out.Set(uint32(k)) } } + if vec.Nulls != nil { + out.Nulls = NewBoolView(vec.Nulls, index) + } return out } From cbb40f53676764ab402ab737b334580834fab450 Mon Sep 17 00:00:00 2001 From: Steve McCanne Date: Fri, 22 Nov 2024 12:47:15 -0800 Subject: [PATCH 08/22] removed children from semantic.Scope as not used (#5497) --- compiler/semantic/scope.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/compiler/semantic/scope.go b/compiler/semantic/scope.go index 1f6e873d94..4646429e69 100644 --- a/compiler/semantic/scope.go +++ b/compiler/semantic/scope.go @@ -11,18 +11,13 @@ import ( ) type Scope struct { - parent *Scope - children []*Scope - nvar int - symbols map[string]*entry + parent *Scope + nvar int + symbols map[string]*entry } func NewScope(parent *Scope) *Scope { - s := &Scope{parent: parent, symbols: make(map[string]*entry)} - if parent != nil { - parent.children = append(parent.children, s) - } - return s + return &Scope{parent: parent, symbols: make(map[string]*entry)} } type entry struct { From 62d0639bdf0fa915ca7dc1965abbc46a826e1e5b Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Mon, 25 Nov 2024 12:29:15 -0500 Subject: [PATCH 09/22] Fix strftime on views (#5498) Closes #5473, #5469 --- runtime/vam/expr/function/time.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/runtime/vam/expr/function/time.go b/runtime/vam/expr/function/time.go index 9fa969daed..3ef5ff6b32 100644 --- a/runtime/vam/expr/function/time.go +++ b/runtime/vam/expr/function/time.go @@ -136,13 +136,17 @@ func (s *Strftime) fastPath(fvec *vector.Const, tvec vector.Any) vector.Any { } func (s *Strftime) fastPathLoop(f *strftime.Strftime, vec *vector.Int, index []uint32) *vector.String { + if index != nil { + out := vector.NewStringEmpty(uint32(len(index)), vector.NewBoolView(vec.Nulls, index)) + for _, i := range index { + s := f.FormatString(nano.Ts(vec.Values[i]).Time()) + out.Append(s) + } + return out + } out := vector.NewStringEmpty(vec.Len(), vec.Nulls) for i := range vec.Len() { - idx := i - if index != nil { - idx = index[i] - } - s := f.FormatString(nano.Ts(vec.Values[idx]).Time()) + s := f.FormatString(nano.Ts(vec.Values[i]).Time()) out.Append(s) } return out From 7c930f2aa454bcf58d7d7044d439b330990a59f0 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Mon, 25 Nov 2024 12:29:27 -0500 Subject: [PATCH 10/22] Fix dynamic builder bug for float values (#5499) Closes #5475 --- vector/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/builder.go b/vector/builder.go index 562cabf485..439e934a2b 100644 --- a/vector/builder.go +++ b/vector/builder.go @@ -75,7 +75,7 @@ func NewBuilder(typ super.Type) Builder { case super.IsSigned(id): b = &intBuilder{typ: typ} case super.IsFloat(id): - b = &intBuilder{typ: typ} + b = &floatBuilder{typ: typ} } } else { switch id { From e7d03764040f05fa189c9a8609781bc8a6bd9a9d Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Mon, 25 Nov 2024 13:24:14 -0500 Subject: [PATCH 11/22] vam: Fix avg ConsumePartial (#5501) Closes #5500 --- runtime/vam/expr/agg/avg.go | 14 +++++++++++--- runtime/vam/op/summarize/summarize.go | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/runtime/vam/expr/agg/avg.go b/runtime/vam/expr/agg/avg.go index 7c17bd589f..173c53d293 100644 --- a/runtime/vam/expr/agg/avg.go +++ b/runtime/vam/expr/agg/avg.go @@ -34,8 +34,16 @@ const ( ) func (a *avg) ConsumeAsPartial(partial vector.Any) { + if partial.Len() != 1 { + panic("avg: invalid partial") + } + idx := uint32(0) + if view, ok := partial.(*vector.View); ok { + idx = view.Index[0] + partial = view.Any + } rec, ok := partial.(*vector.Record) - if !ok || rec.Len() != 1 { + if !ok { panic("avg: invalid partial") } si, ok1 := rec.Typ.IndexOfField(sumName) @@ -48,8 +56,8 @@ func (a *avg) ConsumeAsPartial(partial vector.Any) { if sumVal.Type() != super.TypeFloat64 || countVal.Type() != super.TypeUint64 { panic("avg: invalid partial") } - sum, _ := vector.FloatValue(sumVal, 0) - count, _ := vector.UintValue(countVal, 0) + sum, _ := vector.FloatValue(sumVal, idx) + count, _ := vector.UintValue(countVal, idx) a.sum += sum a.count += count } diff --git a/runtime/vam/op/summarize/summarize.go b/runtime/vam/op/summarize/summarize.go index 0f85009da9..2bb2b9d28b 100644 --- a/runtime/vam/op/summarize/summarize.go +++ b/runtime/vam/op/summarize/summarize.go @@ -32,6 +32,7 @@ func New(parent vector.Puller, zctx *super.Context, aggNames []field.Path, aggEx } return &Summarize{ parent: parent, + zctx: zctx, aggs: aggs, aggExprs: aggExprs, keyExprs: keyExprs, From f0309369685481cbb58c3a2191d25585d0d16681 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 26 Nov 2024 11:49:23 -0500 Subject: [PATCH 12/22] vam: Fix summarize where (#5503) Fix issue with incorrect counts when using where clauses on a aggregation function in vector runtime. If a value fails the where clause make the value as null so it is skipped by the aggregation function. Closes #5468 --- runtime/vam/expr/agg/count.go | 21 ++-- runtime/vam/expr/aggregator.go | 22 ++-- runtime/vam/expr/arith.go | 3 +- runtime/vam/expr/compare.go | 3 +- runtime/ztests/op/summarize/count-where.yaml | 17 +++ vector/bool.go | 113 +++++++++++++++---- vector/builder.go | 2 +- 7 files changed, 135 insertions(+), 46 deletions(-) create mode 100644 runtime/ztests/op/summarize/count-where.yaml diff --git a/runtime/vam/expr/agg/count.go b/runtime/vam/expr/agg/count.go index d25f9d4fbb..8652fc9cd9 100644 --- a/runtime/vam/expr/agg/count.go +++ b/runtime/vam/expr/agg/count.go @@ -10,25 +10,20 @@ type count struct { } func (a *count) Consume(vec vector.Any) { - if c, ok := vec.(*vector.Const); ok { - val := c.Value() - if !val.IsNull() && !val.IsError() { - a.count += uint64(vec.Len()) - } + if c, ok := vec.(*vector.Const); ok && c.Value().IsNull() { return } if _, ok := vector.Under(vec).Type().(*super.TypeError); ok { return } - nulls := vector.NullsOf(vec) - if nulls == nil { - a.count += uint64(vec.Len()) - return - } - for i := range vec.Len() { - if !nulls.Value(i) { - a.count++ + if nulls := vector.NullsOf(vec); nulls != nil { + for i := range vec.Len() { + if !nulls.Value(i) { + a.count++ + } } + } else { + a.count += uint64(vec.Len()) } } diff --git a/runtime/vam/expr/aggregator.go b/runtime/vam/expr/aggregator.go index 4392c3fce4..40f1d46eb9 100644 --- a/runtime/vam/expr/aggregator.go +++ b/runtime/vam/expr/aggregator.go @@ -41,15 +41,19 @@ func (a *Aggregator) Eval(this vector.Any) vector.Any { func (a *Aggregator) apply(args ...vector.Any) vector.Any { vec, where := args[0], args[1] - var tags []uint32 - // If type is not bool then we want to filter everything. - if where.Type().ID() == super.IDBool { - for slot := uint32(0); slot < where.Len(); slot++ { - // XXX Feels like we should have a optimzed version of this. - if vector.BoolValue(where, slot) { - tags = append(tags, slot) - } + bools, _ := BoolMask(where) + if bools.IsEmpty() { + // everything is filtered. + return vector.NewConst(super.NewValue(vec.Type(), nil), vec.Len(), nil) + } + bools.Flip(0, uint64(vec.Len())) + if !bools.IsEmpty() { + nulls := vector.NewBoolEmpty(vec.Len(), nil) + bools.WriteDenseTo(nulls.Bits) + if origNulls := vector.NullsOf(vec); origNulls != nil { + nulls = vector.Or(nulls, origNulls) } + vec = vector.CopyAndSetNulls(vec, nulls) } - return vector.NewView(vec, tags) + return vec } diff --git a/runtime/vam/expr/arith.go b/runtime/vam/expr/arith.go index 71437894a3..df65859ccd 100644 --- a/runtime/vam/expr/arith.go +++ b/runtime/vam/expr/arith.go @@ -64,8 +64,7 @@ func (a *Arith) eval(vecs ...vector.Any) (out vector.Any) { }() } out = f(lhs, rhs) - vector.SetNulls(out, vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs))) - return out + return vector.CopyAndSetNulls(out, vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs))) } func (a *Arith) evalDivideByZero(kind vector.Kind, lhs, rhs vector.Any) vector.Any { diff --git a/runtime/vam/expr/compare.go b/runtime/vam/expr/compare.go index 47d78fae04..58b50ee24c 100644 --- a/runtime/vam/expr/compare.go +++ b/runtime/vam/expr/compare.go @@ -61,8 +61,7 @@ func (c *Compare) eval(vecs ...vector.Any) vector.Any { return vector.NewConst(super.False, lhs.Len(), nulls) } out := f(lhs, rhs) - vector.SetNulls(out, nulls) - return out + return vector.CopyAndSetNulls(out, nulls) } func (c *Compare) compareTypeVals(lhs, rhs vector.Any) vector.Any { diff --git a/runtime/ztests/op/summarize/count-where.yaml b/runtime/ztests/op/summarize/count-where.yaml new file mode 100644 index 0000000000..41b0246993 --- /dev/null +++ b/runtime/ztests/op/summarize/count-where.yaml @@ -0,0 +1,17 @@ +zed: | + summarize + num_requests := count() + where log_time >= 2012-10-01T00:00:00Z + by client_ip + | sort client_ip + +vector: true + +input: | + {log_time:2012-01-01T00:00:44Z,client_ip:249.92.17.134} + {log_time:2012-10-01T00:24:30Z,client_ip:249.92.17.134} + {log_time:2012-05-12T10:23:22Z,client_ip:251.58.48.137} + +output: | + {client_ip:249.92.17.134,num_requests:1(uint64)} + {client_ip:251.58.48.137,num_requests:0(uint64)} diff --git a/vector/bool.go b/vector/bool.go index 038d76d570..1a6d4f4a0b 100644 --- a/vector/bool.go +++ b/vector/bool.go @@ -179,44 +179,119 @@ func NullsOf(v Any) *Bool { panic(v) } -func SetNulls(v Any, nulls *Bool) { +func CopyAndSetNulls(v Any, nulls *Bool) Any { switch v := v.(type) { case *Array: - v.Nulls = nulls + return &Array{ + Typ: v.Typ, + Offsets: v.Offsets, + Values: v.Values, + Nulls: nulls, + } case *Bytes: - v.Nulls = nulls + return &Bytes{ + Offs: v.Offs, + Bytes: v.Bytes, + Nulls: nulls, + } case *Bool: - v.Nulls = nulls + return &Bool{ + len: v.len, + Bits: v.Bits, + Nulls: nulls, + } case *Const: - v.Nulls = nulls + return &Const{ + val: v.val, + len: v.len, + Nulls: nulls, + } case *Dict: - v.Nulls = nulls + return &Dict{ + Any: v.Any, + Index: v.Index, + Counts: v.Counts, + Nulls: nulls, + } case *Error: - v.Nulls = nulls + return &Error{ + Typ: v.Typ, + Vals: v.Vals, + Nulls: nulls, + } case *Float: - v.Nulls = nulls + return &Float{ + Typ: v.Typ, + Values: v.Values, + Nulls: nulls, + } case *Int: - v.Nulls = nulls + return &Int{ + Typ: v.Typ, + Values: v.Values, + Nulls: nulls, + } case *IP: - v.Nulls = nulls + return &IP{ + Values: v.Values, + Nulls: nulls, + } case *Map: - v.Nulls = nulls + return &Map{ + Typ: v.Typ, + Offsets: v.Offsets, + Keys: v.Keys, + Values: v.Values, + Nulls: nulls, + } case *Named: - SetNulls(v.Any, nulls) + return &Named{ + Typ: v.Typ, + Any: CopyAndSetNulls(v.Any, nulls), + } case *Net: - v.Nulls = nulls + return &Net{ + Values: v.Values, + Nulls: nulls, + } case *Record: - v.Nulls = nulls + return &Record{ + Typ: v.Typ, + Fields: v.Fields, + len: v.len, + Nulls: nulls, + } case *Set: - v.Nulls = nulls + return &Set{ + Typ: v.Typ, + Offsets: v.Offsets, + Values: v.Values, + Nulls: nulls, + } case *String: - v.Nulls = nulls + return &String{ + Offsets: v.Offsets, + Bytes: v.Bytes, + Nulls: nulls, + } case *TypeValue: - v.Nulls = nulls + return &TypeValue{ + Offsets: v.Offsets, + Bytes: v.Bytes, + Nulls: nulls, + } case *Uint: - v.Nulls = nulls + return &Uint{ + Typ: v.Typ, + Values: v.Values, + Nulls: nulls, + } case *Union: - v.Nulls = nulls + return &Union{ + Dynamic: v.Dynamic, + Typ: v.Typ, + Nulls: nulls, + } default: panic(v) } diff --git a/vector/builder.go b/vector/builder.go index 439e934a2b..7aecc9c4e5 100644 --- a/vector/builder.go +++ b/vector/builder.go @@ -132,7 +132,7 @@ func (n *nullsBuilder) Build() Any { if !n.nulls.IsEmpty() { bits := make([]uint64, (n.n+63)/64) n.nulls.WriteDenseTo(bits) - SetNulls(vec, NewBool(bits, n.n, nil)) + vec = CopyAndSetNulls(vec, NewBool(bits, n.n, nil)) } return vec } From f166ba93a1bab5699415dfe2b542283b539c9c84 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 26 Nov 2024 14:05:40 -0500 Subject: [PATCH 13/22] SQL null semantics for and, or, not (#5502) Closes #5465 --- compiler/kernel/filter.go | 14 +- lake/pool.go | 3 +- runtime/sam/expr/agg.go | 2 +- runtime/sam/expr/eval.go | 75 ++++++----- runtime/sam/expr/filter.go | 4 +- runtime/sam/expr/ztests/logical.yaml | 102 -------------- runtime/vam/expr/logic.go | 194 ++++++++++++++++++--------- runtime/ztests/expr/logical-and.yaml | 71 ++++++++++ runtime/ztests/expr/logical-not.yaml | 17 +++ runtime/ztests/expr/logical-or.yaml | 71 ++++++++++ vector/bool.go | 36 ++++- vector/kind.go | 3 + vector/view.go | 12 ++ 13 files changed, 393 insertions(+), 211 deletions(-) delete mode 100644 runtime/sam/expr/ztests/logical.yaml create mode 100644 runtime/ztests/expr/logical-and.yaml create mode 100644 runtime/ztests/expr/logical-not.yaml create mode 100644 runtime/ztests/expr/logical-or.yaml diff --git a/compiler/kernel/filter.go b/compiler/kernel/filter.go index 211b65fb4a..eb22e521fa 100644 --- a/compiler/kernel/filter.go +++ b/compiler/kernel/filter.go @@ -36,9 +36,8 @@ func (f *DeleteFilter) AsEvaluator() (expr.Evaluator, error) { return nil, nil } // For a DeleteFilter Evaluator the pushdown gets wrapped in a unary ! - // expression so we get all values that don't match. We also add a missing - // call so if the expression results in an error("missing") the value is - // kept. + // expression so we get all values that don't match. We also add an error + // and null check because we want to keep these values around. return f.builder.compileExpr(&dag.BinaryExpr{ Kind: "BinaryExpr", Op: "or", @@ -47,10 +46,11 @@ func (f *DeleteFilter) AsEvaluator() (expr.Evaluator, error) { Op: "!", Operand: f.pushdown, }, - RHS: &dag.Call{ - Kind: "Call", - Name: "missing", - Args: []dag.Expr{f.pushdown}, + RHS: &dag.BinaryExpr{ + Kind: "BinaryExpr", + Op: "or", + LHS: &dag.IsNullExpr{Kind: "IsNullExpr", Expr: f.pushdown}, + RHS: &dag.Call{Kind: "Call", Name: "is_error", Args: []dag.Expr{f.pushdown}}, }, }) } diff --git a/lake/pool.go b/lake/pool.go index 70aa31de08..0d707db851 100644 --- a/lake/pool.go +++ b/lake/pool.go @@ -179,8 +179,7 @@ func filter(zctx *super.Context, ectx expr.Context, this super.Value, e expr.Eva if e == nil { return true } - val, ok := expr.EvalBool(zctx, ectx, this, e) - return ok && val.Bool() + return expr.EvalBool(zctx, ectx, this, e).Ptr().AsBool() } type BranchTip struct { diff --git a/runtime/sam/expr/agg.go b/runtime/sam/expr/agg.go index 29bedb3e7c..30b943c7ff 100644 --- a/runtime/sam/expr/agg.go +++ b/runtime/sam/expr/agg.go @@ -34,7 +34,7 @@ func (a *Aggregator) NewFunction() agg.Function { func (a *Aggregator) Apply(zctx *super.Context, ectx Context, f agg.Function, this super.Value) { if a.where != nil { - if val, ok := EvalBool(zctx, ectx, this, a.where); !ok || !val.Bool() { + if val := EvalBool(zctx, ectx, this, a.where); !val.AsBool() { // XXX Issue #3401: do something with "where" errors. return } diff --git a/runtime/sam/expr/eval.go b/runtime/sam/expr/eval.go index b5077347f0..71e3f27559 100644 --- a/runtime/sam/expr/eval.go +++ b/runtime/sam/expr/eval.go @@ -34,14 +34,11 @@ func NewLogicalNot(zctx *super.Context, e Evaluator) *Not { } func (n *Not) Eval(ectx Context, this super.Value) super.Value { - val, ok := EvalBool(n.zctx, ectx, this, n.expr) - if !ok { + val := EvalBool(n.zctx, ectx, this, n.expr) + if val.IsError() || val.IsNull() { return val } - if val.Bool() { - return super.False - } - return super.True + return super.NewBool(!val.Bool()) } type And struct { @@ -64,54 +61,62 @@ func NewLogicalOr(zctx *super.Context, lhs, rhs Evaluator) *Or { return &Or{zctx, lhs, rhs} } -// EvalBool evaluates e with this and if the result is a Zed bool, returns the -// result and true. Otherwise, a Zed error (inclusive of missing) and false -// are returned. -func EvalBool(zctx *super.Context, ectx Context, this super.Value, e Evaluator) (super.Value, bool) { +// EvalBool evaluates e with this and returns the result if it is a bool or error. +// Otherwise, EvalBool returns an error. +func EvalBool(zctx *super.Context, ectx Context, this super.Value, e Evaluator) super.Value { val := e.Eval(ectx, this) - if super.TypeUnder(val.Type()) == super.TypeBool { - return val, true - } - if val.IsError() { - return val, false + if super.TypeUnder(val.Type()) == super.TypeBool || val.IsError() { + return val } - return zctx.WrapError("not type bool", val), false + return zctx.WrapError("not type bool", val) } func (a *And) Eval(ectx Context, this super.Value) super.Value { - lhs, ok := EvalBool(a.zctx, ectx, this, a.lhs) - if !ok { - return lhs - } - if !lhs.Bool() { + lhs := EvalBool(a.zctx, ectx, this, a.lhs) + rhs := EvalBool(a.zctx, ectx, this, a.rhs) + if isfalse(lhs) || isfalse(rhs) { + // anything AND FALSE = FALSE return super.False } - rhs, ok := EvalBool(a.zctx, ectx, this, a.rhs) - if !ok { + // ERROR AND NULL = ERROR + // ERROR AND TRUE = ERROR + if lhs.IsError() { + return lhs + } + if rhs.IsError() { return rhs } - if !rhs.Bool() { - return super.False + if lhs.IsNull() || rhs.IsNull() { + // NULL AND TRUE = NULL + return super.NullBool } return super.True } +func isfalse(val super.Value) bool { + return val.Type().ID() == super.IDBool && !val.IsNull() && !val.Bool() +} + func (o *Or) Eval(ectx Context, this super.Value) super.Value { - lhs, ok := EvalBool(o.zctx, ectx, this, o.lhs) - if ok && lhs.Bool() { + lhs := EvalBool(o.zctx, ectx, this, o.lhs) + rhs := EvalBool(o.zctx, ectx, this, o.rhs) + if lhs.AsBool() || rhs.AsBool() { + // anything OR TRUE = TRUE return super.True } - if lhs.IsError() && !lhs.IsMissing() { + if lhs.IsNull() || rhs.IsNull() { + // NULL OR FALSE = NULL + // NULL OR ERROR = NULL + return super.NullBool + } + // ERROR OR FALSE = ERROR + if lhs.IsError() { return lhs } - rhs, ok := EvalBool(o.zctx, ectx, this, o.rhs) - if ok { - if rhs.Bool() { - return super.True - } - return super.False + if rhs.IsError() { + return rhs } - return rhs + return super.False } type In struct { diff --git a/runtime/sam/expr/filter.go b/runtime/sam/expr/filter.go index 20aeb71d6d..a9a9ede499 100644 --- a/runtime/sam/expr/filter.go +++ b/runtime/sam/expr/filter.go @@ -254,8 +254,8 @@ func NewFilterApplier(zctx *super.Context, e Evaluator) Evaluator { } func (f *filterApplier) Eval(ectx Context, this super.Value) super.Value { - val, ok := EvalBool(f.zctx, ectx, this, f.expr) - if ok { + val := EvalBool(f.zctx, ectx, this, f.expr) + if val.Type().ID() == super.IDBool { if val.Bool() { return this } diff --git a/runtime/sam/expr/ztests/logical.yaml b/runtime/sam/expr/ztests/logical.yaml deleted file mode 100644 index bddc73d6be..0000000000 --- a/runtime/sam/expr/ztests/logical.yaml +++ /dev/null @@ -1,102 +0,0 @@ -script: | - echo === TRUE AND === - super -z -c "yield t AND t" in.jsup - super -z -c "yield t AND f" in.jsup - super -z -c "yield t AND n" in.jsup - super -z -c "yield missing(t AND m)" in.jsup - echo === FALSE AND === - super -z -c "yield f AND t" in.jsup - super -z -c "yield f AND f" in.jsup - super -z -c "yield f AND n" in.jsup - super -z -c "yield f AND m" in.jsup - echo === NULL AND === - super -z -c "yield n AND t" in.jsup - super -z -c "yield n AND f" in.jsup - super -z -c "yield n AND n" in.jsup - super -z -c "yield n AND m" in.jsup - echo === MISSING AND === - super -z -c "yield missing(m AND t)" in.jsup - super -z -c "yield missing(m AND f)" in.jsup - super -z -c "yield missing(m AND n)" in.jsup - super -z -c "yield missing(m AND m)" in.jsup - echo === TRUE OR === - super -z -c "yield t OR t" in.jsup - super -z -c "yield t OR f" in.jsup - super -z -c "yield t OR n" in.jsup - super -z -c "yield t OR m" in.jsup - echo === FALSE OR === - super -z -c "yield f OR t" in.jsup - super -z -c "yield f OR f" in.jsup - super -z -c "yield f OR n" in.jsup - super -z -c "yield missing(f OR m)" in.jsup - echo === NULL OR === - super -z -c "yield n OR t" in.jsup - super -z -c "yield n OR f" in.jsup - super -z -c "yield n OR n" in.jsup - super -z -c "yield missing(n OR m)" in.jsup - echo === MISSING OR === - super -z -c "yield m OR t" in.jsup - super -z -c "yield m OR f" in.jsup - super -z -c "yield m OR n" in.jsup - super -z -c "yield missing(m OR m)" in.jsup - echo === NOT - super -z -c "yield !t" in.jsup - super -z -c "yield !f" in.jsup - super -z -c "yield missing(!m)" in.jsup - super -z -c "yield !n" in.jsup - super -z -c "yield !!f" in.jsup - -inputs: - - name: in.jsup - data: | - {t:true,f:false,m:error("missing"),n:null(bool)} - -outputs: - - name: stdout - data: | - === TRUE AND === - true - false - false - true - === FALSE AND === - false - false - false - false - === NULL AND === - false - false - false - false - === MISSING AND === - true - true - true - true - === TRUE OR === - true - true - true - true - === FALSE OR === - true - false - false - true - === NULL OR === - true - false - false - true - === MISSING OR === - true - false - false - true - === NOT - false - true - true - true - false diff --git a/runtime/vam/expr/logic.go b/runtime/vam/expr/logic.go index ad1d2e6fd5..097002f4c0 100644 --- a/runtime/vam/expr/logic.go +++ b/runtime/vam/expr/logic.go @@ -17,16 +17,24 @@ func NewLogicalNot(zctx *super.Context, e Evaluator) *Not { } func (n *Not) Eval(val vector.Any) vector.Any { - val, ok := EvalBool(n.zctx, val, n.expr) - if !ok { - return val - } - b := val.(*vector.Bool) - bits := make([]uint64, len(b.Bits)) - for k := range bits { - bits[k] = ^b.Bits[k] + return evalBool(n.zctx, n.eval, n.expr.Eval(val)) +} + +func (n *Not) eval(vecs ...vector.Any) vector.Any { + switch vec := vecs[0].(type) { + case *vector.Bool: + bits := make([]uint64, len(vec.Bits)) + for k := range bits { + bits[k] = ^vec.Bits[k] + } + return vec.CopyWithBits(bits) + case *vector.Const: + return vector.NewConst(super.NewBool(!vec.Value().Bool()), vec.Len(), vec.Nulls) + case *vector.Error: + return vec + default: + panic(vec) } - return b.CopyWithBits(bits) } type And struct { @@ -50,72 +58,136 @@ func NewLogicalOr(zctx *super.Context, lhs, rhs Evaluator) *Or { } func (a *And) Eval(val vector.Any) vector.Any { - //XXX change this logic to handle dynamic instead of simple ok decision, - // if there are any valid bools then we need to and them together - lhs, ok := EvalBool(a.zctx, val, a.lhs) - if !ok { - //XXX mix errors - return lhs + return evalBool(a.zctx, a.eval, a.lhs.Eval(val), a.rhs.Eval(val)) +} + +func (a *And) eval(vecs ...vector.Any) vector.Any { + if vecs[0].Len() == 0 { + return vecs[0] + } + lhs, rhs := vector.Under(vecs[0]), vector.Under(vecs[1]) + if _, ok := lhs.(*vector.Error); ok { + return a.andError(lhs, rhs) } - rhs, ok := EvalBool(a.zctx, val, a.rhs) - if !ok { - //XXX mix errors - return rhs + if _, ok := rhs.(*vector.Error); ok { + return a.andError(rhs, lhs) } - blhs := lhs.(*vector.Bool) - brhs := rhs.(*vector.Bool) - if len(blhs.Bits) != len(brhs.Bits) { - panic("length mistmatch") + blhs, brhs := toBool(lhs), toBool(rhs) + out := vector.And(blhs, brhs) + if blhs.Nulls == nil && brhs.Nulls == nil { + return out } - bits := make([]uint64, len(blhs.Bits)) - for k := range bits { - bits[k] = blhs.Bits[k] & brhs.Bits[k] + // any and false = false + // null and true = null + notfalse := vector.And(vector.Or(blhs, blhs.Nulls), vector.Or(brhs, brhs.Nulls)) + out.Nulls = vector.And(notfalse, vector.Or(blhs.Nulls, brhs.Nulls)) + return out +} + +func (a *And) andError(err vector.Any, vec vector.Any) vector.Any { + if _, ok := vec.(*vector.Error); ok { + return err + } + b := toBool(vec) + // anything and FALSE = FALSE + isError := vector.Or(b, b.Nulls) + var index []uint32 + for i := range err.Len() { + if isError.Value(i) { + index = append(index, i) + } } - //XXX intersect nulls - return blhs.CopyWithBits(bits) + if len(index) > 0 { + base := vector.NewInverseView(vec, index) + return vector.Combine(base, index, vector.NewView(err, index)) + } + return vec } func (o *Or) Eval(val vector.Any) vector.Any { - lhs, ok := EvalBool(o.zctx, val, o.lhs) - if !ok { - return lhs + return evalBool(o.zctx, o.eval, o.lhs.Eval(val), o.rhs.Eval(val)) +} + +func (o *Or) eval(vecs ...vector.Any) vector.Any { + if vecs[0].Len() == 0 { + return vecs[0] } - rhs, ok := EvalBool(o.zctx, val, o.rhs) - if !ok { - return rhs + lhs, rhs := vector.Under(vecs[0]), vector.Under(vecs[1]) + if _, ok := lhs.(*vector.Error); ok { + return o.orError(lhs, rhs) } - blhs := lhs.(*vector.Bool) - brhs := rhs.(*vector.Bool) - bits := make([]uint64, len(blhs.Bits)) - if len(blhs.Bits) != len(brhs.Bits) { - panic("length mistmatch") + if _, ok := rhs.(*vector.Error); ok { + return o.orError(rhs, lhs) } - for k := range bits { - bits[k] = blhs.Bits[k] | brhs.Bits[k] + blhs, brhs := toBool(lhs), toBool(rhs) + out := vector.Or(blhs, brhs) + if blhs.Nulls == nil && brhs.Nulls == nil { + return out } - //XXX intersect nulls - return blhs.CopyWithBits(bits) + nulls := vector.Or(blhs.Nulls, brhs.Nulls) + out.Nulls = vector.And(vector.Not(out), nulls) + return out } -// EvalBool evaluates e using val to computs a boolean result. For elements +func (o *Or) orError(err, vec vector.Any) vector.Any { + if _, ok := vec.(*vector.Error); ok { + return err + } + b := toBool(vec) + // not error if true or null + notError := vector.Or(b, b.Nulls) + var index []uint32 + for i := range b.Len() { + if !notError.Value(i) { + index = append(index, i) + } + } + if len(index) > 0 { + base := vector.NewInverseView(vec, index) + return vector.Combine(base, index, vector.NewView(err, index)) + } + return vec +} + +// evalBool evaluates e using val to computs a boolean result. For elements // of the result that are not boolean, an error is calculated for each non-bool // slot and they are returned as an error. If all of the value slots are errors, // then the return value is nil. -func EvalBool(zctx *super.Context, val vector.Any, e Evaluator) (vector.Any, bool) { - //XXX Eval could return a dynamic vector of errors and bools and we should - // handle this correctly so the logic above is really the fast path - // and a slower path will handle picking apart the dynamic vector. - // maybe we could have a generic way to traverse dynamics for - // appliers doing their thing along the slow path - if val, ok := vector.Under(e.Eval(val)).(*vector.Bool); ok { - return val, true - } - //XXX need to implement a sparse dynamic (vector.Collection?) - // and check for that here. - // for now, if the vector is not uniformly boolean, we return error. - // XXX example is a field ref a union of structs where the type of - // the referenced field changes... there can be an arbitrary number - // of underlying types though any given slot has only one type - // obviously at any given time. - return vector.NewStringError(zctx, "not type bool", val.Len()), false +func evalBool(zctx *super.Context, fn func(...vector.Any) vector.Any, vecs ...vector.Any) vector.Any { + return vector.Apply(false, func(vecs ...vector.Any) vector.Any { + for i, vec := range vecs { + if vec := vector.Under(vec); vec.Type() == super.TypeBool || vector.KindOf(vec) == vector.KindError { + vecs[i] = vec + } else { + vecs[i] = vector.NewWrappedError(zctx, "not type bool", vec) + } + } + return fn(vecs...) + }, vecs...) +} + +func toBool(vec vector.Any) *vector.Bool { + switch vec := vec.(type) { + case *vector.Const: + val := vec.Value() + if val.Bool() { + out := trueBool(vec.Len()) + out.Nulls = vec.Nulls + return out + } else { + return vector.NewBoolEmpty(0, vec.Nulls) + } + case *vector.Bool: + return vec + default: + panic(vec) + } +} + +func trueBool(n uint32) *vector.Bool { + vec := vector.NewBoolEmpty(n, nil) + for i := range vec.Bits { + vec.Bits[i] = ^uint64(0) + } + return vec } diff --git a/runtime/ztests/expr/logical-and.yaml b/runtime/ztests/expr/logical-and.yaml new file mode 100644 index 0000000000..e13bde0b75 --- /dev/null +++ b/runtime/ztests/expr/logical-and.yaml @@ -0,0 +1,71 @@ +zed: | + yield case when typeof(this) == + then this + else a AND b + end + +vector: true + +input: | + "=== TRUE ===" + {a:true,b:true} + {a:true,b:false} + {a:true,b:null(bool)} + {a:true} + {a:true,b:"foo"} + "=== FALSE ===" + {a:false,b:true} + {a:false,b:false} + {a:false,b:null(bool)} + {a:false} + {a:false,b:"foo"} + "=== NULL ===" + {a:null(bool),b:true} + {a:null(bool),b:false} + {a:null(bool),b:null(bool)} + {a:null(bool)} + {a:null(bool),b:"foo"} + "=== MISSING ===" + {b:true} + {b:false} + {b:null(bool)} + {} + {b:"foo"} + "=== ERROR ===" + {a:"foo",b:true} + {a:"foo",b:false} + {a:"foo",b:null(bool)} + {a:"foo"} + {a:"foo",b:"foo"} + +output: | + "=== TRUE ===" + true + false + null(bool) + error("missing") + error({message:"not type bool",on:"foo"}) + "=== FALSE ===" + false + false + false + false + false + "=== NULL ===" + null(bool) + false + null(bool) + error("missing") + error({message:"not type bool",on:"foo"}) + "=== MISSING ===" + error("missing") + false + error("missing") + error("missing") + error("missing") + "=== ERROR ===" + error({message:"not type bool",on:"foo"}) + false + error({message:"not type bool",on:"foo"}) + error({message:"not type bool",on:"foo"}) + error({message:"not type bool",on:"foo"}) diff --git a/runtime/ztests/expr/logical-not.yaml b/runtime/ztests/expr/logical-not.yaml new file mode 100644 index 0000000000..d32ccfa269 --- /dev/null +++ b/runtime/ztests/expr/logical-not.yaml @@ -0,0 +1,17 @@ +zed: yield not this + +vector: true + +input: | + true + false + null(bool) + error("missing") + error("foo") + +output: | + false + true + null(bool) + error("missing") + error("foo") diff --git a/runtime/ztests/expr/logical-or.yaml b/runtime/ztests/expr/logical-or.yaml new file mode 100644 index 0000000000..6c4ff328b4 --- /dev/null +++ b/runtime/ztests/expr/logical-or.yaml @@ -0,0 +1,71 @@ +zed: | + yield case when typeof(this) == + then this + else a OR b + end + +vector: true + +input: | + "=== TRUE ===" + {a:true,b:true} + {a:true,b:false} + {a:true,b:null(bool)} + {a:true} + {a:true,b:"foo"} + "=== FALSE ===" + {a:false,b:true} + {a:false,b:false} + {a:false,b:null(bool)} + {a:false} + {a:false,b:"foo"} + "=== NULL ===" + {a:null(bool),b:true} + {a:null(bool),b:false} + {a:null(bool),b:null(bool)} + {a:null(bool)} + {a:null(bool),b:"foo"} + "=== MISSING ===" + {b:true} + {b:false} + {b:null(bool)} + {} + {b:"foo"} + "=== ERROR ===" + {a:"foo",b:true} + {a:"foo",b:false} + {a:"foo",b:null(bool)} + {a:"foo"} + {a:"foo",b:"foo"} + +output: | + "=== TRUE ===" + true + true + true + true + true + "=== FALSE ===" + true + false + null(bool) + error("missing") + error({message:"not type bool",on:"foo"}) + "=== NULL ===" + true + null(bool) + null(bool) + null(bool) + null(bool) + "=== MISSING ===" + true + error("missing") + null(bool) + error("missing") + error("missing") + "=== ERROR ===" + true + error({message:"not type bool",on:"foo"}) + null(bool) + error({message:"not type bool",on:"foo"}) + error({message:"not type bool",on:"foo"}) diff --git a/vector/bool.go b/vector/bool.go index 1a6d4f4a0b..b0a23d9edb 100644 --- a/vector/bool.go +++ b/vector/bool.go @@ -2,6 +2,7 @@ package vector import ( "math/bits" + "slices" "strings" "github.com/brimdata/super" @@ -52,7 +53,7 @@ func (b *Bool) CopyWithBits(bits []uint64) *Bool { } func (b *Bool) Serialize(builder *zcode.Builder, slot uint32) { - if b.Nulls.Value(slot) { + if b != nil && b.Nulls.Value(slot) { builder.Append(nil) } else { builder.Append(super.EncodeBool(b.Value(slot))) @@ -94,6 +95,17 @@ func (b *Bool) String() string { return s.String() } +func Not(a *Bool) *Bool { + if a == nil { + panic("not: nil bool") + } + bits := slices.Clone(a.Bits) + for i := range bits { + bits[i] = ^a.Bits[i] + } + return a.CopyWithBits(bits) +} + func Or(a, b *Bool) *Bool { if b == nil { return a @@ -111,6 +123,23 @@ func Or(a, b *Bool) *Bool { return out } +func And(a, b *Bool) *Bool { + if b == nil { + return nil + } + if a == nil { + return nil + } + if a.Len() != b.Len() { + panic("and'ing two different length bool vectors") + } + out := NewBoolEmpty(a.Len(), nil) + for i := range len(a.Bits) { + out.Bits[i] = a.Bits[i] & b.Bits[i] + } + return out +} + // BoolValue returns the value of slot in vec if the value is a Boolean. It // returns false otherwise. func BoolValue(vec Any, slot uint32) bool { @@ -136,6 +165,11 @@ func NullsOf(v Any) *Bool { return v.Nulls case *Bytes: return v.Nulls + case *Bool: + if v != nil { + return v.Nulls + } + return nil case *Const: if v.Value().IsNull() { out := NewBoolEmpty(v.Len(), nil) diff --git a/vector/kind.go b/vector/kind.go index 03bcf53884..4c8ddb4ce7 100644 --- a/vector/kind.go +++ b/vector/kind.go @@ -17,6 +17,7 @@ const ( KindString = 4 KindBytes = 5 KindType = 6 + KindError = 7 ) const ( @@ -40,6 +41,8 @@ func KindOf(v Any) Kind { return KindBytes case *String: return KindString + case *Error: + return KindError case *TypeValue: return KindType case *Dict: diff --git a/vector/view.go b/vector/view.go index 624a9f072a..ef9b2838a0 100644 --- a/vector/view.go +++ b/vector/view.go @@ -54,6 +54,18 @@ func NewView(val Any, index []uint32) Any { return &View{val, index} } +func NewInverseView(vec Any, index []uint32) Any { + var inverse []uint32 + for i := range vec.Len() { + if len(index) > 0 && index[0] == i { + index = index[1:] + continue + } + inverse = append(inverse, i) + } + return NewView(vec, inverse) +} + func NewBoolView(vec *Bool, index []uint32) *Bool { if vec == nil { return nil From 0f7b600ab5b793b874afc4d0e592f39e3dfe1a2f Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 26 Nov 2024 14:46:05 -0500 Subject: [PATCH 14/22] vam: Fix convert const false to bool vector (#5505) --- runtime/vam/expr/logic.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/vam/expr/logic.go b/runtime/vam/expr/logic.go index 097002f4c0..cf4da97b29 100644 --- a/runtime/vam/expr/logic.go +++ b/runtime/vam/expr/logic.go @@ -175,7 +175,7 @@ func toBool(vec vector.Any) *vector.Bool { out.Nulls = vec.Nulls return out } else { - return vector.NewBoolEmpty(0, vec.Nulls) + return vector.NewBoolEmpty(vec.Len(), vec.Nulls) } case *vector.Bool: return vec From a17829169a820496e3a7f809cb674181953bedf4 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 26 Nov 2024 14:46:19 -0500 Subject: [PATCH 15/22] vam: is null fix vectors with no nulls (#5504) --- runtime/vam/expr/compare.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runtime/vam/expr/compare.go b/runtime/vam/expr/compare.go index 58b50ee24c..2cbede1235 100644 --- a/runtime/vam/expr/compare.go +++ b/runtime/vam/expr/compare.go @@ -103,5 +103,8 @@ func (i *isNull) eval(vecs ...vector.Any) vector.Any { if c, ok := vec.(*vector.Const); ok && c.Value().IsNull() { return vector.NewConst(super.True, vec.Len(), nil) } - return vector.NullsOf(vec) + if nulls := vector.NullsOf(vec); nulls != nil { + return nulls + } + return vector.NewConst(super.False, vec.Len(), nil) } From 8901aa270d4a566fe336fb13bff9703db2faa0fc Mon Sep 17 00:00:00 2001 From: Phil Rzewski Date: Wed, 27 Nov 2024 08:26:17 -0800 Subject: [PATCH 16/22] Scripts and AWS results for perf section of super command doc (#5506) --- .markdownlint.yaml | 2 +- docs/commands/search.sql | 487 --------- docs/commands/super.md | 954 +++++++++++------- scripts/super-cmd-perf/README.md | 106 ++ scripts/super-cmd-perf/benchmark.sh | 97 ++ scripts/super-cmd-perf/prep-data.sh | 58 ++ scripts/super-cmd-perf/queries/agg.sql | 4 + scripts/super-cmd-perf/queries/count.sql | 3 + scripts/super-cmd-perf/queries/search+.spq | 3 + scripts/super-cmd-perf/queries/search+.sql | 489 +++++++++ scripts/super-cmd-perf/queries/search.spq | 3 + scripts/super-cmd-perf/queries/search.sql | 3 + .../queries/union-clickhouse.sql | 13 + .../queries/union-datafusion.sql | 15 + scripts/super-cmd-perf/queries/union.spq | 6 + scripts/super-cmd-perf/queries/union.sql | 13 + scripts/super-cmd-perf/run-queries.sh | 146 +++ 17 files changed, 1562 insertions(+), 840 deletions(-) delete mode 100644 docs/commands/search.sql create mode 100644 scripts/super-cmd-perf/README.md create mode 100755 scripts/super-cmd-perf/benchmark.sh create mode 100755 scripts/super-cmd-perf/prep-data.sh create mode 100644 scripts/super-cmd-perf/queries/agg.sql create mode 100644 scripts/super-cmd-perf/queries/count.sql create mode 100644 scripts/super-cmd-perf/queries/search+.spq create mode 100644 scripts/super-cmd-perf/queries/search+.sql create mode 100644 scripts/super-cmd-perf/queries/search.spq create mode 100644 scripts/super-cmd-perf/queries/search.sql create mode 100644 scripts/super-cmd-perf/queries/union-clickhouse.sql create mode 100644 scripts/super-cmd-perf/queries/union-datafusion.sql create mode 100644 scripts/super-cmd-perf/queries/union.spq create mode 100644 scripts/super-cmd-perf/queries/union.sql create mode 100755 scripts/super-cmd-perf/run-queries.sh diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 3c9b4c92a3..1bdcd8fce8 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -11,4 +11,4 @@ whitespace: true MD010: code_blocks: false # Disallow hard tabs except in code blocks. MD033: - allowed_elements: ["p"] + allowed_elements: ["p","br"] diff --git a/docs/commands/search.sql b/docs/commands/search.sql deleted file mode 100644 index f7465cfa80..0000000000 --- a/docs/commands/search.sql +++ /dev/null @@ -1,487 +0,0 @@ -SELECT count() FROM gha WHERE - id LIKE '%in case you have any feedback 😊%' -OR type LIKE '%in case you have any feedback 😊%' -OR actor.login LIKE '%in case you have any feedback 😊%' -OR actor.display_login LIKE '%in case you have any feedback 😊%' -OR actor.gravatar_id LIKE '%in case you have any feedback 😊%' -OR actor.url LIKE '%in case you have any feedback 😊%' -OR actor.avatar_url LIKE '%in case you have any feedback 😊%' -OR repo.name LIKE '%in case you have any feedback 😊%' -OR repo.url LIKE '%in case you have any feedback 😊%' -OR payload.ref LIKE '%in case you have any feedback 😊%' -OR payload.ref_type LIKE '%in case you have any feedback 😊%' -OR payload.pusher_type LIKE '%in case you have any feedback 😊%' -OR payload.head LIKE '%in case you have any feedback 😊%' -OR payload.before LIKE '%in case you have any feedback 😊%' -OR payload.master_branch LIKE '%in case you have any feedback 😊%' -OR payload.description LIKE '%in case you have any feedback 😊%' -OR payload.action LIKE '%in case you have any feedback 😊%' -OR org.login LIKE '%in case you have any feedback 😊%' -OR org.gravatar_id LIKE '%in case you have any feedback 😊%' -OR org.url LIKE '%in case you have any feedback 😊%' -OR org.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.review.node_id LIKE '%in case you have any feedback 😊%' -OR payload.review.user.login LIKE '%in case you have any feedback 😊%' -OR payload.review.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.review.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.review.user.url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.review.user.type LIKE '%in case you have any feedback 😊%' -OR payload.review.body LIKE '%in case you have any feedback 😊%' -OR payload.review.commit_id LIKE '%in case you have any feedback 😊%' -OR payload.review.state LIKE '%in case you have any feedback 😊%' -OR payload.review.html_url LIKE '%in case you have any feedback 😊%' -OR payload.review.pull_request_url LIKE '%in case you have any feedback 😊%' -OR payload.review.author_association LIKE '%in case you have any feedback 😊%' -OR payload.review._links.html.href LIKE '%in case you have any feedback 😊%' -OR payload.review._links.pull_request.href LIKE '%in case you have any feedback 😊%' -OR payload.comment.url LIKE '%in case you have any feedback 😊%' -OR payload.comment.html_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.node_id LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.login LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.user.type LIKE '%in case you have any feedback 😊%' -OR payload.comment.path LIKE '%in case you have any feedback 😊%' -OR payload.comment.commit_id LIKE '%in case you have any feedback 😊%' -OR payload.comment.author_association LIKE '%in case you have any feedback 😊%' -OR payload.comment.body LIKE '%in case you have any feedback 😊%' -OR payload.comment.reactions.url LIKE '%in case you have any feedback 😊%' -OR payload.comment.issue_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.diff_hunk LIKE '%in case you have any feedback 😊%' -OR payload.comment.original_commit_id LIKE '%in case you have any feedback 😊%' -OR payload.comment.pull_request_url LIKE '%in case you have any feedback 😊%' -OR payload.comment.start_side LIKE '%in case you have any feedback 😊%' -OR payload.comment.side LIKE '%in case you have any feedback 😊%' -OR payload.issue.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.repository_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.labels_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.comments_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.html_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.node_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.title LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.login LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.user.type LIKE '%in case you have any feedback 😊%' -OR payload.issue.state LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.login LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.node_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.html_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.following_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.assignee.type LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.html_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.labels_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.node_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.title LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.description LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.login LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.node_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.html_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.following_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.creator.type LIKE '%in case you have any feedback 😊%' -OR payload.issue.milestone.state LIKE '%in case you have any feedback 😊%' -OR payload.issue.author_association LIKE '%in case you have any feedback 😊%' -OR payload.issue.active_lock_reason LIKE '%in case you have any feedback 😊%' -OR payload.issue.body LIKE '%in case you have any feedback 😊%' -OR payload.issue.reactions.url LIKE '%in case you have any feedback 😊%' -OR payload.issue.timeline_url LIKE '%in case you have any feedback 😊%' -OR payload.issue.state_reason LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.diff_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.patch_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.issue_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.state LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.title LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.user.type LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.body LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merge_commit_sha LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.commits_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.review_comments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.review_comment_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.comments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.statuses_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.label LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.ref LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.sha LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.user.type LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.name LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.full_name LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.owner.type LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.description LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.forks_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.keys_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.collaborators_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.teams_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.hooks_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.issue_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.assignees_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.branches_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.tags_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.blobs_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.git_tags_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.git_refs_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.trees_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.statuses_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.languages_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.stargazers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.contributors_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.subscribers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.subscription_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.commits_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.git_commits_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.comments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.contents_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.compare_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.merges_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.archive_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.downloads_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.issues_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.pulls_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.milestones_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.notifications_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.labels_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.releases_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.deployments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.git_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.ssh_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.clone_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.svn_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.homepage LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.language LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.mirror_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.visibility LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.head.repo.default_branch LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.label LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.ref LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.sha LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.user.type LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.name LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.full_name LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.owner.type LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.description LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.forks_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.keys_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.collaborators_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.teams_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.hooks_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.issue_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.assignees_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.branches_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.tags_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.blobs_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.git_tags_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.git_refs_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.trees_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.statuses_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.languages_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.stargazers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.contributors_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.subscribers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.subscription_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.commits_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.git_commits_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.comments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.contents_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.compare_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.merges_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.archive_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.downloads_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.issues_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.pulls_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.milestones_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.notifications_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.labels_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.releases_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.deployments_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.git_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.ssh_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.clone_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.svn_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.homepage LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.language LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.mirror_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.visibility LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.base.repo.default_branch LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.self.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.html.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.issue.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.comments.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.review_comments.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.review_comment.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.commits.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request._links.statuses.href LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.author_association LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.active_lock_reason LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.mergeable_state LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.login LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.node_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.html_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.following_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.pull_request.merged_by.type LIKE '%in case you have any feedback 😊%' -OR payload.forkee.node_id LIKE '%in case you have any feedback 😊%' -OR payload.forkee.name LIKE '%in case you have any feedback 😊%' -OR payload.forkee.full_name LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.login LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.node_id LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.html_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.following_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.events_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.owner.type LIKE '%in case you have any feedback 😊%' -OR payload.forkee.html_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.description LIKE '%in case you have any feedback 😊%' -OR payload.forkee.url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.forks_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.keys_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.collaborators_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.teams_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.hooks_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.issue_events_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.events_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.assignees_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.branches_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.tags_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.blobs_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.git_tags_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.git_refs_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.trees_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.statuses_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.languages_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.stargazers_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.contributors_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.subscribers_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.subscription_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.commits_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.git_commits_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.comments_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.issue_comment_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.contents_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.compare_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.merges_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.archive_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.downloads_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.issues_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.pulls_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.milestones_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.notifications_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.labels_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.releases_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.deployments_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.git_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.ssh_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.clone_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.svn_url LIKE '%in case you have any feedback 😊%' -OR payload.forkee.homepage LIKE '%in case you have any feedback 😊%' -OR payload.forkee.visibility LIKE '%in case you have any feedback 😊%' -OR payload.forkee.default_branch LIKE '%in case you have any feedback 😊%' -OR payload.release.url LIKE '%in case you have any feedback 😊%' -OR payload.release.assets_url LIKE '%in case you have any feedback 😊%' -OR payload.release.upload_url LIKE '%in case you have any feedback 😊%' -OR payload.release.html_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.login LIKE '%in case you have any feedback 😊%' -OR payload.release.author.node_id LIKE '%in case you have any feedback 😊%' -OR payload.release.author.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.release.author.url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.html_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.following_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.events_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.release.author.type LIKE '%in case you have any feedback 😊%' -OR payload.release.node_id LIKE '%in case you have any feedback 😊%' -OR payload.release.tag_name LIKE '%in case you have any feedback 😊%' -OR payload.release.target_commitish LIKE '%in case you have any feedback 😊%' -OR payload.release.name LIKE '%in case you have any feedback 😊%' -OR payload.release.tarball_url LIKE '%in case you have any feedback 😊%' -OR payload.release.zipball_url LIKE '%in case you have any feedback 😊%' -OR payload.release.body LIKE '%in case you have any feedback 😊%' -OR payload.release.short_description_html LIKE '%in case you have any feedback 😊%' -OR payload.release.discussion_url LIKE '%in case you have any feedback 😊%' -OR payload.member.login LIKE '%in case you have any feedback 😊%' -OR payload.member.node_id LIKE '%in case you have any feedback 😊%' -OR payload.member.avatar_url LIKE '%in case you have any feedback 😊%' -OR payload.member.gravatar_id LIKE '%in case you have any feedback 😊%' -OR payload.member.url LIKE '%in case you have any feedback 😊%' -OR payload.member.html_url LIKE '%in case you have any feedback 😊%' -OR payload.member.followers_url LIKE '%in case you have any feedback 😊%' -OR payload.member.following_url LIKE '%in case you have any feedback 😊%' -OR payload.member.gists_url LIKE '%in case you have any feedback 😊%' -OR payload.member.starred_url LIKE '%in case you have any feedback 😊%' -OR payload.member.subscriptions_url LIKE '%in case you have any feedback 😊%' -OR payload.member.organizations_url LIKE '%in case you have any feedback 😊%' -OR payload.member.repos_url LIKE '%in case you have any feedback 😊%' -OR payload.member.events_url LIKE '%in case you have any feedback 😊%' -OR payload.member.received_events_url LIKE '%in case you have any feedback 😊%' -OR payload.member.type LIKE '%in case you have any feedback 😊%' diff --git a/docs/commands/super.md b/docs/commands/super.md index 31b960b1e0..e7c72df485 100644 --- a/docs/commands/super.md +++ b/docs/commands/super.md @@ -663,20 +663,34 @@ the `super` command, but it turns out that `super` can hold its own when compared to other analytics systems. To illustrate comparative performance, we'll present some informal performance -measurements among `super`, -[`DuckDB`](https://duckdb.org/), -[`ClickHouse`](https://clickhouse.com/), and -[`DataFusion`](https://datafusion.apache.org/). +measurements among SuperDB, +[DuckDB](https://duckdb.org/), +[ClickHouse](https://clickhouse.com/), and +[DataFusion](https://datafusion.apache.org/). We'll use the Parquet format to compare apples to apples and also report results for the custom columnar database format of DuckDB -and the Super Binary format used by `super`. -We tried loading our test data into a ClickHouse table using its -[new experimental JSON type](https://clickhouse.com/blog/a-new-powerful-json-data-type-for-clickhouse) -but those attempts failed with "too many open files". +and the [Super Binary](../formats/bsup.md) format used by `super`. -As of this writing in November 2024, we're using the latest version 1.1.3 of `duckdb`. -version 24.11.1.1393 of `clickhouse`, and v43.0.0 of `datafusion-cli`. +We also experimented with loading our test data into a ClickHouse table using its +[new beta JSON type](https://clickhouse.com/blog/a-new-powerful-json-data-type-for-clickhouse). +Preliminary results showed a mix of good performance and failed queries. +We'll provide more detail on these tests soon. + +The detailed steps shown [below](#appendix-2-running-the-tests) can be reproduced via +[automated scripts](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf). +As of this writing in November 2024, [results](#the-test-results) were gathered on an AWS +[`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) instance +with the following software versions: + +|**Software**|**Version**| +|-|-| +|`super`|Commit `31760cd`| +|`duckdb`|`v1.1.3` 19864453f7| +|`datafusion-cli`|datafusion-cli `43.0.0`| +|`clickhouse`|ClickHouse local version `24.10.3.21` (official build)| + +The complete run logs are [archived here](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz). ### The Test Data @@ -694,7 +708,7 @@ wget https://data.gharchive.org/2023-02-08-1.json.gz wget https://data.gharchive.org/2023-02-08-23.json.gz ``` We downloaded these files into a directory called `gharchive_gz` -and created a duckdb database file called `gha.db` and a table called `gha` +and created a DuckDB database file called `gha.db` and a table called `gha` using this command: ``` duckdb gha.db -c "CREATE TABLE gha AS FROM read_json('gharchive_gz/*.json.gz', union_by_name=true)" @@ -708,15 +722,15 @@ We then created a Parquet file called `gha.parquet` with this command: duckdb gha.db -c "COPY (from gha) TO 'gha.parquet'" ``` To create a super-structed file for the `super` command, there is no need to -fuse the data into a single schema (though `super` can still work with the fused +[`fuse`](../language/operators/fuse.md) the data into a single schema (though `super` can still work with the fused schema in the Parquet file), and we simply ran this command to create a Super Binary file: ``` super gharchive_gz/*.json.gz > gha.bsup ``` This code path in `super` is not multi-threaded so not particularly performant but, -on our test machine, it takes about the same time as the `duckdb` method of creating -a schema-fused table. +on our test machine, this runs more than 2x faster than the `duckdb` method of +creating a schema-fused table. Here are the resulting file sizes: ``` @@ -735,11 +749,11 @@ The test queries involve these patterns: * count by field aggregation * rank over union of disparate field types -We will call these tests `search`, `search+`, `count`, `agg`, and `union`, respectively +We will call these tests [search](#search), [search+](#search-1), [count](#count), [agg](#agg), and [union](#union), respectively #### Search -For the search test, we'll search for the string pattern +For the _search_ test, we'll search for the string pattern ``` "in case you have any feedback 😊" ``` @@ -754,9 +768,10 @@ SELECT count() FROM 'gha.parquet' -- or gha WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' ``` -SuperSQL has a function called `grep` that is similar to the SQL `LIKE` clause but -can operate over specified fields or default to all the string fields in any value. -The SuperSQL query is +SuperSQL supports `LIKE` and could run this plain SQL query, but it also has a +similar function called [`grep`](../language/functions/grep.md) that can operate over specified fields or +default to all the string fields in any value. The SuperSQL query that uses +`grep` is ```sql SELECT count() FROM 'gha.bsup' @@ -778,14 +793,21 @@ WHERE id LIKE '%in case you have any feedback 😊%' OR payload.member.type LIKE '%in case you have any feedback 😊%' ``` There are 486 such fields. You can review the entire query in -[docs/commands/search.sql](search.sql). +[`search+.sql`](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/search%2B.sql). + +In SuperSQL, `grep` allows for a much shorter query. +```sql +SELLECT count() +FROM 'gha.bsup' +WHERE grep('in case you have any feedback 😊') +``` #### Count -In the `count` test, we filter the input with a WHERE clause and count the results. +In the _count_ test, we filter the input with a `WHERE` clause and count the results. We chose a random GitHub user name for the filter. This query has the form: -``` +```sql SELECT count() FROM 'gha.parquet' -- or gha or 'gha.bsup' WHERE actor.login='johnbieren'" @@ -793,10 +815,10 @@ WHERE actor.login='johnbieren'" #### Agg -In the `agg` test, we filter the input and count the results grouped by the field `type` +In the _agg_ test, we filter the input and count the results grouped by the field `type` as in the DuckDB blog. This query has the form: -``` +```sql SELECT count(),type FROM 'gha.parquet' -- or 'gha' or 'gha.bsup' WHERE repo.name='duckdb/duckdb' @@ -805,7 +827,7 @@ GROUP BY type #### Union -The `union` test is straight out of the DuckDB blog at the end of +The _union_ test is straight out of the DuckDB blog at the end of [this section](https://duckdb.org/2023/03/03/json.html#handling-inconsistent-json-schemas). This query computes the GitHub users that were assigned as a PR reviewer the most often and returns the top 5 such users. @@ -818,10 +840,10 @@ This query is: ```sql WITH assignees AS ( SELECT payload.pull_request.assignee.login assignee - FROM 'gha.parquet' + FROM 'gha.parquet' -- or 'gha' UNION ALL SELECT unnest(payload.pull_request.assignees).login assignee - FROM 'gha.parquet' + FROM 'gha.parquet' -- or 'gha' ) SELECT assignee, count(*) count FROM assignees @@ -837,19 +859,19 @@ FROM 'gha.parquet' ``` as ```sql -SELECT rec.login as assignee FROM ( - SELECT unnest(payload.pull_request.assignees) rec +SELECT object.login as assignee FROM ( + SELECT unnest(payload.pull_request.assignees) object FROM 'gha.parquet' ) ``` and for ClickHouse, we had to use `arrayJoin` instead of `unnest`. -SuperSQL's data model does not require these sorts of gymnastics as +SuperSQL's data model does not require these kinds of gymnastics as everything does not have to be jammed into a table. Instead, we can use the -`UNNEST` pipe operator combined with the spread operator applied to the array of +`UNNEST` pipe operator combined with the [spread operator](../language/expressions.md#array-expressions) applied to the array of string fields to easily produce a stream of string values representing the assignees. Then we simply aggregate the assignee stream: -``` +```sql FROM 'gha.bsup' | UNNEST [...payload.pull_request.assignees, payload.pull_request.assignee] | WHERE this IS NOT NULL @@ -860,30 +882,32 @@ FROM 'gha.bsup' ### The Test Results -The following table summarizes the results of each test as a column and -each tool as a row with the speed-up factor shown in parentheses: +The following table summarizes the query performance for each tool as recorded in the +[most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz). +The run time for each query in seconds is shown along with the speed-up factor +in parentheses: -| tool | format | search | search+ | count | agg | union | -|--------------|---------------|---------------|---------------|----|------|-------| -| `super` | `bsup` | 3.2 (2.6X) | 6.7 (3.6X) | 3.2 (0.04X) | 3.1 (0.04X) | 3.8 (117X) | -| `super` | `parquet` | note 1 | note 1 | 0.18 (0.7X) | 0.27 (0.4X) | note 2 | -| `duckdb` | `db` | 8.2 | 24 | 0.13 | 0.12 | 446 | -| `duckdb` | `parquet` | 8.4 (1) | 23 (1X) | 0.26 (0.5X) | 0.21 (0.6X) | 419 (1.1X) | -| `datafusion` | `parquet` | 9.1 (0.9X) | 18 (1.3X) | 0.24 (0.5X) | 0.24 (0.5X) | 40 (11x) | -| `clickhouse` | `parquet` | 56 (0.1X) | 463 (0.1X) | 1 (0.1X) | 0.91 (0.1X) | 66 (7X) | +|**Tool**|**Format**|**search**|**search+**|**count**|**agg**|**union**| +|-|-|-|-|-|-|-| +|`super`|`bsup`|6.3
(1.9x)|14.3
(1.4x)|5.7
(0.03x)|5.6
(0.03x)|8.2
(63x)| +|`super`|`parquet`|note 1|note 1|0.3
(0.6x)|0.5
(0.3x)|note 2| +|`duckdb`|`db`|12.1|19.8|0.2|0.14|519| +|`duckdb`|`parquet`|12.9
(0.9x)|21.2
(0.9x)|0.4
(0.4x)|0.3
(0.5x)|499
(1x)| +|`datafusion`|`parquet`|11.1
(1.1x)|21.1
(0.9x)|0.4
(0.5x)|0.4
(0.4x)|24.3
(21x)| +|`clickhouse`|`parquet`|68
(0.2x)|845
(0.02x)|1
(0.2x)|0.9
(0.2x)|70
(7x)| _Note 1: the `super` vectorized runtime does not yet support `grep`_ _Note 2: the `super` vectorized runtime does not yet support array expressions_ Since DuckDB with its native format is overall the best performing, -we used it as the baseline for all of the speedup factors. +we used it as the baseline for all of the speed-up factors. To summarize, `super` with Super Binary is substantially faster than the relational systems for the search use cases and performs on par with the others for traditional OLAP queries, -except for the union query, where the super-structured data model trounces the relational -model (by over 100X!) for stitching together disparate data types for analysis in an aggregation. +except for the _union_ query, where the super-structured data model trounces the relational +model (by over 60x!) for stitching together disparate data types for analysis in an aggregation. ## Appendix 1: Preparing the Test Data @@ -927,16 +951,16 @@ FROM ( Hmm, now `duckdb` runs out of memory. We then thought we'd see if the sampling algorithm of `read_json` is more efficient, -so we ran tried this command with successively larger sample sizes: +so we tried this command with successively larger sample sizes: ``` duckdb scratch -c "CREATE TABLE gha AS FROM read_json('gharchive_gz/*.json.gz', sample_size=1000000)" ``` -even with a million rows as the sample, `duckdb` fails with +Even with a million rows as the sample, `duckdb` fails with ``` Invalid Input Error: JSON transform error in file "gharchive_gz/2023-02-08-14.json.gz", in line 49745: Object {"issues":"write","metadata":"read","pull_requests... has unknown key "repository_hooks" Try increasing 'sample_size', reducing 'maximum_depth', specifying 'columns', 'format' or 'records' manually, setting 'ignore_errors' to true, or setting 'union_by_name' to true when reading multiple files with a different structure. ``` -Ok, there 4434953 JSON objects in the input so let's try this: +Ok, there 4,434,953 JSON objects in the input so let's try this: ``` duckdb gha.db -c "CREATE TABLE gha AS FROM read_json('gharchive_gz/*.json.gz', sample_size=4434953)" ``` @@ -951,344 +975,595 @@ Sure enough, this works: ``` duckdb gha.db -c "CREATE TABLE gha AS FROM read_json('gharchive_gz/*.json.gz', union_by_name=true)" ``` -We now have the `duckdb` database file for our GitHub Archive data called `gha.db` +We now have the DuckDB database file for our GitHub Archive data called `gha.db` containing a single table called `gha` embedded in that database. What about the super-structured format for the `super` command? There is no need to futz with sample sizes, -schema inference, or union by name, just run this to create a Super Binary file: +schema inference, or union by name. Just run this to create a Super Binary file: ``` super gharchive_gz/*.json.gz > gha.bsup ``` ## Appendix 2: Running the Tests -This appendix provides the raw tests and output that we run on a MacBook Pro to generate -the table of results above. +This appendix provides the raw tests and output from the [most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz) +of the tests via [automated scripts](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf) +on an AWS [`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) instance. ### Search Test ``` -; time super -c " - SELECT count() - FROM 'gha.bsup' - WHERE grep('in case you have any feedback 😊', payload.pull_request.body) -" -{count:2(uint64)} -super -c 12.70s user 0.69s system 415% cpu 3.223 total +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -time duckdb gha.db -c " - SELECT count() - FROM gha - WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O +2 + Time (abs ≡): 68.250 s [User: 67.960 s, System: 3.333 s] + +About to execute +================ +datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM +DataFusion CLI v43.0.0 ++---------+ +| count() | ++---------+ +| 2 | ++---------+ +1 row(s) fetched. +Elapsed 10.942 seconds. + + Time (abs ≡): 11.130 s [User: 65.904 s, System: 11.389 s] + +About to execute +================ +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y + +With query +========== +SELECT count() +FROM 'gha' +WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 2 │ └──────────────┘ -duckdb gha.db -c 26.66s user 6.90s system 406% cpu 8.266 total + Time (abs ≡): 12.142 s [User: 81.132 s, System: 8.426 s] + +About to execute +================ +duckdb < /mnt/tmpdir/tmp.EtIuukLt2w + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -; time duckdb -c " - SELECT count() - FROM gha.parquet - WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.EtIuukLt2w' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.EtIuukLt2w ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 2 │ └──────────────┘ -duckdb -c 42.71s user 6.06s system 582% cpu 8.380 total + Time (abs ≡): 12.890 s [User: 86.998 s, System: 6.305 s] + +About to execute +================ +super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG + +With query +========== +SELECT count() +FROM '/mnt/gha.bsup' +WHERE grep('in case you have any feedback 😊', payload.pull_request.body) + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG +{count:2(uint64)} + Time (abs ≡): 6.325 s [User: 23.018 s, System: 1.652 s] +``` +### Search+ Test + +``` +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE + id LIKE '%in case you have any feedback 😊%' + OR type LIKE '%in case you have any feedback 😊%' +... + OR payload.member.type LIKE '%in case you have any feedback 😊%' -; time datafusion-cli -c " - SELECT count() - FROM 'gha.parquet' - WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT +3 + Time (abs ≡): 844.648 s [User: 923.669 s, System: 19.038 s] + +About to execute +================ +datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE + id LIKE '%in case you have any feedback 😊%' + OR type LIKE '%in case you have any feedback 😊%' + ... + OR payload.member.type LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD DataFusion CLI v43.0.0 +---------+ | count() | +---------+ -| 2 | +| 3 | +---------+ -1 row(s) fetched. -Elapsed 8.819 seconds. +1 row(s) fetched. +Elapsed 20.913 seconds. -datafusion-cli -c 40.75s user 6.72s system 521% cpu 9.106 total + Time (abs ≡): 21.127 s [User: 126.933 s, System: 19.620 s] + +About to execute +================ +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv -; time clickhouse -q " - SELECT count() - FROM 'gha.parquet' - WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -" -2 -clickhouse -q 50.81s user 1.83s system 94% cpu 55.994 total -``` - -### Search+ Test - -``` -; time super -c " - SELECT count() - FROM 'gha.bsup' - WHERE grep('in case you have any feedback 😊') -" -{count:3(uint64)} -super -c 43.80s user 0.71s system 669% cpu 6.653 total - -; time duckdb gha.db < search.sql +With query +========== +SELECT count() +FROM 'gha' +WHERE + id LIKE '%in case you have any feedback 😊%' + OR type LIKE '%in case you have any feedback 😊%' + ... + OR payload.member.type LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 3 │ └──────────────┘ -duckdb gha.db < search.sql 73.60s user 33.29s system 435% cpu 24.563 total - -; time duckdb < search-parquet.sql + Time (abs ≡): 19.796 s [User: 140.238 s, System: 9.686 s] + +About to execute +================ +duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE + id LIKE '%in case you have any feedback 😊%' + OR type LIKE '%in case you have any feedback 😊%' + ... + OR payload.member.type LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 3 │ └──────────────┘ -duckdb < search-parquet.sql 89.57s user 29.21s system 513% cpu 23.113 total + Time (abs ≡): 21.210 s [User: 143.903 s, System: 9.179 s] + +About to execute +================ +super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD + +With query +========== +SELECT count() +FROM '/mnt/gha.bsup' +WHERE grep('in case you have any feedback 😊') + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD +{count:3(uint64)} + Time (abs ≡): 14.267 s [User: 105.204 s, System: 1.698 s] +``` -; time datafusion-cli -f search-parquet.sql +### Count Test + +``` +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE actor.login='johnbieren' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw +879 + Time (abs ≡): 1.034 s [User: 0.822 s, System: 0.233 s] + +About to execute +================ +datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE actor.login='johnbieren' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs DataFusion CLI v43.0.0 +---------+ | count() | +---------+ -| 3 | +| 879 | +---------+ -1 row(s) fetched. -Elapsed 18.184 seconds. -datafusion-cli -f search-parquet.sql 83.84s user 11.13s system 513% cpu 18.494 total +1 row(s) fetched. +Elapsed 0.340 seconds. -; time clickhouse --queries-file search-parquet.sql -3 -clickhouse --queries-file search-parquet.sql 515.68s user 5.50s system 112% cpu 7:43.37 total -``` -### Count Test + Time (abs ≡): 0.381 s [User: 1.578 s, System: 0.411 s] + +About to execute +================ +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem -``` -; time super -c " - SELECT count() - FROM 'gha.bsup' - WHERE actor.login='johnbieren' -" -{count:879(uint64)} -super -c 13.81s user 0.71s system 449% cpu 3.233 total - -; time SUPER_VAM=1 super -c " - SELECT count() - FROM 'gha.parquet' - WHERE actor.login='johnbieren' -" -{count:879(uint64)} -SUPER_VAM=1 super -c 0.43s user 0.08s system 277% cpu 0.182 total +With query +========== +SELECT count() +FROM 'gha' +WHERE actor.login='johnbieren' -; time duckdb gha.db -c " - SELECT count() - FROM gha - WHERE actor.login='johnbieren' -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 879 │ └──────────────┘ -duckdb gha.db -c 0.64s user 0.06s system 517% cpu 0.134 total + Time (abs ≡): 0.175 s [User: 1.042 s, System: 0.106 s] + +About to execute +================ +duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE actor.login='johnbieren' -; time duckdb -c " - SELECT count() - FROM 'gha.parquet' - WHERE actor.login='johnbieren' -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 879 │ └──────────────┘ -duckdb gha.db -c 1.14s user 0.14s system 490% cpu 0.261 total - -DataFusion CLI v43.0.0 -+---------+ -| count() | -+---------+ -| 879 | -+---------+ -1 row(s) fetched. -Elapsed 0.203 seconds. + Time (abs ≡): 0.423 s [User: 2.256 s, System: 0.181 s] + +About to execute +================ +super -z -I /mnt/tmpdir/tmp.dyu0120H2m + +With query +========== +SELECT count() +FROM '/mnt/gha.bsup' +WHERE actor.login='johnbieren' -datafusion-cli -c 0.93s user 0.15s system 453% cpu 0.238 total ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.dyu0120H2m' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.dyu0120H2m +{count:879(uint64)} + Time (abs ≡): 5.745 s [User: 17.240 s, System: 1.509 s] + +About to execute +================ +SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe + +With query +========== +SELECT count() +FROM '/mnt/gha.parquet' +WHERE actor.login='johnbieren' -; time clickhouse -q " - SELECT count() - FROM 'gha.parquet' - WHERE actor.login='johnbieren' -" -879 -clickhouse -q 0.86s user 0.07s system 93% cpu 1.001 total ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe' +Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe +{count:879(uint64)} + Time (abs ≡): 0.298 s [User: 0.769 s, System: 0.248 s] ``` ### Agg Test ``` -; time super -c " - SELECT count(),type - FROM 'gha.bsup' - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" -{type:"PullRequestReviewEvent",count:14(uint64)} -{type:"IssueCommentEvent",count:30(uint64)} -{type:"WatchEvent",count:29(uint64)} -{type:"PullRequestEvent",count:35(uint64)} -{type:"PushEvent",count:15(uint64)} -{type:"IssuesEvent",count:9(uint64)} -{type:"ForkEvent",count:3(uint64)} -{type:"PullRequestReviewCommentEvent",count:7(uint64)} -super -c 12.24s user 0.68s system 413% cpu 3.129 total - -; time SUPER_VAM=1 super -c " - SELECT count(),type - FROM 'gha.parquet' - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" -{type:"IssueCommentEvent",count:30(uint64)} -{type:"PullRequestEvent",count:35(uint64)} -{type:"PushEvent",count:15(uint64)} -{type:"WatchEvent",count:29(uint64)} -{type:"PullRequestReviewEvent",count:14(uint64)} -{type:"ForkEvent",count:3(uint64)} -{type:"PullRequestReviewCommentEvent",count:7(uint64)} -{type:"IssuesEvent",count:9(uint64)} -SUPER_VAM=1 super -c 1.01s user 0.13s system 421% cpu 0.271 total - -; time duckdb gha.db -c " - SELECT count(),type - FROM gha - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU + +With query +========== +SELECT count(),type +FROM '/mnt/gha.parquet' +WHERE repo.name='duckdb/duckdb' +GROUP BY type + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU +30 IssueCommentEvent +14 PullRequestReviewEvent +15 PushEvent +29 WatchEvent +9 IssuesEvent +7 PullRequestReviewCommentEvent +3 ForkEvent +35 PullRequestEvent + Time (abs ≡): 0.856 s [User: 0.741 s, System: 0.178 s] + +About to execute +================ +datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6 + +With query +========== +SELECT count(),type +FROM '/mnt/gha.parquet' +WHERE repo.name='duckdb/duckdb' +GROUP BY type + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6 +DataFusion CLI v43.0.0 ++---------+-------------------------------+ +| count() | type | ++---------+-------------------------------+ +| 35 | PullRequestEvent | +| 14 | PullRequestReviewEvent | +| 7 | PullRequestReviewCommentEvent | +| 3 | ForkEvent | +| 15 | PushEvent | +| 30 | IssueCommentEvent | +| 9 | IssuesEvent | +| 29 | WatchEvent | ++---------+-------------------------------+ +8 row(s) fetched. +Elapsed 0.324 seconds. + + Time (abs ≡): 0.354 s [User: 1.299 s, System: 0.413 s] + +About to execute +================ +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE + +With query +========== +SELECT count(),type +FROM 'gha' +WHERE repo.name='duckdb/duckdb' +GROUP BY type + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE ┌──────────────┬───────────────────────────────┐ │ count_star() │ type │ │ int64 │ varchar │ ├──────────────┼───────────────────────────────┤ │ 3 │ ForkEvent │ -│ 35 │ PullRequestEvent │ +│ 14 │ PullRequestReviewEvent │ │ 29 │ WatchEvent │ +│ 35 │ PullRequestEvent │ +│ 30 │ IssueCommentEvent │ │ 7 │ PullRequestReviewCommentEvent │ │ 15 │ PushEvent │ │ 9 │ IssuesEvent │ -│ 14 │ PullRequestReviewEvent │ -│ 30 │ IssueCommentEvent │ └──────────────┴───────────────────────────────┘ -duckdb gha.db -c 0.49s user 0.06s system 466% cpu 0.119 total - -; time duckdb -c " - SELECT count(),type - FROM 'gha.parquet' - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" + Time (abs ≡): 0.144 s [User: 0.770 s, System: 0.143 s] + +About to execute +================ +duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0 + +With query +========== +SELECT count(),type +FROM '/mnt/gha.parquet' +WHERE repo.name='duckdb/duckdb' +GROUP BY type + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0 ┌──────────────┬───────────────────────────────┐ │ count_star() │ type │ │ int64 │ varchar │ ├──────────────┼───────────────────────────────┤ +│ 3 │ ForkEvent │ +│ 15 │ PushEvent │ │ 9 │ IssuesEvent │ │ 7 │ PullRequestReviewCommentEvent │ -│ 15 │ PushEvent │ │ 14 │ PullRequestReviewEvent │ -│ 3 │ ForkEvent │ │ 29 │ WatchEvent │ -│ 35 │ PullRequestEvent │ │ 30 │ IssueCommentEvent │ +│ 35 │ PullRequestEvent │ └──────────────┴───────────────────────────────┘ -duckdb -c 0.73s user 0.14s system 413% cpu 0.211 total - -; time datafusion-cli -c " - SELECT count(),type - FROM 'gha.parquet' - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" -DataFusion CLI v43.0.0 -+---------+-------------------------------+ -| count() | type | -+---------+-------------------------------+ -| 15 | PushEvent | -| 35 | PullRequestEvent | -| 7 | PullRequestReviewCommentEvent | -| 14 | PullRequestReviewEvent | -| 30 | IssueCommentEvent | -| 9 | IssuesEvent | -| 29 | WatchEvent | -| 3 | ForkEvent | -+---------+-------------------------------+ -8 row(s) fetched. -Elapsed 0.200 seconds. + Time (abs ≡): 0.316 s [User: 1.473 s, System: 0.174 s] + +About to execute +================ +super -z -I /mnt/tmpdir/tmp.QieGBDCfVB + +With query +========== +SELECT count(),type +FROM '/mnt/gha.bsup' +WHERE repo.name='duckdb/duckdb' +GROUP BY type -datafusion-cli -c 0.80s user 0.15s system 398% cpu 0.238 total ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.QieGBDCfVB' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.QieGBDCfVB +{type:"IssuesEvent",count:9(uint64)} +{type:"ForkEvent",count:3(uint64)} +{type:"PullRequestReviewCommentEvent",count:7(uint64)} +{type:"PullRequestReviewEvent",count:14(uint64)} +{type:"IssueCommentEvent",count:30(uint64)} +{type:"WatchEvent",count:29(uint64)} +{type:"PullRequestEvent",count:35(uint64)} +{type:"PushEvent",count:15(uint64)} + Time (abs ≡): 5.627 s [User: 15.358 s, System: 1.606 s] + +About to execute +================ +SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz + +With query +========== +SELECT count(),type +FROM '/mnt/gha.parquet' +WHERE repo.name='duckdb/duckdb' +GROUP BY type -; time clickhouse -q " - SELECT count(),type - FROM 'gha.parquet' - WHERE repo.name='duckdb/duckdb' - GROUP BY type -" -30 IssueCommentEvent -14 PullRequestReviewEvent -15 PushEvent -29 WatchEvent -9 IssuesEvent -7 PullRequestReviewCommentEvent -3 ForkEvent -35 PullRequestEvent -clickhouse -q 0.77s user 0.11s system 97% cpu 0.908 total ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz' +Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz +{type:"PullRequestEvent",count:35(uint64)} +{type:"IssueCommentEvent",count:30(uint64)} +{type:"PushEvent",count:15(uint64)} +{type:"IssuesEvent",count:9(uint64)} +{type:"ForkEvent",count:3(uint64)} +{type:"PullRequestReviewCommentEvent",count:7(uint64)} +{type:"PullRequestReviewEvent",count:14(uint64)} +{type:"WatchEvent",count:29(uint64)} + Time (abs ≡): 0.498 s [User: 2.133 s, System: 0.329 s] ``` ### Union Test ``` -time super -c " - FROM 'gha.bsup' - | SELECT VALUE payload.pull_request - | WHERE this IS NOT NULL - | UNNEST [...assignees, assignee] - | WHERE this IS NOT NULL - | AGGREGATE count() BY assignee:=login - | ORDER BY count DESC - | LIMIT 5 -" -{assignee:"poad",count:1966(uint64)} -{assignee:"vinayakkulkarni",count:508(uint64)} -{assignee:"tmtmtmtm",count:356(uint64)} -{assignee:"AMatutat",count:260(uint64)} -{assignee:"danwinship",count:208(uint64)} -super -c 12.39s user 0.95s system 351% cpu 3.797 total - -; time duckdb gha.db -c " - WITH assignees AS ( - SELECT payload.pull_request.assignee.login assignee - FROM gha - UNION ALL - SELECT unnest(payload.pull_request.assignees).login assignee - FROM gha +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN + +With query +========== +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '/mnt/gha.parquet' + UNION ALL + SELECT arrayJoin(payload.pull_request.assignees).login assignee + FROM '/mnt/gha.parquet' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN +poad 1966 +vinayakkulkarni 508 +tmtmtmtm 356 +AMatutat 260 +danwinship 208 + Time (abs ≡): 70.276 s [User: 139.539 s, System: 6.504 s] + +About to execute +================ +datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i + +With query +========== +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '/mnt/gha.parquet' + UNION ALL + SELECT object.login as assignee FROM ( + SELECT unnest(payload.pull_request.assignees) object + FROM '/mnt/gha.parquet' ) - SELECT assignee, count(*) count - FROM assignees - WHERE assignee NOT NULL - GROUP BY assignee - ORDER BY count DESC - LIMIT 5 -" +) +SELECT assignee, count() count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i +DataFusion CLI v43.0.0 ++-----------------+-------+ +| assignee | count | ++-----------------+-------+ +| poad | 1966 | +| vinayakkulkarni | 508 | +| tmtmtmtm | 356 | +| AMatutat | 260 | +| danwinship | 208 | ++-----------------+-------+ +5 row(s) fetched. +Elapsed 24.068 seconds. + + Time (abs ≡): 24.336 s [User: 161.911 s, System: 24.355 s] + +About to execute +================ +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10 + +With query +========== +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM 'gha' + UNION ALL + SELECT unnest(payload.pull_request.assignees).login assignee + FROM 'gha' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10 ┌─────────────────┬───────┐ │ assignee │ count │ │ varchar │ int64 │ @@ -1299,23 +1574,30 @@ super -c 12.39s user 0.95s system 351% cpu 3.797 total │ AMatutat │ 260 │ │ danwinship │ 208 │ └─────────────────┴───────┘ -duckdb gha.db -c 3119.93s user 90.86s system 719% cpu 7:26.22 total + Time (abs ≡): 519.227 s [User: 4075.550 s, System: 14.520 s] + +About to execute +================ +duckdb < /mnt/tmpdir/tmp.30X1TO2UbL + +With query +========== +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '/mnt/gha.parquet' + UNION ALL + SELECT unnest(payload.pull_request.assignees).login assignee + FROM '/mnt/gha.parquet' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 -time duckdb -c " - WITH assignees AS ( - SELECT payload.pull_request.assignee.login assignee - FROM 'gha.parquet' - UNION ALL - SELECT unnest(payload.pull_request.assignees).login assignee - FROM 'gha.parquet' - ) - SELECT assignee, count(*) count - FROM assignees - WHERE assignee NOT NULL - GROUP BY assignee - ORDER BY count DESC - LIMIT 5 -" ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.30X1TO2UbL' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.30X1TO2UbL ┌─────────────────┬───────┐ │ assignee │ count │ │ varchar │ int64 │ @@ -1326,59 +1608,27 @@ time duckdb -c " │ AMatutat │ 260 │ │ danwinship │ 208 │ └─────────────────┴───────┘ -duckdb -c 2914.72s user 107.15s system 721% cpu 6:58.68 total - -time datafusion-cli -c " - WITH assignees AS ( - SELECT payload.pull_request.assignee.login assignee - FROM 'gha.parquet' - UNION ALL - SELECT object.login as assignee FROM ( - SELECT unnest(payload.pull_request.assignees) object - FROM 'gha.parquet' - ) - ) - SELECT assignee, count() count - FROM assignees - WHERE assignee IS NOT NULL - GROUP BY assignee - ORDER BY count DESC - LIMIT 5 -" -DataFusion CLI v43.0.0 -+-----------------+-------+ -| assignee | count | -+-----------------+-------+ -| poad | 1966 | -| vinayakkulkarni | 508 | -| tmtmtmtm | 356 | -| AMatutat | 260 | -| danwinship | 208 | -+-----------------+-------+ -5 row(s) fetched. -Elapsed 39.012 seconds. - -datafusion-cli -c 116.97s user 44.50s system 408% cpu 39.533 total + Time (abs ≡): 499.909 s [User: 3718.128 s, System: 9.680 s] + +About to execute +================ +super -z -I /mnt/tmpdir/tmp.3qO9ALablA + +With query +========== +FROM '/mnt/gha.bsup' +| UNNEST [...payload.pull_request.assignees, payload.pull_request.assignee] +| WHERE this IS NOT NULL +| AGGREGATE count() BY assignee:=login +| ORDER BY count DESC +| LIMIT 5 -; time clickhouse -q " - WITH assignees AS ( - SELECT payload.pull_request.assignee.login assignee - FROM 'gha.parquet' - UNION ALL - SELECT arrayJoin(payload.pull_request.assignees).login assignee - FROM 'gha.parquet' - ) - SELECT assignee, count(*) count - FROM assignees - WHERE assignee IS NOT NULL - GROUP BY assignee - ORDER BY count DESC - LIMIT 5 -" -poad 1966 -vinayakkulkarni 508 -tmtmtmtm 356 -AMatutat 260 -danwinship 208 -clickhouse -q 105.49s user 6.54s system 169% cpu 1:06.27 total ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.3qO9ALablA' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.3qO9ALablA +{assignee:"poad",count:1966(uint64)} +{assignee:"vinayakkulkarni",count:508(uint64)} +{assignee:"tmtmtmtm",count:356(uint64)} +{assignee:"AMatutat",count:260(uint64)} +{assignee:"danwinship",count:208(uint64)} + Time (abs ≡): 8.180 s [User: 17.197 s, System: 1.909 s] ``` diff --git a/scripts/super-cmd-perf/README.md b/scripts/super-cmd-perf/README.md new file mode 100644 index 0000000000..4465c71574 --- /dev/null +++ b/scripts/super-cmd-perf/README.md @@ -0,0 +1,106 @@ +# Query Performance From `super` Command Doc + +These scripts were used to generate the results in the +[Performance](https://zed.brimdata.io/docs/next/commands/super#performance) +section of the [`super` command doc](https://zed.brimdata.io/docs/next/commands/super). +The scripts have been made available to allow for easy reproduction of the +results under different conditions and/or as tested systems evolve. + +# Environments + +The scripts were written to be easily run in two different environments. + +## AWS + +As an environment that's available to everyone, the scripts were developed +primarily for use on a "scratch" EC2 instance in [AWS](https://aws.amazon.com/). +Specifically, we chose the [`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) +instance that has the following specifications: + +* 8x vCPU +* 32 GB of RAM +* 474 GB NVMe instance SSD + +The instance SSD in particular was seen as important to ensure consistent I/O +performance. + +Assuming a freshly-created `m6idn.2xlarge` instance running Ubuntu 24.04, to +start the run: + +``` +curl -s https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/benchmark.sh | bash -xv 2>&1 | tee runlog.txt +``` + +The run proceeds in three phases: + +1. **(AWS only)** Instance SSD is formatted and required tools & data platforms tools are downloaded/installed +2. Test data is downloaded and loaded into needed storage formats +3. Queries are executed on all data platforms + +As the benchmarks may take a long time to run, the use of [`screen`](https://www.gnu.org/software/screen/) +or a similar "detachable" terminal tool is recommended in case your remote +network connection drops during a run. + +## macOS/other + +Whereas on [AWS](#aws) the scripts assume they're in a "scratch" environment +where it may format the instance SSD for optimal storage and install required +software, on other systems such as macOS it's assumed the required data +platforms are already installed, and it will skip ahead right to +downloading/loading test data and then running queries. + +For instance on macOS, the software needed can be first installed via: + +``` +brew install hyperfine datafusion duckdb clickhouse go +go install github.com/brimdata/super/cmd/super@main +``` + +Then clone the [super repo](https://github.com/brimdata/super.git) and run the +benchmarks. + +``` +git clone https://github.com/brimdata/super.git +cd scripts/super-cmd-perf +./benchmark.sh +``` + +All test data will remain in this directory. + +# Results + +Results from the run will accumulate in a subdirectory named for the date/time +when the run started, e.g., `2024-11-19_01:10:30/`. In this directory, summary +reports will be created in files ending in `.md` and `.csv` extensions, and +details from each individual step in generating the results will be in files +ending in `.out`. If run on AWS using the [`curl` command line shown above](#aws), +the `runlog.txt` will also be present that holds the full console output of the +entire run. + +An archive of results from our most recent run of the benchmarks on November +26, 2024 can be downloaded [here](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz). + +# Debugging + +The scripts are configured to exit immediately if failures occur during the +run. If you encounter a failure, look in the results directory for the `.out` +file mentioned last in the console output as this will contain any detailed +error message from the operation that experienced the failure. + +A problem that was encountered when developing the scripts that you may also +encounter is DuckDB running out of memory. Specifically, this happened when +we tried to run the scripts on an Intel-based Macbook with only 16 GB of +RAM, and this is part of why we used an AWS instance with 32 GB of RAM as the +reference platform. On the Macbooks, we found we could work around the memory +problem by telling DuckDB it had the use of more memory than its default +[80% heuristic for `memory_limit`](https://duckdb.org/docs/configuration/overview.html). +The scripts support an environment variable to make it easy to increase this +value, e.g., we found the scripts ran successfully at 16 GB: + +``` +$ DUCKDB_MEMORY_LIMIT="16GB" ./benchmark.sh +``` + +Of course, this ultimately caused swapping on our Macbook and a significant +hit to performance, but it at least allowed the scripts to run without +failure. diff --git a/scripts/super-cmd-perf/benchmark.sh b/scripts/super-cmd-perf/benchmark.sh new file mode 100755 index 0000000000..35c9449388 --- /dev/null +++ b/scripts/super-cmd-perf/benchmark.sh @@ -0,0 +1,97 @@ +#!/bin/bash -xv +set -euo pipefail +export RUNNING_ON_AWS_EC2="" + +# If we can detect we're running on an AWS EC2 m6idn.2xlarge instance, we'll +# treat it as a scratch host, installing all needed software and using the +# local SSD for best I/O performance. +if command -v dmidecode && [ "$(sudo dmidecode --string system-uuid | cut -c1-3)" == "ec2" ] && [ "$(TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-type)" == "m6idn.2xlarge" ]; then + + export RUNNING_ON_AWS_EC2=true + + sudo apt-get -y update + sudo apt-get -y upgrade + sudo apt-get -y install make gcc unzip hyperfine + + # Prepare local SSD for best I/O performance + sudo fdisk -l /dev/nvme1n1 + sudo mkfs.ext4 -E discard -F /dev/nvme1n1 + sudo mount /dev/nvme1n1 /mnt + sudo chown ubuntu:ubuntu /mnt + sudo chmod 777 /mnt + echo 'export TMPDIR="/mnt/tmpdir"' >> "$HOME"/.profile + mkdir /mnt/tmpdir + + # Install ClickHouse + if ! command -v clickhouse-client > /dev/null 2>&1; then + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg + curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg + echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee \ + /etc/apt/sources.list.d/clickhouse.list + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y clickhouse-client + fi + + # Install DuckDB + if ! command -v duckdb > /dev/null 2>&1; then + curl -L -O https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip + unzip duckdb_cli-linux-amd64.zip + sudo mv duckdb /usr/local/bin + fi + + # Install Rust + curl -L -O https://static.rust-lang.org/dist/rust-1.82.0-x86_64-unknown-linux-gnu.tar.xz + tar xf rust-1.82.0-x86_64-unknown-linux-gnu.tar.xz + sudo rust-1.82.0-x86_64-unknown-linux-gnu/install.sh + # shellcheck disable=SC2016 + echo 'export PATH="$PATH:$HOME/.cargo/bin"' >> "$HOME"/.profile + + # Install DataFusion CLI + if ! command -v datafusion-cli > /dev/null 2>&1; then + cargo install datafusion-cli + fi + + # Install Go + if ! command -v go > /dev/null 2>&1; then + curl -L -O https://go.dev/dl/go1.23.3.linux-amd64.tar.gz + rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz + # shellcheck disable=SC2016 + echo 'export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin"' >> "$HOME"/.profile + source "$HOME"/.profile + fi + + # Install SuperDB + if ! command -v super > /dev/null 2>&1; then + git clone https://github.com/brimdata/super.git + cd super + make install + fi + + cd scripts/super-cmd-perf + +fi + +rundir="$(date +%F_%T)" +mkdir "$rundir" +report="$rundir/report_$rundir.md" + +echo -e "|**Software**|**Version**|\n|-|-|" | tee -a "$report" +for software in super duckdb datafusion-cli clickhouse +do + if ! command -v $software > /dev/null; then + echo "error: \"$software\" not found in PATH" + exit 1 + fi + echo "|$software|$($software --version)|" | tee -a "$report" +done +echo >> "$report" + +# Prepare the test data +./prep-data.sh "$rundir" + +# Run the queries and generate the summary report +./run-queries.sh "$rundir" + +if [ -n "$RUNNING_ON_AWS_EC2" ]; then + mv "$HOME/runlog.txt" "$rundir" +fi diff --git a/scripts/super-cmd-perf/prep-data.sh b/scripts/super-cmd-perf/prep-data.sh new file mode 100755 index 0000000000..a1035092bf --- /dev/null +++ b/scripts/super-cmd-perf/prep-data.sh @@ -0,0 +1,58 @@ +#!/bin/bash -xv +set -euo pipefail +pushd "$(cd "$(dirname "$0")" && pwd)" + +if [ "$#" -ne 1 ]; then + echo "Specify results directory string" + exit 1 +fi +rundir="$(pwd)/$1" +mkdir -p "$rundir" + +RUNNING_ON_AWS_EC2="${RUNNING_ON_AWS_EC2:-}" +if [ -n "$RUNNING_ON_AWS_EC2" ]; then + cd /mnt +fi + +function run_cmd { + outputfile="$1" + shift + { hyperfine \ + --show-output \ + --warmup 0 \ + --runs 1 \ + --time-unit second \ + "$@" ; + } \ + > "$outputfile" \ + 2>&1 +} + +mkdir gharchive_gz +cd gharchive_gz +for num in $(seq 0 23) +do + curl -L -O "https://data.gharchive.org/2023-02-08-${num}.json.gz" +done +cd .. + +DUCKDB_MEMORY_LIMIT="${DUCKDB_MEMORY_LIMIT:-}" +if [ -n "$DUCKDB_MEMORY_LIMIT" ]; then + increase_duckdb_memory_limit='SET memory_limit = '\'"${DUCKDB_MEMORY_LIMIT}"\''; ' +else + increase_duckdb_memory_limit="" +fi + +run_cmd \ + "$rundir/duckdb-table-create.out" \ + "duckdb gha.db -c \"${increase_duckdb_memory_limit}CREATE TABLE gha AS FROM read_json('gharchive_gz/*.json.gz', union_by_name=true)\"" + +run_cmd \ + "$rundir/duckdb-parquet-create.out" \ + "duckdb gha.db -c \"${increase_duckdb_memory_limit}COPY (from gha) TO 'gha.parquet'\"" + +run_cmd \ + "$rundir/super-bsup-create.out" \ + "super -o gha.bsup gharchive_gz/*.json.gz" + +du -h gha.db gha.parquet gha.bsup gharchive_gz diff --git a/scripts/super-cmd-perf/queries/agg.sql b/scripts/super-cmd-perf/queries/agg.sql new file mode 100644 index 0000000000..074916587c --- /dev/null +++ b/scripts/super-cmd-perf/queries/agg.sql @@ -0,0 +1,4 @@ +SELECT count(),type +FROM '__SOURCE__' +WHERE repo.name='duckdb/duckdb' +GROUP BY type diff --git a/scripts/super-cmd-perf/queries/count.sql b/scripts/super-cmd-perf/queries/count.sql new file mode 100644 index 0000000000..289bbbd13c --- /dev/null +++ b/scripts/super-cmd-perf/queries/count.sql @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE actor.login='johnbieren' diff --git a/scripts/super-cmd-perf/queries/search+.spq b/scripts/super-cmd-perf/queries/search+.spq new file mode 100644 index 0000000000..5d081071f0 --- /dev/null +++ b/scripts/super-cmd-perf/queries/search+.spq @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE grep('in case you have any feedback 😊') diff --git a/scripts/super-cmd-perf/queries/search+.sql b/scripts/super-cmd-perf/queries/search+.sql new file mode 100644 index 0000000000..7ca7ee7efd --- /dev/null +++ b/scripts/super-cmd-perf/queries/search+.sql @@ -0,0 +1,489 @@ +SELECT count() +FROM '__SOURCE__' +WHERE + id LIKE '%in case you have any feedback 😊%' + OR type LIKE '%in case you have any feedback 😊%' + OR actor.login LIKE '%in case you have any feedback 😊%' + OR actor.display_login LIKE '%in case you have any feedback 😊%' + OR actor.gravatar_id LIKE '%in case you have any feedback 😊%' + OR actor.url LIKE '%in case you have any feedback 😊%' + OR actor.avatar_url LIKE '%in case you have any feedback 😊%' + OR repo.name LIKE '%in case you have any feedback 😊%' + OR repo.url LIKE '%in case you have any feedback 😊%' + OR payload.ref LIKE '%in case you have any feedback 😊%' + OR payload.ref_type LIKE '%in case you have any feedback 😊%' + OR payload.pusher_type LIKE '%in case you have any feedback 😊%' + OR payload.head LIKE '%in case you have any feedback 😊%' + OR payload.before LIKE '%in case you have any feedback 😊%' + OR payload.master_branch LIKE '%in case you have any feedback 😊%' + OR payload.description LIKE '%in case you have any feedback 😊%' + OR payload.action LIKE '%in case you have any feedback 😊%' + OR org.login LIKE '%in case you have any feedback 😊%' + OR org.gravatar_id LIKE '%in case you have any feedback 😊%' + OR org.url LIKE '%in case you have any feedback 😊%' + OR org.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.review.node_id LIKE '%in case you have any feedback 😊%' + OR payload.review.user.login LIKE '%in case you have any feedback 😊%' + OR payload.review.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.review.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.review.user.url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.review.user.type LIKE '%in case you have any feedback 😊%' + OR payload.review.body LIKE '%in case you have any feedback 😊%' + OR payload.review.commit_id LIKE '%in case you have any feedback 😊%' + OR payload.review.state LIKE '%in case you have any feedback 😊%' + OR payload.review.html_url LIKE '%in case you have any feedback 😊%' + OR payload.review.pull_request_url LIKE '%in case you have any feedback 😊%' + OR payload.review.author_association LIKE '%in case you have any feedback 😊%' + OR payload.review._links.html.href LIKE '%in case you have any feedback 😊%' + OR payload.review._links.pull_request.href LIKE '%in case you have any feedback 😊%' + OR payload.comment.url LIKE '%in case you have any feedback 😊%' + OR payload.comment.html_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.node_id LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.login LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.user.type LIKE '%in case you have any feedback 😊%' + OR payload.comment.path LIKE '%in case you have any feedback 😊%' + OR payload.comment.commit_id LIKE '%in case you have any feedback 😊%' + OR payload.comment.author_association LIKE '%in case you have any feedback 😊%' + OR payload.comment.body LIKE '%in case you have any feedback 😊%' + OR payload.comment.reactions.url LIKE '%in case you have any feedback 😊%' + OR payload.comment.issue_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.diff_hunk LIKE '%in case you have any feedback 😊%' + OR payload.comment.original_commit_id LIKE '%in case you have any feedback 😊%' + OR payload.comment.pull_request_url LIKE '%in case you have any feedback 😊%' + OR payload.comment.start_side LIKE '%in case you have any feedback 😊%' + OR payload.comment.side LIKE '%in case you have any feedback 😊%' + OR payload.issue.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.repository_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.labels_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.comments_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.html_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.node_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.title LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.login LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.user.type LIKE '%in case you have any feedback 😊%' + OR payload.issue.state LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.login LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.node_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.html_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.following_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.assignee.type LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.html_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.labels_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.node_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.title LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.description LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.login LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.node_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.html_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.following_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.creator.type LIKE '%in case you have any feedback 😊%' + OR payload.issue.milestone.state LIKE '%in case you have any feedback 😊%' + OR payload.issue.author_association LIKE '%in case you have any feedback 😊%' + OR payload.issue.active_lock_reason LIKE '%in case you have any feedback 😊%' + OR payload.issue.body LIKE '%in case you have any feedback 😊%' + OR payload.issue.reactions.url LIKE '%in case you have any feedback 😊%' + OR payload.issue.timeline_url LIKE '%in case you have any feedback 😊%' + OR payload.issue.state_reason LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.diff_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.patch_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.issue_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.state LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.title LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.user.type LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.body LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merge_commit_sha LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.commits_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.review_comments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.review_comment_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.comments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.statuses_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.label LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.ref LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.sha LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.user.type LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.name LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.full_name LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.owner.type LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.description LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.forks_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.keys_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.collaborators_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.teams_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.hooks_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.issue_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.assignees_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.branches_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.tags_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.blobs_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.git_tags_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.git_refs_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.trees_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.statuses_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.languages_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.stargazers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.contributors_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.subscribers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.subscription_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.commits_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.git_commits_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.comments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.contents_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.compare_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.merges_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.archive_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.downloads_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.issues_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.pulls_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.milestones_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.notifications_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.labels_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.releases_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.deployments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.git_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.ssh_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.clone_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.svn_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.homepage LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.language LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.mirror_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.visibility LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.head.repo.default_branch LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.label LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.ref LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.sha LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.user.type LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.name LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.full_name LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.owner.type LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.description LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.forks_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.keys_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.collaborators_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.teams_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.hooks_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.issue_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.assignees_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.branches_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.tags_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.blobs_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.git_tags_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.git_refs_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.trees_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.statuses_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.languages_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.stargazers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.contributors_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.subscribers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.subscription_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.commits_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.git_commits_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.comments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.contents_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.compare_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.merges_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.archive_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.downloads_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.issues_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.pulls_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.milestones_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.notifications_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.labels_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.releases_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.deployments_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.git_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.ssh_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.clone_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.svn_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.homepage LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.language LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.mirror_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.visibility LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.base.repo.default_branch LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.self.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.html.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.issue.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.comments.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.review_comments.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.review_comment.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.commits.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request._links.statuses.href LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.author_association LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.active_lock_reason LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.mergeable_state LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.login LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.node_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.html_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.following_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.pull_request.merged_by.type LIKE '%in case you have any feedback 😊%' + OR payload.forkee.node_id LIKE '%in case you have any feedback 😊%' + OR payload.forkee.name LIKE '%in case you have any feedback 😊%' + OR payload.forkee.full_name LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.login LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.node_id LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.html_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.following_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.events_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.owner.type LIKE '%in case you have any feedback 😊%' + OR payload.forkee.html_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.description LIKE '%in case you have any feedback 😊%' + OR payload.forkee.url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.forks_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.keys_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.collaborators_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.teams_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.hooks_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.issue_events_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.events_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.assignees_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.branches_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.tags_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.blobs_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.git_tags_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.git_refs_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.trees_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.statuses_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.languages_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.stargazers_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.contributors_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.subscribers_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.subscription_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.commits_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.git_commits_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.comments_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.contents_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.compare_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.merges_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.archive_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.downloads_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.issues_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.pulls_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.milestones_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.notifications_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.labels_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.releases_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.deployments_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.git_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.ssh_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.clone_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.svn_url LIKE '%in case you have any feedback 😊%' + OR payload.forkee.homepage LIKE '%in case you have any feedback 😊%' + OR payload.forkee.visibility LIKE '%in case you have any feedback 😊%' + OR payload.forkee.default_branch LIKE '%in case you have any feedback 😊%' + OR payload.release.url LIKE '%in case you have any feedback 😊%' + OR payload.release.assets_url LIKE '%in case you have any feedback 😊%' + OR payload.release.upload_url LIKE '%in case you have any feedback 😊%' + OR payload.release.html_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.login LIKE '%in case you have any feedback 😊%' + OR payload.release.author.node_id LIKE '%in case you have any feedback 😊%' + OR payload.release.author.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.release.author.url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.html_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.following_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.events_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.release.author.type LIKE '%in case you have any feedback 😊%' + OR payload.release.node_id LIKE '%in case you have any feedback 😊%' + OR payload.release.tag_name LIKE '%in case you have any feedback 😊%' + OR payload.release.target_commitish LIKE '%in case you have any feedback 😊%' + OR payload.release.name LIKE '%in case you have any feedback 😊%' + OR payload.release.tarball_url LIKE '%in case you have any feedback 😊%' + OR payload.release.zipball_url LIKE '%in case you have any feedback 😊%' + OR payload.release.body LIKE '%in case you have any feedback 😊%' + OR payload.release.short_description_html LIKE '%in case you have any feedback 😊%' + OR payload.release.discussion_url LIKE '%in case you have any feedback 😊%' + OR payload.member.login LIKE '%in case you have any feedback 😊%' + OR payload.member.node_id LIKE '%in case you have any feedback 😊%' + OR payload.member.avatar_url LIKE '%in case you have any feedback 😊%' + OR payload.member.gravatar_id LIKE '%in case you have any feedback 😊%' + OR payload.member.url LIKE '%in case you have any feedback 😊%' + OR payload.member.html_url LIKE '%in case you have any feedback 😊%' + OR payload.member.followers_url LIKE '%in case you have any feedback 😊%' + OR payload.member.following_url LIKE '%in case you have any feedback 😊%' + OR payload.member.gists_url LIKE '%in case you have any feedback 😊%' + OR payload.member.starred_url LIKE '%in case you have any feedback 😊%' + OR payload.member.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR payload.member.organizations_url LIKE '%in case you have any feedback 😊%' + OR payload.member.repos_url LIKE '%in case you have any feedback 😊%' + OR payload.member.events_url LIKE '%in case you have any feedback 😊%' + OR payload.member.received_events_url LIKE '%in case you have any feedback 😊%' + OR payload.member.type LIKE '%in case you have any feedback 😊%' diff --git a/scripts/super-cmd-perf/queries/search.spq b/scripts/super-cmd-perf/queries/search.spq new file mode 100644 index 0000000000..b289be1760 --- /dev/null +++ b/scripts/super-cmd-perf/queries/search.spq @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE grep('in case you have any feedback 😊', payload.pull_request.body) diff --git a/scripts/super-cmd-perf/queries/search.sql b/scripts/super-cmd-perf/queries/search.sql new file mode 100644 index 0000000000..b4feba2741 --- /dev/null +++ b/scripts/super-cmd-perf/queries/search.sql @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' diff --git a/scripts/super-cmd-perf/queries/union-clickhouse.sql b/scripts/super-cmd-perf/queries/union-clickhouse.sql new file mode 100644 index 0000000000..ecea189b37 --- /dev/null +++ b/scripts/super-cmd-perf/queries/union-clickhouse.sql @@ -0,0 +1,13 @@ +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '__SOURCE__' + UNION ALL + SELECT arrayJoin(payload.pull_request.assignees).login assignee + FROM '__SOURCE__' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 diff --git a/scripts/super-cmd-perf/queries/union-datafusion.sql b/scripts/super-cmd-perf/queries/union-datafusion.sql new file mode 100644 index 0000000000..5346c3d211 --- /dev/null +++ b/scripts/super-cmd-perf/queries/union-datafusion.sql @@ -0,0 +1,15 @@ +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '__SOURCE__' + UNION ALL + SELECT object.login as assignee FROM ( + SELECT unnest(payload.pull_request.assignees) object + FROM '__SOURCE__' + ) +) +SELECT assignee, count() count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 diff --git a/scripts/super-cmd-perf/queries/union.spq b/scripts/super-cmd-perf/queries/union.spq new file mode 100644 index 0000000000..bb53c5fe9f --- /dev/null +++ b/scripts/super-cmd-perf/queries/union.spq @@ -0,0 +1,6 @@ +FROM '__SOURCE__' +| UNNEST [...payload.pull_request.assignees, payload.pull_request.assignee] +| WHERE this IS NOT NULL +| AGGREGATE count() BY assignee:=login +| ORDER BY count DESC +| LIMIT 5 diff --git a/scripts/super-cmd-perf/queries/union.sql b/scripts/super-cmd-perf/queries/union.sql new file mode 100644 index 0000000000..163e9db4e1 --- /dev/null +++ b/scripts/super-cmd-perf/queries/union.sql @@ -0,0 +1,13 @@ +WITH assignees AS ( + SELECT payload.pull_request.assignee.login assignee + FROM '__SOURCE__' + UNION ALL + SELECT unnest(payload.pull_request.assignees).login assignee + FROM '__SOURCE__' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 diff --git a/scripts/super-cmd-perf/run-queries.sh b/scripts/super-cmd-perf/run-queries.sh new file mode 100755 index 0000000000..d715738b6d --- /dev/null +++ b/scripts/super-cmd-perf/run-queries.sh @@ -0,0 +1,146 @@ +#!/bin/bash -xv +set -euo pipefail +pushd "$(cd "$(dirname "$0")" && pwd)" + +if [ "$#" -ne 1 ]; then + echo "Specify results directory string" + exit 1 +fi +rundir="$(pwd)/$1" +mkdir -p "$rundir" + +RUNNING_ON_AWS_EC2="${RUNNING_ON_AWS_EC2:-}" +if [ -n "$RUNNING_ON_AWS_EC2" ]; then + storage="/mnt/" +else + storage="" +fi + +warmups=1 +runs=1 +report="$rundir/report_$(basename "$rundir").md" +csv_report="$rundir/report_$(basename "$rundir").csv" + +function run_query { + cmd="$1" + shift + queryfile="$1" + shift + source="$1" + shift + outputfile="$rundir/$cmd-$queryfile-$source.out" + + final_query=$(mktemp) + + DUCKDB_MEMORY_LIMIT="${DUCKDB_MEMORY_LIMIT:-}" + if [ "$cmd" == "duckdb" ] && [ -n "$DUCKDB_MEMORY_LIMIT" ]; then + echo 'SET memory_limit = '\'"${DUCKDB_MEMORY_LIMIT}"\''; ' >> "$final_query" + fi + + if [ "$source" == "gha" ]; then + sed -e "s/__SOURCE__/$source/" "queries/$queryfile" >> "$final_query" + else + sed -e "s/__SOURCE__/${storage//\//\\/}${source}/" "queries/$queryfile" >> "$final_query" + fi + + if [ "$cmd" == "super" ]; then + if [ "$source" == "gha.parquet" ]; then + cmd="SUPER_VAM=1 super" + fi + cmd="$cmd -z -I $final_query" + elif [ "$cmd" == "duckdb" ]; then + if [ "$source" == "gha" ]; then + cmd="duckdb ${storage}gha.db" + fi + cmd="$cmd < $final_query" + elif [ "$cmd" == "datafusion" ]; then + cmd="datafusion-cli --file $final_query" + elif [ "$cmd" == "clickhouse" ]; then + cmd="clickhouse --queries-file $final_query" + fi + + echo -e "About to execute\n================\n$cmd\n\nWith query\n==========" > "$outputfile" + cat "$final_query" >> "$outputfile" + echo >> "$outputfile" + + { hyperfine \ + --show-output \ + --warmup $warmups \ + --runs $runs \ + --time-unit second \ + "$cmd" ; + } \ + >> "$outputfile" \ + 2>&1 + + rm -f "$final_query" +} + +echo "|**Tool**|**Format**|**search**|**search+**|**count**|**agg**|**union**|" >> "$report" +echo "|-|-|-|-|-|-|-|" >> "$report" +echo "Tool,Format,search,search+,count,agg,union" > "$csv_report" + +for source in gha.bsup gha.parquet +do + echo -n "|\`super\`|\`${source/gha./}\`|" >> "$report" + echo -n "super,${source/gha./}" >> "$csv_report" + for queryfile in search.spq search+.spq count.sql agg.sql union.spq + do + if [ "$source" == "gha.parquet" ] && { [ "$queryfile" == "search.spq" ] || [ "$queryfile" == "search+.spq" ] || [ "$queryfile" == "union.spq" ]; }; then + echo -n "N/A|" >> "$report" + echo -n ",N/A" >> "$csv_report" + continue + fi + run_query super $queryfile "$source" + result=$(grep Time < "$rundir/super-$queryfile-$source.out" | awk '{ print $4 }') + echo -n "$result" >> "$report" + echo -n "|" >> "$report" + echo -n ",$result" >> "$csv_report" + done + echo >> "$report" + echo >> "$csv_report" +done + +for source in gha gha.parquet +do + duckdb_source=${source/gha\./} + duckdb_source=${duckdb_source/gha/db} + echo -n "|\`duckdb\`|\`$duckdb_source\`|" >> "$report" + echo -n "duckdb,$duckdb_source" >> "$csv_report" + for queryfile in search.sql search+.sql count.sql agg.sql union.sql + do + run_query duckdb $queryfile "$source" + result=$(grep Time < "$rundir/duckdb-$queryfile-$source.out" | awk '{ print $4 }') + echo -n "$result" >> "$report" + echo -n "|" >> "$report" + echo -n ",$result" >> "$csv_report" + done + echo >> "$report" + echo >> "$csv_report" +done + +echo -n "|\`datafusion\`|\`parquet\`|" >> "$report" +echo -n "datafusion,parquet" >> "$csv_report" +for queryfile in search.sql search+.sql count.sql agg.sql union-datafusion.sql +do + run_query datafusion $queryfile gha.parquet + result=$(grep Time < "$rundir/datafusion-$queryfile-$source.out" | awk '{ print $4 }') + echo -n "$result" >> "$report" + echo -n "|" >> "$report" + echo -n ",$result" >> "$csv_report" +done +echo >> "$report" +echo >> "$csv_report" + +echo -n "|\`clickhouse\`|\`parquet\`|" >> "$report" +echo -n "clickhouse,parquet" >> "$csv_report" +for queryfile in search.sql search+.sql count.sql agg.sql union-clickhouse.sql +do + run_query clickhouse $queryfile gha.parquet + result=$(grep Time < "$rundir/clickhouse-$queryfile-$source.out" | awk '{ print $4 }') + echo -n "$result" >> "$report" + echo -n "|" >> "$report" + echo -n ",$result" >> "$csv_report" +done +echo >> "$report" +echo >> "$csv_report" From 77e8c85e01c806a17209d350466c22536173f2b0 Mon Sep 17 00:00:00 2001 From: Phil Rzewski Date: Mon, 2 Dec 2024 12:13:10 -0800 Subject: [PATCH 17/22] Use linkspector for markdown link checking and fix the broken links it found (#5511) Use linkspector for markdown link checking and fix the links it found --- .../workflows/markdown-link-check-config.json | 19 ------------------- .github/workflows/markdown-lint.yaml | 6 +++--- .linkspector.yml | 5 +++++ CHANGELOG.md | 12 ++++++------ docs/README.md | 2 +- docs/commands/super.md | 2 +- docs/tutorials/zed.md | 2 +- 7 files changed, 17 insertions(+), 31 deletions(-) delete mode 100644 .github/workflows/markdown-link-check-config.json create mode 100644 .linkspector.yml diff --git a/.github/workflows/markdown-link-check-config.json b/.github/workflows/markdown-link-check-config.json deleted file mode 100644 index beede2705c..0000000000 --- a/.github/workflows/markdown-link-check-config.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "ignorePatterns": [ - { - "pattern": "^http://localhost:9867" - }, - { - "pattern": "^https://suricata.io" - } - ], - "retryOn429": true, - "httpHeaders": [ - { - "urls": ["https://docs.github.com/"], - "headers": { - "Accept-Encoding": "zstd, br, gzip, deflate" - } - } - ] -} diff --git a/.github/workflows/markdown-lint.yaml b/.github/workflows/markdown-lint.yaml index 9cb61b46b8..17316195da 100644 --- a/.github/workflows/markdown-lint.yaml +++ b/.github/workflows/markdown-lint.yaml @@ -15,10 +15,10 @@ jobs: - uses: actions/checkout@v4 - name: Lint run: make markdown-lint - - uses: gaurav-nelson/github-action-markdown-link-check@v1 + - uses: umbrelladocs/action-linkspector@v1 with: - config-file: .github/workflows/markdown-link-check-config.json - use-quiet-mode: yes + fail_on_error: true + filter_mode: nofilter - name: Inform Slack users of link check failures uses: tiloio/slack-webhook-action@v1.1.2 if: failure() && github.ref_name == 'main' diff --git a/.linkspector.yml b/.linkspector.yml new file mode 100644 index 0000000000..96f0ae2f26 --- /dev/null +++ b/.linkspector.yml @@ -0,0 +1,5 @@ +dirs: + - . +useGitIgnore: true +excludedDirs: + - node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 120fc2e3a4..b375ff021b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,7 +146,7 @@ * Fix an issue where certain ZNG files could not be read and caused a `control` error (#4579) * Fix an issue where `zed serve` would exit if it tried to write to a closed socket (#4587) * Improve JSON output for Zed [maps](docs/formats/zed.md#24-map) (#4589) -* Add the [`zed vacuum`](docs/commands/super-db.md#215-vacuum) command (#4577, #4598, #4600) +* Add the [`zed vacuum`](docs/commands/super-db.md#vacuum) command (#4577, #4598, #4600) ## v1.7.0 * Add [`regexp_replace()`](docs/language/functions/regexp_replace.md) function for replacing regular expression matches in a string (#4435, #4449) @@ -203,7 +203,7 @@ * Improve handling of errors during [shaping](docs/language/shaping.md) (#4067, #4069) * Allow use of a pool name regexp/glob pattern with the [`from` operator](docs/language/operators/from.md) (#4072, #4075) * Add [`levenshtein()` function](docs/language/functions/levenshtein.md) for fuzzy string matching (#4104) -* Allow use of any filter with [`zed delete -where`](docs/commands/super-db.md#24-delete) (#4100, #4124, #4126, #4125, #4127) +* Allow use of any filter with [`zed delete -where`](docs/commands/super-db.md#delete) (#4100, #4124, #4126, #4125, #4127) * Add [`regexp()`](docs/language/functions/regexp.md) function for regular expression searches and capture groups (#4145, #4158) * Add [`coalesce()`](docs/language/functions/coalesce.md) function for locating non-null/non-error values (#4172) * Add `line` format for sourcing newline-delimited input as strings (#4175) @@ -235,7 +235,7 @@ * Allow conversion of time values to other numeric types (#3816) * Remove scaling from duration and time conversions (#3809) * Add [`over` expressions](docs/language/lateral-subqueries.md#lateral-expressions) (#3797) -* Add `-where` flag to [`zed delete`](docs/commands/super-db.md#24-delete) (#3791) +* Add `-where` flag to [`zed delete`](docs/commands/super-db.md#delete) (#3791) * Allow base62 object IDs in lake API request bodies (#3783) * Remove `let` operator and [`over` operator](docs/language/operators/over.md)'s `as` clause (#3785) @@ -677,7 +677,7 @@ questions. * zqd: Add a Python `zqd` API client for use with tools like [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) (#1564) ## v0.22.0 -* zq: Change the implementation of the `union` type to conform with the [ZNG spec](docs/formats/bsup.md#3114-union-typedef) (#1245) +* zq: Change the implementation of the `union` type to conform with the [ZNG spec](docs/formats/bsup.md#215-union-typedef) (#1245) * zq: Make options/flags and version reporting consistent across CLI tools (#1249, #1254, #1256, #1296, #1323, #1334, #1328) * zqd: Fix an issue that was preventing flows in nanosecond pcaps from opening in Brim (#1243, #1241) * zq: Fix an issue where the TZNG reader did not recognize a bad record type as a syntax error (#1260) @@ -695,7 +695,7 @@ questions. * zql: Fix broken links in documentation (#1321, #1339) * zst: Introduce the [ZST format](docs/formats/csup.md) for columnar data based on ZNG (#1268, #1338) * pcap: Fix an issue where certain pcapng files could fail import with a `bad option length` error (#1341) -* zql: [Document the `**` operator](docs/language/README.md#search-syntax) for type-specific searches that look within nested records (#1337) +* zql: Document the `**` operator for type-specific searches that look within nested records (#1337) * zar: Change the archive data file layout to prepare for handing chunk files with overlapping ranges and improved S3 support (#1330) * zar: Support archive data files with overlapping time spans (#1348) * zqd: Add a page containing guidance for users that directly access the root `zqd` endpoint in a browser (#1350) @@ -745,7 +745,7 @@ questions. * zqd: Fix an issue with excess characters in Space names after upgrade (#1112) ## v0.19.0 -* zq: ZNG output is now LZ4-compressed by default (#1050, #1064, #1063, [ZNG spec](docs/formats/bsup.md#313-compressed-value-message-block)) +* zq: ZNG output is now LZ4-compressed by default (#1050, #1064, #1063, [ZNG spec](docs/formats/bsup.md#2-the-super-binary-format)) * zar: Adjust import size threshold to account for compression (#1082) * zqd: Support starting `zqd` with datapath set to an S3 path (#1072) * zq: Fix an issue with panics during pcap import (#1090) diff --git a/docs/README.md b/docs/README.md index 88447c6b0c..36ad0a4a89 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,7 @@ packaged up in the easy-to-understand [SuperPipe language](language/README.md). While `super` and its accompanying data formats are production quality, the project's -[SuperDB data lake](commands/super-db.md) is a bit [earlier in development](commands/super-db.md#status). +[SuperDB data lake](commands/super-db.md) is a bit earlier in development. ## Terminology diff --git a/docs/commands/super.md b/docs/commands/super.md index e7c72df485..57b2c62f00 100644 --- a/docs/commands/super.md +++ b/docs/commands/super.md @@ -793,7 +793,7 @@ WHERE id LIKE '%in case you have any feedback 😊%' OR payload.member.type LIKE '%in case you have any feedback 😊%' ``` There are 486 such fields. You can review the entire query in -[`search+.sql`](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/search%2B.sql). +[`search+.sql`](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/queries/search%2B.sql). In SuperSQL, `grep` allows for a much shorter query. ```sql diff --git a/docs/tutorials/zed.md b/docs/tutorials/zed.md index 3c21db432a..0a5b3b3385 100644 --- a/docs/tutorials/zed.md +++ b/docs/tutorials/zed.md @@ -10,7 +10,7 @@ analytics? This is where the `zed` command comes in. `zed` builds on the type system and language found in `zq` and adds a high performance data lake on top. > Note: `zed` is currently in alpha form. Check out its current status in the -> [`super db` command](../commands/super-db.md#status) documentation.. +> [`super db` command](../commands/super-db.md) documentation.. ## Creating a Lake From 8ba613dc1cbb2aa9675b2f2b0542a34382399d86 Mon Sep 17 00:00:00 2001 From: Phil Rzewski Date: Mon, 2 Dec 2024 12:13:28 -0800 Subject: [PATCH 18/22] Fix URL in curl for running super cmd perf script (#5512) --- scripts/super-cmd-perf/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/super-cmd-perf/README.md b/scripts/super-cmd-perf/README.md index 4465c71574..c5e935901c 100644 --- a/scripts/super-cmd-perf/README.md +++ b/scripts/super-cmd-perf/README.md @@ -28,7 +28,7 @@ Assuming a freshly-created `m6idn.2xlarge` instance running Ubuntu 24.04, to start the run: ``` -curl -s https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/benchmark.sh | bash -xv 2>&1 | tee runlog.txt +curl -s https://raw.githubusercontent.com/brimdata/super/refs/heads/main/scripts/super-cmd-perf/benchmark.sh | bash -xv 2>&1 | tee runlog.txt ``` The run proceeds in three phases: From 26269cc3f9875df427ef7e9b9ff6050820d96a71 Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 3 Dec 2024 12:04:12 -0500 Subject: [PATCH 19/22] CSUP: Allow multiple objects (#5507) This pr changes the protocol for CSUP files so that a single file can contain multiple vng Objects. When writing a CSUP file a new object is created every 120,000 values. --- vng/object.go | 4 +++ vng/writer.go | 17 +++++++++--- zio/vngio/reader.go | 63 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/vng/object.go b/vng/object.go index 735ee52a17..27ed7cc869 100644 --- a/vng/object.go +++ b/vng/object.go @@ -75,6 +75,10 @@ func (o *Object) NewReader(zctx *super.Context) (zio.Reader, error) { return NewZedReader(zctx, o.meta, o.readerAt) } +func (o *Object) Size() uint64 { + return HeaderSize + o.header.MetaSize + o.header.DataSize +} + func readMetadata(r io.Reader) (Metadata, error) { zctx := super.NewContext() zr := zngio.NewReader(zctx, r) diff --git a/vng/writer.go b/vng/writer.go index ff8c6d55cf..91184dd066 100644 --- a/vng/writer.go +++ b/vng/writer.go @@ -11,6 +11,8 @@ import ( "github.com/brimdata/super/zson" ) +var maxObjectSize uint32 = 120_000 + // Writer implements the zio.Writer interface. A Writer creates a vector // VNG object from a stream of super.Records. type Writer struct { @@ -30,7 +32,7 @@ func NewWriter(w io.WriteCloser) *Writer { } func (w *Writer) Close() error { - firstErr := w.finalize() + firstErr := w.finalizeObject() if err := w.writer.Close(); err != nil && firstErr == nil { firstErr = err } @@ -38,10 +40,16 @@ func (w *Writer) Close() error { } func (w *Writer) Write(val super.Value) error { - return w.dynamic.Write(val) + if err := w.dynamic.Write(val); err != nil { + return err + } + if w.dynamic.len >= maxObjectSize { + return w.finalizeObject() + } + return nil } -func (w *Writer) finalize() error { +func (w *Writer) finalizeObject() error { meta, dataSize, err := w.dynamic.Encode() if err != nil { return fmt.Errorf("system error: could not encode VNG metadata: %w", err) @@ -74,5 +82,8 @@ func (w *Writer) finalize() error { if err := w.dynamic.Emit(w.writer); err != nil { return fmt.Errorf("system error: could not write VNG data section: %w", err) } + // Set new dynamic so we can write the next section. + w.dynamic = NewDynamicEncoder() + w.zctx.Reset() return nil } diff --git a/zio/vngio/reader.go b/zio/vngio/reader.go index 3136aee0a3..1fec62ce72 100644 --- a/zio/vngio/reader.go +++ b/zio/vngio/reader.go @@ -3,6 +3,7 @@ package vngio import ( "errors" "io" + "math" "github.com/brimdata/super" "github.com/brimdata/super/pkg/field" @@ -10,14 +11,72 @@ import ( "github.com/brimdata/super/zio" ) +type reader struct { + zctx *super.Context + objects []*vng.Object + n int + readerAt io.ReaderAt + reader zio.Reader +} + func NewReader(zctx *super.Context, r io.Reader, fields []field.Path) (zio.Reader, error) { ra, ok := r.(io.ReaderAt) if !ok { return nil, errors.New("Super Columnar requires a seekable input") } - o, err := vng.NewObject(ra) + objects, err := readObjects(ra) if err != nil { return nil, err } - return o.NewReader(zctx) + return &reader{ + zctx: zctx, + objects: objects, + readerAt: ra, + }, nil +} + +func (r *reader) Read() (*super.Value, error) { +again: + if r.reader == nil { + if r.n >= len(r.objects) { + return nil, nil + } + o := r.objects[r.n] + r.n++ + var err error + if r.reader, err = o.NewReader(r.zctx); err != nil { + return nil, err + } + } + v, err := r.reader.Read() + if v == nil && err == nil { + r.reader = nil + goto again + } + return v, err +} + +func (r *reader) Close() error { + if closer, ok := r.readerAt.(io.Closer); ok { + return closer.Close() + } + return nil +} + +func readObjects(r io.ReaderAt) ([]*vng.Object, error) { + var objects []*vng.Object + var start int64 + for { + // NewObject puts the right end to the passed in SectionReader and since + // the end is unkown just pass MaxInt64. + o, err := vng.NewObject(io.NewSectionReader(r, start, math.MaxInt64)) + if err != nil { + if err == io.EOF && len(objects) > 0 { + return objects, nil + } + return nil, err + } + objects = append(objects, o) + start += int64(o.Size()) + } } From 5ff9972780f4b4ec82e510843446adc5b7f1a615 Mon Sep 17 00:00:00 2001 From: Phil Rzewski Date: Tue, 3 Dec 2024 13:04:03 -0800 Subject: [PATCH 20/22] Include ClickHouse beta JSON type results in super command doc (#5513) Run super cmd perf queries with ClickHouse JSON type --- docs/commands/super.md | 461 +++++++++++------ scripts/super-cmd-perf/README.md | 5 + scripts/super-cmd-perf/benchmark.sh | 23 +- scripts/super-cmd-perf/clickhouse-storage.xml | 5 + .../clickhouse-table-create.sql | 3 + scripts/super-cmd-perf/prep-data.sh | 14 + .../queries/agg-clickhouse-db.sql | 5 + .../queries/count-clickhouse-db.sql | 3 + .../queries/search+-clickhouse-db.sql | 489 ++++++++++++++++++ .../queries/search-clickhouse-db.sql | 3 + .../queries/union-clickhouse-db.sql | 13 + scripts/super-cmd-perf/run-queries.sh | 26 +- 12 files changed, 888 insertions(+), 162 deletions(-) create mode 100644 scripts/super-cmd-perf/clickhouse-storage.xml create mode 100644 scripts/super-cmd-perf/clickhouse-table-create.sql create mode 100644 scripts/super-cmd-perf/queries/agg-clickhouse-db.sql create mode 100644 scripts/super-cmd-perf/queries/count-clickhouse-db.sql create mode 100644 scripts/super-cmd-perf/queries/search+-clickhouse-db.sql create mode 100644 scripts/super-cmd-perf/queries/search-clickhouse-db.sql create mode 100644 scripts/super-cmd-perf/queries/union-clickhouse-db.sql diff --git a/docs/commands/super.md b/docs/commands/super.md index 57b2c62f00..1dd9380f7c 100644 --- a/docs/commands/super.md +++ b/docs/commands/super.md @@ -669,28 +669,24 @@ measurements among SuperDB, [DataFusion](https://datafusion.apache.org/). We'll use the Parquet format to compare apples to apples -and also report results for the custom columnar database format of DuckDB +and also report results for the custom columnar database format of DuckDB, +the [new beta JSON type](https://clickhouse.com/blog/a-new-powerful-json-data-type-for-clickhouse) of ClickHouse, and the [Super Binary](../formats/bsup.md) format used by `super`. -We also experimented with loading our test data into a ClickHouse table using its -[new beta JSON type](https://clickhouse.com/blog/a-new-powerful-json-data-type-for-clickhouse). -Preliminary results showed a mix of good performance and failed queries. -We'll provide more detail on these tests soon. - The detailed steps shown [below](#appendix-2-running-the-tests) can be reproduced via [automated scripts](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf). -As of this writing in November 2024, [results](#the-test-results) were gathered on an AWS +As of this writing in December 2024, [results](#the-test-results) were gathered on an AWS [`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) instance with the following software versions: |**Software**|**Version**| |-|-| -|`super`|Commit `31760cd`| +|`super`|Commit `cc6949f`| |`duckdb`|`v1.1.3` 19864453f7| |`datafusion-cli`|datafusion-cli `43.0.0`| -|`clickhouse`|ClickHouse local version `24.10.3.21` (official build)| +|`clickhouse`|ClickHouse local version `24.11.1.2557` (official build)| -The complete run logs are [archived here](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz). +The complete run logs are [archived here](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-12-03_00-43-29.tgz). ### The Test Data @@ -721,6 +717,15 @@ We then created a Parquet file called `gha.parquet` with this command: ``` duckdb gha.db -c "COPY (from gha) TO 'gha.parquet'" ``` +To create a ClickHouse table using their beta JSON type, after starting +a ClickHouse server we defined the single-column schema before loading the +data using this command: +``` +clickhouse-client --query " + SET enable_json_type = 1; + CREATE TABLE gha (v JSON) ENGINE MergeTree() ORDER BY tuple(); + INSERT INTO gha SELECT * FROM file('gharchive_gz/*.json.gz', JSONAsObject);" +``` To create a super-structed file for the `super` command, there is no need to [`fuse`](../language/operators/fuse.md) the data into a single schema (though `super` can still work with the fused schema in the Parquet file), and we simply ran this command to create a Super Binary @@ -730,15 +735,17 @@ super gharchive_gz/*.json.gz > gha.bsup ``` This code path in `super` is not multi-threaded so not particularly performant but, on our test machine, this runs more than 2x faster than the `duckdb` method of -creating a schema-fused table. +creating a schema-fused table and just a bit faster than `clickhouse` could +load the data to its beta JSON type. Here are the resulting file sizes: ``` -% du -h gha.db gha.parquet gha.bsup gharchive_gz -9.3G gha.db -4.6G gha.parquet -2.8G gha.bsup -2.2G gharchive_gz +% du -h gha.db gha.parquet gha.bsup gharchive_gz clickhouse/store +9.3G gha.db +4.6G gha.parquet +2.8G gha.bsup +2.2G gharchive_gz + 15G clickhouse/store ``` ### The Test Queries @@ -759,7 +766,7 @@ For the _search_ test, we'll search for the string pattern ``` in the field `payload.pull_request.body` and we'll just count the number of matches found. -The number of matches is small (3) so the query performance is dominated +The number of matches is small (2) so the query performance is dominated by the search. The SQL for this query is @@ -768,7 +775,14 @@ SELECT count() FROM 'gha.parquet' -- or gha WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' ``` -SuperSQL supports `LIKE` and could run this plain SQL query, but it also has a +To query the data stored with the ClickHouse JSON type, field +references needed to be rewritten relative to the named column `v`. +```sql +SELECT count() +FROM 'gha' +WHERE v.payload.pull_request.body LIKE '%in case you have any feedback 😊%' +``` +SuperSQL supports `LIKE` and could run the plain SQL query, but it also has a similar function called [`grep`](../language/functions/grep.md) that can operate over specified fields or default to all the string fields in any value. The SuperSQL query that uses `grep` is @@ -795,6 +809,17 @@ WHERE id LIKE '%in case you have any feedback 😊%' There are 486 such fields. You can review the entire query in [`search+.sql`](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf/queries/search%2B.sql). +To query the data stored with the ClickHouse JSON type, field +references needed to be rewritten relative to the named column `v`. +```sql +SELECT count() +FROM 'gha' +WHERE + v.id LIKE '%in case you have any feedback 😊%' + OR v.type LIKE '%in case you have any feedback 😊%' +... +``` + In SuperSQL, `grep` allows for a much shorter query. ```sql SELLECT count() @@ -813,6 +838,14 @@ FROM 'gha.parquet' -- or gha or 'gha.bsup' WHERE actor.login='johnbieren'" ``` +To query the data stored with the ClickHouse JSON type, field +references needed to be rewritten relative to the named column `v`. +```sql +SELECT count() +FROM 'gha' +WHERE v.actor.login='johnbieren' +``` + #### Agg In the _agg_ test, we filter the input and count the results grouped by the field `type` @@ -825,6 +858,28 @@ WHERE repo.name='duckdb/duckdb' GROUP BY type ``` +To query the data stored with the ClickHouse JSON type, field +references needed to be rewritten relative to the named column `v`. +```sql +SET allow_suspicious_types_in_group_by = 1; +SELECT count(),v.type +FROM 'gha' +WHERE v.repo.name='duckdb/duckdb' +GROUP BY v.type +``` + +Also, we had to enable the `allow_suspicious_types_in_group_by` setting as +shown above because an initial attempt to query with default settings +triggered the error: +``` +Code: 44. DB::Exception: Received from localhost:9000. DB::Exception: Data +types Variant/Dynamic are not allowed in GROUP BY keys, because it can lead +to unexpected results. Consider using a subcolumn with a specific data type +instead (for example 'column.Int64' or 'json.some.path.:Int64' if its a JSON +path subcolumn) or casting this column to a specific data type. Set setting +allow_suspicious_types_in_group_by = 1 in order to allow it. (ILLEGAL_COLUMN) +``` + #### Union The _union_ test is straight out of the DuckDB blog at the end of @@ -866,6 +921,34 @@ SELECT object.login as assignee FROM ( ``` and for ClickHouse, we had to use `arrayJoin` instead of `unnest`. +Even with this change ClickHouse could only run the query successfully against +the Parquet data, as after rewriting the field references to attempt to +query the data stored with the ClickHouse JSON type it would not run. We +suspect this is likely due to some remaining work in ClickHouse for `arrayJoin` +to work with the new JSON type. +``` +$ clickhouse-client --query " + WITH assignees AS ( + SELECT v.payload.pull_request.assignee.login assignee + FROM 'gha' + UNION ALL + SELECT arrayJoin(v.payload.pull_request.assignees).login assignee + FROM 'gha' + ) + SELECT assignee, count(*) count + FROM assignees + WHERE assignee IS NOT NULL + GROUP BY assignee + ORDER BY count DESC + LIMIT 5" + +Received exception from server (version 24.11.1): +Code: 43. DB::Exception: Received from localhost:9000. DB::Exception: First +argument for function tupleElement must be tuple or array of tuple. Actual +Dynamic: In scope SELECT tupleElement(arrayJoin(v.payload.pull_request.assignees), +'login') AS assignee FROM gha. (ILLEGAL_TYPE_OF_ARGUMENT) +``` + SuperSQL's data model does not require these kinds of gymnastics as everything does not have to be jammed into a table. Instead, we can use the `UNNEST` pipe operator combined with the [spread operator](../language/expressions.md#array-expressions) applied to the array of @@ -883,28 +966,32 @@ FROM 'gha.bsup' ### The Test Results The following table summarizes the query performance for each tool as recorded in the -[most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz). +[most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-12-03_00-43-29.tgz). The run time for each query in seconds is shown along with the speed-up factor in parentheses: |**Tool**|**Format**|**search**|**search+**|**count**|**agg**|**union**| |-|-|-|-|-|-|-| -|`super`|`bsup`|6.3
(1.9x)|14.3
(1.4x)|5.7
(0.03x)|5.6
(0.03x)|8.2
(63x)| +|`super`|`bsup`|6.4
(2.0x)|14.3
(1.4x)|5.8
(0.03x)|5.7
(0.03x)|8.2
(64x)| |`super`|`parquet`|note 1|note 1|0.3
(0.6x)|0.5
(0.3x)|note 2| -|`duckdb`|`db`|12.1|19.8|0.2|0.14|519| -|`duckdb`|`parquet`|12.9
(0.9x)|21.2
(0.9x)|0.4
(0.4x)|0.3
(0.5x)|499
(1x)| -|`datafusion`|`parquet`|11.1
(1.1x)|21.1
(0.9x)|0.4
(0.5x)|0.4
(0.4x)|24.3
(21x)| -|`clickhouse`|`parquet`|68
(0.2x)|845
(0.02x)|1
(0.2x)|0.9
(0.2x)|70
(7x)| +|`duckdb`|`db`|13.0
(1x)|20.0
(1x)|0.2
(1x)|0.1
(1x)|521
(1x)| +|`duckdb`|`parquet`|13.4
(1.0x)|21.4
(0.9x)|0.4
(0.4x)|0.3
(0.4x)|504
(1.0x)| +|`datafusion`|`parquet`|11.0
(1.2x)|21.7
(0.9x)|0.4
(0.5x)|0.4
(0.4x)|24.6
(21x)| +|`clickhouse`|`parquet`|71
(0.2x)|870
(0.02x)|1.0
(0.2x)|0.9
(0.2x)|72
(7x)| +|`clickhouse`|`db`|0.9
(14x)|13.2
(1.5x)|0.1
(2.2x)|0.1
(1.1x)|note 3| _Note 1: the `super` vectorized runtime does not yet support `grep`_ _Note 2: the `super` vectorized runtime does not yet support array expressions_ -Since DuckDB with its native format is overall the best performing, -we used it as the baseline for all of the speed-up factors. +_Note 3: we were not able to successfully run the [union query](#union) with +ClickHouse's beta JSON type_ + +Since DuckDB with its native format could successfully run all queries with +decent performance, we used it as the baseline for all of the speed-up factors. To summarize, -`super` with Super Binary is substantially faster than the relational systems for +`super` with Super Binary is substantially faster than multiple relational systems for the search use cases and performs on par with the others for traditional OLAP queries, except for the _union_ query, where the super-structured data model trounces the relational model (by over 60x!) for stitching together disparate data types for analysis in an aggregation. @@ -986,7 +1073,7 @@ super gharchive_gz/*.json.gz > gha.bsup ## Appendix 2: Running the Tests -This appendix provides the raw tests and output from the [most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-11-26_03-17-25.tgz) +This appendix provides the raw tests and output from the [most recent archived run](https://super-cmd-perf.s3.us-east-2.amazonaws.com/2024-12-03_00-43-29.tgz) of the tests via [automated scripts](https://github.com/brimdata/super/blob/main/scripts/super-cmd-perf) on an AWS [`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) instance. @@ -995,7 +1082,22 @@ on an AWS [`m6idn.2xlarge`](https://aws.amazon.com/ec2/instance-types/m6i/) inst ``` About to execute ================ -clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O +clickhouse-client --queries-file /mnt/tmpdir/tmp.oymd2K7311 + +With query +========== +SELECT count() +FROM 'gha' +WHERE v.payload.pull_request.body LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse-client --queries-file /mnt/tmpdir/tmp.oymd2K7311' +Benchmark 1: clickhouse-client --queries-file /mnt/tmpdir/tmp.oymd2K7311 +2 + Time (abs ≡): 0.904 s [User: 0.038 s, System: 0.030 s] + +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.K3EjBntwdo With query ========== @@ -1003,14 +1105,14 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O' -Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.0REdlePG3O ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.K3EjBntwdo' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.K3EjBntwdo 2 - Time (abs ≡): 68.250 s [User: 67.960 s, System: 3.333 s] + Time (abs ≡): 70.647 s [User: 70.320 s, System: 3.447 s] About to execute ================ -datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM +datafusion-cli --file /mnt/tmpdir/tmp.zSkYYYeSG6 With query ========== @@ -1018,8 +1120,8 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM' -Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.TO5M8YolwM ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.zSkYYYeSG6' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.zSkYYYeSG6 DataFusion CLI v43.0.0 +---------+ | count() | @@ -1027,13 +1129,13 @@ DataFusion CLI v43.0.0 | 2 | +---------+ 1 row(s) fetched. -Elapsed 10.942 seconds. +Elapsed 10.764 seconds. - Time (abs ≡): 11.130 s [User: 65.904 s, System: 11.389 s] + Time (abs ≡): 10.990 s [User: 66.344 s, System: 10.974 s] About to execute ================ -duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.31z1ThfK6B With query ========== @@ -1041,19 +1143,19 @@ SELECT count() FROM 'gha' WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y' -Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.GxPkGbQK8Y ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.31z1ThfK6B' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.31z1ThfK6B ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 2 │ └──────────────┘ - Time (abs ≡): 12.142 s [User: 81.132 s, System: 8.426 s] + Time (abs ≡): 12.985 s [User: 78.328 s, System: 9.270 s] About to execute ================ -duckdb < /mnt/tmpdir/tmp.EtIuukLt2w +duckdb < /mnt/tmpdir/tmp.x2HfLY0RBU With query ========== @@ -1061,19 +1163,19 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE payload.pull_request.body LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.EtIuukLt2w' -Benchmark 1: duckdb < /mnt/tmpdir/tmp.EtIuukLt2w ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.x2HfLY0RBU' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.x2HfLY0RBU ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 2 │ └──────────────┘ - Time (abs ≡): 12.890 s [User: 86.998 s, System: 6.305 s] + Time (abs ≡): 13.356 s [User: 89.551 s, System: 6.785 s] About to execute ================ -super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG +super -z -I /mnt/tmpdir/tmp.KmM8c3l1gb With query ========== @@ -1081,17 +1183,37 @@ SELECT count() FROM '/mnt/gha.bsup' WHERE grep('in case you have any feedback 😊', payload.pull_request.body) -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG' -Benchmark 1: super -z -I /mnt/tmpdir/tmp.JfLwNNwBeG ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.KmM8c3l1gb' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.KmM8c3l1gb {count:2(uint64)} - Time (abs ≡): 6.325 s [User: 23.018 s, System: 1.652 s] + Time (abs ≡): 6.442 s [User: 23.375 s, System: 1.777 s] + ``` ### Search+ Test ``` About to execute ================ -clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT +clickhouse-client --queries-file /mnt/tmpdir/tmp.tgIZkIc6XA + +With query +========== +SELECT count() +FROM 'gha' +WHERE + v.id LIKE '%in case you have any feedback 😊%' + OR v.type LIKE '%in case you have any feedback 😊%' + ... + OR v.payload.member.type LIKE '%in case you have any feedback 😊%' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse-client --queries-file /mnt/tmpdir/tmp.tgIZkIc6XA' +Benchmark 1: clickhouse-client --queries-file /mnt/tmpdir/tmp.tgIZkIc6XA +3 + Time (abs ≡): 13.244 s [User: 0.058 s, System: 0.022 s] + +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.0ENj1f6lI8 With query ========== @@ -1100,17 +1222,17 @@ FROM '/mnt/gha.parquet' WHERE id LIKE '%in case you have any feedback 😊%' OR type LIKE '%in case you have any feedback 😊%' -... + ... OR payload.member.type LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT' -Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.QRmnp0x8FT ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.0ENj1f6lI8' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.0ENj1f6lI8 3 - Time (abs ≡): 844.648 s [User: 923.669 s, System: 19.038 s] + Time (abs ≡): 870.218 s [User: 950.089 s, System: 18.760 s] About to execute ================ -datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD +datafusion-cli --file /mnt/tmpdir/tmp.veTUjcdQto With query ========== @@ -1122,8 +1244,8 @@ WHERE ... OR payload.member.type LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD' -Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.NZ6GD2NGSD ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.veTUjcdQto' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.veTUjcdQto DataFusion CLI v43.0.0 +---------+ | count() | @@ -1131,13 +1253,13 @@ DataFusion CLI v43.0.0 | 3 | +---------+ 1 row(s) fetched. -Elapsed 20.913 seconds. +Elapsed 21.422 seconds. - Time (abs ≡): 21.127 s [User: 126.933 s, System: 19.620 s] + Time (abs ≡): 21.661 s [User: 129.457 s, System: 19.646 s] About to execute ================ -duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.CcmsLBMCmv With query ========== @@ -1149,19 +1271,19 @@ WHERE ... OR payload.member.type LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv' -Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.fmZ4sHQJOv ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.CcmsLBMCmv' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.CcmsLBMCmv ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 3 │ └──────────────┘ - Time (abs ≡): 19.796 s [User: 140.238 s, System: 9.686 s] + Time (abs ≡): 20.043 s [User: 137.850 s, System: 10.587 s] About to execute ================ -duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ +duckdb < /mnt/tmpdir/tmp.BI1AC3TnV2 With query ========== @@ -1173,19 +1295,19 @@ WHERE ... OR payload.member.type LIKE '%in case you have any feedback 😊%' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ' -Benchmark 1: duckdb < /mnt/tmpdir/tmp.hE8ZzAlSRQ ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.BI1AC3TnV2' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.BI1AC3TnV2 ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 3 │ └──────────────┘ - Time (abs ≡): 21.210 s [User: 143.903 s, System: 9.179 s] + Time (abs ≡): 21.352 s [User: 144.078 s, System: 9.044 s] About to execute ================ -super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD +super -z -I /mnt/tmpdir/tmp.v0WfEuBi8J With query ========== @@ -1193,10 +1315,10 @@ SELECT count() FROM '/mnt/gha.bsup' WHERE grep('in case you have any feedback 😊') -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD' -Benchmark 1: super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.v0WfEuBi8J' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.v0WfEuBi8J {count:3(uint64)} - Time (abs ≡): 14.267 s [User: 105.204 s, System: 1.698 s] + Time (abs ≡): 14.311 s [User: 104.946 s, System: 1.880 s] ``` ### Count Test @@ -1204,7 +1326,22 @@ Benchmark 1: super -z -I /mnt/tmpdir/tmp.ncLqBOUkXD ``` About to execute ================ -clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw +clickhouse-client --queries-file /mnt/tmpdir/tmp.CFT0wwiAbD + +With query +========== +SELECT count() +FROM 'gha' +WHERE v.actor.login='johnbieren' + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse-client --queries-file /mnt/tmpdir/tmp.CFT0wwiAbD' +Benchmark 1: clickhouse-client --queries-file /mnt/tmpdir/tmp.CFT0wwiAbD +879 + Time (abs ≡): 0.080 s [User: 0.025 s, System: 0.018 s] + +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.XFTW0X911r With query ========== @@ -1212,14 +1349,14 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw' -Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.xpShnx3ftw ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.XFTW0X911r' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.XFTW0X911r 879 - Time (abs ≡): 1.034 s [User: 0.822 s, System: 0.233 s] + Time (abs ≡): 0.954 s [User: 0.809 s, System: 0.164 s] About to execute ================ -datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs +datafusion-cli --file /mnt/tmpdir/tmp.QLU5fBDx7L With query ========== @@ -1227,8 +1364,8 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs' -Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.eO6Lt0jBbs ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.QLU5fBDx7L' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.QLU5fBDx7L DataFusion CLI v43.0.0 +---------+ | count() | @@ -1238,11 +1375,11 @@ DataFusion CLI v43.0.0 1 row(s) fetched. Elapsed 0.340 seconds. - Time (abs ≡): 0.381 s [User: 1.578 s, System: 0.411 s] + Time (abs ≡): 0.388 s [User: 1.601 s, System: 0.417 s] About to execute ================ -duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.WVteXNRqfp With query ========== @@ -1250,19 +1387,19 @@ SELECT count() FROM 'gha' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem' -Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.dEgCWl2Iem ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.WVteXNRqfp' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.WVteXNRqfp ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 879 │ └──────────────┘ - Time (abs ≡): 0.175 s [User: 1.042 s, System: 0.106 s] + Time (abs ≡): 0.177 s [User: 1.011 s, System: 0.137 s] About to execute ================ -duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU +duckdb < /mnt/tmpdir/tmp.b5T64pDmwq With query ========== @@ -1270,19 +1407,19 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU' -Benchmark 1: duckdb < /mnt/tmpdir/tmp.GNGEkrs6IU ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.b5T64pDmwq' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.b5T64pDmwq ┌──────────────┐ │ count_star() │ │ int64 │ ├──────────────┤ │ 879 │ └──────────────┘ - Time (abs ≡): 0.423 s [User: 2.256 s, System: 0.181 s] + Time (abs ≡): 0.416 s [User: 2.235 s, System: 0.187 s] About to execute ================ -super -z -I /mnt/tmpdir/tmp.dyu0120H2m +super -z -I /mnt/tmpdir/tmp.s5e3Ueg2zU With query ========== @@ -1290,14 +1427,14 @@ SELECT count() FROM '/mnt/gha.bsup' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.dyu0120H2m' -Benchmark 1: super -z -I /mnt/tmpdir/tmp.dyu0120H2m ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.s5e3Ueg2zU' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.s5e3Ueg2zU {count:879(uint64)} - Time (abs ≡): 5.745 s [User: 17.240 s, System: 1.509 s] + Time (abs ≡): 5.830 s [User: 17.284 s, System: 1.737 s] About to execute ================ -SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe +SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.2f1t2J9pWR With query ========== @@ -1305,10 +1442,10 @@ SELECT count() FROM '/mnt/gha.parquet' WHERE actor.login='johnbieren' -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe' -Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.2f1t2J9pWR' +Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.2f1t2J9pWR {count:879(uint64)} - Time (abs ≡): 0.298 s [User: 0.769 s, System: 0.248 s] + Time (abs ≡): 0.301 s [User: 0.740 s, System: 0.257 s] ``` ### Agg Test @@ -1316,7 +1453,31 @@ Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.yogAuyCHWe ``` About to execute ================ -clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU +clickhouse-client --queries-file /mnt/tmpdir/tmp.hFAMHegng8 + +With query +========== +SET allow_suspicious_types_in_group_by = 1; +SELECT count(),v.type +FROM 'gha' +WHERE v.repo.name='duckdb/duckdb' +GROUP BY v.type + ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse-client --queries-file /mnt/tmpdir/tmp.hFAMHegng8' +Benchmark 1: clickhouse-client --queries-file /mnt/tmpdir/tmp.hFAMHegng8 +14 PullRequestReviewEvent +15 PushEvent +9 IssuesEvent +3 ForkEvent +7 PullRequestReviewCommentEvent +29 WatchEvent +30 IssueCommentEvent +35 PullRequestEvent + Time (abs ≡): 0.132 s [User: 0.034 s, System: 0.018 s] + +About to execute +================ +clickhouse --queries-file /mnt/tmpdir/tmp.MiXEgFCu5o With query ========== @@ -1325,21 +1486,21 @@ FROM '/mnt/gha.parquet' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU' -Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.FNKcK1lhGU ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.MiXEgFCu5o' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.MiXEgFCu5o 30 IssueCommentEvent 14 PullRequestReviewEvent 15 PushEvent 29 WatchEvent -9 IssuesEvent 7 PullRequestReviewCommentEvent +9 IssuesEvent 3 ForkEvent 35 PullRequestEvent - Time (abs ≡): 0.856 s [User: 0.741 s, System: 0.178 s] + Time (abs ≡): 0.864 s [User: 0.747 s, System: 0.180 s] About to execute ================ -datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6 +datafusion-cli --file /mnt/tmpdir/tmp.uI0r2dLw8f With query ========== @@ -1348,29 +1509,29 @@ FROM '/mnt/gha.parquet' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6' -Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.cv7JPVFkc6 ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.uI0r2dLw8f' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.uI0r2dLw8f DataFusion CLI v43.0.0 +---------+-------------------------------+ | count() | type | +---------+-------------------------------+ +| 3 | ForkEvent | +| 15 | PushEvent | | 35 | PullRequestEvent | | 14 | PullRequestReviewEvent | | 7 | PullRequestReviewCommentEvent | -| 3 | ForkEvent | -| 15 | PushEvent | | 30 | IssueCommentEvent | | 9 | IssuesEvent | | 29 | WatchEvent | +---------+-------------------------------+ 8 row(s) fetched. -Elapsed 0.324 seconds. +Elapsed 0.315 seconds. - Time (abs ≡): 0.354 s [User: 1.299 s, System: 0.413 s] + Time (abs ≡): 0.358 s [User: 1.385 s, System: 0.404 s] About to execute ================ -duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.Nqj23A926J With query ========== @@ -1379,8 +1540,8 @@ FROM 'gha' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE' -Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.Nqj23A926J' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.Nqj23A926J ┌──────────────┬───────────────────────────────┐ │ count_star() │ type │ │ int64 │ varchar │ @@ -1388,17 +1549,17 @@ Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.qaqGNHoHPE │ 3 │ ForkEvent │ │ 14 │ PullRequestReviewEvent │ │ 29 │ WatchEvent │ -│ 35 │ PullRequestEvent │ │ 30 │ IssueCommentEvent │ -│ 7 │ PullRequestReviewCommentEvent │ │ 15 │ PushEvent │ │ 9 │ IssuesEvent │ +│ 7 │ PullRequestReviewCommentEvent │ +│ 35 │ PullRequestEvent │ └──────────────┴───────────────────────────────┘ - Time (abs ≡): 0.144 s [User: 0.770 s, System: 0.143 s] + Time (abs ≡): 0.143 s [User: 0.722 s, System: 0.162 s] About to execute ================ -duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0 +duckdb < /mnt/tmpdir/tmp.LepFhAA9Y3 With query ========== @@ -1407,8 +1568,8 @@ FROM '/mnt/gha.parquet' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0' -Benchmark 1: duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0 ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.LepFhAA9Y3' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.LepFhAA9Y3 ┌──────────────┬───────────────────────────────┐ │ count_star() │ type │ │ int64 │ varchar │ @@ -1418,15 +1579,15 @@ Benchmark 1: duckdb < /mnt/tmpdir/tmp.3BIyBWjqG0 │ 9 │ IssuesEvent │ │ 7 │ PullRequestReviewCommentEvent │ │ 14 │ PullRequestReviewEvent │ -│ 29 │ WatchEvent │ -│ 30 │ IssueCommentEvent │ │ 35 │ PullRequestEvent │ +│ 30 │ IssueCommentEvent │ +│ 29 │ WatchEvent │ └──────────────┴───────────────────────────────┘ - Time (abs ≡): 0.316 s [User: 1.473 s, System: 0.174 s] + Time (abs ≡): 0.318 s [User: 1.547 s, System: 0.159 s] About to execute ================ -super -z -I /mnt/tmpdir/tmp.QieGBDCfVB +super -z -I /mnt/tmpdir/tmp.oWK2c4UwIp With query ========== @@ -1435,8 +1596,8 @@ FROM '/mnt/gha.bsup' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.QieGBDCfVB' -Benchmark 1: super -z -I /mnt/tmpdir/tmp.QieGBDCfVB ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.oWK2c4UwIp' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.oWK2c4UwIp {type:"IssuesEvent",count:9(uint64)} {type:"ForkEvent",count:3(uint64)} {type:"PullRequestReviewCommentEvent",count:7(uint64)} @@ -1445,11 +1606,11 @@ Benchmark 1: super -z -I /mnt/tmpdir/tmp.QieGBDCfVB {type:"WatchEvent",count:29(uint64)} {type:"PullRequestEvent",count:35(uint64)} {type:"PushEvent",count:15(uint64)} - Time (abs ≡): 5.627 s [User: 15.358 s, System: 1.606 s] + Time (abs ≡): 5.692 s [User: 15.531 s, System: 1.644 s] About to execute ================ -SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz +SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.S1AYE55Oyi With query ========== @@ -1458,17 +1619,17 @@ FROM '/mnt/gha.parquet' WHERE repo.name='duckdb/duckdb' GROUP BY type -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz' -Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.S1AYE55Oyi' +Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.S1AYE55Oyi +{type:"WatchEvent",count:29(uint64)} {type:"PullRequestEvent",count:35(uint64)} -{type:"IssueCommentEvent",count:30(uint64)} {type:"PushEvent",count:15(uint64)} {type:"IssuesEvent",count:9(uint64)} +{type:"IssueCommentEvent",count:30(uint64)} {type:"ForkEvent",count:3(uint64)} {type:"PullRequestReviewCommentEvent",count:7(uint64)} {type:"PullRequestReviewEvent",count:14(uint64)} -{type:"WatchEvent",count:29(uint64)} - Time (abs ≡): 0.498 s [User: 2.133 s, System: 0.329 s] + Time (abs ≡): 0.492 s [User: 2.079 s, System: 0.354 s] ``` ### Union Test @@ -1476,7 +1637,7 @@ Benchmark 1: SUPER_VAM=1 super -z -I /mnt/tmpdir/tmp.XI76knYAGz ``` About to execute ================ -clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN +clickhouse --queries-file /mnt/tmpdir/tmp.KgVFqIsPVq With query ========== @@ -1494,18 +1655,18 @@ GROUP BY assignee ORDER BY count DESC LIMIT 5 -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN' -Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.rpGStdRtoN ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'clickhouse --queries-file /mnt/tmpdir/tmp.KgVFqIsPVq' +Benchmark 1: clickhouse --queries-file /mnt/tmpdir/tmp.KgVFqIsPVq poad 1966 vinayakkulkarni 508 tmtmtmtm 356 AMatutat 260 danwinship 208 - Time (abs ≡): 70.276 s [User: 139.539 s, System: 6.504 s] + Time (abs ≡): 72.059 s [User: 142.588 s, System: 6.638 s] About to execute ================ -datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i +datafusion-cli --file /mnt/tmpdir/tmp.bWB9scRPum With query ========== @@ -1525,8 +1686,8 @@ GROUP BY assignee ORDER BY count DESC LIMIT 5 -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i' -Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.V2yirMdQ2i ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'datafusion-cli --file /mnt/tmpdir/tmp.bWB9scRPum' +Benchmark 1: datafusion-cli --file /mnt/tmpdir/tmp.bWB9scRPum DataFusion CLI v43.0.0 +-----------------+-------+ | assignee | count | @@ -1538,13 +1699,13 @@ DataFusion CLI v43.0.0 | danwinship | 208 | +-----------------+-------+ 5 row(s) fetched. -Elapsed 24.068 seconds. +Elapsed 24.234 seconds. - Time (abs ≡): 24.336 s [User: 161.911 s, System: 24.355 s] + Time (abs ≡): 24.575 s [User: 163.931 s, System: 24.758 s] About to execute ================ -duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10 +duckdb /mnt/gha.db < /mnt/tmpdir/tmp.3724dO4AgT With query ========== @@ -1562,8 +1723,8 @@ GROUP BY assignee ORDER BY count DESC LIMIT 5 -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10' -Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10 ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb /mnt/gha.db < /mnt/tmpdir/tmp.3724dO4AgT' +Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.3724dO4AgT ┌─────────────────┬───────┐ │ assignee │ count │ │ varchar │ int64 │ @@ -1574,11 +1735,11 @@ Benchmark 1: duckdb /mnt/gha.db < /mnt/tmpdir/tmp.yz1E2h5G10 │ AMatutat │ 260 │ │ danwinship │ 208 │ └─────────────────┴───────┘ - Time (abs ≡): 519.227 s [User: 4075.550 s, System: 14.520 s] + Time (abs ≡): 520.980 s [User: 4062.107 s, System: 15.406 s] About to execute ================ -duckdb < /mnt/tmpdir/tmp.30X1TO2UbL +duckdb < /mnt/tmpdir/tmp.WcA1AOl9UB With query ========== @@ -1596,8 +1757,8 @@ GROUP BY assignee ORDER BY count DESC LIMIT 5 -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.30X1TO2UbL' -Benchmark 1: duckdb < /mnt/tmpdir/tmp.30X1TO2UbL ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'duckdb < /mnt/tmpdir/tmp.WcA1AOl9UB' +Benchmark 1: duckdb < /mnt/tmpdir/tmp.WcA1AOl9UB ┌─────────────────┬───────┐ │ assignee │ count │ │ varchar │ int64 │ @@ -1608,11 +1769,11 @@ Benchmark 1: duckdb < /mnt/tmpdir/tmp.30X1TO2UbL │ AMatutat │ 260 │ │ danwinship │ 208 │ └─────────────────┴───────┘ - Time (abs ≡): 499.909 s [User: 3718.128 s, System: 9.680 s] + Time (abs ≡): 503.567 s [User: 3747.792 s, System: 10.013 s] About to execute ================ -super -z -I /mnt/tmpdir/tmp.3qO9ALablA +super -z -I /mnt/tmpdir/tmp.iTtaFeoj74 With query ========== @@ -1623,12 +1784,12 @@ FROM '/mnt/gha.bsup' | ORDER BY count DESC | LIMIT 5 -+ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.3qO9ALablA' -Benchmark 1: super -z -I /mnt/tmpdir/tmp.3qO9ALablA ++ hyperfine --show-output --warmup 1 --runs 1 --time-unit second 'super -z -I /mnt/tmpdir/tmp.iTtaFeoj74' +Benchmark 1: super -z -I /mnt/tmpdir/tmp.iTtaFeoj74 {assignee:"poad",count:1966(uint64)} {assignee:"vinayakkulkarni",count:508(uint64)} {assignee:"tmtmtmtm",count:356(uint64)} {assignee:"AMatutat",count:260(uint64)} {assignee:"danwinship",count:208(uint64)} - Time (abs ≡): 8.180 s [User: 17.197 s, System: 1.909 s] + Time (abs ≡): 8.184 s [User: 17.319 s, System: 1.908 s] ``` diff --git a/scripts/super-cmd-perf/README.md b/scripts/super-cmd-perf/README.md index c5e935901c..bb262ad824 100644 --- a/scripts/super-cmd-perf/README.md +++ b/scripts/super-cmd-perf/README.md @@ -37,6 +37,11 @@ The run proceeds in three phases: 2. Test data is downloaded and loaded into needed storage formats 3. Queries are executed on all data platforms +The scripts only run with ClickHouse's [beta JSON type](https://clickhouse.com/blog/a-new-powerful-json-data-type-for-clickhouse) +on AWS because when we attempted to load data to this type on our Macbooks +that have 16 GB of RAM it consistently failed with a "too many open files" +error. + As the benchmarks may take a long time to run, the use of [`screen`](https://www.gnu.org/software/screen/) or a similar "detachable" terminal tool is recommended in case your remote network connection drops during a run. diff --git a/scripts/super-cmd-perf/benchmark.sh b/scripts/super-cmd-perf/benchmark.sh index 35c9449388..ec46a74533 100755 --- a/scripts/super-cmd-perf/benchmark.sh +++ b/scripts/super-cmd-perf/benchmark.sh @@ -22,16 +22,6 @@ if command -v dmidecode && [ "$(sudo dmidecode --string system-uuid | cut -c1-3) echo 'export TMPDIR="/mnt/tmpdir"' >> "$HOME"/.profile mkdir /mnt/tmpdir - # Install ClickHouse - if ! command -v clickhouse-client > /dev/null 2>&1; then - sudo apt-get install -y apt-transport-https ca-certificates curl gnupg - curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg - echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee \ - /etc/apt/sources.list.d/clickhouse.list - sudo apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y clickhouse-client - fi - # Install DuckDB if ! command -v duckdb > /dev/null 2>&1; then curl -L -O https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip @@ -69,6 +59,19 @@ if command -v dmidecode && [ "$(sudo dmidecode --string system-uuid | cut -c1-3) cd scripts/super-cmd-perf + # Install ClickHouse + if ! command -v clickhouse-client > /dev/null 2>&1; then + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg + curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg + echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee \ + /etc/apt/sources.list.d/clickhouse.list + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y clickhouse-server clickhouse-client + sudo cp clickhouse-storage.xml /etc/clickhouse-server/config.d + sudo systemctl stop clickhouse-server + sudo systemctl disable clickhouse-server.service + fi + fi rundir="$(date +%F_%T)" diff --git a/scripts/super-cmd-perf/clickhouse-storage.xml b/scripts/super-cmd-perf/clickhouse-storage.xml new file mode 100644 index 0000000000..4099ad3163 --- /dev/null +++ b/scripts/super-cmd-perf/clickhouse-storage.xml @@ -0,0 +1,5 @@ + + /mnt/clickhouse/caches/ + /mnt/clickhouse/ + /mnt/clickhouse/tmp/ + diff --git a/scripts/super-cmd-perf/clickhouse-table-create.sql b/scripts/super-cmd-perf/clickhouse-table-create.sql new file mode 100644 index 0000000000..2103f0f130 --- /dev/null +++ b/scripts/super-cmd-perf/clickhouse-table-create.sql @@ -0,0 +1,3 @@ +SET enable_json_type = 1; +CREATE TABLE gha (v JSON) ENGINE MergeTree() ORDER BY tuple(); +INSERT INTO gha SELECT * FROM file('gharchive_gz/*.json.gz', JSONAsObject); diff --git a/scripts/super-cmd-perf/prep-data.sh b/scripts/super-cmd-perf/prep-data.sh index a1035092bf..0c0a70a3ba 100755 --- a/scripts/super-cmd-perf/prep-data.sh +++ b/scripts/super-cmd-perf/prep-data.sh @@ -11,6 +11,7 @@ mkdir -p "$rundir" RUNNING_ON_AWS_EC2="${RUNNING_ON_AWS_EC2:-}" if [ -n "$RUNNING_ON_AWS_EC2" ]; then + cp clickhouse-table-create.sql /mnt cd /mnt fi @@ -55,4 +56,17 @@ run_cmd \ "$rundir/super-bsup-create.out" \ "super -o gha.bsup gharchive_gz/*.json.gz" +if [ -n "$RUNNING_ON_AWS_EC2" ]; then + sudo mkdir -p /var/lib/clickhouse/user_files + sudo chown clickhouse:clickhouse /var/lib/clickhouse/user_files + sudo ln -s /mnt/gharchive_gz /var/lib/clickhouse/user_files/gharchive_gz + sudo systemctl start clickhouse-server + sleep 5 + run_cmd \ + "$rundir/clickhouse-table-create.out" \ + "clickhouse-client < clickhouse-table-create.sql" + sudo systemctl stop clickhouse-server + du -h clickhouse/store +fi + du -h gha.db gha.parquet gha.bsup gharchive_gz diff --git a/scripts/super-cmd-perf/queries/agg-clickhouse-db.sql b/scripts/super-cmd-perf/queries/agg-clickhouse-db.sql new file mode 100644 index 0000000000..c0afa66371 --- /dev/null +++ b/scripts/super-cmd-perf/queries/agg-clickhouse-db.sql @@ -0,0 +1,5 @@ +SET allow_suspicious_types_in_group_by = 1; +SELECT count(),v.type +FROM '__SOURCE__' +WHERE v.repo.name='duckdb/duckdb' +GROUP BY v.type diff --git a/scripts/super-cmd-perf/queries/count-clickhouse-db.sql b/scripts/super-cmd-perf/queries/count-clickhouse-db.sql new file mode 100644 index 0000000000..87ae5e1a27 --- /dev/null +++ b/scripts/super-cmd-perf/queries/count-clickhouse-db.sql @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE v.actor.login='johnbieren' diff --git a/scripts/super-cmd-perf/queries/search+-clickhouse-db.sql b/scripts/super-cmd-perf/queries/search+-clickhouse-db.sql new file mode 100644 index 0000000000..0aaf3f7a4f --- /dev/null +++ b/scripts/super-cmd-perf/queries/search+-clickhouse-db.sql @@ -0,0 +1,489 @@ +SELECT count() +FROM '__SOURCE__' +WHERE + v.id LIKE '%in case you have any feedback 😊%' + OR v.type LIKE '%in case you have any feedback 😊%' + OR v.actor.login LIKE '%in case you have any feedback 😊%' + OR v.actor.display_login LIKE '%in case you have any feedback 😊%' + OR v.actor.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.actor.url LIKE '%in case you have any feedback 😊%' + OR v.actor.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.repo.name LIKE '%in case you have any feedback 😊%' + OR v.repo.url LIKE '%in case you have any feedback 😊%' + OR v.payload.ref LIKE '%in case you have any feedback 😊%' + OR v.payload.ref_type LIKE '%in case you have any feedback 😊%' + OR v.payload.pusher_type LIKE '%in case you have any feedback 😊%' + OR v.payload.head LIKE '%in case you have any feedback 😊%' + OR v.payload.before LIKE '%in case you have any feedback 😊%' + OR v.payload.master_branch LIKE '%in case you have any feedback 😊%' + OR v.payload.description LIKE '%in case you have any feedback 😊%' + OR v.payload.action LIKE '%in case you have any feedback 😊%' + OR v.org.login LIKE '%in case you have any feedback 😊%' + OR v.org.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.org.url LIKE '%in case you have any feedback 😊%' + OR v.org.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.review.body LIKE '%in case you have any feedback 😊%' + OR v.payload.review.commit_id LIKE '%in case you have any feedback 😊%' + OR v.payload.review.state LIKE '%in case you have any feedback 😊%' + OR v.payload.review.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.pull_request_url LIKE '%in case you have any feedback 😊%' + OR v.payload.review.author_association LIKE '%in case you have any feedback 😊%' + OR v.payload.review._links.html.href LIKE '%in case you have any feedback 😊%' + OR v.payload.review._links.pull_request.href LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.path LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.commit_id LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.author_association LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.body LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.reactions.url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.issue_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.diff_hunk LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.original_commit_id LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.pull_request_url LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.start_side LIKE '%in case you have any feedback 😊%' + OR v.payload.comment.side LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.repository_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.labels_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.title LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.state LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.login LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.assignee.type LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.labels_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.title LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.description LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.login LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.creator.type LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.milestone.state LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.author_association LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.active_lock_reason LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.body LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.reactions.url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.timeline_url LIKE '%in case you have any feedback 😊%' + OR v.payload.issue.state_reason LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.diff_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.patch_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.issue_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.state LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.title LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.body LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merge_commit_sha LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.review_comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.review_comment_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.statuses_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.label LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.ref LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.sha LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.name LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.full_name LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.owner.type LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.description LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.forks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.keys_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.collaborators_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.teams_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.hooks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.issue_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.assignees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.branches_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.blobs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.git_tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.git_refs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.trees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.statuses_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.languages_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.stargazers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.contributors_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.subscribers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.subscription_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.git_commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.contents_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.compare_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.merges_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.archive_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.downloads_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.issues_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.pulls_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.milestones_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.notifications_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.labels_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.releases_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.deployments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.git_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.ssh_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.clone_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.svn_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.homepage LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.language LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.mirror_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.visibility LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.head.repo.default_branch LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.label LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.ref LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.sha LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.user.type LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.name LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.full_name LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.owner.type LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.description LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.forks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.keys_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.collaborators_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.teams_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.hooks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.issue_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.assignees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.branches_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.blobs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.git_tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.git_refs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.trees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.statuses_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.languages_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.stargazers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.contributors_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.subscribers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.subscription_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.git_commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.contents_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.compare_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.merges_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.archive_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.downloads_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.issues_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.pulls_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.milestones_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.notifications_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.labels_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.releases_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.deployments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.git_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.ssh_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.clone_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.svn_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.homepage LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.language LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.mirror_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.visibility LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.base.repo.default_branch LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.self.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.html.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.issue.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.comments.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.review_comments.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.review_comment.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.commits.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request._links.statuses.href LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.author_association LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.active_lock_reason LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.mergeable_state LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.login LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.pull_request.merged_by.type LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.name LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.full_name LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.login LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.owner.type LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.description LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.forks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.keys_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.collaborators_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.teams_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.hooks_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.issue_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.assignees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.branches_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.blobs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.git_tags_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.git_refs_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.trees_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.statuses_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.languages_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.stargazers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.contributors_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.subscribers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.subscription_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.git_commits_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.comments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.issue_comment_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.contents_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.compare_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.merges_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.archive_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.downloads_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.issues_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.pulls_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.milestones_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.notifications_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.labels_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.releases_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.deployments_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.git_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.ssh_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.clone_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.svn_url LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.homepage LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.visibility LIKE '%in case you have any feedback 😊%' + OR v.payload.forkee.default_branch LIKE '%in case you have any feedback 😊%' + OR v.payload.release.url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.assets_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.upload_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.login LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.author.type LIKE '%in case you have any feedback 😊%' + OR v.payload.release.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.release.tag_name LIKE '%in case you have any feedback 😊%' + OR v.payload.release.target_commitish LIKE '%in case you have any feedback 😊%' + OR v.payload.release.name LIKE '%in case you have any feedback 😊%' + OR v.payload.release.tarball_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.zipball_url LIKE '%in case you have any feedback 😊%' + OR v.payload.release.body LIKE '%in case you have any feedback 😊%' + OR v.payload.release.short_description_html LIKE '%in case you have any feedback 😊%' + OR v.payload.release.discussion_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.login LIKE '%in case you have any feedback 😊%' + OR v.payload.member.node_id LIKE '%in case you have any feedback 😊%' + OR v.payload.member.avatar_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.gravatar_id LIKE '%in case you have any feedback 😊%' + OR v.payload.member.url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.html_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.followers_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.following_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.gists_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.starred_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.subscriptions_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.organizations_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.repos_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.received_events_url LIKE '%in case you have any feedback 😊%' + OR v.payload.member.type LIKE '%in case you have any feedback 😊%' diff --git a/scripts/super-cmd-perf/queries/search-clickhouse-db.sql b/scripts/super-cmd-perf/queries/search-clickhouse-db.sql new file mode 100644 index 0000000000..ad4b94281c --- /dev/null +++ b/scripts/super-cmd-perf/queries/search-clickhouse-db.sql @@ -0,0 +1,3 @@ +SELECT count() +FROM '__SOURCE__' +WHERE v.payload.pull_request.body LIKE '%in case you have any feedback 😊%' diff --git a/scripts/super-cmd-perf/queries/union-clickhouse-db.sql b/scripts/super-cmd-perf/queries/union-clickhouse-db.sql new file mode 100644 index 0000000000..6f24f0815d --- /dev/null +++ b/scripts/super-cmd-perf/queries/union-clickhouse-db.sql @@ -0,0 +1,13 @@ +WITH assignees AS ( + SELECT v.payload.pull_request.assignee.login assignee + FROM '__SOURCE__' + UNION ALL + SELECT arrayJoin(v.payload.pull_request.assignees).login assignee + FROM '__SOURCE__' +) +SELECT assignee, count(*) count +FROM assignees +WHERE assignee IS NOT NULL +GROUP BY assignee +ORDER BY count DESC +LIMIT 5 diff --git a/scripts/super-cmd-perf/run-queries.sh b/scripts/super-cmd-perf/run-queries.sh index d715738b6d..aa0c4371ed 100755 --- a/scripts/super-cmd-perf/run-queries.sh +++ b/scripts/super-cmd-perf/run-queries.sh @@ -55,8 +55,8 @@ function run_query { cmd="$cmd < $final_query" elif [ "$cmd" == "datafusion" ]; then cmd="datafusion-cli --file $final_query" - elif [ "$cmd" == "clickhouse" ]; then - cmd="clickhouse --queries-file $final_query" + elif [[ "$cmd" == "clickhouse"* ]]; then + cmd="$cmd --queries-file $final_query" fi echo -e "About to execute\n================\n$cmd\n\nWith query\n==========" > "$outputfile" @@ -144,3 +144,25 @@ do done echo >> "$report" echo >> "$csv_report" + +if [ -n "$RUNNING_ON_AWS_EC2" ]; then + sudo systemctl start clickhouse-server + echo -n "|\`clickhouse\`|\`db\`|" >> "$report" + echo -n "clickhouse,db" >> "$csv_report" + for queryfile in search-clickhouse-db.sql search+-clickhouse-db.sql count-clickhouse-db.sql agg-clickhouse-db.sql union-clickhouse-db.sql + do + if [ "$queryfile" == "union-clickhouse-db.sql" ]; then + echo -n "N/A|" >> "$report" + echo -n ",N/A" >> "$csv_report" + continue + fi + run_query clickhouse-client $queryfile gha + result=$(grep Time < "$rundir/clickhouse-client-$queryfile-$source.out" | awk '{ print $4 }') + echo -n "$result" >> "$report" + echo -n "|" >> "$report" + echo -n ",$result" >> "$csv_report" + done + sudo systemctl stop clickhouse-server + echo >> "$report" + echo >> "$csv_report" +fi From 1f0c0cea7cfca956e89497830546bbfcd25ff13f Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Tue, 3 Dec 2024 17:32:52 -0500 Subject: [PATCH 21/22] Use CSUP files in vector runtime (#5508) The commit adds the ability to use CSUP files in vector runtime. It also implements the NewConcurrentPuller protocol to enable parallel read of a CSUP file in vector runtime. --- compiler/semantic/op.go | 9 ++++- runtime/exec/environment.go | 12 ++++-- zio/vngio/vectorreader.go | 75 +++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 zio/vngio/vectorreader.go diff --git a/compiler/semantic/op.go b/compiler/semantic/op.go index 17573b9f8d..c89cd132a5 100644 --- a/compiler/semantic/op.go +++ b/compiler/semantic/op.go @@ -237,8 +237,13 @@ func (a *analyzer) formatArg(args ast.FromArgs) string { func (a *analyzer) semFile(name string, args ast.FromArgs) dag.Op { format := a.formatArg(args) - if format == "" && strings.HasSuffix(name, ".parquet") { - format = "parquet" + if format == "" { + switch filepath.Ext(name) { + case ".parquet": + format = "parquet" + case ".csup": + format = "csup" + } } return &dag.FileScan{ Kind: "FileScan", diff --git a/runtime/exec/environment.go b/runtime/exec/environment.go index 3c906f6434..c30222ff90 100644 --- a/runtime/exec/environment.go +++ b/runtime/exec/environment.go @@ -18,6 +18,7 @@ import ( "github.com/brimdata/super/zbuf" "github.com/brimdata/super/zio/anyio" "github.com/brimdata/super/zio/parquetio" + "github.com/brimdata/super/zio/vngio" "github.com/segmentio/ksuid" ) @@ -124,8 +125,8 @@ func (c *closePuller) Pull(done bool) (zbuf.Batch, error) { } func (e *Environment) VectorOpen(ctx context.Context, zctx *super.Context, path, format string, fields []field.Path) (vector.Puller, error) { - if format != "parquet" { - return nil, fmt.Errorf("vector runtime supports only Parquet files") + if format != "parquet" && format != "csup" { + return nil, fmt.Errorf("vector runtime supports only Parquet and CSUP files") } if path == "-" { path = "stdio:stdin" @@ -138,7 +139,12 @@ func (e *Environment) VectorOpen(ctx context.Context, zctx *super.Context, path, if err != nil { return nil, err } - puller, err := parquetio.NewVectorReader(ctx, zctx, r, fields) + var puller vector.Puller + if format == "parquet" { + puller, err = parquetio.NewVectorReader(ctx, zctx, r, fields) + } else { + puller, err = vngio.NewVectorReader(ctx, zctx, r, fields) + } if err != nil { r.Close() return nil, err diff --git a/zio/vngio/vectorreader.go b/zio/vngio/vectorreader.go new file mode 100644 index 0000000000..8210f383fa --- /dev/null +++ b/zio/vngio/vectorreader.go @@ -0,0 +1,75 @@ +package vngio + +import ( + "context" + "errors" + "io" + "sync/atomic" + + "github.com/brimdata/super" + "github.com/brimdata/super/pkg/field" + "github.com/brimdata/super/runtime/vcache" + "github.com/brimdata/super/vector" + "github.com/brimdata/super/vng" +) + +type VectorReader struct { + ctx context.Context + zctx *super.Context + + activeReaders *atomic.Int64 + nextObject *atomic.Int64 + objects []*vng.Object + projection vcache.Path + readerAt io.ReaderAt +} + +func NewVectorReader(ctx context.Context, zctx *super.Context, r io.Reader, fields []field.Path) (*VectorReader, error) { + ra, ok := r.(io.ReaderAt) + if !ok { + return nil, errors.New("Super Columnar requires a seekable input") + } + objects, err := readObjects(ra) + if err != nil { + return nil, err + } + return &VectorReader{ + ctx: ctx, + zctx: zctx, + activeReaders: &atomic.Int64{}, + nextObject: &atomic.Int64{}, + objects: objects, + projection: vcache.NewProjection(fields), + readerAt: ra, + }, nil +} + +func (v *VectorReader) NewConcurrentPuller() vector.Puller { + v.activeReaders.Add(1) + return v +} + +func (v *VectorReader) Pull(done bool) (vector.Any, error) { + if done { + return nil, v.close() + } + if err := v.ctx.Err(); err != nil { + v.close() + return nil, err + } + n := int(v.nextObject.Add(1) - 1) + if n >= len(v.objects) { + return nil, v.close() + } + o := v.objects[n] + return vcache.NewObjectFromVNG(o).Fetch(v.zctx, v.projection) +} + +func (v *VectorReader) close() error { + if v.activeReaders.Add(-1) <= 0 { + if closer, ok := v.readerAt.(io.Closer); ok { + return closer.Close() // coffee is for closers + } + } + return nil +} From 200f37322f51426ebd117fe9e66701b44ba06e5e Mon Sep 17 00:00:00 2001 From: Matthew Nibecker Date: Wed, 4 Dec 2024 13:49:08 -0500 Subject: [PATCH 22/22] vam: Support for unary minus (#5510) --- compiler/kernel/vexpr.go | 5 +- runtime/sam/expr/eval.go | 44 +++-- runtime/vam/expr/unaryminus.go | 150 ++++++++++++++++++ .../ztests => ztests/expr}/unary-minus.yaml | 10 +- vector/bool.go | 4 + 5 files changed, 182 insertions(+), 31 deletions(-) create mode 100644 runtime/vam/expr/unaryminus.go rename runtime/{sam/expr/ztests => ztests/expr}/unary-minus.yaml (95%) diff --git a/compiler/kernel/vexpr.go b/compiler/kernel/vexpr.go index 7b39a55681..833caf9ef4 100644 --- a/compiler/kernel/vexpr.go +++ b/compiler/kernel/vexpr.go @@ -133,9 +133,8 @@ func (b *Builder) compileVamUnary(unary dag.UnaryExpr) (vamexpr.Evaluator, error return nil, err } switch unary.Op { - //XXX TBD - //case "-": - // return vamexpr.NewUnaryMinus(b.zctx(), e), nil + case "-": + return vamexpr.NewUnaryMinus(b.zctx(), e), nil case "!": return vamexpr.NewLogicalNot(b.zctx(), e), nil default: diff --git a/runtime/sam/expr/eval.go b/runtime/sam/expr/eval.go index 71e3f27559..244332f687 100644 --- a/runtime/sam/expr/eval.go +++ b/runtime/sam/expr/eval.go @@ -545,6 +545,26 @@ func NewUnaryMinus(zctx *super.Context, e Evaluator) *UnaryMinus { func (u *UnaryMinus) Eval(ectx Context, this super.Value) super.Value { val := u.expr.Eval(ectx, this) typ := val.Type() + if super.IsUnsigned(typ.ID()) { + switch typ.ID() { + case super.IDUint8: + typ = super.TypeInt8 + case super.IDUint16: + typ = super.TypeInt16 + case super.IDUint32: + typ = super.TypeInt32 + default: + typ = super.TypeInt64 + } + v, ok := coerce.ToInt(val, typ) + if !ok { + return u.zctx.WrapError("cannot cast to "+zson.FormatType(typ), val) + } + if val.IsNull() { + return super.NewValue(typ, nil) + } + val = super.NewInt(typ, v) + } if val.IsNull() && super.IsNumber(typ.ID()) { return val } @@ -575,30 +595,6 @@ func (u *UnaryMinus) Eval(ectx Context, this super.Value) super.Value { return u.zctx.WrapError("unary '-' underflow", val) } return super.NewInt64(-v) - case super.IDUint8: - v := val.Uint() - if v > math.MaxInt8 { - return u.zctx.WrapError("unary '-' overflow", val) - } - return super.NewInt8(int8(-v)) - case super.IDUint16: - v := val.Uint() - if v > math.MaxInt16 { - return u.zctx.WrapError("unary '-' overflow", val) - } - return super.NewInt16(int16(-v)) - case super.IDUint32: - v := val.Uint() - if v > math.MaxInt32 { - return u.zctx.WrapError("unary '-' overflow", val) - } - return super.NewInt32(int32(-v)) - case super.IDUint64: - v := val.Uint() - if v > math.MaxInt64 { - return u.zctx.WrapError("unary '-' overflow", val) - } - return super.NewInt64(int64(-v)) } return u.zctx.WrapError("type incompatible with unary '-' operator", val) } diff --git a/runtime/vam/expr/unaryminus.go b/runtime/vam/expr/unaryminus.go new file mode 100644 index 0000000000..79071d32a3 --- /dev/null +++ b/runtime/vam/expr/unaryminus.go @@ -0,0 +1,150 @@ +package expr + +import ( + "math" + + "github.com/brimdata/super" + "github.com/brimdata/super/runtime/vam/expr/cast" + "github.com/brimdata/super/vector" +) + +type unaryMinus struct { + zctx *super.Context + expr Evaluator +} + +func NewUnaryMinus(zctx *super.Context, eval Evaluator) Evaluator { + return &unaryMinus{zctx, eval} +} + +func (u *unaryMinus) Eval(this vector.Any) vector.Any { + return vector.Apply(true, u.eval, u.expr.Eval(this)) +} + +func (u *unaryMinus) eval(vecs ...vector.Any) vector.Any { + vec := vector.Under(vecs[0]) + if vec.Len() == 0 { + return vec + } + if _, ok := vec.(*vector.Error); ok { + return vec + } + id := vec.Type().ID() + if !super.IsNumber(vec.Type().ID()) { + return vector.NewWrappedError(u.zctx, "type incompatible with unary '-' operator", vecs[0]) + } + if super.IsUnsigned(id) { + var typ super.Type + switch id { + case super.IDUint8: + typ = super.TypeInt8 + case super.IDUint16: + typ = super.TypeInt16 + case super.IDUint32: + typ = super.TypeInt32 + default: + typ = super.TypeInt64 + } + return u.eval(cast.To(u.zctx, vec, typ)) + } + out, ok := u.convert(vec) + if !ok { + // Overflow for int detected, go slow path. + return u.slowPath(vec) + } + return out +} + +func (u *unaryMinus) convert(vec vector.Any) (vector.Any, bool) { + switch vec := vec.(type) { + case *vector.Const: + var val super.Value + if super.IsFloat(vec.Type().ID()) { + val = super.NewFloat(vec.Type(), -vec.Value().Float()) + } else { + v := vec.Value().Int() + if v == minInt(vec.Type()) { + return nil, false + } + val = super.NewInt(vec.Type(), -vec.Value().Int()) + } + return vector.NewConst(val, vec.Len(), vec.Nulls), true + case *vector.Dict: + out, ok := u.convert(vec.Any) + if !ok { + return nil, false + } + return &vector.Dict{ + Any: out, + Index: vec.Index, + Counts: vec.Counts, + Nulls: vec.Nulls, + }, true + case *vector.View: + out, ok := u.convert(vec.Any) + if !ok { + return nil, false + } + return &vector.View{Any: out, Index: vec.Index}, true + case *vector.Int: + min := minInt(vec.Type()) + out := make([]int64, vec.Len()) + for i := range vec.Len() { + if vec.Values[i] == min { + return nil, false + } + out[i] = -vec.Values[i] + } + return vector.NewInt(vec.Typ, out, vec.Nulls), true + case *vector.Float: + out := make([]float64, vec.Len()) + for i := range vec.Len() { + out[i] = -vec.Values[i] + } + return vector.NewFloat(vec.Typ, out, vec.Nulls), true + default: + panic(vec) + } +} + +func (u *unaryMinus) slowPath(vec vector.Any) vector.Any { + var nulls *vector.Bool + var ints []int64 + var errs []uint32 + minval := minInt(vec.Type()) + for i := range vec.Len() { + v, isnull := vector.IntValue(vec, i) + if isnull { + if nulls == nil { + nulls = vector.NewBoolEmpty(vec.Len(), nil) + } + nulls.Set(uint32(len(ints))) + ints = append(ints, 0) + continue + } + if v == minval { + errs = append(errs, i) + } else { + ints = append(ints, -v) + } + } + if nulls != nil { + nulls.SetLen(uint32(len(ints))) + } + out := vector.NewInt(vec.Type(), ints, nulls) + err := vector.NewWrappedError(u.zctx, "unary '-' underflow", vector.NewView(vec, errs)) + return vector.Combine(out, errs, err) +} + +func minInt(typ super.Type) int64 { + switch typ.ID() { + case super.IDInt8: + return math.MinInt8 + case super.IDInt16: + return math.MinInt16 + case super.IDInt32: + return math.MinInt32 + default: + return math.MinInt64 + } +} diff --git a/runtime/sam/expr/ztests/unary-minus.yaml b/runtime/ztests/expr/unary-minus.yaml similarity index 95% rename from runtime/sam/expr/ztests/unary-minus.yaml rename to runtime/ztests/expr/unary-minus.yaml index d8fee7e48e..9245786350 100644 --- a/runtime/sam/expr/ztests/unary-minus.yaml +++ b/runtime/ztests/expr/unary-minus.yaml @@ -1,5 +1,7 @@ zed: yield -this +vector: true + input: | 1(int8) -1(int8) @@ -66,10 +68,10 @@ output: | null(int16) null(int32) null(int64) - null(uint8) - null(uint16) - null(uint32) - null(uint64) + null(int8) + null(int16) + null(int32) + null(int64) null(float16) null(float32) null(float64) diff --git a/vector/bool.go b/vector/bool.go index b0a23d9edb..289d24720c 100644 --- a/vector/bool.go +++ b/vector/bool.go @@ -39,6 +39,10 @@ func (b *Bool) Set(slot uint32) { b.Bits[slot>>6] |= (1 << (slot & 0x3f)) } +func (b *Bool) SetLen(len uint32) { + b.len = len +} + func (b *Bool) Len() uint32 { if b == nil { return 0