From cf24037ba804bf6d7a54358e4defa9fcbf2c2bd4 Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Tue, 2 Sep 2025 05:34:14 -0700 Subject: [PATCH 01/73] [no-release-notes] .github/workflows/test.yml: Prepare for go-icu-regex dependency on ICU4C by ensuring it is available to Cgo in all test environments. --- .github/workflows/test.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 791825489c..f14971cef2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,11 +18,31 @@ jobs: uses: actions/setup-go@v5 with: go-version-file: go.mod + - name: Install ICU4C (MacOS) + if: ${{ matrix.platform == 'macos-latest' }} + run: | + dir=$(brew --cellar icu4c) + dir="$dir"/$(ls "$dir") + echo CGO_CPPFLAGS=-I$dir/include >> $GITHUB_ENV + echo CGO_LDFLAGS=-L$dir/lib >> $GITHUB_ENV + - name: Install ICU4C (Windows) + if: ${{ matrix.platform == 'windows-latest' }} + uses: msys2/setup-msys2@v2 + with: + path-type: inherit + msystem: UCRT64 + pacboy: icu:p toolchain:p pkg-config:p - name: Test - if: ${{ matrix.platform != 'ubuntu-latest' }} + if: ${{ matrix.platform == 'macos-latest' }} run: go test ./... env: CI_TEST: "true" + - name: Test + if: ${{ matrix.platform == 'windows-latest' }} + shell: msys2 {0} + run: go.exe test ./... + env: + CI_TEST: "true" - name: Test if: ${{ matrix.platform == 'ubuntu-latest' }} run: go test -race ./... From db9a8e1295e2ffa72bf3ee4be001c4417239832f Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Tue, 2 Sep 2025 16:21:33 -0700 Subject: [PATCH 02/73] Refactorings to support index scans for pg catalog tables --- sql/analyzer/costed_index_scan.go | 184 ++++++++++++----------------- sql/analyzer/indexscanop_string.go | 37 ------ sql/index.go | 45 +++++++ sql/index_builder.go | 2 +- 4 files changed, 124 insertions(+), 144 deletions(-) delete mode 100644 sql/analyzer/indexscanop_string.go diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 2521122649..9599bca16c 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -124,12 +124,15 @@ func indexSearchableLookup(ctx *sql.Context, n sql.Node, rt sql.TableNode, looku return ret, transform.NewTree, nil } +var SplitConjunction func(expr sql.Expression) []sql.Expression = expression.SplitConjunction + func costedIndexLookup(ctx *sql.Context, n sql.Node, a *Analyzer, iat sql.IndexAddressableTable, rt sql.TableNode, aliasName string, oldFilter sql.Expression, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) { indexes, err := iat.GetIndexes(ctx) if err != nil { return n, transform.SameTree, err } - ita, stats, filters, err := getCostedIndexScan(ctx, a.Catalog, rt, indexes, expression.SplitConjunction(oldFilter), qFlags) + // TODO(next): this is getting a GMSCast node and not getting an index assigned here + ita, stats, filters, err := getCostedIndexScan(ctx, a.Catalog, rt, indexes, SplitConjunction(oldFilter), qFlags) if err != nil || ita == nil { return n, transform.SameTree, err } @@ -871,7 +874,7 @@ func (b *indexScanRangeBuilder) rangeBuildAnd(f *iScanAnd, inScan bool) (sql.MyS partBuilder := sql.NewMySQLIndexBuilder(b.idx) for _, leaf := range f.leaves() { switch leaf.Op() { - case IndexScanOpSpatialEq: + case sql.IndexScanOpSpatialEq: ranges, err := b.rangeBuildSpatialLeaf(leaf, inScan) if err != nil { return nil, err @@ -882,7 +885,7 @@ func (b *indexScanRangeBuilder) rangeBuildAnd(f *iScanAnd, inScan bool) (sql.MyS return nil, err } } - case IndexScanOpFulltextEq: + case sql.IndexScanOpFulltextEq: ranges, err := b.rangeBuildFulltextLeaf(leaf, inScan) if err != nil { return nil, err @@ -982,9 +985,9 @@ func (b *indexScanRangeBuilder) rangeBuildFulltextLeaf(f *iScanLeaf, inScan bool func (b *indexScanRangeBuilder) rangeBuildLeaf(f *iScanLeaf, inScan bool) (sql.MySQLRangeCollection, error) { switch f.Op() { - case IndexScanOpSpatialEq: + case sql.IndexScanOpSpatialEq: return b.rangeBuildSpatialLeaf(f, inScan) - case IndexScanOpFulltextEq: + case sql.IndexScanOpFulltextEq: return b.rangeBuildFulltextLeaf(f, inScan) default: bb := sql.NewMySQLIndexBuilder(b.idx) @@ -1006,29 +1009,29 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, name := f.normString() switch f.Op() { - case IndexScanOpEq: + case sql.IndexScanOpEq: bb.Equals(b.ctx, name, f.litValue) - case IndexScanOpNotEq: + case sql.IndexScanOpNotEq: bb.NotEquals(b.ctx, name, f.litValue) - case IndexScanOpInSet: + case sql.IndexScanOpInSet: bb.Equals(b.ctx, name, f.setValues...) - case IndexScanOpNotInSet: + case sql.IndexScanOpNotInSet: for _, v := range f.setValues { bb.NotEquals(b.ctx, name, v) } - case IndexScanOpGt: + case sql.IndexScanOpGt: bb.GreaterThan(b.ctx, name, f.litValue) - case IndexScanOpGte: + case sql.IndexScanOpGte: bb.GreaterOrEqual(b.ctx, name, f.litValue) - case IndexScanOpLt: + case sql.IndexScanOpLt: bb.LessThan(b.ctx, name, f.litValue) - case IndexScanOpLte: + case sql.IndexScanOpLte: bb.LessOrEqual(b.ctx, name, f.litValue) - case IndexScanOpIsNotNull: + case sql.IndexScanOpIsNotNull: bb.IsNotNull(b.ctx, name) - case IndexScanOpIsNull: + case sql.IndexScanOpIsNull: bb.IsNull(b.ctx, name) - case IndexScanOpNullSafeEq: + case sql.IndexScanOpNullSafeEq: if f.litValue == nil { bb.IsNull(b.ctx, name) } else { @@ -1059,12 +1062,12 @@ func (b *indexScanRangeBuilder) markImprecise(f indexFilter) { // indexFilter decomposes filter conjunction into a format // amenable for checking index prefix alignment type indexFilter interface { - Op() IndexScanOp + Op() sql.IndexScanOp Id() indexScanId } type iScanLeaf struct { - op IndexScanOp + op sql.IndexScanOp id indexScanId gf *expression.GetField underlying string @@ -1084,7 +1087,7 @@ func (l *iScanLeaf) Id() indexScanId { return l.id } -func (l *iScanLeaf) Op() IndexScanOp { +func (l *iScanLeaf) Op() sql.IndexScanOp { return l.op } @@ -1097,8 +1100,8 @@ func (o *iScanOr) Id() indexScanId { return o.id } -func (o *iScanOr) Op() IndexScanOp { - return IndexScanOpOr +func (o *iScanOr) Op() sql.IndexScanOp { + return sql.IndexScanOpOr } func newIScanAnd(id indexScanId) *iScanAnd { @@ -1114,8 +1117,8 @@ type iScanAnd struct { cnt int } -func (a *iScanAnd) Op() IndexScanOp { - return IndexScanOpAnd +func (a *iScanAnd) Op() sql.IndexScanOp { + return sql.IndexScanOpAnd } func (a *iScanAnd) Id() indexScanId { @@ -1199,9 +1202,9 @@ func formatIndexFilterRec(b *strings.Builder, nesting int, f indexFilter) { b.WriteString(" ") } switch f.Op() { - case IndexScanOpIsNull, IndexScanOpIsNotNull: + case sql.IndexScanOpIsNull, sql.IndexScanOpIsNotNull: fmt.Fprintf(b, "(%d: %s %s)", f.Id(), f.gf, f.Op()) - case IndexScanOpInSet, IndexScanOpNotInSet: + case sql.IndexScanOpInSet, sql.IndexScanOpNotInSet: var valStrs []string for _, v := range f.setValues { valStrs = append(valStrs, fmt.Sprintf("%v", v)) @@ -1352,17 +1355,17 @@ func (c *indexCoster) costIndexScanLeaf(filter *iScanLeaf, s sql.Statistic, buck // but can't be used for other comparisons, such as less than or greater than. if indexHasContentHashedFieldForFilter(filter, idx, ordinals) { switch filter.op { - case IndexScanOpEq, IndexScanOpNotEq, IndexScanOpNullSafeEq, IndexScanOpIsNull, IndexScanOpIsNotNull: + case sql.IndexScanOpEq, sql.IndexScanOpNotEq, sql.IndexScanOpNullSafeEq, sql.IndexScanOpIsNull, sql.IndexScanOpIsNotNull: default: return nil, nil, false, 0, nil } } switch filter.op { - case IndexScanOpSpatialEq: + case sql.IndexScanOpSpatialEq: stat, ok, err := c.costSpatial(filter, s, ord) return buckets, stat.FuncDeps(), ok, 0, err - case IndexScanOpFulltextEq: + case sql.IndexScanOpFulltextEq: stat, ok, err := c.costFulltext(filter, s, ord) return buckets, stat.FuncDeps(), ok, 0, err default: @@ -1385,44 +1388,6 @@ func (c *indexCoster) costFulltext(filter *iScanLeaf, s sql.Statistic, ordinal i return s, s.IndexClass() == sql.IndexClassFulltext && s.Qualifier().Index() == filter.fulltextIndex, nil } -type IndexScanOp uint8 - -//go:generate stringer -type=IndexScanOp -linecomment - -const ( - IndexScanOpEq IndexScanOp = iota // = - IndexScanOpNullSafeEq // <=> - IndexScanOpInSet // = - IndexScanOpNotInSet // != - IndexScanOpNotEq // != - IndexScanOpGt // > - IndexScanOpGte // >= - IndexScanOpLt // < - IndexScanOpLte // <= - IndexScanOpAnd // && - IndexScanOpOr // || - IndexScanOpIsNull // IS NULL - IndexScanOpIsNotNull // IS NOT NULL - IndexScanOpSpatialEq // SpatialEq - IndexScanOpFulltextEq // FulltextEq -) - -// Swap returns the identity op for swapping a comparison's LHS and RHS -func (o IndexScanOp) Swap() IndexScanOp { - switch o { - case IndexScanOpGt: - return IndexScanOpLt - case IndexScanOpGte: - return IndexScanOpLte - case IndexScanOpLt: - return IndexScanOpGt - case IndexScanOpLte: - return IndexScanOpGte - default: - return o - } -} - // newLeaf tries to convert an expression into the intermediate // representation that facilitates index column matching. We return // a metadata enriched *iScanLeaf, or nil and a false value if the @@ -1432,7 +1397,7 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri if !ok { return nil, false } - if op == IndexScanOpFulltextEq { + if op == sql.IndexScanOpFulltextEq { e := e.(*expression.MatchAgainst) return &iScanLeaf{id: id, op: op, gf: e.Columns[0].(*expression.GetField), underlying: underlying, fulltextIndex: e.GetIndex().ID()}, true } @@ -1446,7 +1411,7 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri return nil, false } - if op == IndexScanOpIsNull || op == IndexScanOpIsNotNull { + if op == sql.IndexScanOpIsNull || op == sql.IndexScanOpIsNotNull { return &iScanLeaf{id: id, gf: gf, op: op, underlying: underlying}, true } @@ -1454,7 +1419,7 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri return nil, false } - if op == IndexScanOpInSet || op == IndexScanOpNotInSet { + if op == sql.IndexScanOpInSet || op == sql.IndexScanOpNotInSet { tup := right.(expression.Tuple) var litSet []interface{} for _, lit := range tup { @@ -1476,79 +1441,86 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri } // IndexLeafChildren handles the struct types that may be found on a leaf node while creating indexes. -func IndexLeafChildren(e sql.Expression) (IndexScanOp, sql.Expression, sql.Expression, bool) { - var op IndexScanOp +func IndexLeafChildren(e sql.Expression) (sql.IndexScanOp, sql.Expression, sql.Expression, bool) { + var op sql.IndexScanOp var left sql.Expression var right sql.Expression switch e := e.(type) { + // TODO: we need to extract an interface here so that pg expressions can use them as well case *expression.NullSafeEquals: - op = IndexScanOpNullSafeEq + op = sql.IndexScanOpNullSafeEq right = e.Right() left = e.Left() case *expression.Equals: - op = IndexScanOpEq + op = sql.IndexScanOpEq right = e.Right() left = e.Left() case *expression.InTuple: - op = IndexScanOpInSet + op = sql.IndexScanOpInSet right = e.Right() left = e.Left() case *expression.HashInTuple: - op = IndexScanOpInSet + op = sql.IndexScanOpInSet right = e.Right() left = e.Left() case *expression.LessThan: left = e.Left() right = e.Right() - op = IndexScanOpLt + op = sql.IndexScanOpLt case *expression.GreaterThanOrEqual: left = e.Left() right = e.Right() - op = IndexScanOpGte + op = sql.IndexScanOpGte case *expression.GreaterThan: left = e.Left() right = e.Right() - op = IndexScanOpGt + op = sql.IndexScanOpGt case *expression.LessThanOrEqual: left = e.Left() right = e.Right() - op = IndexScanOpLte + op = sql.IndexScanOpLte case sql.IsNullExpression: left = e.Children()[0] - op = IndexScanOpIsNull + op = sql.IndexScanOpIsNull case sql.IsNotNullExpression: left = e.Children()[0] - op = IndexScanOpIsNotNull + op = sql.IndexScanOpIsNotNull case *expression.Not: switch e := e.Child.(type) { case sql.IsNullExpression: left = e.Children()[0] - op = IndexScanOpIsNotNull + op = sql.IndexScanOpIsNotNull // TODO: In Postgres, Not(IS NULL) is valid, but doesn't necessarily always mean the // same thing as IS NOT NULL, particularly for the case of records or composite // values. case *expression.Equals: left = e.Left() right = e.Right() - op = IndexScanOpNotEq + op = sql.IndexScanOpNotEq case *expression.InTuple: - op = IndexScanOpNotInSet + op = sql.IndexScanOpNotInSet right = e.Right() left = e.Left() case *expression.HashInTuple: - op = IndexScanOpNotInSet + op = sql.IndexScanOpNotInSet right = e.Right() left = e.Left() default: return 0, nil, nil, false } case *spatial.Intersects, *spatial.Within, *spatial.STEquals: - op = IndexScanOpSpatialEq + op = sql.IndexScanOpSpatialEq children := e.Children() left = children[0] right = children[1] case *expression.MatchAgainst: - op = IndexScanOpFulltextEq + op = sql.IndexScanOpFulltextEq + case sql.IndexComparisonExpression: + ok := false + op, left, right, ok = e.IndexScanOperation() + if !ok { + return 0, nil, nil, false + } default: return 0, nil, nil, false } @@ -1709,11 +1681,11 @@ func (c *conjCollector) add(ctx *sql.Context, f *iScanLeaf) error { c.applied.Add(int(f.Id())) var err error switch f.Op() { - case IndexScanOpNullSafeEq: + case sql.IndexScanOpNullSafeEq: err = c.addEq(ctx, f.gf.Name(), f.litValue, true) - case IndexScanOpEq: + case sql.IndexScanOpEq: err = c.addEq(ctx, f.gf.Name(), f.litValue, false) - case IndexScanOpInSet: + case sql.IndexScanOpInSet: // TODO cost UNION of equals err = c.addEq(ctx, f.gf.Name(), f.setValues[0], false) default: @@ -1765,7 +1737,7 @@ func (c *conjCollector) addEq(ctx *sql.Context, col string, val interface{}, nul return nil } -func (c *conjCollector) addIneq(ctx *sql.Context, op IndexScanOp, col string, val interface{}) error { +func (c *conjCollector) addIneq(ctx *sql.Context, op sql.IndexScanOp, col string, val interface{}) error { ord := c.ordinals[col] c.ineqCols.Add(ord) if ord > 0 { @@ -1780,7 +1752,7 @@ func (c *conjCollector) addIneq(ctx *sql.Context, op IndexScanOp, col string, va // cmpFirstCol checks whether we should try to range truncate the first // column in the index -func (c *conjCollector) cmpFirstCol(ctx *sql.Context, op IndexScanOp, val interface{}) error { +func (c *conjCollector) cmpFirstCol(ctx *sql.Context, op sql.IndexScanOp, val interface{}) error { // check if first col already constant // otherwise attempt to truncate histogram var err error @@ -1788,39 +1760,39 @@ func (c *conjCollector) cmpFirstCol(ctx *sql.Context, op IndexScanOp, val interf return nil } switch op { - case IndexScanOpNotEq: + case sql.IndexScanOpNotEq: // todo notEq c.hist, err = stats.PrefixGt(ctx, c.hist, c.stat.Types(), val) - case IndexScanOpGt: + case sql.IndexScanOpGt: c.hist, err = stats.PrefixGt(ctx, c.hist, c.stat.Types(), val) - case IndexScanOpGte: + case sql.IndexScanOpGte: c.hist, err = stats.PrefixGte(ctx, c.hist, c.stat.Types(), val) - case IndexScanOpLt: + case sql.IndexScanOpLt: c.hist, err = stats.PrefixLt(ctx, c.hist, c.stat.Types(), val) - case IndexScanOpLte: + case sql.IndexScanOpLte: c.hist, err = stats.PrefixLte(ctx, c.hist, c.stat.Types(), val) - case IndexScanOpIsNull: + case sql.IndexScanOpIsNull: c.hist, err = stats.PrefixIsNull(c.hist) - case IndexScanOpIsNotNull: + case sql.IndexScanOpIsNotNull: c.hist, err = stats.PrefixIsNotNull(c.hist) } return err } -func (c *conjCollector) truncateMcvs(i int, op IndexScanOp, val interface{}) error { +func (c *conjCollector) truncateMcvs(i int, op sql.IndexScanOp, val interface{}) error { var err error switch op { - case IndexScanOpGt: + case sql.IndexScanOpGt: c.stat, err = stats.McvPrefixGt(c.stat, i, val) - case IndexScanOpGte: + case sql.IndexScanOpGte: c.stat, err = stats.McvPrefixGte(c.stat, i, val) - case IndexScanOpLt: + case sql.IndexScanOpLt: c.stat, err = stats.McvPrefixLt(c.stat, i, val) - case IndexScanOpLte: + case sql.IndexScanOpLte: c.stat, err = stats.McvPrefixLte(c.stat, i, val) - case IndexScanOpIsNull: + case sql.IndexScanOpIsNull: c.stat, err = stats.McvPrefixIsNull(c.stat, i, val) - case IndexScanOpIsNotNull: + case sql.IndexScanOpIsNotNull: c.stat, err = stats.McvPrefixIsNotNull(c.stat, i, val) } return err diff --git a/sql/analyzer/indexscanop_string.go b/sql/analyzer/indexscanop_string.go deleted file mode 100644 index 7ee792c540..0000000000 --- a/sql/analyzer/indexscanop_string.go +++ /dev/null @@ -1,37 +0,0 @@ -// Code generated by "stringer -type=IndexScanOp -linecomment"; DO NOT EDIT. - -package analyzer - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[IndexScanOpEq-0] - _ = x[IndexScanOpNullSafeEq-1] - _ = x[IndexScanOpInSet-2] - _ = x[IndexScanOpNotInSet-3] - _ = x[IndexScanOpNotEq-4] - _ = x[IndexScanOpGt-5] - _ = x[IndexScanOpGte-6] - _ = x[IndexScanOpLt-7] - _ = x[IndexScanOpLte-8] - _ = x[IndexScanOpAnd-9] - _ = x[IndexScanOpOr-10] - _ = x[IndexScanOpIsNull-11] - _ = x[IndexScanOpIsNotNull-12] - _ = x[IndexScanOpSpatialEq-13] - _ = x[IndexScanOpFulltextEq-14] -} - -const _IndexScanOp_name = "=<=>=!=!=>>=<<=&&||IS NULLIS NOT NULLSpatialEqFulltextEq" - -var _IndexScanOp_index = [...]uint8{0, 1, 4, 5, 7, 9, 10, 12, 13, 15, 17, 19, 26, 37, 46, 56} - -func (i IndexScanOp) String() string { - if i >= IndexScanOp(len(_IndexScanOp_index)-1) { - return "IndexScanOp(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _IndexScanOp_name[_IndexScanOp_index[i]:_IndexScanOp_index[i+1]] -} diff --git a/sql/index.go b/sql/index.go index 62aac79cc6..5bb6f2a856 100644 --- a/sql/index.go +++ b/sql/index.go @@ -166,6 +166,51 @@ type IndexLookup struct { var emptyLookup = IndexLookup{} +type IndexComparisonExpression interface { + // TODO: IndexScanOp probably needs to be moved into this package as well + IndexScanOperation() (IndexScanOp, Expression, Expression, bool) + +} + +type IndexScanOp uint8 + +//go:generate stringer -type=IndexScanOp -linecomment + +const ( + IndexScanOpEq IndexScanOp = iota // = + IndexScanOpNullSafeEq // <=> + IndexScanOpInSet // = + IndexScanOpNotInSet // != + IndexScanOpNotEq // != + IndexScanOpGt // > + IndexScanOpGte // >= + IndexScanOpLt // < + IndexScanOpLte // <= + IndexScanOpAnd // && + IndexScanOpOr // || + IndexScanOpIsNull // IS NULL + IndexScanOpIsNotNull // IS NOT NULL + IndexScanOpSpatialEq // SpatialEq + IndexScanOpFulltextEq // FulltextEq +) + +// Swap returns the identity op for swapping a comparison's LHS and RHS +func (o IndexScanOp) Swap() IndexScanOp { + switch o { + case IndexScanOpGt: + return IndexScanOpLt + case IndexScanOpGte: + return IndexScanOpLte + case IndexScanOpLt: + return IndexScanOpGt + case IndexScanOpLte: + return IndexScanOpGte + default: + return o + } +} + + func NewIndexLookup(idx Index, ranges MySQLRangeCollection, isPointLookup, isEmptyRange, isSpatialLookup, isReverse bool) IndexLookup { if isReverse { for i, j := 0, len(ranges)-1; i < j; i, j = i+1, j-1 { diff --git a/sql/index_builder.go b/sql/index_builder.go index ae40494a8e..86fe2c84c5 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -18,7 +18,7 @@ import ( "fmt" "math" "strings" - + "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" ) From 1ef73a8091d70a25fe8a996a52c77ad1c6e56c50 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Wed, 3 Sep 2025 15:14:42 -0700 Subject: [PATCH 03/73] Moved ExtendedType into the sql package --- sql/analyzer/costed_index_scan.go | 2 +- sql/analyzer/resolve_column_defaults.go | 2 +- sql/hash/hash.go | 2 +- sql/index_builder.go | 5 ++- sql/plan/foreign_key_editor.go | 4 +-- sql/rowexec/agg.go | 4 +-- sql/type.go | 27 +++++++++++++++ sql/types/extended.go | 45 +++++-------------------- sql/types/typecheck.go | 2 +- 9 files changed, 47 insertions(+), 46 deletions(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 9599bca16c..61827c0195 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1010,7 +1010,7 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, name := f.normString() switch f.Op() { case sql.IndexScanOpEq: - bb.Equals(b.ctx, name, f.litValue) + bb.Equals(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpNotEq: bb.NotEquals(b.ctx, name, f.litValue) case sql.IndexScanOpInSet: diff --git a/sql/analyzer/resolve_column_defaults.go b/sql/analyzer/resolve_column_defaults.go index 705c1dc592..a8ed9f8124 100644 --- a/sql/analyzer/resolve_column_defaults.go +++ b/sql/analyzer/resolve_column_defaults.go @@ -479,7 +479,7 @@ func normalizeDefault(ctx *sql.Context, colDefault *sql.ColumnDefaultValue) (sql // serialization before being passed to the integrator for table creation func skipDefaultNormalizationForType(typ sql.Type) bool { // Extended types handle their own serialization concerns - if _, ok := typ.(types.ExtendedType); ok { + if _, ok := typ.(sql.ExtendedType); ok { return true } return types.IsTime(typ) || types.IsTimespan(typ) || types.IsEnum(typ) || types.IsSet(typ) || types.IsJSON(typ) diff --git a/sql/hash/hash.go b/sql/hash/hash.go index 94bcc64206..483d51dcda 100644 --- a/sql/hash/hash.go +++ b/sql/hash/hash.go @@ -70,7 +70,7 @@ func HashOf(ctx *sql.Context, sch sql.Schema, row sql.Row) (uint64, error) { } switch typ := sch[i].Type.(type) { - case types.ExtendedType: + case sql.ExtendedType: // TODO: Doltgres follows Postgres conventions which don't align with the expectations of MySQL, // so we're using the old (probably incorrect) behavior for now _, err = fmt.Fprintf(hash, "%v", v) diff --git a/sql/index_builder.go b/sql/index_builder.go index 86fe2c84c5..883ecb8291 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -104,7 +104,7 @@ func floor(val interface{}) interface{} { } // Equals represents colExpr = key. For IN expressions, pass all of them in the same Equals call. -func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keys ...interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyTypes []Type, keys ...interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -134,6 +134,9 @@ func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keys ...interfa } var err error + + // x, ok := typ.(ExtendedTy) + k, _, err = typ.Convert(ctx, k) if err != nil { b.isInvalid = true diff --git a/sql/plan/foreign_key_editor.go b/sql/plan/foreign_key_editor.go index b0597183cd..c1554c98bd 100644 --- a/sql/plan/foreign_key_editor.go +++ b/sql/plan/foreign_key_editor.go @@ -763,14 +763,14 @@ func GetForeignKeyTypeConversions( childType := childSch[childIndex].Type parentType := parentSch[parentIndex].Type - childExtendedType, ok := childType.(types.ExtendedType) + childExtendedType, ok := childType.(sql.ExtendedType) // if even one of the types is not an extended type, then we can't transform any values if !ok { return nil, nil } if !childType.Equals(parentType) { - parentExtendedType, ok := parentType.(types.ExtendedType) + parentExtendedType, ok := parentType.(sql.ExtendedType) if !ok { // this should be impossible (child and parent should both be extended types), but just in case return nil, nil diff --git a/sql/rowexec/agg.go b/sql/rowexec/agg.go index a24cecb7a6..cd122e0eb3 100644 --- a/sql/rowexec/agg.go +++ b/sql/rowexec/agg.go @@ -18,8 +18,6 @@ import ( "errors" "io" - "github.com/dolthub/go-mysql-server/sql/types" - "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/expression/function/aggregation" "github.com/dolthub/go-mysql-server/sql/hash" @@ -252,7 +250,7 @@ func (i *groupByGroupingIter) groupingKey(ctx *sql.Context, exprs []sql.Expressi // TODO: this should be moved into hash.HashOf typ := expr.Type() - if extTyp, isExtTyp := typ.(types.ExtendedType); isExtTyp { + if extTyp, isExtTyp := typ.(sql.ExtendedType); isExtTyp { val, vErr := extTyp.SerializeValue(ctx, v) if vErr != nil { return 0, vErr diff --git a/sql/type.go b/sql/type.go index eca6a2bda2..68e25cfa17 100644 --- a/sql/type.go +++ b/sql/type.go @@ -261,3 +261,30 @@ type SystemVariableType interface { // UnderlyingType returns the underlying type that this system variable type is based on. UnderlyingType() Type } + +// ExtendedType is a serializable type that offers an extended interface for interacting with types in a wider context. +type ExtendedType interface { + Type + // SerializedCompare compares two byte slices that each represent a serialized value, without first deserializing + // the value. This should return the same result as the Compare function. + SerializedCompare(ctx context.Context, v1 []byte, v2 []byte) (int, error) + // SerializeValue converts the given value into a binary representation. + SerializeValue(ctx context.Context, val any) ([]byte, error) + // DeserializeValue converts a binary representation of a value into its canonical type. + DeserializeValue(ctx context.Context, val []byte) (any, error) + // FormatValue returns a string version of the value. Primarily intended for display. + FormatValue(val any) (string, error) + // MaxSerializedWidth returns the maximum size that the serialized value may represent. + MaxSerializedWidth() ExtendedTypeSerializedWidth + // ConvertToType converts the given value of the given type to this type, or returns an error if + // no conversion is possible. + ConvertToType(ctx *Context, typ ExtendedType, val any) (any, error) +} + +type ExtendedTypeSerializedWidth uint8 + +const ( + ExtendedTypeSerializedWidth_64K ExtendedTypeSerializedWidth = iota // Represents a variably-sized value. The maximum number of bytes is (2^16)-1. + ExtendedTypeSerializedWidth_Unbounded // Represents a variably-sized value. The maximum number of bytes is (2^64)-1, which is practically unbounded. +) + diff --git a/sql/types/extended.go b/sql/types/extended.go index af86db84ac..8bd7be6109 100644 --- a/sql/types/extended.go +++ b/sql/types/extended.go @@ -15,52 +15,25 @@ package types import ( - "context" "encoding/hex" "errors" "github.com/dolthub/go-mysql-server/sql" ) -// ExtendedType is a serializable type that offers an extended interface for interacting with types in a wider context. -type ExtendedType interface { - sql.Type - // SerializedCompare compares two byte slices that each represent a serialized value, without first deserializing - // the value. This should return the same result as the Compare function. - SerializedCompare(ctx context.Context, v1 []byte, v2 []byte) (int, error) - // SerializeValue converts the given value into a binary representation. - SerializeValue(ctx context.Context, val any) ([]byte, error) - // DeserializeValue converts a binary representation of a value into its canonical type. - DeserializeValue(ctx context.Context, val []byte) (any, error) - // FormatValue returns a string version of the value. Primarily intended for display. - FormatValue(val any) (string, error) - // MaxSerializedWidth returns the maximum size that the serialized value may represent. - MaxSerializedWidth() ExtendedTypeSerializedWidth - // ConvertToType converts the given value of the given type to this type, or returns an error if - // no conversion is possible. - ConvertToType(ctx *sql.Context, typ ExtendedType, val any) (any, error) -} - -type ExtendedTypeSerializedWidth uint8 - -const ( - ExtendedTypeSerializedWidth_64K ExtendedTypeSerializedWidth = iota // Represents a variably-sized value. The maximum number of bytes is (2^16)-1. - ExtendedTypeSerializedWidth_Unbounded // Represents a variably-sized value. The maximum number of bytes is (2^64)-1, which is practically unbounded. -) - // ExtendedTypeSerializer is the function signature for the extended type serializer. -type ExtendedTypeSerializer func(extendedType ExtendedType) ([]byte, error) +type ExtendedTypeSerializer func(extendedType sql.ExtendedType) ([]byte, error) // ExtendedTypeDeserializer is the function signature for the extended type deserializer. -type ExtendedTypeDeserializer func(serializedType []byte) (ExtendedType, error) +type ExtendedTypeDeserializer func(serializedType []byte) (sql.ExtendedType, error) // extendedTypeDeserializer refers to the function that will handle deserialization of extended types. -var extendedTypeDeserializer ExtendedTypeDeserializer = func(serializedType []byte) (ExtendedType, error) { +var extendedTypeDeserializer ExtendedTypeDeserializer = func(serializedType []byte) (sql.ExtendedType, error) { return nil, errors.New("placeholder extended type deserializer") } // extendedTypeSerializer refers to the function that will handle serialization of extended types. -var extendedTypeSerializer ExtendedTypeSerializer = func(extendedType ExtendedType) ([]byte, error) { +var extendedTypeSerializer ExtendedTypeSerializer = func(extendedType sql.ExtendedType) ([]byte, error) { return nil, errors.New("placeholder extended type serializer") } @@ -72,12 +45,12 @@ func SetExtendedTypeSerializers(serializer ExtendedTypeSerializer, deserializer } // SerializeType serializes the given extended type into a byte slice. -func SerializeType(typ ExtendedType) ([]byte, error) { +func SerializeType(typ sql.ExtendedType) ([]byte, error) { return extendedTypeSerializer(typ) } // SerializeTypeToString serializes the given extended type into a hex-encoded string. -func SerializeTypeToString(typ ExtendedType) (string, error) { +func SerializeTypeToString(typ sql.ExtendedType) (string, error) { serializedType, err := extendedTypeSerializer(typ) if err != nil { return "", err @@ -86,12 +59,12 @@ func SerializeTypeToString(typ ExtendedType) (string, error) { } // DeserializeType deserializes a byte slice representing a serialized extended type. -func DeserializeType(typ []byte) (ExtendedType, error) { +func DeserializeType(typ []byte) (sql.ExtendedType, error) { return extendedTypeDeserializer(typ) } // DeserializeTypeFromString deserializes a hex-encoded string representing a serialized extended type. -func DeserializeTypeFromString(typ string) (ExtendedType, error) { +func DeserializeTypeFromString(typ string) (sql.ExtendedType, error) { serializedType, err := hex.DecodeString(typ) if err != nil { return nil, err @@ -101,6 +74,6 @@ func DeserializeTypeFromString(typ string) (ExtendedType, error) { // IsExtendedType returns whether the given sql.Type is an ExtendedType. func IsExtendedType(typ sql.Type) bool { - _, ok := typ.(ExtendedType) + _, ok := typ.(sql.ExtendedType) return ok } diff --git a/sql/types/typecheck.go b/sql/types/typecheck.go index 26fd198907..8834757f93 100644 --- a/sql/types/typecheck.go +++ b/sql/types/typecheck.go @@ -129,7 +129,7 @@ func IsText(t sql.Type) bool { return IsText(typ.UnderlyingType()) case StringType: return true - case ExtendedType: + case sql.ExtendedType: _, isString := typ.Zero().(string) return isString default: From 84e24eb5b3bf7f63ccdd30191078360dece40508 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Wed, 3 Sep 2025 17:25:18 -0700 Subject: [PATCH 04/73] Bug fixes --- sql/analyzer/costed_index_scan.go | 4 ++-- sql/index_builder.go | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 61827c0195..7a7fa56856 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1014,7 +1014,7 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, case sql.IndexScanOpNotEq: bb.NotEquals(b.ctx, name, f.litValue) case sql.IndexScanOpInSet: - bb.Equals(b.ctx, name, f.setValues...) + bb.Equals(b.ctx, name, f.gf.Type(), f.setValues...) case sql.IndexScanOpNotInSet: for _, v := range f.setValues { bb.NotEquals(b.ctx, name, v) @@ -1035,7 +1035,7 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, if f.litValue == nil { bb.IsNull(b.ctx, name) } else { - bb.Equals(b.ctx, name, f.litValue) + bb.Equals(b.ctx, name, f.gf.Type(), f.litValue) } default: panic(fmt.Sprintf("unknown IndexScanOp: %d", f.Op())) diff --git a/sql/index_builder.go b/sql/index_builder.go index 883ecb8291..6cf6979f09 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -104,11 +104,11 @@ func floor(val interface{}) interface{} { } // Equals represents colExpr = key. For IN expressions, pass all of them in the same Equals call. -func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyTypes []Type, keys ...interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyType Type, keys ...interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } - typ, ok := b.colExprTypes[colExpr] + colTyp, ok := b.colExprTypes[colExpr] if !ok { b.isInvalid = true b.err = ErrInvalidColExpr.New(colExpr, b.idx.ID()) @@ -117,33 +117,34 @@ func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyTypes []Type potentialRanges := make([]MySQLRangeColumnExpr, len(keys)) for i, k := range keys { // if converting from float to int results in rounding, then it's empty range - if t, ok := typ.(NumberType); ok && !t.IsFloat() { + if t, ok := colTyp.(NumberType); ok && !t.IsFloat() { f, c := floor(k), ceil(k) switch k.(type) { case float32, float64: if f != c { - potentialRanges[i] = EmptyRangeColumnExpr(typ) + potentialRanges[i] = EmptyRangeColumnExpr(colTyp) continue } case decimal.Decimal: if !f.(decimal.Decimal).Equals(c.(decimal.Decimal)) { - potentialRanges[i] = EmptyRangeColumnExpr(typ) + potentialRanges[i] = EmptyRangeColumnExpr(colTyp) continue } } } var err error - - // x, ok := typ.(ExtendedTy) - - k, _, err = typ.Convert(ctx, k) + if et, ok := keyType.(ExtendedType); ok { + k, err = et.ConvertToType(ctx, colTyp.(ExtendedType), k) + } else { + k, _, err = colTyp.Convert(ctx, k) + } if err != nil { b.isInvalid = true b.err = err return b } - potentialRanges[i] = ClosedRangeColumnExpr(k, k, typ) + potentialRanges[i] = ClosedRangeColumnExpr(k, k, colTyp) } b.updateCol(ctx, colExpr, potentialRanges...) return b From b2ba67c993e6b0ace3de160dc4e1bd3c8374dfe6 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Wed, 3 Sep 2025 17:34:37 -0700 Subject: [PATCH 05/73] Added key type to other index builder interfaces --- sql/analyzer/costed_index_scan.go | 12 ++++++------ sql/index_builder.go | 32 ++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 7a7fa56856..2f79f189be 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1012,21 +1012,21 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, case sql.IndexScanOpEq: bb.Equals(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpNotEq: - bb.NotEquals(b.ctx, name, f.litValue) + bb.NotEquals(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpInSet: bb.Equals(b.ctx, name, f.gf.Type(), f.setValues...) case sql.IndexScanOpNotInSet: for _, v := range f.setValues { - bb.NotEquals(b.ctx, name, v) + bb.NotEquals(b.ctx, name, f.gf.Type(), v) } case sql.IndexScanOpGt: - bb.GreaterThan(b.ctx, name, f.litValue) + bb.GreaterThan(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpGte: - bb.GreaterOrEqual(b.ctx, name, f.litValue) + bb.GreaterOrEqual(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpLt: - bb.LessThan(b.ctx, name, f.litValue) + bb.LessThan(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpLte: - bb.LessOrEqual(b.ctx, name, f.litValue) + bb.LessOrEqual(b.ctx, name, f.gf.Type(), f.litValue) case sql.IndexScanOpIsNotNull: bb.IsNotNull(b.ctx, name) case sql.IndexScanOpIsNull: diff --git a/sql/index_builder.go b/sql/index_builder.go index 6cf6979f09..46fa8d215f 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -18,7 +18,7 @@ import ( "fmt" "math" "strings" - + "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" ) @@ -151,7 +151,7 @@ func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyType Type, k } // NotEquals represents colExpr <> key. -func (b *MySQLIndexBuilder) NotEquals(ctx *Context, colExpr string, key interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) NotEquals(ctx *Context, colExpr string, keyType Type, key interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -176,7 +176,7 @@ func (b *MySQLIndexBuilder) NotEquals(ctx *Context, colExpr string, key interfac } } - key, _, err := typ.Convert(ctx, key) + key, err := b.convertKey(ctx, typ, keyType, key) if err != nil { b.isInvalid = true b.err = err @@ -201,7 +201,7 @@ func (b *MySQLIndexBuilder) NotEquals(ctx *Context, colExpr string, key interfac } // GreaterThan represents colExpr > key. -func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, key interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, keyType Type, key interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -216,7 +216,7 @@ func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, key interf key = floor(key) } - key, _, err := typ.Convert(ctx, key) + key, err := b.convertKey(ctx, typ, keyType, key) if err != nil { b.isInvalid = true b.err = err @@ -227,8 +227,17 @@ func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, key interf return b } +func (b *MySQLIndexBuilder) convertKey(ctx *Context, colType Type, keyType Type, key interface{}) (interface{}, error) { + if et, ok := keyType.(ExtendedType); ok { + return et.ConvertToType(ctx, colType.(ExtendedType), key) + } else { + key, _, err := colType.Convert(ctx, key) + return key, err + } +} + // GreaterOrEqual represents colExpr >= key. -func (b *MySQLIndexBuilder) GreaterOrEqual(ctx *Context, colExpr string, key interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) GreaterOrEqual(ctx *Context, colExpr string, keyType Type, key interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -251,7 +260,7 @@ func (b *MySQLIndexBuilder) GreaterOrEqual(ctx *Context, colExpr string, key int key = newKey } - key, _, err := typ.Convert(ctx, key) + key, err := b.convertKey(ctx, typ, keyType, key) if err != nil { b.isInvalid = true b.err = err @@ -270,7 +279,7 @@ func (b *MySQLIndexBuilder) GreaterOrEqual(ctx *Context, colExpr string, key int } // LessThan represents colExpr < key. -func (b *MySQLIndexBuilder) LessThan(ctx *Context, colExpr string, key interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) LessThan(ctx *Context, colExpr string, keyType Type, key interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -284,7 +293,8 @@ func (b *MySQLIndexBuilder) LessThan(ctx *Context, colExpr string, key interface if t, ok := typ.(NumberType); ok && !t.IsFloat() { key = ceil(key) } - key, _, err := typ.Convert(ctx, key) + + key, err := b.convertKey(ctx, typ, keyType, key) if err != nil { b.isInvalid = true b.err = err @@ -296,7 +306,7 @@ func (b *MySQLIndexBuilder) LessThan(ctx *Context, colExpr string, key interface } // LessOrEqual represents colExpr <= key. -func (b *MySQLIndexBuilder) LessOrEqual(ctx *Context, colExpr string, key interface{}) *MySQLIndexBuilder { +func (b *MySQLIndexBuilder) LessOrEqual(ctx *Context, colExpr string, keyType Type, key interface{}) *MySQLIndexBuilder { if b.isInvalid { return b } @@ -319,7 +329,7 @@ func (b *MySQLIndexBuilder) LessOrEqual(ctx *Context, colExpr string, key interf key = newKey } - key, _, err := typ.Convert(ctx, key) + key, err := b.convertKey(ctx, typ, keyType, key) if err != nil { b.isInvalid = true b.err = err From 4bfc2254cafb1441e37225fcfa17c89c58aa8ef1 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Thu, 4 Sep 2025 12:28:43 -0700 Subject: [PATCH 06/73] Support for NOT --- sql/analyzer/costed_index_scan.go | 15 +++++++++++++ sql/indexscanop_string.go | 37 +++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100755 sql/indexscanop_string.go diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 2f79f189be..0c89889576 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1505,6 +1505,21 @@ func IndexLeafChildren(e sql.Expression) (sql.IndexScanOp, sql.Expression, sql.E op = sql.IndexScanOpNotInSet right = e.Right() left = e.Left() + case sql.IndexComparisonExpression: + ok := false + if !ok { + return 0, nil, nil, false + } + + op, left, right, ok = e.IndexScanOperation() + switch op { + case sql.IndexScanOpEq: + op = sql.IndexScanOpNotEq + case sql.IndexScanOpInSet: + op = sql.IndexScanOpNotInSet + default: + return 0, nil, nil, false + } default: return 0, nil, nil, false } diff --git a/sql/indexscanop_string.go b/sql/indexscanop_string.go new file mode 100755 index 0000000000..6768059957 --- /dev/null +++ b/sql/indexscanop_string.go @@ -0,0 +1,37 @@ +// Code generated by "stringer -type=IndexScanOp -linecomment"; DO NOT EDIT. + +package sql + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[IndexScanOpEq-0] + _ = x[IndexScanOpNullSafeEq-1] + _ = x[IndexScanOpInSet-2] + _ = x[IndexScanOpNotInSet-3] + _ = x[IndexScanOpNotEq-4] + _ = x[IndexScanOpGt-5] + _ = x[IndexScanOpGte-6] + _ = x[IndexScanOpLt-7] + _ = x[IndexScanOpLte-8] + _ = x[IndexScanOpAnd-9] + _ = x[IndexScanOpOr-10] + _ = x[IndexScanOpIsNull-11] + _ = x[IndexScanOpIsNotNull-12] + _ = x[IndexScanOpSpatialEq-13] + _ = x[IndexScanOpFulltextEq-14] +} + +const _IndexScanOp_name = "=<=>=!=!=>>=<<=&&||IS NULLIS NOT NULLSpatialEqFulltextEq" + +var _IndexScanOp_index = [...]uint8{0, 1, 4, 5, 7, 9, 10, 12, 13, 15, 17, 19, 26, 37, 46, 56} + +func (i IndexScanOp) String() string { + if i >= IndexScanOp(len(_IndexScanOp_index)-1) { + return "IndexScanOp(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _IndexScanOp_name[_IndexScanOp_index[i]:_IndexScanOp_index[i+1]] +} From 561fd826fea3778391aac7ea758043ce36062931 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Sep 2025 18:12:41 +0000 Subject: [PATCH 07/73] add unwrapany calls for dolt textstorage --- .../function/reverse_repeat_replace.go | 33 ++++++++++++++++-- sql/expression/function/substring.go | 12 +++++-- sql/expression/function/trim_ltrim_rtrim.go | 34 +++++++++++++++---- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/sql/expression/function/reverse_repeat_replace.go b/sql/expression/function/reverse_repeat_replace.go index 9a6a6d156a..7ae4d7b4f9 100644 --- a/sql/expression/function/reverse_repeat_replace.go +++ b/sql/expression/function/reverse_repeat_replace.go @@ -16,6 +16,7 @@ package function import ( "fmt" + "reflect" "strings" "gopkg.in/src-d/go-errors.v1" @@ -64,7 +65,18 @@ func (r *Reverse) Eval( return nil, err } - return reverseString(v.(string)), nil + // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings + v, err = sql.UnwrapAny(ctx, v) + if err != nil { + return nil, err + } + + s, ok := v.(string) + if !ok { + return nil, sql.ErrInvalidType.New(reflect.TypeOf(v).String()) + } + + return reverseString(s), nil } func reverseString(s string) string { @@ -162,6 +174,17 @@ func (r *Repeat) Eval( return nil, err } + // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + + strVal, ok := str.(string) + if !ok { + return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) + } + count, err := r.RightChild.Eval(ctx, row) if count == nil || err != nil { return nil, err @@ -171,10 +194,14 @@ func (r *Repeat) Eval( if err != nil { return nil, err } - if count.(int32) < 0 { + countVal, ok := count.(int32) + if !ok { + return nil, sql.ErrInvalidType.New(reflect.TypeOf(count).String()) + } + if countVal < 0 { return nil, ErrNegativeRepeatCount.New(count) } - return strings.Repeat(str.(string), int(count.(int32))), nil + return strings.Repeat(strVal, int(countVal)), nil } // Replace is a function that returns a string with all occurrences of fromStr replaced by the diff --git a/sql/expression/function/substring.go b/sql/expression/function/substring.go index 19a51a46f0..e88921d9c2 100644 --- a/sql/expression/function/substring.go +++ b/sql/expression/function/substring.go @@ -84,14 +84,22 @@ func (s *Substring) Eval( return nil, err } + if str == nil { + return nil, nil + } + + // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + var text []rune switch str := str.(type) { case string: text = []rune(str) case []byte: text = []rune(string(str)) - case nil: - return nil, nil default: return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) } diff --git a/sql/expression/function/trim_ltrim_rtrim.go b/sql/expression/function/trim_ltrim_rtrim.go index b5c6d2a05c..88a28650ec 100644 --- a/sql/expression/function/trim_ltrim_rtrim.go +++ b/sql/expression/function/trim_ltrim_rtrim.go @@ -68,6 +68,12 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, sql.ErrInvalidType.New(reflect.TypeOf(pat).String()) } + // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings + pat, err = sql.UnwrapAny(ctx, pat) + if err != nil { + return nil, err + } + // Evaluate string value str, err := t.str.Eval(ctx, row) if err != nil { @@ -79,15 +85,31 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, nil } - // Convert pat into string + // Convert str to text type (may still be wrapped) str, _, err = types.LongText.Convert(ctx, str) if err != nil { return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) } + // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + + strVal, ok := str.(string) + if !ok { + return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) + } + + patVal, ok := pat.(string) + if !ok { + return nil, sql.ErrInvalidType.New(reflect.TypeOf(pat).String()) + } + start := 0 - end := len(str.(string)) - n := len(pat.(string)) + end := len(strVal) + n := len(patVal) // Empty pattern, do nothing if n == 0 { @@ -96,19 +118,19 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { // Trim Leading if t.dir == sqlparser.Leading || t.dir == sqlparser.Both { - for start+n <= end && str.(string)[start:start+n] == pat { + for start+n <= end && strVal[start:start+n] == patVal { start += n } } // Trim Trailing if t.dir == sqlparser.Trailing || t.dir == sqlparser.Both { - for start+n <= end && str.(string)[end-n:end] == pat { + for start+n <= end && strVal[end-n:end] == patVal { end -= n } } - return str.(string)[start:end], nil + return strVal[start:end], nil } // IsNullable implements the Expression interface. From 7f6dddfb677512c7ac182760a3fbc707004c654c Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Fri, 5 Sep 2025 11:40:28 -0700 Subject: [PATCH 08/73] Bug fix for type conversion in index building --- sql/analyzer/costed_index_scan.go | 28 ++++++++++++++++++---------- sql/index_builder.go | 11 ++++------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 5d4f12d65b..f641e63054 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1012,23 +1012,23 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, name := f.normString() switch f.Op() { case sql.IndexScanOpEq: - bb.Equals(b.ctx, name, f.gf.Type(), f.litValue) + bb.Equals(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpNotEq: - bb.NotEquals(b.ctx, name, f.gf.Type(), f.litValue) + bb.NotEquals(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpInSet: - bb.Equals(b.ctx, name, f.gf.Type(), f.setValues...) + bb.Equals(b.ctx, name, f.litType, f.setValues...) case sql.IndexScanOpNotInSet: for _, v := range f.setValues { - bb.NotEquals(b.ctx, name, f.gf.Type(), v) + bb.NotEquals(b.ctx, name, f.litType, v) } case sql.IndexScanOpGt: - bb.GreaterThan(b.ctx, name, f.gf.Type(), f.litValue) + bb.GreaterThan(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpGte: - bb.GreaterOrEqual(b.ctx, name, f.gf.Type(), f.litValue) + bb.GreaterOrEqual(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpLt: - bb.LessThan(b.ctx, name, f.gf.Type(), f.litValue) + bb.LessThan(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpLte: - bb.LessOrEqual(b.ctx, name, f.gf.Type(), f.litValue) + bb.LessOrEqual(b.ctx, name, f.litType, f.litValue) case sql.IndexScanOpIsNotNull: bb.IsNotNull(b.ctx, name) case sql.IndexScanOpIsNull: @@ -1037,7 +1037,7 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder, if f.litValue == nil { bb.IsNull(b.ctx, name) } else { - bb.Equals(b.ctx, name, f.gf.Type(), f.litValue) + bb.Equals(b.ctx, name, f.litType, f.litValue) } default: panic(fmt.Sprintf("unknown IndexScanOp: %d", f.Op())) @@ -1070,6 +1070,7 @@ type indexFilter interface { type iScanLeaf struct { litValue interface{} + litType sql.Type gf *expression.GetField underlying string fulltextIndex string @@ -1439,7 +1440,14 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri return nil, false } - return &iScanLeaf{id: id, gf: gf, op: op, litValue: value, underlying: underlying}, true + return &iScanLeaf{ + id: id, + gf: gf, + op: op, + litValue: value, + litType: right.Type(), + underlying: underlying, + }, true } // IndexLeafChildren handles the struct types that may be found on a leaf node while creating indexes. diff --git a/sql/index_builder.go b/sql/index_builder.go index 242788657c..ba49bd8b77 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -134,11 +134,8 @@ func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyType Type, k } var err error - if et, ok := keyType.(ExtendedType); ok { - k, err = et.ConvertToType(ctx, colTyp.(ExtendedType), k) - } else { - k, _, err = colTyp.Convert(ctx, k) - } + k, err = b.convertKey(ctx, colTyp, keyType, k) + if err != nil { b.isInvalid = true b.err = err @@ -228,8 +225,8 @@ func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, keyType Ty } func (b *MySQLIndexBuilder) convertKey(ctx *Context, colType Type, keyType Type, key interface{}) (interface{}, error) { - if et, ok := keyType.(ExtendedType); ok { - return et.ConvertToType(ctx, colType.(ExtendedType), key) + if et, ok := colType.(ExtendedType); ok { + return et.ConvertToType(ctx, keyType.(ExtendedType), key) } else { key, _, err := colType.Convert(ctx, key) return key, err From 0883bbc2caef0e2cb3710ba43853f07b8d9daf48 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Fri, 5 Sep 2025 12:07:26 -0700 Subject: [PATCH 09/73] type conversion for in set --- sql/analyzer/costed_index_scan.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index f641e63054..6d65f24cdc 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1425,14 +1425,25 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri if op == sql.IndexScanOpInSet || op == sql.IndexScanOpNotInSet { tup := right.(expression.Tuple) var litSet []interface{} + var litType sql.Type for _, lit := range tup { value, err := lit.Eval(ctx, nil) if err != nil { return nil, false } litSet = append(litSet, value) + if litType == nil { + litType = lit.Type() + } } - return &iScanLeaf{id: id, gf: gf, op: op, setValues: litSet, underlying: underlying}, true + return &iScanLeaf{ + id: id, + gf: gf, + op: op, + setValues: litSet, + litType: litType, + underlying: underlying, + }, true } value, err := right.Eval(ctx, nil) From 3298c59c48dec52f7b199fd3f6000f948270548b Mon Sep 17 00:00:00 2001 From: zachmu Date: Fri, 5 Sep 2025 20:47:44 +0000 Subject: [PATCH 10/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/analyzer/costed_index_scan.go | 26 +++++++++++++------------- sql/index.go | 2 -- sql/type.go | 1 - 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/sql/analyzer/costed_index_scan.go b/sql/analyzer/costed_index_scan.go index 6d65f24cdc..e41d07cfaa 100644 --- a/sql/analyzer/costed_index_scan.go +++ b/sql/analyzer/costed_index_scan.go @@ -1414,7 +1414,7 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri return nil, false } - if op == sql.IndexScanOpIsNull || op == sql.IndexScanOpIsNotNull { + if op == sql.IndexScanOpIsNull || op == sql.IndexScanOpIsNotNull { return &iScanLeaf{id: id, gf: gf, op: op, underlying: underlying}, true } @@ -1437,11 +1437,11 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri } } return &iScanLeaf{ - id: id, - gf: gf, - op: op, - setValues: litSet, - litType: litType, + id: id, + gf: gf, + op: op, + setValues: litSet, + litType: litType, underlying: underlying, }, true } @@ -1452,11 +1452,11 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri } return &iScanLeaf{ - id: id, - gf: gf, - op: op, - litValue: value, - litType: right.Type(), + id: id, + gf: gf, + op: op, + litValue: value, + litType: right.Type(), underlying: underlying, }, true } @@ -1467,7 +1467,7 @@ func IndexLeafChildren(e sql.Expression) (sql.IndexScanOp, sql.Expression, sql.E var left sql.Expression var right sql.Expression switch e := e.(type) { - // TODO: we need to extract an interface here so that pg expressions can use them as well + // TODO: we need to extract an interface here so that pg expressions can use them as well case *expression.NullSafeEquals: op = sql.IndexScanOpNullSafeEq right = e.Right() @@ -1555,7 +1555,7 @@ func IndexLeafChildren(e sql.Expression) (sql.IndexScanOp, sql.Expression, sql.E ok := false op, left, right, ok = e.IndexScanOperation() if !ok { - return 0, nil, nil, false + return 0, nil, nil, false } default: return 0, nil, nil, false diff --git a/sql/index.go b/sql/index.go index caeda2b8d4..34225fb114 100644 --- a/sql/index.go +++ b/sql/index.go @@ -169,7 +169,6 @@ var emptyLookup = IndexLookup{} type IndexComparisonExpression interface { // TODO: IndexScanOp probably needs to be moved into this package as well IndexScanOperation() (IndexScanOp, Expression, Expression, bool) - } type IndexScanOp uint8 @@ -210,7 +209,6 @@ func (o IndexScanOp) Swap() IndexScanOp { } } - func NewIndexLookup(idx Index, ranges MySQLRangeCollection, isPointLookup, isEmptyRange, isSpatialLookup, isReverse bool) IndexLookup { if isReverse { for i, j := 0, len(ranges)-1; i < j; i, j = i+1, j-1 { diff --git a/sql/type.go b/sql/type.go index 68e25cfa17..379ed92221 100644 --- a/sql/type.go +++ b/sql/type.go @@ -287,4 +287,3 @@ const ( ExtendedTypeSerializedWidth_64K ExtendedTypeSerializedWidth = iota // Represents a variably-sized value. The maximum number of bytes is (2^16)-1. ExtendedTypeSerializedWidth_Unbounded // Represents a variably-sized value. The maximum number of bytes is (2^64)-1, which is practically unbounded. ) - From d9d27fb847263f0929320cbe70e1fed7cc56f42d Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Fri, 5 Sep 2025 13:58:13 -0700 Subject: [PATCH 11/73] fixed test --- sql/index_builder_test.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/sql/index_builder_test.go b/sql/index_builder_test.go index a7bde2a244..41798842cc 100644 --- a/sql/index_builder_test.go +++ b/sql/index_builder_test.go @@ -46,7 +46,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("IsNull,Equals2=EmptyRange", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) builder = builder.IsNull(ctx, "column_0") - builder = builder.Equals(ctx, "column_0", 2) + builder = builder.Equals(ctx, "column_0", nil, 2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.EmptyRangeColumnExpr(types.Int8)}}, ranges) @@ -54,7 +54,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("NotEquals2=(NULL,2),(2,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.NotEquals(ctx, "column_0", 2) + builder = builder.NotEquals(ctx, "column_0", nil,2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.GreaterThanRangeColumnExpr(int8(2), types.Int8)}, sql.MySQLRange{sql.LessThanRangeColumnExpr(int8(2), types.Int8)}}, ranges) @@ -62,8 +62,8 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("NotEquals2,Equals2=(Inf,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.NotEquals(ctx, "column_0", 2) - builder = builder.Equals(ctx, "column_0", 2) + builder = builder.NotEquals(ctx, "column_0", nil,2) + builder = builder.Equals(ctx, "column_0", nil, 2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.EmptyRangeColumnExpr(types.Int8)}}, ranges) @@ -71,8 +71,8 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("Equals2,NotEquals2=(Inf,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.Equals(ctx, "column_0", 2) - builder = builder.NotEquals(ctx, "column_0", 2) + builder = builder.Equals(ctx, "column_0", nil, 2) + builder = builder.NotEquals(ctx, "column_0", nil, 2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.EmptyRangeColumnExpr(types.Int8)}}, ranges) @@ -80,7 +80,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("LT4=(NULL,4)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.LessThan(ctx, "column_0", 4) + builder = builder.LessThan(ctx, "column_0", nil, 4) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.LessThanRangeColumnExpr(int8(4), types.Int8)}}, ranges) @@ -88,8 +88,8 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("GT2,LT4=(2,4)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.GreaterThan(ctx, "column_0", 2) - builder = builder.LessThan(ctx, "column_0", 4) + builder = builder.GreaterThan(ctx, "column_0", nil, 2) + builder = builder.LessThan(ctx, "column_0", nil, 4) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.OpenRangeColumnExpr(int8(2), int8(4), types.Int8)}}, ranges) @@ -97,8 +97,8 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("GT2,GT6=(4,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.GreaterThan(ctx, "column_0", 2) - builder = builder.GreaterThan(ctx, "column_0", 6) + builder = builder.GreaterThan(ctx, "column_0", nil,2) + builder = builder.GreaterThan(ctx, "column_0", nil, 6) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.GreaterThanRangeColumnExpr(int8(6), types.Int8)}}, ranges) @@ -106,9 +106,9 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("GT2,LT4,GT6=(Inf,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.GreaterThan(ctx, "column_0", 2) - builder = builder.LessThan(ctx, "column_0", 4) - builder = builder.GreaterThan(ctx, "column_0", 6) + builder = builder.GreaterThan(ctx, "column_0", nil, 2) + builder = builder.LessThan(ctx, "column_0", nil, 4) + builder = builder.GreaterThan(ctx, "column_0", nil, 6) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.EmptyRangeColumnExpr(types.Int8)}}, ranges) @@ -116,8 +116,8 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("NotEqual2,NotEquals4=(2,4),(4,Inf),(NULL,2)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.NotEquals(ctx, "column_0", 2) - builder = builder.NotEquals(ctx, "column_0", 4) + builder = builder.NotEquals(ctx, "column_0", nil, 2) + builder = builder.NotEquals(ctx, "column_0", nil, 4) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.OpenRangeColumnExpr(int8(2), int8(4), types.Int8)}, sql.MySQLRange{sql.GreaterThanRangeColumnExpr(int8(4), types.Int8)}, sql.MySQLRange{sql.LessThanRangeColumnExpr(int8(2), types.Int8)}}, ranges) @@ -125,9 +125,9 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("ThreeColumnCombine", func(t *testing.T) { clauses := make([]sql.MySQLRangeCollection, 3) - clauses[0] = sql.NewMySQLIndexBuilder(testIndex{3}).GreaterOrEqual(ctx, "column_0", 99).LessThan(ctx, "column_1", 66).Ranges(ctx) - clauses[1] = sql.NewMySQLIndexBuilder(testIndex{3}).GreaterOrEqual(ctx, "column_0", 1).LessOrEqual(ctx, "column_0", 47).Ranges(ctx) - clauses[2] = sql.NewMySQLIndexBuilder(testIndex{3}).NotEquals(ctx, "column_0", 2).LessThan(ctx, "column_1", 30).Ranges(ctx) + clauses[0] = sql.NewMySQLIndexBuilder(testIndex{3}).GreaterOrEqual(ctx, "column_0", nil, 99).LessThan(ctx, "column_1", nil, 66).Ranges(ctx) + clauses[1] = sql.NewMySQLIndexBuilder(testIndex{3}).GreaterOrEqual(ctx, "column_0", nil, 1).LessOrEqual(ctx, "column_0", nil, 47).Ranges(ctx) + clauses[2] = sql.NewMySQLIndexBuilder(testIndex{3}).NotEquals(ctx, "column_0", nil, 2).LessThan(ctx, "column_1", nil, 30).Ranges(ctx) assert.Len(t, clauses[0], 1) assert.Len(t, clauses[1], 1) assert.Len(t, clauses[2], 2) From 015f57212ff438bd683624fa1c5385c99b8f0b90 Mon Sep 17 00:00:00 2001 From: zachmu Date: Fri, 5 Sep 2025 20:59:20 +0000 Subject: [PATCH 12/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/index_builder_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/index_builder_test.go b/sql/index_builder_test.go index 41798842cc..c055768fb3 100644 --- a/sql/index_builder_test.go +++ b/sql/index_builder_test.go @@ -54,7 +54,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("NotEquals2=(NULL,2),(2,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.NotEquals(ctx, "column_0", nil,2) + builder = builder.NotEquals(ctx, "column_0", nil, 2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) assert.Equal(t, sql.MySQLRangeCollection{sql.MySQLRange{sql.GreaterThanRangeColumnExpr(int8(2), types.Int8)}, sql.MySQLRange{sql.LessThanRangeColumnExpr(int8(2), types.Int8)}}, ranges) @@ -62,7 +62,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("NotEquals2,Equals2=(Inf,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.NotEquals(ctx, "column_0", nil,2) + builder = builder.NotEquals(ctx, "column_0", nil, 2) builder = builder.Equals(ctx, "column_0", nil, 2) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) @@ -97,7 +97,7 @@ func TestIndexBuilderRanges(t *testing.T) { t.Run("GT2,GT6=(4,Inf)", func(t *testing.T) { builder := sql.NewMySQLIndexBuilder(testIndex{1}) - builder = builder.GreaterThan(ctx, "column_0", nil,2) + builder = builder.GreaterThan(ctx, "column_0", nil, 2) builder = builder.GreaterThan(ctx, "column_0", nil, 6) ranges := builder.Ranges(ctx) assert.NotNil(t, ranges) From 08d813d897ad37e0a8c1a140190dbe2a2ce66bec Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 5 Sep 2025 14:26:45 -0700 Subject: [PATCH 13/73] Add added column to CreateConstraint scope --- enginetest/queries/alter_table_queries.go | 14 ++++++++++++++ sql/analyzer/fix_exec_indexes.go | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/enginetest/queries/alter_table_queries.go b/enginetest/queries/alter_table_queries.go index 6f22a8e893..b7118e928d 100644 --- a/enginetest/queries/alter_table_queries.go +++ b/enginetest/queries/alter_table_queries.go @@ -2107,6 +2107,20 @@ var AddColumnScripts = []ScriptTest{ }, }, }, + { + Name: "add column with check constraint", + SetUpScript: []string{ + "create table t (i int primary key, j int)", + "insert into t values (1, 2)", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "alter table t add column k int check (k > 0)", + // TODO: this should be 1 rowsAffected https://github.com/dolthub/dolt/issues/9606 + Expected: []sql.Row{{types.NewOkResult(0)}}, + }, + }, + }, { Name: "error cases", Assertions: []ScriptTestAssertion{ diff --git a/sql/analyzer/fix_exec_indexes.go b/sql/analyzer/fix_exec_indexes.go index 734d02fa5b..9a231a1fa5 100644 --- a/sql/analyzer/fix_exec_indexes.go +++ b/sql/analyzer/fix_exec_indexes.go @@ -159,6 +159,7 @@ type idxScope struct { childScopes []*idxScope ids []sql.ColumnId columns []string + addedColumns sql.Schema children []sql.Node expressions []sql.Expression checks sql.CheckConstraints @@ -301,6 +302,7 @@ func (s *idxScope) copy() *idxScope { parentScopes: parentCopy, columns: varsCopy, ids: idsCopy, + addedColumns: s.addedColumns, subqueryScope: s.subqueryScope, triggerScope: s.triggerScope, insertSourceScope: s.insertSourceScope, @@ -399,6 +401,9 @@ func (s *idxScope) visitChildren(n sql.Node) error { if err != nil { return err } + if ac, ok := c.(*plan.AddColumn); ok { + s.addedColumns = append(s.addedColumns, ac.Column()) + } s.childScopes = append(s.childScopes, cScope) s.children = append(s.children, newC) } @@ -565,6 +570,11 @@ func (s *idxScope) visitSelf(n sql.Node) error { newDef := fixExprToScope(sql.Expression(col.Default), scope) n.DestSch[colIdx].Default = newDef.(*sql.ColumnDefaultValue) } + case *plan.CreateCheck: + addedScope := &idxScope{} + addedScope.addSchema(s.addedColumns) + scope := append(append(s.parentScopes, s.childScopes...), addedScope) + s.expressions = append(s.expressions, fixExprToScope(n.Check.Expr, scope...)) default: // Group By and Window functions already account for the new/old columns present from triggers // This means that when indexing the Projections, we should not include the trigger scope(s), which are From 1ed44afeecd41d3849b25762e70ce1791932aa55 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 5 Sep 2025 15:10:07 -0700 Subject: [PATCH 14/73] add more tests --- enginetest/queries/alter_table_queries.go | 8 ++++++++ sql/analyzer/fix_exec_indexes.go | 10 ++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/enginetest/queries/alter_table_queries.go b/enginetest/queries/alter_table_queries.go index b7118e928d..4a638e31b5 100644 --- a/enginetest/queries/alter_table_queries.go +++ b/enginetest/queries/alter_table_queries.go @@ -2119,6 +2119,14 @@ var AddColumnScripts = []ScriptTest{ // TODO: this should be 1 rowsAffected https://github.com/dolthub/dolt/issues/9606 Expected: []sql.Row{{types.NewOkResult(0)}}, }, + { + Query: "alter table t add column l int check (l is not null)", + ExpectedErr: sql.ErrCheckConstraintViolated, + }, + { + Query: "alter table t add column m int default 0 check (m != 0)", + ExpectedErr: sql.ErrCheckConstraintViolated, + }, }, }, { diff --git a/sql/analyzer/fix_exec_indexes.go b/sql/analyzer/fix_exec_indexes.go index 9a231a1fa5..fc24a145d4 100644 --- a/sql/analyzer/fix_exec_indexes.go +++ b/sql/analyzer/fix_exec_indexes.go @@ -159,10 +159,12 @@ type idxScope struct { childScopes []*idxScope ids []sql.ColumnId columns []string - addedColumns sql.Schema - children []sql.Node - expressions []sql.Expression - checks sql.CheckConstraints + // Columns added from AddColumn are not included in the ResolvedTable yet. For columns that are added with a + // constraint, we need to add the new columns to the scope so CreateConstraint gets the right exec index + addedColumns sql.Schema + children []sql.Node + expressions []sql.Expression + checks sql.CheckConstraints triggerScope bool insertSourceScope bool From c24cf8073809a18b256ab240736610fae37fee3d Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 5 Sep 2025 15:15:38 -0700 Subject: [PATCH 15/73] update comment --- sql/analyzer/fix_exec_indexes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/analyzer/fix_exec_indexes.go b/sql/analyzer/fix_exec_indexes.go index fc24a145d4..1b239345f0 100644 --- a/sql/analyzer/fix_exec_indexes.go +++ b/sql/analyzer/fix_exec_indexes.go @@ -160,7 +160,7 @@ type idxScope struct { ids []sql.ColumnId columns []string // Columns added from AddColumn are not included in the ResolvedTable yet. For columns that are added with a - // constraint, we need to add the new columns to the scope so CreateConstraint gets the right exec index + // constraint, we need to add the new columns to the scope so CreateCheck gets the right exec index addedColumns sql.Schema children []sql.Node expressions []sql.Expression From b6184470b08ab552ba62de4224e93ba0b1ce5657 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Sep 2025 22:19:32 +0000 Subject: [PATCH 16/73] add other funcs --- enginetest/queries/script_queries.go | 168 ++++++++++++++++++ sql/expression/function/locate.go | 10 ++ .../function/reverse_repeat_replace.go | 33 +--- sql/expression/function/substring.go | 9 +- sql/expression/function/trim_ltrim_rtrim.go | 36 +--- sql/types/strings.go | 4 + 6 files changed, 195 insertions(+), 65 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 958699dc7f..dc9c8922a1 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -120,6 +120,174 @@ type ScriptTestAssertion struct { // Unlike other engine tests, ScriptTests must be self-contained. No other tables are created outside the definition of // the tests. var ScriptTests = []ScriptTest{ + { + // https://github.com/dolthub/dolt/issues/9794 + Name: "UPDATE with TRIM function on TEXT column", + SetUpScript: []string{ + "create table my_table (txt text);", + "insert into my_table values('foobar');", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "update my_table set txt = trim(txt);", + SkipResultsCheck: true, + }, + { + Query: "select txt from my_table;", + Expected: []sql.Row{{"foobar"}}, + }, + }, + }, + { + // https://github.com/dolthub/dolt/issues/9794 + Name: "String functions with TextStorage (comprehensive test)", + SetUpScript: []string{ + "create table test_strings (id int primary key, content text);", + "insert into test_strings values (1, ' Hello World '), (2, 'Test String'), (3, 'LOWERCASE'), (4, 'abc123def');", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "select id, trim(content) from test_strings order by id;", + Expected: []sql.Row{{1, "Hello World"}, {2, "Test String"}, {3, "LOWERCASE"}, {4, "abc123def"}}, + }, + { + Query: "select id, upper(content) from test_strings order by id;", + Expected: []sql.Row{{1, " HELLO WORLD "}, {2, "TEST STRING"}, {3, "LOWERCASE"}, {4, "ABC123DEF"}}, + }, + { + Query: "select id, lower(content) from test_strings order by id;", + Expected: []sql.Row{{1, " hello world "}, {2, "test string"}, {3, "lowercase"}, {4, "abc123def"}}, + }, + { + Query: "select id, reverse(content) from test_strings order by id;", + Expected: []sql.Row{{1, " dlroW olleH "}, {2, "gnirtS tseT"}, {3, "ESACREWOL"}, {4, "fed321cba"}}, + }, + { + Query: "select id, substring(content, 1, 5) from test_strings order by id;", + Expected: []sql.Row{{1, " Hel"}, {2, "Test "}, {3, "LOWER"}, {4, "abc12"}}, + }, + { + Query: "select id, length(content) from test_strings order by id;", + Expected: []sql.Row{{1, 15}, {2, 11}, {3, 9}, {4, 9}}, + }, + { + Query: "select id, left(content, 3) from test_strings order by id;", + Expected: []sql.Row{{1, " H"}, {2, "Tes"}, {3, "LOW"}, {4, "abc"}}, + }, + { + Query: "select id, right(content, 3) from test_strings order by id;", + Expected: []sql.Row{{1, "d "}, {2, "ing"}, {3, "ASE"}, {4, "def"}}, + }, + { + Query: "select id, ltrim(content) from test_strings order by id;", + Expected: []sql.Row{{1, "Hello World "}, {2, "Test String"}, {3, "LOWERCASE"}, {4, "abc123def"}}, + }, + { + Query: "select id, rtrim(content) from test_strings order by id;", + Expected: []sql.Row{{1, " Hello World"}, {2, "Test String"}, {3, "LOWERCASE"}, {4, "abc123def"}}, + }, + { + Query: "select id, replace(content, 'e', 'X') from test_strings order by id;", + Expected: []sql.Row{{1, " HXllo World "}, {2, "TXst String"}, {3, "LOWERCASE"}, {4, "abc123dXf"}}, + }, + { + Query: "select id, repeat(substring(content, 1, 2), 2) from test_strings order by id;", + Expected: []sql.Row{{1, " "}, {2, "TeTe"}, {3, "LOLO"}, {4, "abab"}}, + }, + { + Query: "select id, lpad(content, 12, '*') from test_strings where id = 4;", + Expected: []sql.Row{{4, "***abc123def"}}, + }, + { + Query: "select id, rpad(content, 12, '*') from test_strings where id = 4;", + Expected: []sql.Row{{4, "abc123def***"}}, + }, + { + Query: "select id, locate('o', content) from test_strings order by id;", + Expected: []sql.Row{{1, 7}, {2, 0}, {3, 2}, {4, 0}}, + }, + { + Query: "select id, position('o' in content) from test_strings order by id;", + Expected: []sql.Row{{1, 7}, {2, 0}, {3, 2}, {4, 0}}, + }, + { + Query: "select id, substr(content, 2, 4) from test_strings order by id;", + Expected: []sql.Row{{1, " Hel"}, {2, "est "}, {3, "OWER"}, {4, "bc12"}}, + }, + { + Query: "select id, mid(content, 3, 3) from test_strings order by id;", + Expected: []sql.Row{{1, "Hel"}, {2, "st "}, {3, "WER"}, {4, "c12"}}, + }, + { + Query: "select id, char_length(content) from test_strings order by id;", + Expected: []sql.Row{{1, 15}, {2, 11}, {3, 9}, {4, 9}}, + }, + { + Query: "select id, character_length(content) from test_strings order by id;", + Expected: []sql.Row{{1, 15}, {2, 11}, {3, 9}, {4, 9}}, + }, + { + Query: "select id, octet_length(content) from test_strings order by id;", + Expected: []sql.Row{{1, 15}, {2, 11}, {3, 9}, {4, 9}}, + }, + { + Query: "select id, lcase(content) from test_strings order by id;", + Expected: []sql.Row{{1, " hello world "}, {2, "test string"}, {3, "lowercase"}, {4, "abc123def"}}, + }, + { + Query: "select id, ucase(content) from test_strings order by id;", + Expected: []sql.Row{{1, " HELLO WORLD "}, {2, "TEST STRING"}, {3, "LOWERCASE"}, {4, "ABC123DEF"}}, + }, + { + Query: "select id, ascii(content) from test_strings order by id;", + Expected: []sql.Row{{1, uint64(32)}, {2, uint64(84)}, {3, uint64(76)}, {4, uint64(97)}}, + }, + { + Query: "select id, hex(content) from test_strings where id = 4;", + Expected: []sql.Row{{4, "616263313233646566"}}, + }, + { + Query: "select id, unhex(hex(content)) = content from test_strings where id = 4;", + Expected: []sql.Row{{4, true}}, + }, + { + Query: "select id, substring_index(content, 'e', 1) from test_strings order by id;", + Expected: []sql.Row{{1, " H"}, {2, "T"}, {3, "LOWERCASE"}, {4, "abc123d"}}, + }, + { + Query: "select id, insert(content, 2, 3, 'XYZ') from test_strings where id = 4;", + Expected: []sql.Row{{4, "aXYZ23def"}}, + }, + { + Query: "update test_strings set content = concat(trim(content), '!');", + SkipResultsCheck: true, + }, + { + Query: "select id, content from test_strings order by id;", + Expected: []sql.Row{{1, "Hello World!"}, {2, "Test String!"}, {3, "LOWERCASE!"}, {4, "abc123def!"}}, + }, + { + Query: "SELECT CONCAT_WS(',', content, 'suffix') FROM test_strings WHERE id = 2;", + Expected: []sql.Row{{"Test String!,suffix"}}, + }, + { + Query: "SELECT EXPORT_SET(5, content, 'off') FROM test_strings WHERE id = 2;", + Expected: []sql.Row{{"Test String!,off,Test String!,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off,off"}}, + }, + { + Query: "SELECT FIND_IN_SET('String', content) FROM test_strings WHERE id = 2;", + Expected: []sql.Row{{int32(0)}}, + }, + { + Query: "SELECT MAKE_SET(3, content, 'second', 'third') FROM test_strings WHERE id = 2;", + Expected: []sql.Row{{"Test String!,second"}}, + }, + { + Query: "SELECT SOUNDEX(content) FROM test_strings WHERE id = 2;", + Expected: []sql.Row{{"T2323652"}}, + }, + }, + }, { // Regression test for https://github.com/dolthub/dolt/issues/9641 Name: "bit union max1err dolt#9641", diff --git a/sql/expression/function/locate.go b/sql/expression/function/locate.go index 68bd897ec8..a59e229b66 100644 --- a/sql/expression/function/locate.go +++ b/sql/expression/function/locate.go @@ -104,6 +104,11 @@ func (l *Locate) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, nil } + substrVal, _, err = types.LongText.Convert(ctx, substrVal) + if err != nil { + return nil, err + } + substr, ok := substrVal.(string) if !ok { return nil, sql.ErrInvalidArgumentDetails.New("locate", "substring must be a string") @@ -118,6 +123,11 @@ func (l *Locate) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, nil } + strVal, _, err = types.LongText.Convert(ctx, strVal) + if err != nil { + return nil, err + } + str, ok := strVal.(string) if !ok { return nil, sql.ErrInvalidArgumentDetails.New("locate", "string must be a string") diff --git a/sql/expression/function/reverse_repeat_replace.go b/sql/expression/function/reverse_repeat_replace.go index 7ae4d7b4f9..9a6a6d156a 100644 --- a/sql/expression/function/reverse_repeat_replace.go +++ b/sql/expression/function/reverse_repeat_replace.go @@ -16,7 +16,6 @@ package function import ( "fmt" - "reflect" "strings" "gopkg.in/src-d/go-errors.v1" @@ -65,18 +64,7 @@ func (r *Reverse) Eval( return nil, err } - // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings - v, err = sql.UnwrapAny(ctx, v) - if err != nil { - return nil, err - } - - s, ok := v.(string) - if !ok { - return nil, sql.ErrInvalidType.New(reflect.TypeOf(v).String()) - } - - return reverseString(s), nil + return reverseString(v.(string)), nil } func reverseString(s string) string { @@ -174,17 +162,6 @@ func (r *Repeat) Eval( return nil, err } - // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings - str, err = sql.UnwrapAny(ctx, str) - if err != nil { - return nil, err - } - - strVal, ok := str.(string) - if !ok { - return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) - } - count, err := r.RightChild.Eval(ctx, row) if count == nil || err != nil { return nil, err @@ -194,14 +171,10 @@ func (r *Repeat) Eval( if err != nil { return nil, err } - countVal, ok := count.(int32) - if !ok { - return nil, sql.ErrInvalidType.New(reflect.TypeOf(count).String()) - } - if countVal < 0 { + if count.(int32) < 0 { return nil, ErrNegativeRepeatCount.New(count) } - return strings.Repeat(strVal, int(countVal)), nil + return strings.Repeat(str.(string), int(count.(int32))), nil } // Replace is a function that returns a string with all occurrences of fromStr replaced by the diff --git a/sql/expression/function/substring.go b/sql/expression/function/substring.go index e88921d9c2..65e51196bb 100644 --- a/sql/expression/function/substring.go +++ b/sql/expression/function/substring.go @@ -84,12 +84,7 @@ func (s *Substring) Eval( return nil, err } - if str == nil { - return nil, nil - } - - // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings - str, err = sql.UnwrapAny(ctx, str) + str, _, err = types.LongText.Convert(ctx, str) if err != nil { return nil, err } @@ -100,6 +95,8 @@ func (s *Substring) Eval( text = []rune(str) case []byte: text = []rune(string(str)) + case nil: + return nil, nil default: return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) } diff --git a/sql/expression/function/trim_ltrim_rtrim.go b/sql/expression/function/trim_ltrim_rtrim.go index 88a28650ec..e9bbe9adb3 100644 --- a/sql/expression/function/trim_ltrim_rtrim.go +++ b/sql/expression/function/trim_ltrim_rtrim.go @@ -62,18 +62,12 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } - // Convert pat into string + // Convert pat into string and unwrap automatically pat, _, err = types.LongText.Convert(ctx, pat) if err != nil { return nil, sql.ErrInvalidType.New(reflect.TypeOf(pat).String()) } - // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings - pat, err = sql.UnwrapAny(ctx, pat) - if err != nil { - return nil, err - } - // Evaluate string value str, err := t.str.Eval(ctx, row) if err != nil { @@ -85,31 +79,15 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, nil } - // Convert str to text type (may still be wrapped) + // Convert str to text type and unwrap automatically str, _, err = types.LongText.Convert(ctx, str) if err != nil { return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) } - // Handle Dolt's TextStorage and other wrapper types that don't convert to plain strings - str, err = sql.UnwrapAny(ctx, str) - if err != nil { - return nil, err - } - - strVal, ok := str.(string) - if !ok { - return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) - } - - patVal, ok := pat.(string) - if !ok { - return nil, sql.ErrInvalidType.New(reflect.TypeOf(pat).String()) - } - start := 0 - end := len(strVal) - n := len(patVal) + end := len(str.(string)) + n := len(pat.(string)) // Empty pattern, do nothing if n == 0 { @@ -118,19 +96,19 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { // Trim Leading if t.dir == sqlparser.Leading || t.dir == sqlparser.Both { - for start+n <= end && strVal[start:start+n] == patVal { + for start+n <= end && str.(string)[start:start+n] == pat { start += n } } // Trim Trailing if t.dir == sqlparser.Trailing || t.dir == sqlparser.Both { - for start+n <= end && strVal[end-n:end] == patVal { + for start+n <= end && str.(string)[end-n:end] == pat { end -= n } } - return strVal[start:end], nil + return str.(string)[start:end], nil } // IsNullable implements the Expression interface. diff --git a/sql/types/strings.go b/sql/types/strings.go index 7d48428225..12142cf921 100644 --- a/sql/types/strings.go +++ b/sql/types/strings.go @@ -340,6 +340,10 @@ func (t StringType) Convert(ctx context.Context, v interface{}) (interface{}, sq switch v := v.(type) { case sql.StringWrapper: if t.baseType == sqltypes.Text && t.maxByteLength >= v.MaxByteLength() { + // Unwrap the wrapper to get the actual string value + if unwrapped, err := sql.UnwrapAny(ctx, v); err == nil { + return unwrapped, sql.InRange, nil + } return v, sql.InRange, nil } case sql.BytesWrapper: From 58e535d46adc468526c6511cf6a6307fa5c25786 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Sep 2025 22:53:04 +0000 Subject: [PATCH 17/73] mv unwrap to funcs --- sql/expression/function/reverse_repeat_replace.go | 12 ++++++++++++ sql/expression/function/substring.go | 6 ++++++ sql/expression/function/trim_ltrim_rtrim.go | 12 ++++++++++++ sql/types/strings.go | 4 ---- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/sql/expression/function/reverse_repeat_replace.go b/sql/expression/function/reverse_repeat_replace.go index 9a6a6d156a..b8287a2763 100644 --- a/sql/expression/function/reverse_repeat_replace.go +++ b/sql/expression/function/reverse_repeat_replace.go @@ -64,6 +64,12 @@ func (r *Reverse) Eval( return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + v, err = sql.UnwrapAny(ctx, v) + if err != nil { + return nil, err + } + return reverseString(v.(string)), nil } @@ -162,6 +168,12 @@ func (r *Repeat) Eval( return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + count, err := r.RightChild.Eval(ctx, row) if count == nil || err != nil { return nil, err diff --git a/sql/expression/function/substring.go b/sql/expression/function/substring.go index 65e51196bb..cc5c170082 100644 --- a/sql/expression/function/substring.go +++ b/sql/expression/function/substring.go @@ -89,6 +89,12 @@ func (s *Substring) Eval( return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + var text []rune switch str := str.(type) { case string: diff --git a/sql/expression/function/trim_ltrim_rtrim.go b/sql/expression/function/trim_ltrim_rtrim.go index e9bbe9adb3..1d4addf1de 100644 --- a/sql/expression/function/trim_ltrim_rtrim.go +++ b/sql/expression/function/trim_ltrim_rtrim.go @@ -68,6 +68,12 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, sql.ErrInvalidType.New(reflect.TypeOf(pat).String()) } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + pat, err = sql.UnwrapAny(ctx, pat) + if err != nil { + return nil, err + } + // Evaluate string value str, err := t.str.Eval(ctx, row) if err != nil { @@ -85,6 +91,12 @@ func (t *Trim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, sql.ErrInvalidType.New(reflect.TypeOf(str).String()) } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + start := 0 end := len(str.(string)) n := len(pat.(string)) diff --git a/sql/types/strings.go b/sql/types/strings.go index 12142cf921..7d48428225 100644 --- a/sql/types/strings.go +++ b/sql/types/strings.go @@ -340,10 +340,6 @@ func (t StringType) Convert(ctx context.Context, v interface{}) (interface{}, sq switch v := v.(type) { case sql.StringWrapper: if t.baseType == sqltypes.Text && t.maxByteLength >= v.MaxByteLength() { - // Unwrap the wrapper to get the actual string value - if unwrapped, err := sql.UnwrapAny(ctx, v); err == nil { - return unwrapped, sql.InRange, nil - } return v, sql.InRange, nil } case sql.BytesWrapper: From a1bcdb15b0014058670e46490994f324984d93e4 Mon Sep 17 00:00:00 2001 From: elianddb Date: Sat, 6 Sep 2025 00:13:29 +0000 Subject: [PATCH 18/73] add miss for trim --- sql/expression/function/trim_ltrim_rtrim.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sql/expression/function/trim_ltrim_rtrim.go b/sql/expression/function/trim_ltrim_rtrim.go index 1d4addf1de..0222b96ded 100644 --- a/sql/expression/function/trim_ltrim_rtrim.go +++ b/sql/expression/function/trim_ltrim_rtrim.go @@ -219,6 +219,12 @@ func (t *LeftTrim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, sql.ErrInvalidType.New(reflect.TypeOf(str)) } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + return strings.TrimLeftFunc(str.(string), func(r rune) bool { return r == ' ' }), nil @@ -282,6 +288,12 @@ func (t *RightTrim) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, sql.ErrInvalidType.New(reflect.TypeOf(str)) } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + str, err = sql.UnwrapAny(ctx, str) + if err != nil { + return nil, err + } + return strings.TrimRightFunc(str.(string), func(r rune) bool { return r == ' ' }), nil From 238572202c1e3fbe7d8d262a4d9ae8cad55db755 Mon Sep 17 00:00:00 2001 From: elianddb Date: Sat, 6 Sep 2025 00:39:39 +0000 Subject: [PATCH 19/73] add miss unwraps --- sql/expression/function/concat_ws.go | 6 ++++++ sql/expression/function/export_set.go | 19 +++++++++++++++++++ sql/expression/function/insert.go | 12 ++++++++++++ sql/expression/function/locate.go | 12 ++++++++++++ sql/expression/function/make_set.go | 7 +++++++ sql/expression/function/soundex.go | 6 ++++++ sql/expression/function/substring.go | 14 ++++++++++++++ 7 files changed, 76 insertions(+) diff --git a/sql/expression/function/concat_ws.go b/sql/expression/function/concat_ws.go index de6ce27edd..88565409ec 100644 --- a/sql/expression/function/concat_ws.go +++ b/sql/expression/function/concat_ws.go @@ -127,6 +127,12 @@ func (f *ConcatWithSeparator) Eval(ctx *sql.Context, row sql.Row) (interface{}, return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + val, err = sql.UnwrapAny(ctx, val) + if err != nil { + return nil, err + } + parts = append(parts, val.(string)) } diff --git a/sql/expression/function/export_set.go b/sql/expression/function/export_set.go index acff3ff7ac..9356ad7b22 100644 --- a/sql/expression/function/export_set.go +++ b/sql/expression/function/export_set.go @@ -171,6 +171,13 @@ func (e *ExportSet) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } + + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + sepStr, err = sql.UnwrapAny(ctx, sepStr) + if err != nil { + return nil, err + } + separatorVal = sepStr.(string) } @@ -206,11 +213,23 @@ func (e *ExportSet) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + onStr, err = sql.UnwrapAny(ctx, onStr) + if err != nil { + return nil, err + } + offStr, _, err := types.LongText.Convert(ctx, offVal) if err != nil { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + offStr, err = sql.UnwrapAny(ctx, offStr) + if err != nil { + return nil, err + } + bits := bitsInt.(uint64) on := onStr.(string) off := offStr.(string) diff --git a/sql/expression/function/insert.go b/sql/expression/function/insert.go index 55029521bc..97278e58b3 100644 --- a/sql/expression/function/insert.go +++ b/sql/expression/function/insert.go @@ -127,6 +127,12 @@ func (i *Insert) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + strVal, err = sql.UnwrapAny(ctx, strVal) + if err != nil { + return nil, err + } + posVal, _, err := types.Int64.Convert(ctx, pos) if err != nil { return nil, err @@ -142,6 +148,12 @@ func (i *Insert) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + newStrVal, err = sql.UnwrapAny(ctx, newStrVal) + if err != nil { + return nil, err + } + s := strVal.(string) p := posVal.(int64) l := lengthVal.(int64) diff --git a/sql/expression/function/locate.go b/sql/expression/function/locate.go index a59e229b66..65246f64c9 100644 --- a/sql/expression/function/locate.go +++ b/sql/expression/function/locate.go @@ -109,6 +109,12 @@ func (l *Locate) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + substrVal, err = sql.UnwrapAny(ctx, substrVal) + if err != nil { + return nil, err + } + substr, ok := substrVal.(string) if !ok { return nil, sql.ErrInvalidArgumentDetails.New("locate", "substring must be a string") @@ -128,6 +134,12 @@ func (l *Locate) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + strVal, err = sql.UnwrapAny(ctx, strVal) + if err != nil { + return nil, err + } + str, ok := strVal.(string) if !ok { return nil, sql.ErrInvalidArgumentDetails.New("locate", "string must be a string") diff --git a/sql/expression/function/make_set.go b/sql/expression/function/make_set.go index 8471706a46..7844128db7 100644 --- a/sql/expression/function/make_set.go +++ b/sql/expression/function/make_set.go @@ -143,6 +143,13 @@ func (m *MakeSet) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } + + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + valStr, err = sql.UnwrapAny(ctx, valStr) + if err != nil { + return nil, err + } + result = append(result, valStr.(string)) } } diff --git a/sql/expression/function/soundex.go b/sql/expression/function/soundex.go index 2744b9a574..1f7b34567c 100644 --- a/sql/expression/function/soundex.go +++ b/sql/expression/function/soundex.go @@ -66,6 +66,12 @@ func (s *Soundex) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, err } + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + v, err = sql.UnwrapAny(ctx, v) + if err != nil { + return nil, err + } + var b strings.Builder var last rune for _, c := range strings.ToUpper(v.(string)) { diff --git a/sql/expression/function/substring.go b/sql/expression/function/substring.go index cc5c170082..329eca9f5d 100644 --- a/sql/expression/function/substring.go +++ b/sql/expression/function/substring.go @@ -234,6 +234,13 @@ func (s *SubstringIndex) Eval(ctx *sql.Context, row sql.Row) (interface{}, error if err != nil { return nil, err } + + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + ex, err = sql.UnwrapAny(ctx, ex) + if err != nil { + return nil, err + } + str, ok := ex.(string) if !ok { return nil, sql.ErrInvalidType.New(reflect.TypeOf(ex).String()) @@ -247,6 +254,13 @@ func (s *SubstringIndex) Eval(ctx *sql.Context, row sql.Row) (interface{}, error if err != nil { return nil, err } + + // Handle Dolt's TextStorage wrapper that doesn't convert to plain string + ex, err = sql.UnwrapAny(ctx, ex) + if err != nil { + return nil, err + } + delim, ok := ex.(string) if !ok { return nil, sql.ErrInvalidType.New(reflect.TypeOf(ex).String()) From 56d48aa2e51f837018539631498788764c7b5d3b Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 5 Sep 2025 09:51:50 -0700 Subject: [PATCH 20/73] do not push down filters for full outer joins --- enginetest/join_op_tests.go | 41 +++++++++++++++++++++++++++++++++++++ sql/analyzer/pushdown.go | 11 +++++----- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/enginetest/join_op_tests.go b/enginetest/join_op_tests.go index f2116bca96..cf8c90f67f 100644 --- a/enginetest/join_op_tests.go +++ b/enginetest/join_op_tests.go @@ -2112,6 +2112,47 @@ WHERE }, }, }, + { + // https://github.com/dolthub/dolt/issues/9793 + name: "outer join on false", + setup: [][]string{ + { + "create table t1(c0 int)", + "create table t2(c0 int)", + "insert into t1 values (1)", + "insert into t2 values (1)", + }, + }, + tests: []JoinOpTests{ + { + Query: "select * from t1 full outer join t2 on false", + Expected: []sql.Row{ + {1, nil}, + {nil, 1}, + }, + }, + { + Query: "select * from t1 full outer join t2 on false where t2.c0 is not null and t1.c0 is not null", + Expected: []sql.Row{}, + }, + { + Query: "select * from t1 left outer join t2 on false", + Expected: []sql.Row{{1, nil}}, + }, + { + Query: "select * from t1 left outer join t2 on false where t2.c0 is not null", + Expected: []sql.Row{}, + }, + { + Query: "select * from t1 right outer join t2 on false", + Expected: []sql.Row{{nil, 1}}, + }, + { + Query: "select * from t1 right outer join t2 on false where t1.c0 is not null", + Expected: []sql.Row{}, + }, + }, + }, } var rangeJoinOpTests = []JoinOpTests{ diff --git a/sql/analyzer/pushdown.go b/sql/analyzer/pushdown.go index bd24c7bf1a..9595c3e4fe 100644 --- a/sql/analyzer/pushdown.go +++ b/sql/analyzer/pushdown.go @@ -157,11 +157,10 @@ func canDoPushdown(n sql.Node) bool { return true } -// Pushing down a filter is incompatible with the secondary table in a Left -// or Right join. If we push a predicate on the secondary table below the -// join, we end up not evaluating it in all cases (since the secondary table -// result is sometimes null in these types of joins). It must be evaluated -// only after the join result is computed. +// Pushing down a filter is incompatible with the secondary table in a Left or Right join. If we push a predicate on the +// secondary table below the join, we end up not evaluating it in all cases (since the secondary table result is +// sometimes null in these types of joins). It must be evaluated only after the join result is computed. This is also +// true with both tables in a Full Outer join, since either table result could be null. func filterPushdownChildSelector(c transform.Context) bool { switch c.Node.(type) { case *plan.Limit: @@ -178,6 +177,8 @@ func filterPushdownChildSelector(c transform.Context) bool { return false case *plan.JoinNode: switch { + case n.Op.IsFullOuter(): + return false case n.Op.IsMerge(): return false case n.Op.IsLookup(): From c0a961feb0149988a310dc97509afc03f27903b4 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Sep 2025 18:07:27 -0700 Subject: [PATCH 21/73] add dialect --- enginetest/queries/script_queries.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index dc9c8922a1..275c914271 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -140,7 +140,8 @@ var ScriptTests = []ScriptTest{ }, { // https://github.com/dolthub/dolt/issues/9794 - Name: "String functions with TextStorage (comprehensive test)", + Name: "String functions with TextStorage (comprehensive test)", + Dialect: "mysql", SetUpScript: []string{ "create table test_strings (id int primary key, content text);", "insert into test_strings values (1, ' Hello World '), (2, 'Test String'), (3, 'LOWERCASE'), (4, 'abc123def');", From 447dc8fdbd369d9a5350fe3ad3e8da09045b8a56 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Sep 2025 17:37:51 +0000 Subject: [PATCH 22/73] add fix for 9807 --- enginetest/queries/join_queries.go | 16 ++++++++++++++++ sql/rowexec/join_iters.go | 6 +++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index f113c8b266..6a63a66d0b 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -792,6 +792,22 @@ on w = 0;`, } var JoinScriptTests = []ScriptTest{ + { + // https://github.com/dolthub/dolt/issues/9807 + Name: "FULL OUTER JOIN fails with empty subquery", + SetUpScript: []string{ + "CREATE TABLE t(c BOOLEAN);", + "INSERT INTO t VALUES (FALSE);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT * FROM ( SELECT c FROM t WHERE c ) sub1 FULL OUTER JOIN ( SELECT 1 AS c ) sub2 ON 1=1;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + }, + }, { Name: "Simple join query", SetUpScript: []string{}, diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index fbfcca13cc..278a1d5229 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -487,6 +487,10 @@ func (i *fullJoinIter) Next(ctx *sql.Context) (sql.Row, error) { } i.r = nil i.leftRow = nil + continue + } + if err != nil { + return nil, err } row := i.buildRow(i.leftRow, rightRow) @@ -512,7 +516,7 @@ func (i *fullJoinIter) Next(ctx *sql.Context) (sql.Row, error) { for { if i.r == nil { - iter, err := i.b.Build(ctx, i.rp, i.leftRow) + iter, err := i.b.Build(ctx, i.rp, i.parentRow) if err != nil { return nil, err } From 3f18f5275d432968d54808d3443a6e5e8b13a356 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Sep 2025 18:51:26 +0000 Subject: [PATCH 23/73] add simple tests --- enginetest/queries/join_queries.go | 35 ++++++++++++++++++++++++++++++ sql/rowexec/join_iters.go | 2 ++ 2 files changed, 37 insertions(+) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index 6a63a66d0b..a116fbc2f9 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -808,6 +808,41 @@ var JoinScriptTests = []ScriptTest{ }, }, }, + { + // https://github.com/dolthub/dolt/issues/9807 + Name: "FULL OUTER JOIN with empty tables", + SetUpScript: []string{ + "CREATE TABLE t1 (i INT);", + "CREATE TABLE t2 (j INT);", + "INSERT INTO t2 VALUES (1);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=1;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + { + Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=1;", + Expected: []sql.Row{ + {1, nil}, + }, + }, + { + Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=0;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + { + Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=0;", + Expected: []sql.Row{ + {1, nil}, + }, + }, + }, + }, { Name: "Simple join query", SetUpScript: []string{}, diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index 278a1d5229..af02d2ac40 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -516,6 +516,8 @@ func (i *fullJoinIter) Next(ctx *sql.Context) (sql.Row, error) { for { if i.r == nil { + // Phase 2 of FULL OUTER JOIN: return unmatched right rows as (null, rightRow). + // Use parentRow instead of leftRow since leftRow is nil when left side is empty. iter, err := i.b.Build(ctx, i.rp, i.parentRow) if err != nil { return nil, err From 1c0d9a7a062404fea258deea1f5a133727ba6bfe Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Sep 2025 18:52:35 +0000 Subject: [PATCH 24/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/join_queries.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index a116fbc2f9..cddf26b95f 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -813,7 +813,7 @@ var JoinScriptTests = []ScriptTest{ Name: "FULL OUTER JOIN with empty tables", SetUpScript: []string{ "CREATE TABLE t1 (i INT);", - "CREATE TABLE t2 (j INT);", + "CREATE TABLE t2 (j INT);", "INSERT INTO t2 VALUES (1);", }, Assertions: []ScriptTestAssertion{ From 5d96f23dcba28c6b98bd50bcbf4f4f723514d394 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Sep 2025 12:03:28 -0700 Subject: [PATCH 25/73] mv tests to join_op_tests --- enginetest/join_op_tests.go | 55 ++++++++++++++++++++++++++++++ enginetest/queries/join_queries.go | 51 --------------------------- 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/enginetest/join_op_tests.go b/enginetest/join_op_tests.go index cf8c90f67f..2cb23ed527 100644 --- a/enginetest/join_op_tests.go +++ b/enginetest/join_op_tests.go @@ -105,6 +105,61 @@ var EngineOnlyJoinOpTests = []joinOpTest{ } var DefaultJoinOpTests = []joinOpTest{ + { + // https://github.com/dolthub/dolt/issues/9807 + name: "FULL OUTER JOIN fails with empty subquery", + setup: [][]string{ + { + "CREATE TABLE t(c BOOLEAN);", + "INSERT INTO t VALUES (FALSE);", + }, + }, + tests: []JoinOpTests{ + { + Query: "SELECT * FROM ( SELECT c FROM t WHERE c ) sub1 FULL OUTER JOIN ( SELECT 1 AS c ) sub2 ON 1=1;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + }, + }, + { + // https://github.com/dolthub/dolt/issues/9807 + name: "FULL OUTER JOIN with empty tables", + setup: [][]string{ + { + "CREATE TABLE t1 (i INT);", + "CREATE TABLE t2 (j INT);", + "INSERT INTO t2 VALUES (1);", + }, + }, + tests: []JoinOpTests{ + { + Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=1;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + { + Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=1;", + Expected: []sql.Row{ + {1, nil}, + }, + }, + { + Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=0;", + Expected: []sql.Row{ + {nil, 1}, + }, + }, + { + Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=0;", + Expected: []sql.Row{ + {1, nil}, + }, + }, + }, + }, { name: "bug where transitive join edge drops filters", setup: [][]string{ diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index cddf26b95f..f113c8b266 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -792,57 +792,6 @@ on w = 0;`, } var JoinScriptTests = []ScriptTest{ - { - // https://github.com/dolthub/dolt/issues/9807 - Name: "FULL OUTER JOIN fails with empty subquery", - SetUpScript: []string{ - "CREATE TABLE t(c BOOLEAN);", - "INSERT INTO t VALUES (FALSE);", - }, - Assertions: []ScriptTestAssertion{ - { - Query: "SELECT * FROM ( SELECT c FROM t WHERE c ) sub1 FULL OUTER JOIN ( SELECT 1 AS c ) sub2 ON 1=1;", - Expected: []sql.Row{ - {nil, 1}, - }, - }, - }, - }, - { - // https://github.com/dolthub/dolt/issues/9807 - Name: "FULL OUTER JOIN with empty tables", - SetUpScript: []string{ - "CREATE TABLE t1 (i INT);", - "CREATE TABLE t2 (j INT);", - "INSERT INTO t2 VALUES (1);", - }, - Assertions: []ScriptTestAssertion{ - { - Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=1;", - Expected: []sql.Row{ - {nil, 1}, - }, - }, - { - Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=1;", - Expected: []sql.Row{ - {1, nil}, - }, - }, - { - Query: "SELECT i, j FROM t1 FULL OUTER JOIN t2 ON 1=0;", - Expected: []sql.Row{ - {nil, 1}, - }, - }, - { - Query: "SELECT j, i FROM t2 FULL OUTER JOIN t1 ON 1=0;", - Expected: []sql.Row{ - {1, nil}, - }, - }, - }, - }, { Name: "Simple join query", SetUpScript: []string{}, From 6f248027f21a4c26490616eab2bf56225d0113dc Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Mon, 8 Sep 2025 14:08:11 -0700 Subject: [PATCH 26/73] PR feedback --- sql/index_builder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/index_builder.go b/sql/index_builder.go index ba49bd8b77..8652a2b3b1 100644 --- a/sql/index_builder.go +++ b/sql/index_builder.go @@ -224,6 +224,7 @@ func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, keyType Ty return b } +// convertKey converts the given key from keyType to colType, returning an error if the conversion fails. func (b *MySQLIndexBuilder) convertKey(ctx *Context, colType Type, keyType Type, key interface{}) (interface{}, error) { if et, ok := colType.(ExtendedType); ok { return et.ConvertToType(ctx, keyType.(ExtendedType), key) From c8d2027a12b58257278a746790a4262d3d42b819 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Sep 2025 11:24:56 -0700 Subject: [PATCH 27/73] implement double truncation and find correct hash comparison type (#3200) --- enginetest/queries/join_queries.go | 31 +++++++++++++++++ enginetest/queries/queries.go | 20 +++++++++++ sql/errors.go | 3 ++ sql/expression/convert.go | 4 +++ sql/plan/hash_lookup.go | 53 +++++++++++++++++++++++++++--- sql/types/conversion.go | 2 +- sql/types/number.go | 4 +-- sql/types/number_test.go | 2 +- 8 files changed, 110 insertions(+), 9 deletions(-) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index f113c8b266..7296f2d0c8 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -1200,6 +1200,37 @@ var JoinScriptTests = []ScriptTest{ }, }, }, + { + Name: "HashLookup with type int8 and string type conversions", + SetUpScript: []string{ + "create table t1 (c1 boolean);", + "create table t2 (c2 varchar(500));", + "insert into t1 values (true), (false);", + "insert into t2 values ('abc'), ('def');", // will be converted to float64(0) and match false + "insert into t2 values ('1asdf');", // will be converted to '1' and match true + "insert into t2 values ('5five');", // will be converted to '5' and match nothing + }, + Assertions: []ScriptTestAssertion{ + { + // TODO: our warnings don't align with MySQL + Query: "select /*+ HASH_JOIN(t1, t2) */ * from t1 join t2 where c1 = c2 order by c1, c2;", + Expected: []sql.Row{ + {0, "abc"}, + {0, "def"}, + {1, "1asdf"}, + }, + }, + { + // TODO: our warnings don't align with MySQL + Query: "select /*+ INNER_JOIN(t1, t2) */ * from t1 join t2 where c1 = c2 order by c1, c2;", + Expected: []sql.Row{ + {0, "abc"}, + {0, "def"}, + {1, "1asdf"}, + }, + }, + }, + }, } var LateralJoinScriptTests = []ScriptTest{ diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 1f4d182014..61b95ddef4 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -892,6 +892,26 @@ var QueryTests = []QueryTest{ Query: "SELECT 1 % true", Expected: []sql.Row{{"0"}}, }, + { + Query: "select 'abc' = false", + Expected: []sql.Row{{true}}, + }, + { + Query: "select '123abc' = 123", + Expected: []sql.Row{{true}}, + }, + { + Query: "select '1abc' = true", + Expected: []sql.Row{{true}}, + }, + { + Query: "select '123abc' = false", + Expected: []sql.Row{{false}}, + }, + { + Query: "select '123abc' = true", + Expected: []sql.Row{{false}}, + }, { Query: "SELECT * from mytable where (0.000 and true)", Expected: []sql.Row{}, diff --git a/sql/errors.go b/sql/errors.go index f95df0aef5..0346fee008 100644 --- a/sql/errors.go +++ b/sql/errors.go @@ -947,6 +947,9 @@ var ( ErrColumnSpecifiedTwice = errors.NewKind("column '%v' specified twice") ErrEnumTypeTruncated = errors.NewKind("new enum type change truncates value") + + // ErrTruncatedIncorrect is thrown when converting a value results in portions of the data to be trimmed. + ErrTruncatedIncorrect = errors.NewKind("Truncated incorrect %s value: %v") ) // CastSQLError returns a *mysql.SQLError with the error code and in some cases, also a SQL state, populated for the diff --git a/sql/expression/convert.go b/sql/expression/convert.go index ea959f5bf6..28a8ce385b 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -372,6 +372,10 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } d, _, err := types.Float64.Convert(ctx, value) if err != nil { + if sql.ErrTruncatedIncorrect.Is(err) { + ctx.Warn(1265, "%s", err.Error()) + return d, nil + } return types.Float64.Zero(), nil } return d, nil diff --git a/sql/plan/hash_lookup.go b/sql/plan/hash_lookup.go index 8c3d35f6ce..fe750db6c2 100644 --- a/sql/plan/hash_lookup.go +++ b/sql/plan/hash_lookup.go @@ -34,10 +34,12 @@ import ( // simply delegates to the child. func NewHashLookup(n sql.Node, rightEntryKey sql.Expression, leftProbeKey sql.Expression, joinType JoinType) *HashLookup { leftKeySch := hash.ExprsToSchema(leftProbeKey) + compareType := GetCompareType(leftProbeKey.Type(), rightEntryKey.Type()) return &HashLookup{ UnaryNode: UnaryNode{n}, RightEntryKey: rightEntryKey, LeftProbeKey: leftProbeKey, + CompareType: compareType, Mutex: new(sync.Mutex), JoinType: joinType, leftKeySch: leftKeySch, @@ -48,6 +50,7 @@ type HashLookup struct { UnaryNode RightEntryKey sql.Expression LeftProbeKey sql.Expression + CompareType sql.Type Mutex *sync.Mutex Lookup *map[interface{}][]sql.Row leftKeySch sql.Schema @@ -58,6 +61,46 @@ var _ sql.Node = (*HashLookup)(nil) var _ sql.Expressioner = (*HashLookup)(nil) var _ sql.CollationCoercible = (*HashLookup)(nil) +// GetCompareType returns the type to use when comparing values of types left and right. +func GetCompareType(left, right sql.Type) sql.Type { + // TODO: much of this logic is very similar to castLeftAndRight() from sql/expression/comparison.go + // consider consolidating + if left.Equals(right) { + return left + } + if types.IsTuple(left) && types.IsTuple(right) { + return left + } + if types.IsTime(left) || types.IsTime(right) { + return types.DatetimeMaxPrecision + } + if types.IsJSON(left) || types.IsJSON(right) { + return types.JSON + } + if types.IsBinaryType(left) || types.IsBinaryType(right) { + return types.LongBlob + } + if types.IsNumber(left) || types.IsNumber(right) { + if types.IsDecimal(left) { + return left + } + if types.IsDecimal(right) { + return right + } + if types.IsFloat(left) || types.IsFloat(right) { + return types.Float64 + } + if types.IsSigned(left) && types.IsSigned(right) { + return types.Int64 + } + if types.IsUnsigned(left) && types.IsUnsigned(right) { + return types.Uint64 + } + return types.Float64 + } + return types.LongText +} + func (n *HashLookup) Expressions() []sql.Expression { return []sql.Expression{n.RightEntryKey, n.LeftProbeKey} } @@ -113,7 +156,7 @@ func (n *HashLookup) CollationCoercibility(ctx *sql.Context) (collation sql.Coll return sql.GetCoercibility(ctx, n.Child) } -// Convert a tuple expression returning []interface{} into something comparable. +// GetHashKey converts a tuple expression returning []interface{} into something comparable. // Fast paths a few smaller slices into fixed size arrays, puts everything else // through string serialization and a hash for now. It is OK to hash lossy here // as the join condition is still evaluated after the matching rows are returned. @@ -122,13 +165,13 @@ func (n *HashLookup) GetHashKey(ctx *sql.Context, e sql.Expression, row sql.Row) if err != nil { return nil, err } - typ := n.LeftProbeKey.Type() - key, _, err = typ.Convert(ctx, key) + key, _, err = n.CompareType.Convert(ctx, key) if types.ErrValueNotNil.Is(err) { // The LHS expression was NullType. This is allowed. return nil, nil } - if err != nil { + if err != nil && !sql.ErrTruncatedIncorrect.Is(err) { + // Truncated warning is already thrown elsewhere. return nil, err } if s, ok := key.([]interface{}); ok { @@ -139,7 +182,7 @@ func (n *HashLookup) GetHashKey(ctx *sql.Context, e sql.Expression, row sql.Row) return string(k), nil } - return hash.HashOfSimple(ctx, key, typ) + return hash.HashOfSimple(ctx, key, n.CompareType) } func (n *HashLookup) Dispose() { diff --git a/sql/types/conversion.go b/sql/types/conversion.go index b87adbe033..3fb22c781b 100644 --- a/sql/types/conversion.go +++ b/sql/types/conversion.go @@ -766,7 +766,7 @@ func TypeAwareConversion(ctx *sql.Context, val interface{}, originalType sql.Typ // ConvertOrTruncate converts the value |i| to type |t| and returns the converted value; if the value does not convert // cleanly and the type is automatically coerced (i.e. string and numeric types), then a warning is logged and the // value is truncated to the Zero value for type |t|. If the value does not convert and the type is not automatically -// coerced, then an error is returned. +// coerced, then return an error. func ConvertOrTruncate(ctx *sql.Context, i interface{}, t sql.Type) (interface{}, error) { converted, _, err := t.Convert(ctx, i) if err == nil { diff --git a/sql/types/number.go b/sql/types/number.go index bdc33f6954..8b74d813d2 100644 --- a/sql/types/number.go +++ b/sql/types/number.go @@ -530,7 +530,7 @@ func (t NumberTypeImpl_) SQLUint64(ctx *sql.Context, dest []byte, v interface{}) func (t NumberTypeImpl_) SQLFloat64(ctx *sql.Context, dest []byte, v interface{}) ([]byte, error) { num, err := convertToFloat64(t, v) - if err != nil { + if err != nil && !sql.ErrTruncatedIncorrect.Is(err) { return nil, err } dest = strconv.AppendFloat(dest, num, 'g', -1, 64) @@ -1543,7 +1543,7 @@ func convertToFloat64(t NumberTypeImpl_, v interface{}) (float64, error) { // parse the first longest valid numbers s := numre.FindString(v) i, _ = strconv.ParseFloat(s, 64) - return i, sql.ErrInvalidValue.New(v, t.String()) + return i, sql.ErrTruncatedIncorrect.New(t.String(), v) } return i, nil case bool: diff --git a/sql/types/number_test.go b/sql/types/number_test.go index 580b50bda2..8c7d2fca0a 100644 --- a/sql/types/number_test.go +++ b/sql/types/number_test.go @@ -253,7 +253,7 @@ func TestNumberSQL_NumberFromString(t *testing.T) { val, err = Float64.SQL(sql.NewEmptyContext(), nil, "also not a number") require.NoError(t, err) - assert.Equal(t, "also not a number", val.ToString()) + assert.Equal(t, "0", val.ToString()) } func TestNumberString(t *testing.T) { From cacc2205eccc16315a5ee7247637dc0cfeeffdb1 Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Tue, 9 Sep 2025 14:02:10 -0700 Subject: [PATCH 28/73] allow caching subqueries --- sql/analyzer/resolve_subqueries.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sql/analyzer/resolve_subqueries.go b/sql/analyzer/resolve_subqueries.go index 39c2969aca..5da35c9998 100644 --- a/sql/analyzer/resolve_subqueries.go +++ b/sql/analyzer/resolve_subqueries.go @@ -291,17 +291,21 @@ func analyzeSubqueryAlias(ctx *sql.Context, a *Analyzer, sqa *plan.SubqueryAlias // node on top of those nodes. The left-most child of a join root is an exception // that cannot be cached. func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) { - var recurse func(n sql.Node, parentCached, inJoin, rootJoinT1 bool) (sql.Node, transform.TreeIdentity, error) - recurse = func(n sql.Node, parentCached, inJoin, foundFirstRel bool) (sql.Node, transform.TreeIdentity, error) { + foundFirstRel := false + var recurse func(n sql.Node, parentCached, inJoin bool, rootJoinT1 *bool) (sql.Node, transform.TreeIdentity, error) + recurse = func(n sql.Node, parentCached, inJoin bool, foundFirstRel *bool) (sql.Node, transform.TreeIdentity, error) { _, isOp := n.(sql.OpaqueNode) var isCacheableSq bool var isCachedRs bool var isMax1Row bool + // If we enter a new join, we use this stack-allocated variable to track whether or not we've encountered + // a nameable child in that node. + childFoundFirstRel := false switch n := n.(type) { case *plan.JoinNode: if !inJoin { inJoin = true - foundFirstRel = false + foundFirstRel = &childFoundFirstRel } case *plan.SubqueryAlias: isCacheableSq = n.CanCacheResults() @@ -316,11 +320,11 @@ func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scop doCache := isCacheableSq && inJoin && !parentCached childInJoin := inJoin && !isOp - if inJoin && !foundFirstRel { + if inJoin && !(*foundFirstRel) { switch n.(type) { case sql.Nameable: doCache = false - foundFirstRel = true + *foundFirstRel = true default: } } @@ -351,5 +355,5 @@ func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scop } return ret, transform.NewTree, nil } - return recurse(n, false, false, false) + return recurse(n, false, false, &foundFirstRel) } From 521c5d9f1d1c04f909c2bdfe8770f15782b45db6 Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Tue, 9 Sep 2025 14:20:48 -0700 Subject: [PATCH 29/73] Update plan tests. --- enginetest/queries/integration_plans.go | 6979 ++++++++++++----------- enginetest/queries/query_plans.go | 1691 +++--- 2 files changed, 4397 insertions(+), 4273 deletions(-) diff --git a/enginetest/queries/integration_plans.go b/enginetest/queries/integration_plans.go index 74f6ffb47f..ad392501d8 100644 --- a/enginetest/queries/integration_plans.go +++ b/enginetest/queries/integration_plans.go @@ -4415,32 +4415,33 @@ WHERE " │ │ │ │ │ └─ HashLookup\n" + " │ │ │ │ │ ├─ left-key: TUPLE(ct.M22QN:4!null, ct.LUEVY:3!null)\n" + " │ │ │ │ │ ├─ right-key: TUPLE(khjjo.M22QN:0!null, khjjo.LUEVY:2!null)\n" + - " │ │ │ │ │ └─ SubqueryAlias\n" + - " │ │ │ │ │ ├─ name: khjjo\n" + - " │ │ │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ │ │ ├─ isLateral: false\n" + - " │ │ │ │ │ ├─ cacheable: true\n" + - " │ │ │ │ │ ├─ colSet: (92-94)\n" + - " │ │ │ │ │ ├─ tableId: 7\n" + - " │ │ │ │ │ └─ Distinct\n" + - " │ │ │ │ │ └─ Project\n" + - " │ │ │ │ │ ├─ columns: [mf.M22QN:3!null->M22QN:0, sn.id:0!null->BDNYB:0, mf.LUEVY:2!null->LUEVY:0]\n" + - " │ │ │ │ │ └─ LookupJoin\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ ├─ columns: [id brqp2]\n" + - " │ │ │ │ │ │ ├─ colSet: (79-88)\n" + - " │ │ │ │ │ │ └─ tableId: 6\n" + - " │ │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ │ ├─ keys: [sn.BRQP2:1!null]\n" + - " │ │ │ │ │ ├─ colSet: (62-78)\n" + - " │ │ │ │ │ ├─ tableId: 5\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: HGMQ6\n" + - " │ │ │ │ │ └─ columns: [luevy m22qn]\n" + + " │ │ │ │ │ └─ CachedResults\n" + + " │ │ │ │ │ └─ SubqueryAlias\n" + + " │ │ │ │ │ ├─ name: khjjo\n" + + " │ │ │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ │ │ ├─ isLateral: false\n" + + " │ │ │ │ │ ├─ cacheable: true\n" + + " │ │ │ │ │ ├─ colSet: (92-94)\n" + + " │ │ │ │ │ ├─ tableId: 7\n" + + " │ │ │ │ │ └─ Distinct\n" + + " │ │ │ │ │ └─ Project\n" + + " │ │ │ │ │ ├─ columns: [mf.M22QN:3!null->M22QN:0, sn.id:0!null->BDNYB:0, mf.LUEVY:2!null->LUEVY:0]\n" + + " │ │ │ │ │ └─ LookupJoin\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ ├─ columns: [id brqp2]\n" + + " │ │ │ │ │ │ ├─ colSet: (79-88)\n" + + " │ │ │ │ │ │ └─ tableId: 6\n" + + " │ │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ │ ├─ keys: [sn.BRQP2:1!null]\n" + + " │ │ │ │ │ ├─ colSet: (62-78)\n" + + " │ │ │ │ │ ├─ tableId: 5\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: HGMQ6\n" + + " │ │ │ │ │ └─ columns: [luevy m22qn]\n" + " │ │ │ │ └─ TableAlias(sn)\n" + " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + " │ │ │ │ ├─ index: [NOXN3.id]\n" + @@ -4626,26 +4627,27 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: TUPLE()\n" + " ├─ right-key: TUPLE()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (214)\n" + - " ├─ tableId: 23\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq:0!null]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ 1 (longtext))\n" + - " ├─ Row(\n" + - " │ 2 (longtext))\n" + - " ├─ Row(\n" + - " │ 3 (longtext))\n" + - " ├─ Row(\n" + - " │ 4 (longtext))\n" + - " └─ Row(\n" + - " 5 (longtext))\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (214)\n" + + " ├─ tableId: 23\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq:0!null]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ 1 (longtext))\n" + + " ├─ Row(\n" + + " │ 2 (longtext))\n" + + " ├─ Row(\n" + + " │ 3 (longtext))\n" + + " ├─ Row(\n" + + " │ 4 (longtext))\n" + + " └─ Row(\n" + + " 5 (longtext))\n" + "", ExpectedEstimates: "Union all\n" + " ├─ Project\n" + @@ -4717,24 +4719,25 @@ WHERE " │ │ │ │ │ └─ HashLookup\n" + " │ │ │ │ │ ├─ left-key: (ct.M22QN, ct.LUEVY)\n" + " │ │ │ │ │ ├─ right-key: (khjjo.M22QN, khjjo.LUEVY)\n" + - " │ │ │ │ │ └─ SubqueryAlias\n" + - " │ │ │ │ │ ├─ name: khjjo\n" + - " │ │ │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ │ │ ├─ isLateral: false\n" + - " │ │ │ │ │ ├─ cacheable: true\n" + - " │ │ │ │ │ └─ Distinct\n" + - " │ │ │ │ │ └─ Project\n" + - " │ │ │ │ │ ├─ columns: [mf.M22QN as M22QN, sn.id as BDNYB, mf.LUEVY as LUEVY]\n" + - " │ │ │ │ │ └─ LookupJoin\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ └─ columns: [id brqp2]\n" + - " │ │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ │ ├─ columns: [luevy m22qn]\n" + - " │ │ │ │ │ └─ keys: sn.BRQP2\n" + + " │ │ │ │ │ └─ CachedResults\n" + + " │ │ │ │ │ └─ SubqueryAlias\n" + + " │ │ │ │ │ ├─ name: khjjo\n" + + " │ │ │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ │ │ ├─ isLateral: false\n" + + " │ │ │ │ │ ├─ cacheable: true\n" + + " │ │ │ │ │ └─ Distinct\n" + + " │ │ │ │ │ └─ Project\n" + + " │ │ │ │ │ ├─ columns: [mf.M22QN as M22QN, sn.id as BDNYB, mf.LUEVY as LUEVY]\n" + + " │ │ │ │ │ └─ LookupJoin\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ └─ columns: [id brqp2]\n" + + " │ │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ │ ├─ columns: [luevy m22qn]\n" + + " │ │ │ │ │ └─ keys: sn.BRQP2\n" + " │ │ │ │ └─ TableAlias(sn)\n" + " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + " │ │ │ │ ├─ index: [NOXN3.id]\n" + @@ -4836,24 +4839,25 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ '1')\n" + - " ├─ Row(\n" + - " │ '2')\n" + - " ├─ Row(\n" + - " │ '3')\n" + - " ├─ Row(\n" + - " │ '4')\n" + - " └─ Row(\n" + - " '5')\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ '1')\n" + + " ├─ Row(\n" + + " │ '2')\n" + + " ├─ Row(\n" + + " │ '3')\n" + + " ├─ Row(\n" + + " │ '4')\n" + + " └─ Row(\n" + + " '5')\n" + "", ExpectedAnalysis: "Union all\n" + " ├─ Project\n" + @@ -4925,24 +4929,25 @@ WHERE " │ │ │ │ │ └─ HashLookup\n" + " │ │ │ │ │ ├─ left-key: (ct.M22QN, ct.LUEVY)\n" + " │ │ │ │ │ ├─ right-key: (khjjo.M22QN, khjjo.LUEVY)\n" + - " │ │ │ │ │ └─ SubqueryAlias\n" + - " │ │ │ │ │ ├─ name: khjjo\n" + - " │ │ │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ │ │ ├─ isLateral: false\n" + - " │ │ │ │ │ ├─ cacheable: true\n" + - " │ │ │ │ │ └─ Distinct\n" + - " │ │ │ │ │ └─ Project\n" + - " │ │ │ │ │ ├─ columns: [mf.M22QN as M22QN, sn.id as BDNYB, mf.LUEVY as LUEVY]\n" + - " │ │ │ │ │ └─ LookupJoin\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ └─ columns: [id brqp2]\n" + - " │ │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ │ ├─ columns: [luevy m22qn]\n" + - " │ │ │ │ │ └─ keys: sn.BRQP2\n" + + " │ │ │ │ │ └─ CachedResults\n" + + " │ │ │ │ │ └─ SubqueryAlias\n" + + " │ │ │ │ │ ├─ name: khjjo\n" + + " │ │ │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ │ │ ├─ isLateral: false\n" + + " │ │ │ │ │ ├─ cacheable: true\n" + + " │ │ │ │ │ └─ Distinct\n" + + " │ │ │ │ │ └─ Project\n" + + " │ │ │ │ │ ├─ columns: [mf.M22QN as M22QN, sn.id as BDNYB, mf.LUEVY as LUEVY]\n" + + " │ │ │ │ │ └─ LookupJoin\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ └─ columns: [id brqp2]\n" + + " │ │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ │ ├─ columns: [luevy m22qn]\n" + + " │ │ │ │ │ └─ keys: sn.BRQP2\n" + " │ │ │ │ └─ TableAlias(sn)\n" + " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + " │ │ │ │ ├─ index: [NOXN3.id]\n" + @@ -5044,24 +5049,25 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ '1')\n" + - " ├─ Row(\n" + - " │ '2')\n" + - " ├─ Row(\n" + - " │ '3')\n" + - " ├─ Row(\n" + - " │ '4')\n" + - " └─ Row(\n" + - " '5')\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ '1')\n" + + " ├─ Row(\n" + + " │ '2')\n" + + " ├─ Row(\n" + + " │ '3')\n" + + " ├─ Row(\n" + + " │ '4')\n" + + " └─ Row(\n" + + " '5')\n" + "", }, { @@ -5478,26 +5484,27 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: TUPLE()\n" + " ├─ right-key: TUPLE()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (214)\n" + - " ├─ tableId: 23\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq:0!null]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ 1 (longtext))\n" + - " ├─ Row(\n" + - " │ 2 (longtext))\n" + - " ├─ Row(\n" + - " │ 3 (longtext))\n" + - " ├─ Row(\n" + - " │ 4 (longtext))\n" + - " └─ Row(\n" + - " 5 (longtext))\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (214)\n" + + " ├─ tableId: 23\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq:0!null]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ 1 (longtext))\n" + + " ├─ Row(\n" + + " │ 2 (longtext))\n" + + " ├─ Row(\n" + + " │ 3 (longtext))\n" + + " ├─ Row(\n" + + " │ 4 (longtext))\n" + + " └─ Row(\n" + + " 5 (longtext))\n" + "", ExpectedEstimates: "Union all\n" + " ├─ Project\n" + @@ -5682,24 +5689,25 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ '1')\n" + - " ├─ Row(\n" + - " │ '2')\n" + - " ├─ Row(\n" + - " │ '3')\n" + - " ├─ Row(\n" + - " │ '4')\n" + - " └─ Row(\n" + - " '5')\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ '1')\n" + + " ├─ Row(\n" + + " │ '2')\n" + + " ├─ Row(\n" + + " │ '3')\n" + + " ├─ Row(\n" + + " │ '4')\n" + + " └─ Row(\n" + + " '5')\n" + "", ExpectedAnalysis: "Union all\n" + " ├─ Project\n" + @@ -5884,24 +5892,25 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aoev5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [temp_aoev5.t4ibq]\n" + - " └─ Values() as temp_AOEV5\n" + - " ├─ Row(\n" + - " │ '1')\n" + - " ├─ Row(\n" + - " │ '2')\n" + - " ├─ Row(\n" + - " │ '3')\n" + - " ├─ Row(\n" + - " │ '4')\n" + - " └─ Row(\n" + - " '5')\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aoev5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [temp_aoev5.t4ibq]\n" + + " └─ Values() as temp_AOEV5\n" + + " ├─ Row(\n" + + " │ '1')\n" + + " ├─ Row(\n" + + " │ '2')\n" + + " ├─ Row(\n" + + " │ '3')\n" + + " ├─ Row(\n" + + " │ '4')\n" + + " └─ Row(\n" + + " '5')\n" + "", }, { @@ -6568,41 +6577,42 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE()\n" + " │ ├─ right-key: TUPLE()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: tmdtp\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (37,38)\n" + - " │ ├─ tableId: 3\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id:2!null->B2TX3:0, cla.FTQLQ:1!null->T4IBQ:0]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ cla.id:0!null\n" + - " │ │ └─ bs.IXUXU:3\n" + - " │ ├─ Filter\n" + - " │ │ ├─ HashIn\n" + - " │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (1-30)\n" + - " │ │ ├─ tableId: 1\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: YK2GW\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (31-34)\n" + - " │ ├─ tableId: 2\n" + - " │ └─ Table\n" + - " │ ├─ name: THNTS\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: tmdtp\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (37,38)\n" + + " │ ├─ tableId: 3\n" + + " │ └─ Project\n" + + " │ ├─ columns: [bs.id:2!null->B2TX3:0, cla.FTQLQ:1!null->T4IBQ:0]\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ cla.id:0!null\n" + + " │ │ └─ bs.IXUXU:3\n" + + " │ ├─ Filter\n" + + " │ │ ├─ HashIn\n" + + " │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (1-30)\n" + + " │ │ ├─ tableId: 1\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: YK2GW\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (31-34)\n" + + " │ ├─ tableId: 2\n" + + " │ └─ Table\n" + + " │ ├─ name: THNTS\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ TableAlias(fc)\n" + " └─ IndexedTableAccess(AMYXQ)\n" + " ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + @@ -6655,27 +6665,28 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: tmdtp\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id as B2TX3, cla.FTQLQ as T4IBQ]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ ├─ Filter\n" + - " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: tmdtp\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [bs.id as B2TX3, cla.FTQLQ as T4IBQ]\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ ├─ Filter\n" + + " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ TableAlias(fc)\n" + " └─ IndexedTableAccess(AMYXQ)\n" + " ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + @@ -6724,27 +6735,28 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: tmdtp\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id as B2TX3, cla.FTQLQ as T4IBQ]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ ├─ Filter\n" + - " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: tmdtp\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [bs.id as B2TX3, cla.FTQLQ as T4IBQ]\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ ├─ Filter\n" + + " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ TableAlias(fc)\n" + " └─ IndexedTableAccess(AMYXQ)\n" + " ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + @@ -7042,198 +7054,199 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE(bs.T4IBQ:1!null, nd.id:15!null)\n" + " │ ├─ right-key: TUPLE(f26zw.T4IBQ:0!null, f26zw.BRQP2:1!null)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (183-186)\n" + - " │ ├─ tableId: 20\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ:0!null, iq.BRQP2:1!null, iq.Z7CP5:2!null, CASE WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ KAOAS (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ OG (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ TSG (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ W6W24 (longtext)\n" + - " │ │ THEN 1 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ OG (longtext)\n" + - " │ │ THEN 1 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ TSG (longtext)\n" + - " │ │ THEN 0 (tinyint) ELSE NULL (null) END->YHYLK:0]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ w2mao.YH4XB:6!null\n" + - " │ │ └─ vc.id:7!null\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ ├─ colSet: (168-172)\n" + - " │ │ │ ├─ tableId: 17\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.BRQP2:12!null, mf.id:4!null->Z7CP5:0, mf.FSDY2:7!null, nma.DZLIM:11!null->IDWIO:0]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ mf.GXLUB:5!null\n" + - " │ │ │ │ └─ bs.id:2!null\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ │ ├─ cla.id:0!null\n" + - " │ │ │ │ │ └─ bs.IXUXU:3\n" + - " │ │ │ │ ├─ Filter\n" + - " │ │ │ │ │ ├─ HashIn\n" + - " │ │ │ │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ ├─ colSet: (105-134)\n" + - " │ │ │ │ │ ├─ tableId: 13\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: YK2GW\n" + - " │ │ │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ │ │ └─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ ├─ colSet: (101-104)\n" + - " │ │ │ │ ├─ tableId: 12\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: THNTS\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: TUPLE(bs.id:2!null)\n" + - " │ │ │ ├─ right-key: TUPLE(mf.GXLUB:1!null)\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ ├─ mf.LUEVY:6!null\n" + - " │ │ │ │ │ └─ nd.id:8!null\n" + - " │ │ │ │ └─ Eq\n" + - " │ │ │ │ ├─ mf.LUEVY:6!null\n" + - " │ │ │ │ └─ sn.BRQP2:12!null\n" + - " │ │ │ ├─ TableAlias(mf)\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: HGMQ6\n" + - " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ │ ├─ colSet: (84-100)\n" + - " │ │ │ │ └─ tableId: 11\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: TUPLE(mf.LUEVY:6!null, mf.LUEVY:6!null)\n" + - " │ │ │ ├─ right-key: TUPLE(nd.id:0!null, sn.BRQP2:4!null)\n" + - " │ │ │ └─ LookupJoin\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ │ ├─ nd.HPCMS:9!null\n" + - " │ │ │ │ │ └─ nma.id:10!null\n" + - " │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ ├─ colSet: (135-151)\n" + - " │ │ │ │ │ ├─ tableId: 14\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: E2I7U\n" + - " │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ ├─ colSet: (152-154)\n" + - " │ │ │ │ ├─ tableId: 15\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: TNMXI\n" + - " │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ └─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ keys: [nd.id:8!null]\n" + - " │ │ │ ├─ colSet: (155-164)\n" + - " │ │ │ ├─ tableId: 16\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [brqp2]\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ keys: [iq.Z7CP5:2!null]\n" + - " │ │ ├─ colSet: (173-175)\n" + - " │ │ ├─ tableId: 18\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: SEQS3\n" + - " │ │ └─ columns: [z7cp5 yh4xb]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(w2mao.YH4XB:6!null)\n" + - " │ ├─ right-key: TUPLE(vc.id:0!null)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ ├─ columns: [id znp4p]\n" + - " │ ├─ colSet: (176-181)\n" + - " │ └─ tableId: 19\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (183-186)\n" + + " │ ├─ tableId: 20\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ:0!null, iq.BRQP2:1!null, iq.Z7CP5:2!null, CASE WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ KAOAS (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ OG (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ TSG (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ W6W24 (longtext)\n" + + " │ │ THEN 1 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ OG (longtext)\n" + + " │ │ THEN 1 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ TSG (longtext)\n" + + " │ │ THEN 0 (tinyint) ELSE NULL (null) END->YHYLK:0]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ w2mao.YH4XB:6!null\n" + + " │ │ └─ vc.id:7!null\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ ├─ colSet: (168-172)\n" + + " │ │ │ ├─ tableId: 17\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.BRQP2:12!null, mf.id:4!null->Z7CP5:0, mf.FSDY2:7!null, nma.DZLIM:11!null->IDWIO:0]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ mf.GXLUB:5!null\n" + + " │ │ │ │ └─ bs.id:2!null\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ │ ├─ cla.id:0!null\n" + + " │ │ │ │ │ └─ bs.IXUXU:3\n" + + " │ │ │ │ ├─ Filter\n" + + " │ │ │ │ │ ├─ HashIn\n" + + " │ │ │ │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ ├─ colSet: (105-134)\n" + + " │ │ │ │ │ ├─ tableId: 13\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: YK2GW\n" + + " │ │ │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ │ │ └─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ ├─ colSet: (101-104)\n" + + " │ │ │ │ ├─ tableId: 12\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: THNTS\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: TUPLE(bs.id:2!null)\n" + + " │ │ │ ├─ right-key: TUPLE(mf.GXLUB:1!null)\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ ├─ mf.LUEVY:6!null\n" + + " │ │ │ │ │ └─ nd.id:8!null\n" + + " │ │ │ │ └─ Eq\n" + + " │ │ │ │ ├─ mf.LUEVY:6!null\n" + + " │ │ │ │ └─ sn.BRQP2:12!null\n" + + " │ │ │ ├─ TableAlias(mf)\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: HGMQ6\n" + + " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ │ ├─ colSet: (84-100)\n" + + " │ │ │ │ └─ tableId: 11\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: TUPLE(mf.LUEVY:6!null, mf.LUEVY:6!null)\n" + + " │ │ │ ├─ right-key: TUPLE(nd.id:0!null, sn.BRQP2:4!null)\n" + + " │ │ │ └─ LookupJoin\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ │ ├─ nd.HPCMS:9!null\n" + + " │ │ │ │ │ └─ nma.id:10!null\n" + + " │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ ├─ colSet: (135-151)\n" + + " │ │ │ │ │ ├─ tableId: 14\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: E2I7U\n" + + " │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ ├─ colSet: (152-154)\n" + + " │ │ │ │ ├─ tableId: 15\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: TNMXI\n" + + " │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ └─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ keys: [nd.id:8!null]\n" + + " │ │ │ ├─ colSet: (155-164)\n" + + " │ │ │ ├─ tableId: 16\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [brqp2]\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ keys: [iq.Z7CP5:2!null]\n" + + " │ │ ├─ colSet: (173-175)\n" + + " │ │ ├─ tableId: 18\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: SEQS3\n" + + " │ │ └─ columns: [z7cp5 yh4xb]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(w2mao.YH4XB:6!null)\n" + + " │ ├─ right-key: TUPLE(vc.id:0!null)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ ├─ columns: [id znp4p]\n" + + " │ ├─ colSet: (176-181)\n" + + " │ └─ tableId: 19\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(nd.HPCMS:17!null)\n" + " ├─ right-key: TUPLE(nma.id:0!null)\n" + @@ -7352,81 +7365,82 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (bs.T4IBQ, nd.id)\n" + " │ ├─ right-key: (f26zw.T4IBQ, f26zw.BRQP2)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ (w2mao.YH4XB = vc.id)\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ │ │ ├─ Filter\n" + - " │ │ │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ │ │ └─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (bs.id)\n" + - " │ │ │ ├─ right-key: (mf.GXLUB)\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ ((mf.LUEVY = nd.id) AND (mf.LUEVY = sn.BRQP2))\n" + - " │ │ │ ├─ TableAlias(mf)\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: HGMQ6\n" + - " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (mf.LUEVY, mf.LUEVY)\n" + - " │ │ │ ├─ right-key: (nd.id, sn.BRQP2)\n" + - " │ │ │ └─ LookupJoin\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + - " │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ └─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ columns: [brqp2]\n" + - " │ │ │ └─ keys: nd.id\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ columns: [z7cp5 yh4xb]\n" + - " │ │ └─ keys: iq.Z7CP5\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (w2mao.YH4XB)\n" + - " │ ├─ right-key: (vc.id)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ └─ columns: [id znp4p]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ (w2mao.YH4XB = vc.id)\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ │ │ ├─ Filter\n" + + " │ │ │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ │ │ └─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (bs.id)\n" + + " │ │ │ ├─ right-key: (mf.GXLUB)\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ ((mf.LUEVY = nd.id) AND (mf.LUEVY = sn.BRQP2))\n" + + " │ │ │ ├─ TableAlias(mf)\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: HGMQ6\n" + + " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (mf.LUEVY, mf.LUEVY)\n" + + " │ │ │ ├─ right-key: (nd.id, sn.BRQP2)\n" + + " │ │ │ └─ LookupJoin\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + + " │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ └─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ columns: [brqp2]\n" + + " │ │ │ └─ keys: nd.id\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ columns: [z7cp5 yh4xb]\n" + + " │ │ └─ keys: iq.Z7CP5\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (w2mao.YH4XB)\n" + + " │ ├─ right-key: (vc.id)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ └─ columns: [id znp4p]\n" + " └─ HashLookup\n" + " ├─ left-key: (nd.HPCMS)\n" + " ├─ right-key: (nma.id)\n" + @@ -7543,81 +7557,82 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (bs.T4IBQ, nd.id)\n" + " │ ├─ right-key: (f26zw.T4IBQ, f26zw.BRQP2)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ (w2mao.YH4XB = vc.id)\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ │ │ ├─ Filter\n" + - " │ │ │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ │ │ └─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (bs.id)\n" + - " │ │ │ ├─ right-key: (mf.GXLUB)\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ ((mf.LUEVY = nd.id) AND (mf.LUEVY = sn.BRQP2))\n" + - " │ │ │ ├─ TableAlias(mf)\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: HGMQ6\n" + - " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (mf.LUEVY, mf.LUEVY)\n" + - " │ │ │ ├─ right-key: (nd.id, sn.BRQP2)\n" + - " │ │ │ └─ LookupJoin\n" + - " │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + - " │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ └─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ columns: [brqp2]\n" + - " │ │ │ └─ keys: nd.id\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ columns: [z7cp5 yh4xb]\n" + - " │ │ └─ keys: iq.Z7CP5\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (w2mao.YH4XB)\n" + - " │ ├─ right-key: (vc.id)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ └─ columns: [id znp4p]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ (w2mao.YH4XB = vc.id)\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ │ │ ├─ Filter\n" + + " │ │ │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ │ │ └─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (bs.id)\n" + + " │ │ │ ├─ right-key: (mf.GXLUB)\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ ((mf.LUEVY = nd.id) AND (mf.LUEVY = sn.BRQP2))\n" + + " │ │ │ ├─ TableAlias(mf)\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: HGMQ6\n" + + " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (mf.LUEVY, mf.LUEVY)\n" + + " │ │ │ ├─ right-key: (nd.id, sn.BRQP2)\n" + + " │ │ │ └─ LookupJoin\n" + + " │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + + " │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ └─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ columns: [brqp2]\n" + + " │ │ │ └─ keys: nd.id\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ columns: [z7cp5 yh4xb]\n" + + " │ │ └─ keys: iq.Z7CP5\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (w2mao.YH4XB)\n" + + " │ ├─ right-key: (vc.id)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ └─ columns: [id znp4p]\n" + " └─ HashLookup\n" + " ├─ left-key: (nd.HPCMS)\n" + " ├─ right-key: (nma.id)\n" + @@ -7917,197 +7932,198 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE(bs.T4IBQ:1!null, nd.id:15!null)\n" + " │ ├─ right-key: TUPLE(f26zw.T4IBQ:0!null, f26zw.BRQP2:1!null)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (183-186)\n" + - " │ ├─ tableId: 20\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ:0!null, iq.BRQP2:1!null, iq.Z7CP5:2!null, CASE WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ KAOAS (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ OG (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ TSG (longtext)\n" + - " │ │ THEN 0 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ W6W24 (longtext)\n" + - " │ │ THEN 1 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ OG (longtext)\n" + - " │ │ THEN 1 (tinyint) WHEN AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ IN\n" + - " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + - " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ Eq\n" + - " │ │ │ ├─ vc.ZNP4P:8!null\n" + - " │ │ │ └─ L5Q44 (longtext)\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ iq.IDWIO:4!null\n" + - " │ │ └─ TSG (longtext)\n" + - " │ │ THEN 0 (tinyint) ELSE NULL (null) END->YHYLK:0]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ w2mao.YH4XB:6!null\n" + - " │ │ └─ vc.id:7!null\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ ├─ colSet: (168-172)\n" + - " │ │ │ ├─ tableId: 17\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ:12!null->T4IBQ:0, sn.BRQP2:0!null, mf.id:5!null->Z7CP5:0, mf.FSDY2:8!null, nma.DZLIM:4!null->IDWIO:0]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ mf.GXLUB:6!null\n" + - " │ │ │ │ └─ bs.id:9!null\n" + - " │ │ │ ├─ LookupJoin\n" + - " │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ ├─ mf.LUEVY:7!null\n" + - " │ │ │ │ │ └─ sn.BRQP2:0!null\n" + - " │ │ │ │ ├─ HashJoin\n" + - " │ │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ │ ├─ sn.BRQP2:0!null\n" + - " │ │ │ │ │ │ └─ nd.id:1!null\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ ├─ columns: [brqp2]\n" + - " │ │ │ │ │ │ ├─ colSet: (155-164)\n" + - " │ │ │ │ │ │ └─ tableId: 16\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: TUPLE(sn.BRQP2:0!null)\n" + - " │ │ │ │ │ ├─ right-key: TUPLE(nd.id:0!null)\n" + - " │ │ │ │ │ └─ MergeJoin\n" + - " │ │ │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ │ │ ├─ nd.HPCMS:2!null\n" + - " │ │ │ │ │ │ └─ nma.id:3!null\n" + - " │ │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ ├─ colSet: (135-151)\n" + - " │ │ │ │ │ │ ├─ tableId: 14\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: E2I7U\n" + - " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ ├─ colSet: (152-154)\n" + - " │ │ │ │ │ ├─ tableId: 15\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: TNMXI\n" + - " │ │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ ├─ keys: [nd.id:1!null]\n" + - " │ │ │ │ ├─ colSet: (84-100)\n" + - " │ │ │ │ ├─ tableId: 11\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: HGMQ6\n" + - " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: TUPLE(mf.GXLUB:6!null)\n" + - " │ │ │ ├─ right-key: TUPLE(bs.id:0!null)\n" + - " │ │ │ └─ MergeJoin\n" + - " │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ ├─ bs.IXUXU:10\n" + - " │ │ │ │ └─ cla.id:11!null\n" + - " │ │ │ ├─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ ├─ colSet: (101-104)\n" + - " │ │ │ │ ├─ tableId: 12\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: THNTS\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ Filter\n" + - " │ │ │ ├─ HashIn\n" + - " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (105-134)\n" + - " │ │ │ ├─ tableId: 13\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: YK2GW\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ keys: [iq.Z7CP5:2!null]\n" + - " │ │ ├─ colSet: (173-175)\n" + - " │ │ ├─ tableId: 18\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: SEQS3\n" + - " │ │ └─ columns: [z7cp5 yh4xb]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(w2mao.YH4XB:6!null)\n" + - " │ ├─ right-key: TUPLE(vc.id:0!null)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ ├─ columns: [id znp4p]\n" + - " │ ├─ colSet: (176-181)\n" + - " │ └─ tableId: 19\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (183-186)\n" + + " │ ├─ tableId: 20\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ:0!null, iq.BRQP2:1!null, iq.Z7CP5:2!null, CASE WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ KAOAS (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ OG (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ TSG (longtext)\n" + + " │ │ THEN 0 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ W6W24 (longtext)\n" + + " │ │ THEN 1 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ OG (longtext)\n" + + " │ │ THEN 1 (tinyint) WHEN AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ IN\n" + + " │ │ │ │ ├─ left: iq.FSDY2:3!null\n" + + " │ │ │ │ └─ right: TUPLE(SRARY (longtext), UBQWG (longtext))\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ Eq\n" + + " │ │ │ ├─ vc.ZNP4P:8!null\n" + + " │ │ │ └─ L5Q44 (longtext)\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ iq.IDWIO:4!null\n" + + " │ │ └─ TSG (longtext)\n" + + " │ │ THEN 0 (tinyint) ELSE NULL (null) END->YHYLK:0]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ w2mao.YH4XB:6!null\n" + + " │ │ └─ vc.id:7!null\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ ├─ colSet: (168-172)\n" + + " │ │ │ ├─ tableId: 17\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ:12!null->T4IBQ:0, sn.BRQP2:0!null, mf.id:5!null->Z7CP5:0, mf.FSDY2:8!null, nma.DZLIM:4!null->IDWIO:0]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ mf.GXLUB:6!null\n" + + " │ │ │ │ └─ bs.id:9!null\n" + + " │ │ │ ├─ LookupJoin\n" + + " │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ ├─ mf.LUEVY:7!null\n" + + " │ │ │ │ │ └─ sn.BRQP2:0!null\n" + + " │ │ │ │ ├─ HashJoin\n" + + " │ │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ │ ├─ sn.BRQP2:0!null\n" + + " │ │ │ │ │ │ └─ nd.id:1!null\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ ├─ columns: [brqp2]\n" + + " │ │ │ │ │ │ ├─ colSet: (155-164)\n" + + " │ │ │ │ │ │ └─ tableId: 16\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: TUPLE(sn.BRQP2:0!null)\n" + + " │ │ │ │ │ ├─ right-key: TUPLE(nd.id:0!null)\n" + + " │ │ │ │ │ └─ MergeJoin\n" + + " │ │ │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ │ │ ├─ nd.HPCMS:2!null\n" + + " │ │ │ │ │ │ └─ nma.id:3!null\n" + + " │ │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ ├─ colSet: (135-151)\n" + + " │ │ │ │ │ │ ├─ tableId: 14\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: E2I7U\n" + + " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ ├─ colSet: (152-154)\n" + + " │ │ │ │ │ ├─ tableId: 15\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: TNMXI\n" + + " │ │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ ├─ keys: [nd.id:1!null]\n" + + " │ │ │ │ ├─ colSet: (84-100)\n" + + " │ │ │ │ ├─ tableId: 11\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: HGMQ6\n" + + " │ │ │ │ └─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: TUPLE(mf.GXLUB:6!null)\n" + + " │ │ │ ├─ right-key: TUPLE(bs.id:0!null)\n" + + " │ │ │ └─ MergeJoin\n" + + " │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ ├─ bs.IXUXU:10\n" + + " │ │ │ │ └─ cla.id:11!null\n" + + " │ │ │ ├─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ ├─ colSet: (101-104)\n" + + " │ │ │ │ ├─ tableId: 12\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: THNTS\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ Filter\n" + + " │ │ │ ├─ HashIn\n" + + " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ ├─ colSet: (105-134)\n" + + " │ │ │ ├─ tableId: 13\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: YK2GW\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ keys: [iq.Z7CP5:2!null]\n" + + " │ │ ├─ colSet: (173-175)\n" + + " │ │ ├─ tableId: 18\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: SEQS3\n" + + " │ │ └─ columns: [z7cp5 yh4xb]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(w2mao.YH4XB:6!null)\n" + + " │ ├─ right-key: TUPLE(vc.id:0!null)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ ├─ columns: [id znp4p]\n" + + " │ ├─ colSet: (176-181)\n" + + " │ └─ tableId: 19\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(nd.HPCMS:17!null)\n" + " ├─ right-key: TUPLE(nma.id:0!null)\n" + @@ -8226,82 +8242,83 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (bs.T4IBQ, nd.id)\n" + " │ ├─ right-key: (f26zw.T4IBQ, f26zw.BRQP2)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ (w2mao.YH4XB = vc.id)\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + - " │ │ │ ├─ LookupJoin\n" + - " │ │ │ │ ├─ (mf.LUEVY = sn.BRQP2)\n" + - " │ │ │ │ ├─ HashJoin\n" + - " │ │ │ │ │ ├─ (sn.BRQP2 = nd.id)\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ └─ columns: [brqp2]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (sn.BRQP2)\n" + - " │ │ │ │ │ ├─ right-key: (nd.id)\n" + - " │ │ │ │ │ └─ MergeJoin\n" + - " │ │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + - " │ │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ │ └─ keys: nd.id\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (mf.GXLUB)\n" + - " │ │ │ ├─ right-key: (bs.id)\n" + - " │ │ │ └─ MergeJoin\n" + - " │ │ │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ │ │ ├─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ columns: [z7cp5 yh4xb]\n" + - " │ │ └─ keys: iq.Z7CP5\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (w2mao.YH4XB)\n" + - " │ ├─ right-key: (vc.id)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ └─ columns: [id znp4p]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ (w2mao.YH4XB = vc.id)\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + + " │ │ │ ├─ LookupJoin\n" + + " │ │ │ │ ├─ (mf.LUEVY = sn.BRQP2)\n" + + " │ │ │ │ ├─ HashJoin\n" + + " │ │ │ │ │ ├─ (sn.BRQP2 = nd.id)\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ └─ columns: [brqp2]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (sn.BRQP2)\n" + + " │ │ │ │ │ ├─ right-key: (nd.id)\n" + + " │ │ │ │ │ └─ MergeJoin\n" + + " │ │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + + " │ │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ │ └─ keys: nd.id\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (mf.GXLUB)\n" + + " │ │ │ ├─ right-key: (bs.id)\n" + + " │ │ │ └─ MergeJoin\n" + + " │ │ │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ │ │ ├─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ columns: [z7cp5 yh4xb]\n" + + " │ │ └─ keys: iq.Z7CP5\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (w2mao.YH4XB)\n" + + " │ ├─ right-key: (vc.id)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ └─ columns: [id znp4p]\n" + " └─ HashLookup\n" + " ├─ left-key: (nd.HPCMS)\n" + " ├─ right-key: (nma.id)\n" + @@ -8418,82 +8435,83 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (bs.T4IBQ, nd.id)\n" + " │ ├─ right-key: (f26zw.T4IBQ, f26zw.BRQP2)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: f26zw\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + - " │ └─ LeftOuterHashJoin\n" + - " │ ├─ (w2mao.YH4XB = vc.id)\n" + - " │ ├─ LeftOuterLookupJoin\n" + - " │ │ ├─ SubqueryAlias\n" + - " │ │ │ ├─ name: iq\n" + - " │ │ │ ├─ outerVisibility: false\n" + - " │ │ │ ├─ isLateral: false\n" + - " │ │ │ ├─ cacheable: true\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + - " │ │ │ └─ HashJoin\n" + - " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + - " │ │ │ ├─ LookupJoin\n" + - " │ │ │ │ ├─ (mf.LUEVY = sn.BRQP2)\n" + - " │ │ │ │ ├─ HashJoin\n" + - " │ │ │ │ │ ├─ (sn.BRQP2 = nd.id)\n" + - " │ │ │ │ │ ├─ TableAlias(sn)\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ │ │ └─ columns: [brqp2]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (sn.BRQP2)\n" + - " │ │ │ │ │ ├─ right-key: (nd.id)\n" + - " │ │ │ │ │ └─ MergeJoin\n" + - " │ │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + - " │ │ │ │ │ ├─ TableAlias(nd)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + - " │ │ │ │ │ └─ TableAlias(nma)\n" + - " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + - " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + - " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ └─ columns: [id dzlim]\n" + - " │ │ │ │ └─ TableAlias(mf)\n" + - " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + - " │ │ │ │ └─ keys: nd.id\n" + - " │ │ │ └─ HashLookup\n" + - " │ │ │ ├─ left-key: (mf.GXLUB)\n" + - " │ │ │ ├─ right-key: (bs.id)\n" + - " │ │ │ └─ MergeJoin\n" + - " │ │ │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ │ │ ├─ TableAlias(bs)\n" + - " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ └─ columns: [id ixuxu]\n" + - " │ │ │ └─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(w2mao)\n" + - " │ │ └─ IndexedTableAccess(SEQS3)\n" + - " │ │ ├─ index: [SEQS3.Z7CP5]\n" + - " │ │ ├─ columns: [z7cp5 yh4xb]\n" + - " │ │ └─ keys: iq.Z7CP5\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (w2mao.YH4XB)\n" + - " │ ├─ right-key: (vc.id)\n" + - " │ └─ TableAlias(vc)\n" + - " │ └─ Table\n" + - " │ ├─ name: D34QP\n" + - " │ └─ columns: [id znp4p]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: f26zw\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [iq.T4IBQ, iq.BRQP2, iq.Z7CP5, CASE WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'KAOAS')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'OG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (vc.ZNP4P = 'L5Q44')) AND (iq.IDWIO = 'TSG')) THEN 0 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'W6W24')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'OG')) THEN 1 WHEN (((iq.FSDY2 IN ('SRARY', 'UBQWG')) AND (NOT((vc.ZNP4P = 'L5Q44')))) AND (iq.IDWIO = 'TSG')) THEN 0 ELSE NULL END as YHYLK]\n" + + " │ └─ LeftOuterHashJoin\n" + + " │ ├─ (w2mao.YH4XB = vc.id)\n" + + " │ ├─ LeftOuterLookupJoin\n" + + " │ │ ├─ SubqueryAlias\n" + + " │ │ │ ├─ name: iq\n" + + " │ │ │ ├─ outerVisibility: false\n" + + " │ │ │ ├─ isLateral: false\n" + + " │ │ │ ├─ cacheable: true\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.BRQP2, mf.id as Z7CP5, mf.FSDY2, nma.DZLIM as IDWIO]\n" + + " │ │ │ └─ HashJoin\n" + + " │ │ │ ├─ (mf.GXLUB = bs.id)\n" + + " │ │ │ ├─ LookupJoin\n" + + " │ │ │ │ ├─ (mf.LUEVY = sn.BRQP2)\n" + + " │ │ │ │ ├─ HashJoin\n" + + " │ │ │ │ │ ├─ (sn.BRQP2 = nd.id)\n" + + " │ │ │ │ │ ├─ TableAlias(sn)\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ │ │ └─ columns: [brqp2]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (sn.BRQP2)\n" + + " │ │ │ │ │ ├─ right-key: (nd.id)\n" + + " │ │ │ │ │ └─ MergeJoin\n" + + " │ │ │ │ │ ├─ cmp: (nd.HPCMS = nma.id)\n" + + " │ │ │ │ │ ├─ TableAlias(nd)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ │ │ ├─ index: [E2I7U.HPCMS]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id hpcms]\n" + + " │ │ │ │ │ └─ TableAlias(nma)\n" + + " │ │ │ │ │ └─ IndexedTableAccess(TNMXI)\n" + + " │ │ │ │ │ ├─ index: [TNMXI.id]\n" + + " │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ └─ columns: [id dzlim]\n" + + " │ │ │ │ └─ TableAlias(mf)\n" + + " │ │ │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ │ │ ├─ columns: [id gxlub luevy fsdy2]\n" + + " │ │ │ │ └─ keys: nd.id\n" + + " │ │ │ └─ HashLookup\n" + + " │ │ │ ├─ left-key: (mf.GXLUB)\n" + + " │ │ │ ├─ right-key: (bs.id)\n" + + " │ │ │ └─ MergeJoin\n" + + " │ │ │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ │ │ ├─ TableAlias(bs)\n" + + " │ │ │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ └─ columns: [id ixuxu]\n" + + " │ │ │ └─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(w2mao)\n" + + " │ │ └─ IndexedTableAccess(SEQS3)\n" + + " │ │ ├─ index: [SEQS3.Z7CP5]\n" + + " │ │ ├─ columns: [z7cp5 yh4xb]\n" + + " │ │ └─ keys: iq.Z7CP5\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (w2mao.YH4XB)\n" + + " │ ├─ right-key: (vc.id)\n" + + " │ └─ TableAlias(vc)\n" + + " │ └─ Table\n" + + " │ ├─ name: D34QP\n" + + " │ └─ columns: [id znp4p]\n" + " └─ HashLookup\n" + " ├─ left-key: (nd.HPCMS)\n" + " ├─ right-key: (nma.id)\n" + @@ -8547,23 +8565,24 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: TUPLE(xj2rd.WNUNU:1!null)\n" + " ├─ right-key: TUPLE(tusay.XLFIA:1!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (26,27)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc):0!null->Y3IOU:0, noxn3.id:1!null->XLFIA:0]\n" + - " └─ Window\n" + - " ├─ row_number() over ( order by noxn3.id ASC)\n" + - " ├─ noxn3.id:0!null\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id]\n" + - " ├─ colSet: (13-22)\n" + - " └─ tableId: 3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (26,27)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc):0!null->Y3IOU:0, noxn3.id:1!null->XLFIA:0]\n" + + " └─ Window\n" + + " ├─ row_number() over ( order by noxn3.id ASC)\n" + + " ├─ noxn3.id:0!null\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id]\n" + + " ├─ colSet: (13-22)\n" + + " └─ tableId: 3\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [tusay.Y3IOU as RWGEU]\n" + @@ -8583,17 +8602,18 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: (xj2rd.WNUNU)\n" + " ├─ right-key: (tusay.XLFIA)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [tusay.Y3IOU as RWGEU]\n" + @@ -8613,17 +8633,18 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: (xj2rd.WNUNU)\n" + " ├─ right-key: (tusay.XLFIA)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", }, { @@ -8718,23 +8739,24 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: TUPLE(nd.T722E:0!null)\n" + " ├─ right-key: TUPLE(fc.ZPAIK:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: fc\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (31,32)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [amyxq.LUEVY:1!null->ZPAIK:0, max(amyxq.z35gy):0!null->Z35GY:0]\n" + - " └─ GroupBy\n" + - " ├─ select: MAX(amyxq.Z35GY:1!null), amyxq.LUEVY:0!null\n" + - " ├─ group: amyxq.luevy:0!null\n" + - " └─ Table\n" + - " ├─ name: AMYXQ\n" + - " ├─ columns: [luevy z35gy]\n" + - " ├─ colSet: (20-27)\n" + - " └─ tableId: 3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: fc\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (31,32)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [amyxq.LUEVY:1!null->ZPAIK:0, max(amyxq.z35gy):0!null->Z35GY:0]\n" + + " └─ GroupBy\n" + + " ├─ select: MAX(amyxq.Z35GY:1!null), amyxq.LUEVY:0!null\n" + + " ├─ group: amyxq.luevy:0!null\n" + + " └─ Table\n" + + " ├─ name: AMYXQ\n" + + " ├─ columns: [luevy z35gy]\n" + + " ├─ colSet: (20-27)\n" + + " └─ tableId: 3\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [CASE WHEN (NOT(yzxyp.Z35GY IS NULL)) THEN yzxyp.Z35GY ELSE -1 END as FMSOH]\n" + @@ -8761,19 +8783,20 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: (nd.T722E)\n" + " ├─ right-key: (fc.ZPAIK)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: fc\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [amyxq.LUEVY as ZPAIK, max(amyxq.z35gy) as Z35GY]\n" + - " └─ GroupBy\n" + - " ├─ SelectDeps(MAX(amyxq.Z35GY), amyxq.LUEVY)\n" + - " ├─ Grouping(amyxq.luevy)\n" + - " └─ Table\n" + - " ├─ name: AMYXQ\n" + - " └─ columns: [luevy z35gy]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: fc\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [amyxq.LUEVY as ZPAIK, max(amyxq.z35gy) as Z35GY]\n" + + " └─ GroupBy\n" + + " ├─ SelectDeps(MAX(amyxq.Z35GY), amyxq.LUEVY)\n" + + " ├─ Grouping(amyxq.luevy)\n" + + " └─ Table\n" + + " ├─ name: AMYXQ\n" + + " └─ columns: [luevy z35gy]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [CASE WHEN (NOT(yzxyp.Z35GY IS NULL)) THEN yzxyp.Z35GY ELSE -1 END as FMSOH]\n" + @@ -8800,19 +8823,20 @@ WHERE " └─ HashLookup\n" + " ├─ left-key: (nd.T722E)\n" + " ├─ right-key: (fc.ZPAIK)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: fc\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [amyxq.LUEVY as ZPAIK, max(amyxq.z35gy) as Z35GY]\n" + - " └─ GroupBy\n" + - " ├─ SelectDeps(MAX(amyxq.Z35GY), amyxq.LUEVY)\n" + - " ├─ Grouping(amyxq.luevy)\n" + - " └─ Table\n" + - " ├─ name: AMYXQ\n" + - " └─ columns: [luevy z35gy]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: fc\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [amyxq.LUEVY as ZPAIK, max(amyxq.z35gy) as Z35GY]\n" + + " └─ GroupBy\n" + + " ├─ SelectDeps(MAX(amyxq.Z35GY), amyxq.LUEVY)\n" + + " ├─ Grouping(amyxq.luevy)\n" + + " └─ Table\n" + + " ├─ name: AMYXQ\n" + + " └─ columns: [luevy z35gy]\n" + "", }, { @@ -9184,76 +9208,78 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE(oxxei.BDNYB:1!null)\n" + " │ ├─ right-key: TUPLE(e52ap.BDNYB:1!null)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (133-136)\n" + - " │ ├─ tableId: 16\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N:3!null->KUXQY:0, sn.id:0!null->BDNYB:0, nma.DZLIM:7!null->YHVEZ:0, CASE WHEN LessThan\n" + - " │ │ ├─ nd.TCE7A:4\n" + - " │ │ └─ 0.9 (decimal(2,1))\n" + - " │ │ THEN 1 (tinyint) ELSE 0 (tinyint) END->YAZ4X:0]\n" + - " │ └─ Sort(sn.id:0!null ASC nullsFirst)\n" + - " │ └─ Filter\n" + - " │ ├─ NOT\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ nma.DZLIM:7!null\n" + - " │ │ └─ Q5I4E (longtext)\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: Eq\n" + - " │ │ │ ├─ sn.BRQP2:1!null\n" + - " │ │ │ └─ nd.id:2!null\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (88-97)\n" + - " │ │ │ ├─ tableId: 10\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (98-114)\n" + - " │ │ ├─ tableId: 11\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: E2I7U\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ keys: [nd.HPCMS:5!null]\n" + - " │ ├─ colSet: (115-117)\n" + - " │ ├─ tableId: 12\n" + - " │ └─ Table\n" + - " │ ├─ name: TNMXI\n" + - " │ └─ columns: [id dzlim]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (133-136)\n" + + " │ ├─ tableId: 16\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N:3!null->KUXQY:0, sn.id:0!null->BDNYB:0, nma.DZLIM:7!null->YHVEZ:0, CASE WHEN LessThan\n" + + " │ │ ├─ nd.TCE7A:4\n" + + " │ │ └─ 0.9 (decimal(2,1))\n" + + " │ │ THEN 1 (tinyint) ELSE 0 (tinyint) END->YAZ4X:0]\n" + + " │ └─ Sort(sn.id:0!null ASC nullsFirst)\n" + + " │ └─ Filter\n" + + " │ ├─ NOT\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ nma.DZLIM:7!null\n" + + " │ │ └─ Q5I4E (longtext)\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: Eq\n" + + " │ │ │ ├─ sn.BRQP2:1!null\n" + + " │ │ │ └─ nd.id:2!null\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ ├─ colSet: (88-97)\n" + + " │ │ │ ├─ tableId: 10\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (98-114)\n" + + " │ │ ├─ tableId: 11\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: E2I7U\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ keys: [nd.HPCMS:5!null]\n" + + " │ ├─ colSet: (115-117)\n" + + " │ ├─ tableId: 12\n" + + " │ └─ Table\n" + + " │ ├─ name: TNMXI\n" + + " │ └─ columns: [id dzlim]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(oxxei.BDNYB:1!null)\n" + " ├─ right-key: TUPLE(ckele.LWQ6O:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (150,151)\n" + - " ├─ tableId: 18\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id:1!null->LWQ6O:0, row_number() over ( order by noxn3.id asc):0!null->M6T2N:0]\n" + - " └─ Window\n" + - " ├─ row_number() over ( order by noxn3.id ASC)\n" + - " ├─ noxn3.id:0!null\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id]\n" + - " ├─ colSet: (137-146)\n" + - " └─ tableId: 17\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (150,151)\n" + + " ├─ tableId: 18\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id:1!null->LWQ6O:0, row_number() over ( order by noxn3.id asc):0!null->M6T2N:0]\n" + + " └─ Window\n" + + " ├─ row_number() over ( order by noxn3.id ASC)\n" + + " ├─ noxn3.id:0!null\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id]\n" + + " ├─ colSet: (137-146)\n" + + " └─ tableId: 17\n" + "", ExpectedEstimates: "Sort(ckele.M6T2N ASC)\n" + " └─ Distinct\n" + @@ -9327,48 +9353,50 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (oxxei.BDNYB)\n" + " │ ├─ right-key: (e52ap.BDNYB)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + - " │ └─ Sort(sn.id ASC)\n" + - " │ └─ Filter\n" + - " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ columns: [id dzlim]\n" + - " │ └─ keys: nd.HPCMS\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + + " │ └─ Sort(sn.id ASC)\n" + + " │ └─ Filter\n" + + " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ columns: [id dzlim]\n" + + " │ └─ keys: nd.HPCMS\n" + " └─ HashLookup\n" + " ├─ left-key: (oxxei.BDNYB)\n" + " ├─ right-key: (ckele.LWQ6O)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", ExpectedAnalysis: "Sort(ckele.M6T2N ASC)\n" + " └─ Distinct\n" + @@ -9442,48 +9470,50 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (oxxei.BDNYB)\n" + " │ ├─ right-key: (e52ap.BDNYB)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + - " │ └─ Sort(sn.id ASC)\n" + - " │ └─ Filter\n" + - " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ columns: [id dzlim]\n" + - " │ └─ keys: nd.HPCMS\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + + " │ └─ Sort(sn.id ASC)\n" + + " │ └─ Filter\n" + + " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ columns: [id dzlim]\n" + + " │ └─ keys: nd.HPCMS\n" + " └─ HashLookup\n" + " ├─ left-key: (oxxei.BDNYB)\n" + " ├─ right-key: (ckele.LWQ6O)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", }, { @@ -9669,76 +9699,78 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE(oxxei.BDNYB:1!null)\n" + " │ ├─ right-key: TUPLE(e52ap.BDNYB:1!null)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (133-136)\n" + - " │ ├─ tableId: 16\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N:3!null->KUXQY:0, sn.id:0!null->BDNYB:0, nma.DZLIM:7!null->YHVEZ:0, CASE WHEN LessThan\n" + - " │ │ ├─ nd.TCE7A:4\n" + - " │ │ └─ 0.9 (decimal(2,1))\n" + - " │ │ THEN 1 (tinyint) ELSE 0 (tinyint) END->YAZ4X:0]\n" + - " │ └─ Sort(sn.id:0!null ASC nullsFirst)\n" + - " │ └─ Filter\n" + - " │ ├─ NOT\n" + - " │ │ └─ Eq\n" + - " │ │ ├─ nma.DZLIM:7!null\n" + - " │ │ └─ Q5I4E (longtext)\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: Eq\n" + - " │ │ │ ├─ sn.BRQP2:1!null\n" + - " │ │ │ └─ nd.id:2!null\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (88-97)\n" + - " │ │ │ ├─ tableId: 10\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (98-114)\n" + - " │ │ ├─ tableId: 11\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: E2I7U\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ keys: [nd.HPCMS:5!null]\n" + - " │ ├─ colSet: (115-117)\n" + - " │ ├─ tableId: 12\n" + - " │ └─ Table\n" + - " │ ├─ name: TNMXI\n" + - " │ └─ columns: [id dzlim]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (133-136)\n" + + " │ ├─ tableId: 16\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N:3!null->KUXQY:0, sn.id:0!null->BDNYB:0, nma.DZLIM:7!null->YHVEZ:0, CASE WHEN LessThan\n" + + " │ │ ├─ nd.TCE7A:4\n" + + " │ │ └─ 0.9 (decimal(2,1))\n" + + " │ │ THEN 1 (tinyint) ELSE 0 (tinyint) END->YAZ4X:0]\n" + + " │ └─ Sort(sn.id:0!null ASC nullsFirst)\n" + + " │ └─ Filter\n" + + " │ ├─ NOT\n" + + " │ │ └─ Eq\n" + + " │ │ ├─ nma.DZLIM:7!null\n" + + " │ │ └─ Q5I4E (longtext)\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: Eq\n" + + " │ │ │ ├─ sn.BRQP2:1!null\n" + + " │ │ │ └─ nd.id:2!null\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ ├─ colSet: (88-97)\n" + + " │ │ │ ├─ tableId: 10\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (98-114)\n" + + " │ │ ├─ tableId: 11\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: E2I7U\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ keys: [nd.HPCMS:5!null]\n" + + " │ ├─ colSet: (115-117)\n" + + " │ ├─ tableId: 12\n" + + " │ └─ Table\n" + + " │ ├─ name: TNMXI\n" + + " │ └─ columns: [id dzlim]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(oxxei.BDNYB:1!null)\n" + " ├─ right-key: TUPLE(ckele.LWQ6O:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (150,151)\n" + - " ├─ tableId: 18\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id:1!null->LWQ6O:0, row_number() over ( order by noxn3.id asc):0!null->M6T2N:0]\n" + - " └─ Window\n" + - " ├─ row_number() over ( order by noxn3.id ASC)\n" + - " ├─ noxn3.id:0!null\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id]\n" + - " ├─ colSet: (137-146)\n" + - " └─ tableId: 17\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (150,151)\n" + + " ├─ tableId: 18\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id:1!null->LWQ6O:0, row_number() over ( order by noxn3.id asc):0!null->M6T2N:0]\n" + + " └─ Window\n" + + " ├─ row_number() over ( order by noxn3.id ASC)\n" + + " ├─ noxn3.id:0!null\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id]\n" + + " ├─ colSet: (137-146)\n" + + " └─ tableId: 17\n" + "", ExpectedEstimates: "Sort(ckele.M6T2N ASC)\n" + " └─ Distinct\n" + @@ -9810,48 +9842,50 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (oxxei.BDNYB)\n" + " │ ├─ right-key: (e52ap.BDNYB)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + - " │ └─ Sort(sn.id ASC)\n" + - " │ └─ Filter\n" + - " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ columns: [id dzlim]\n" + - " │ └─ keys: nd.HPCMS\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + + " │ └─ Sort(sn.id ASC)\n" + + " │ └─ Filter\n" + + " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ columns: [id dzlim]\n" + + " │ └─ keys: nd.HPCMS\n" + " └─ HashLookup\n" + " ├─ left-key: (oxxei.BDNYB)\n" + " ├─ right-key: (ckele.LWQ6O)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", ExpectedAnalysis: "Sort(ckele.M6T2N ASC)\n" + " └─ Distinct\n" + @@ -9923,48 +9957,50 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (oxxei.BDNYB)\n" + " │ ├─ right-key: (e52ap.BDNYB)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: e52ap\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + - " │ └─ Sort(sn.id ASC)\n" + - " │ └─ Filter\n" + - " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + - " │ └─ LeftOuterLookupJoin\n" + - " │ ├─ LeftOuterMergeJoin\n" + - " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(nd)\n" + - " │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ ├─ index: [E2I7U.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + - " │ └─ TableAlias(nma)\n" + - " │ └─ IndexedTableAccess(TNMXI)\n" + - " │ ├─ index: [TNMXI.id]\n" + - " │ ├─ columns: [id dzlim]\n" + - " │ └─ keys: nd.HPCMS\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: e52ap\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [nd.TW55N as KUXQY, sn.id as BDNYB, nma.DZLIM as YHVEZ, CASE WHEN (nd.TCE7A < 0.9) THEN 1 ELSE 0 END as YAZ4X]\n" + + " │ └─ Sort(sn.id ASC)\n" + + " │ └─ Filter\n" + + " │ ├─ (NOT((nma.DZLIM = 'Q5I4E')))\n" + + " │ └─ LeftOuterLookupJoin\n" + + " │ ├─ LeftOuterMergeJoin\n" + + " │ │ ├─ cmp: (sn.BRQP2 = nd.id)\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(nd)\n" + + " │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ ├─ index: [E2I7U.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id tw55n tce7a hpcms]\n" + + " │ └─ TableAlias(nma)\n" + + " │ └─ IndexedTableAccess(TNMXI)\n" + + " │ ├─ index: [TNMXI.id]\n" + + " │ ├─ columns: [id dzlim]\n" + + " │ └─ keys: nd.HPCMS\n" + " └─ HashLookup\n" + " ├─ left-key: (oxxei.BDNYB)\n" + " ├─ right-key: (ckele.LWQ6O)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: ckele\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: ckele\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [noxn3.id as LWQ6O, row_number() over ( order by noxn3.id asc) as M6T2N]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", }, { @@ -10726,69 +10762,71 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE(sn.BRQP2:12!null, mjr3d.M22QN:3!null)\n" + " │ ├─ right-key: TUPLE(mf.LUEVY:1!null, mf.M22QN:2!null)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: mf\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (246-248)\n" + - " │ ├─ tableId: 24\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ:4!null, mf.LUEVY:1!null, mf.M22QN:2!null]\n" + - " │ └─ HashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ bs.id:5!null\n" + - " │ │ └─ mf.GXLUB:0!null\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ ├─ columns: [gxlub luevy m22qn]\n" + - " │ │ ├─ colSet: (229-245)\n" + - " │ │ └─ tableId: 23\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(mf.GXLUB:0!null)\n" + - " │ ├─ right-key: TUPLE(bs.id:2!null)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ cla.id:3!null\n" + - " │ │ └─ bs.IXUXU:6\n" + - " │ ├─ Filter\n" + - " │ │ ├─ HashIn\n" + - " │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (195-224)\n" + - " │ │ ├─ tableId: 21\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: YK2GW\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (225-228)\n" + - " │ ├─ tableId: 22\n" + - " │ └─ Table\n" + - " │ ├─ name: THNTS\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: mf\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (246-248)\n" + + " │ ├─ tableId: 24\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ:4!null, mf.LUEVY:1!null, mf.M22QN:2!null]\n" + + " │ └─ HashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ bs.id:5!null\n" + + " │ │ └─ mf.GXLUB:0!null\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ ├─ columns: [gxlub luevy m22qn]\n" + + " │ │ ├─ colSet: (229-245)\n" + + " │ │ └─ tableId: 23\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(mf.GXLUB:0!null)\n" + + " │ ├─ right-key: TUPLE(bs.id:2!null)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ cla.id:3!null\n" + + " │ │ └─ bs.IXUXU:6\n" + + " │ ├─ Filter\n" + + " │ │ ├─ HashIn\n" + + " │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (195-224)\n" + + " │ │ ├─ tableId: 21\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: YK2GW\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (225-228)\n" + + " │ ├─ tableId: 22\n" + + " │ └─ Table\n" + + " │ ├─ name: THNTS\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(mjr3d.M22QN:3!null)\n" + " ├─ right-key: TUPLE(aac.id:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aac\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (252-254)\n" + - " ├─ tableId: 26\n" + - " └─ Table\n" + - " ├─ name: TPXBU\n" + - " ├─ columns: [id btxc5 fhcyt]\n" + - " ├─ colSet: (249-251)\n" + - " └─ tableId: 25\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aac\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (252-254)\n" + + " ├─ tableId: 26\n" + + " └─ Table\n" + + " ├─ name: TPXBU\n" + + " ├─ columns: [id btxc5 fhcyt]\n" + + " ├─ colSet: (249-251)\n" + + " └─ tableId: 25\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [mf.FTQLQ as T4IBQ, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, mjr3d.GE5EL as GE5EL, mjr3d.F7A4Q as F7A4Q, mjr3d.CC4AX as CC4AX, mjr3d.SL76B as SL76B, aac.BTXC5 as YEBDJ, mjr3d.PSMU6]\n" + @@ -11023,47 +11061,49 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (sn.BRQP2, mjr3d.M22QN)\n" + " │ ├─ right-key: (mf.LUEVY, mf.M22QN)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: mf\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ, mf.LUEVY, mf.M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ ├─ Filter\n" + - " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: mf\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ, mf.LUEVY, mf.M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ ├─ Filter\n" + + " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ HashLookup\n" + " ├─ left-key: (mjr3d.M22QN)\n" + " ├─ right-key: (aac.id)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aac\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + - " ├─ name: TPXBU\n" + - " └─ columns: [id btxc5 fhcyt]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aac\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: TPXBU\n" + + " └─ columns: [id btxc5 fhcyt]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [mf.FTQLQ as T4IBQ, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, mjr3d.GE5EL as GE5EL, mjr3d.F7A4Q as F7A4Q, mjr3d.CC4AX as CC4AX, mjr3d.SL76B as SL76B, aac.BTXC5 as YEBDJ, mjr3d.PSMU6]\n" + @@ -11298,47 +11338,49 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: (sn.BRQP2, mjr3d.M22QN)\n" + " │ ├─ right-key: (mf.LUEVY, mf.M22QN)\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: mf\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ, mf.LUEVY, mf.M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ ├─ Filter\n" + - " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ └─ TableAlias(cla)\n" + - " │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ ├─ index: [YK2GW.id]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ftqlq]\n" + - " │ └─ TableAlias(bs)\n" + - " │ └─ IndexedTableAccess(THNTS)\n" + - " │ ├─ index: [THNTS.IXUXU]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ixuxu]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: mf\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ, mf.LUEVY, mf.M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ ├─ Filter\n" + + " │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ └─ TableAlias(cla)\n" + + " │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ ├─ index: [YK2GW.id]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ftqlq]\n" + + " │ └─ TableAlias(bs)\n" + + " │ └─ IndexedTableAccess(THNTS)\n" + + " │ ├─ index: [THNTS.IXUXU]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ixuxu]\n" + " └─ HashLookup\n" + " ├─ left-key: (mjr3d.M22QN)\n" + " ├─ right-key: (aac.id)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: aac\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + - " ├─ name: TPXBU\n" + - " └─ columns: [id btxc5 fhcyt]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: aac\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: TPXBU\n" + + " └─ columns: [id btxc5 fhcyt]\n" + "", }, { @@ -11855,493 +11897,496 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE()\n" + " │ ├─ right-key: TUPLE()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (235)\n" + - " │ ├─ tableId: 29\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ:0!null]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (232-234)\n" + - " │ ├─ tableId: 17\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.id:7!null->BDNYB:0, mf.M22QN:6!null->M22QN:0]\n" + - " │ └─ HashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ bs.id:2!null\n" + - " │ │ └─ mf.GXLUB:4!null\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: Eq\n" + - " │ │ │ ├─ cla.id:0!null\n" + - " │ │ │ └─ bs.IXUXU:3\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ HashIn\n" + - " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (114-143)\n" + - " │ │ │ ├─ tableId: 14\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: YK2GW\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (110-113)\n" + - " │ │ ├─ tableId: 13\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: THNTS\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(bs.id:2!null)\n" + - " │ ├─ right-key: TUPLE(mf.GXLUB:0!null)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ mf.LUEVY:5!null\n" + - " │ │ └─ sn.BRQP2:8!null\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (93-109)\n" + - " │ │ ├─ tableId: 12\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (144-153)\n" + - " │ ├─ tableId: 15\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ └─ columns: [id brqp2]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (235)\n" + + " │ ├─ tableId: 29\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ:0!null]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (232-234)\n" + + " │ ├─ tableId: 17\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.id:7!null->BDNYB:0, mf.M22QN:6!null->M22QN:0]\n" + + " │ └─ HashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ bs.id:2!null\n" + + " │ │ └─ mf.GXLUB:4!null\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: Eq\n" + + " │ │ │ ├─ cla.id:0!null\n" + + " │ │ │ └─ bs.IXUXU:3\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ HashIn\n" + + " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ ├─ colSet: (114-143)\n" + + " │ │ │ ├─ tableId: 14\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: YK2GW\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (110-113)\n" + + " │ │ ├─ tableId: 13\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: THNTS\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(bs.id:2!null)\n" + + " │ ├─ right-key: TUPLE(mf.GXLUB:0!null)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ mf.LUEVY:5!null\n" + + " │ │ └─ sn.BRQP2:8!null\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (93-109)\n" + + " │ │ ├─ tableId: 12\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (144-153)\n" + + " │ ├─ tableId: 15\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ └─ columns: [id brqp2]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(TUPLE(fs.T4IBQ:0!null, fs.M6T2N:1, fs.BTXC5:2, fs.TUV25:3))\n" + " ├─ right-key: TUPLE(TUPLE(zmspr.T4IBQ:0!null, zmspr.M6T2N:1, zmspr.BTXC5:2, zmspr.TUV25:3))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (264-267)\n" + - " ├─ tableId: 35\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ:0!null->T4IBQ:0, p4pjz.M6T2N:3->M6T2N:0, p4pjz.BTXC5:4->BTXC5:0, p4pjz.TUV25:7->TUV25:0]\n" + - " └─ Filter\n" + - " ├─ NOT\n" + - " │ └─ p4pjz.M6T2N:3 IS NULL\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ AND\n" + - " │ ├─ Eq\n" + - " │ │ ├─ p4pjz.LWQ6O:6!null\n" + - " │ │ └─ cld.BDNYB:1!null\n" + - " │ └─ Eq\n" + - " │ ├─ p4pjz.NTOFG:5!null\n" + - " │ └─ cld.M22QN:2!null\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (244-246)\n" + - " │ ├─ tableId: 32\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.id:7!null->BDNYB:0, mf.M22QN:6!null->M22QN:0]\n" + - " │ └─ HashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ bs.id:2!null\n" + - " │ │ └─ mf.GXLUB:4!null\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: Eq\n" + - " │ │ │ ├─ cla.id:0!null\n" + - " │ │ │ └─ bs.IXUXU:3\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ HashIn\n" + - " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (114-143)\n" + - " │ │ │ ├─ tableId: 14\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: YK2GW\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (110-113)\n" + - " │ │ ├─ tableId: 13\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: THNTS\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(bs.id:2!null)\n" + - " │ ├─ right-key: TUPLE(mf.GXLUB:0!null)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ mf.LUEVY:5!null\n" + - " │ │ └─ sn.BRQP2:8!null\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (93-109)\n" + - " │ │ ├─ tableId: 12\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (144-153)\n" + - " │ ├─ tableId: 15\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ └─ columns: [id brqp2]\n" + - " └─ HashLookup\n" + - " ├─ left-key: TUPLE(cld.BDNYB:1!null, cld.M22QN:2!null)\n" + - " ├─ right-key: TUPLE(p4pjz.LWQ6O:3!null, p4pjz.NTOFG:2!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (247-251)\n" + - " ├─ tableId: 33\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN NOT\n" + - " │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:26!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:25!null\n" + - " │ │ └─ mjr3d.QNI57:5!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (210,211)\n" + - " │ ├─ tableId: 24\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:25!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ WHEN NOT\n" + - " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:26!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:25!null\n" + - " │ │ └─ mjr3d.TDEIU:6!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (212,213)\n" + - " │ ├─ tableId: 25\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:25!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5:0!null, mjr3d.BJUF2:1!null, mjr3d.M22QN:2!null, mjr3d.TUV25:3, mjr3d.ESFVY:4!null, mjr3d.QNI57:5!null, mjr3d.TDEIU:6!null, aac.id:7!null, aac.BTXC5:8, aac.FHCYT:9, sn.id:10!null, sn.BRQP2:11!null, sn.FFTBJ:12!null, sn.A7XO2:13, sn.KBO7R:14!null, sn.ECDKM:15, sn.NUMK2:16!null, sn.LETOE:17!null, sn.YKSSU:18, sn.FHCYT:19, CASE WHEN NOT\n" + - " │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:21!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:20!null\n" + - " │ │ └─ mjr3d.QNI57:5!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (210,211)\n" + - " │ ├─ tableId: 24\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:20!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ WHEN NOT\n" + - " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:21!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:20!null\n" + - " │ │ └─ mjr3d.TDEIU:6!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (212,213)\n" + - " │ ├─ tableId: 25\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:20!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + - " └─ LeftOuterJoin\n" + - " ├─ Or\n" + - " │ ├─ Or\n" + - " │ │ ├─ Or\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ │ │ │ │ └─ Eq\n" + - " │ │ │ │ │ ├─ sn.id:10!null\n" + - " │ │ │ │ │ └─ mjr3d.QNI57:5!null\n" + - " │ │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ │ │ └─ AND\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ │ │ │ └─ InSubquery\n" + - " │ │ │ │ ├─ left: sn.id:10!null\n" + - " │ │ │ │ └─ right: Subquery\n" + - " │ │ │ │ ├─ cacheable: false\n" + - " │ │ │ │ ├─ alias-string: select JTEHG.id from NOXN3 as JTEHG where BRQP2 = MJR3D.BJUF2\n" + - " │ │ │ │ └─ Project\n" + - " │ │ │ │ ├─ columns: [jtehg.id:20!null]\n" + - " │ │ │ │ └─ Filter\n" + - " │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ ├─ jtehg.BRQP2:21!null\n" + - " │ │ │ │ │ └─ mjr3d.BJUF2:1!null\n" + - " │ │ │ │ └─ TableAlias(jtehg)\n" + - " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + - " │ │ │ │ ├─ colSet: (180-189)\n" + - " │ │ │ │ ├─ tableId: 21\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ └─ columns: [id brqp2]\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ │ └─ AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ NOT\n" + - " │ │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ │ │ └─ InSubquery\n" + - " │ │ │ ├─ left: sn.id:10!null\n" + - " │ │ │ └─ right: Subquery\n" + - " │ │ │ ├─ cacheable: false\n" + - " │ │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.FJDP5\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [xmafz.id:20!null]\n" + - " │ │ │ └─ Filter\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ xmafz.BRQP2:21!null\n" + - " │ │ │ │ └─ mjr3d.FJDP5:0!null\n" + - " │ │ │ └─ TableAlias(xmafz)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ keys: [mjr3d.FJDP5:0!null]\n" + - " │ │ │ ├─ colSet: (190-199)\n" + - " │ │ │ ├─ tableId: 22\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ └─ AND\n" + - " │ ├─ AND\n" + - " │ │ ├─ NOT\n" + - " │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ │ └─ InSubquery\n" + - " │ │ ├─ left: sn.id:10!null\n" + - " │ │ └─ right: Subquery\n" + - " │ │ ├─ cacheable: false\n" + - " │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.BJUF2\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [xmafz.id:20!null]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ Eq\n" + - " │ │ │ ├─ xmafz.BRQP2:21!null\n" + - " │ │ │ └─ mjr3d.BJUF2:1!null\n" + - " │ │ └─ TableAlias(xmafz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + - " │ │ ├─ colSet: (200-209)\n" + - " │ │ ├─ tableId: 23\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: NOXN3\n" + - " │ │ └─ columns: [id brqp2]\n" + - " │ └─ NOT\n" + - " │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ ├─ colSet: (160-166)\n" + - " │ │ ├─ tableId: 18\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E:0!null->FJDP5:0, cpmfe.id:10!null->BJUF2:0, ism.M22QN:2!null->M22QN:0, g3yxs.TUV25:7->TUV25:0, g3yxs.ESFVY:6!null->ESFVY:0, yqif4.id:12!null->QNI57:0, yvhjz.id:15!null->TDEIU:0]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ Or\n" + - " │ │ │ ├─ NOT\n" + - " │ │ │ │ └─ yqif4.id:12!null IS NULL\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ yvhjz.id:15!null IS NULL\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ Eq\n" + - " │ │ │ ├─ yvhjz.BRQP2:16!null\n" + - " │ │ │ └─ ism.UJ6XY:1!null\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ yqif4.BRQP2:13!null\n" + - " │ │ │ │ └─ ism.FV24E:0!null\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ └─ Eq\n" + - " │ │ │ │ │ ├─ cpmfe.id:10!null\n" + - " │ │ │ │ │ └─ ism.FV24E:0!null\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ │ ├─ nhmxw.id:8!null\n" + - " │ │ │ │ │ │ └─ ism.PRUV2:4\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ │ │ │ ├─ ism.NZ4MQ:3!null\n" + - " │ │ │ │ │ │ │ └─ g3yxs.id:5!null\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ ├─ colSet: (15-23)\n" + - " │ │ │ │ │ │ │ ├─ tableId: 4\n" + - " │ │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ │ ├─ name: HDDVB\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ │ │ └─ g3yxs.TUV25:2 IS NULL\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ ├─ colSet: (24-31)\n" + - " │ │ │ │ │ │ ├─ tableId: 5\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: YYBCX\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: TUPLE(ism.PRUV2:4)\n" + - " │ │ │ │ │ ├─ right-key: TUPLE(nhmxw.id:0!null)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ ├─ columns: [id nohhr]\n" + - " │ │ │ │ │ ├─ colSet: (32-41)\n" + - " │ │ │ │ │ └─ tableId: 6\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ keys: [nhmxw.NOHHR:9!null]\n" + - " │ │ │ │ ├─ colSet: (42-58)\n" + - " │ │ │ │ ├─ tableId: 7\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: E2I7U\n" + - " │ │ │ │ └─ columns: [id zh72s]\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ keys: [ism.UJ6XY:1!null]\n" + - " │ │ │ ├─ colSet: (59-68)\n" + - " │ │ │ ├─ tableId: 8\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ keys: [ism.FV24E:0!null]\n" + - " │ │ ├─ colSet: (69-78)\n" + - " │ │ ├─ tableId: 9\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: NOXN3\n" + - " │ │ └─ columns: [id brqp2 fftbj]\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ ├─ keys: [mjr3d.M22QN:2!null]\n" + - " │ ├─ colSet: (167-169)\n" + - " │ ├─ tableId: 19\n" + - " │ └─ Table\n" + - " │ ├─ name: TPXBU\n" + - " │ └─ columns: [id btxc5 fhcyt]\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id brqp2 fftbj a7xo2 kbo7r ecdkm numk2 letoe ykssu fhcyt]\n" + - " ├─ colSet: (170-179)\n" + - " └─ tableId: 20\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (264-267)\n" + + " ├─ tableId: 35\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ:0!null->T4IBQ:0, p4pjz.M6T2N:3->M6T2N:0, p4pjz.BTXC5:4->BTXC5:0, p4pjz.TUV25:7->TUV25:0]\n" + + " └─ Filter\n" + + " ├─ NOT\n" + + " │ └─ p4pjz.M6T2N:3 IS NULL\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ AND\n" + + " │ ├─ Eq\n" + + " │ │ ├─ p4pjz.LWQ6O:6!null\n" + + " │ │ └─ cld.BDNYB:1!null\n" + + " │ └─ Eq\n" + + " │ ├─ p4pjz.NTOFG:5!null\n" + + " │ └─ cld.M22QN:2!null\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (244-246)\n" + + " │ ├─ tableId: 32\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ:1!null->T4IBQ:0, sn.id:7!null->BDNYB:0, mf.M22QN:6!null->M22QN:0]\n" + + " │ └─ HashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ bs.id:2!null\n" + + " │ │ └─ mf.GXLUB:4!null\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: Eq\n" + + " │ │ │ ├─ cla.id:0!null\n" + + " │ │ │ └─ bs.IXUXU:3\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ HashIn\n" + + " │ │ │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ ├─ colSet: (114-143)\n" + + " │ │ │ ├─ tableId: 14\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: YK2GW\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (110-113)\n" + + " │ │ ├─ tableId: 13\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: THNTS\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(bs.id:2!null)\n" + + " │ ├─ right-key: TUPLE(mf.GXLUB:0!null)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ mf.LUEVY:5!null\n" + + " │ │ └─ sn.BRQP2:8!null\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (93-109)\n" + + " │ │ ├─ tableId: 12\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (144-153)\n" + + " │ ├─ tableId: 15\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ └─ columns: [id brqp2]\n" + + " └─ HashLookup\n" + + " ├─ left-key: TUPLE(cld.BDNYB:1!null, cld.M22QN:2!null)\n" + + " ├─ right-key: TUPLE(p4pjz.LWQ6O:3!null, p4pjz.NTOFG:2!null)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (247-251)\n" + + " ├─ tableId: 33\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN NOT\n" + + " │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:26!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:25!null\n" + + " │ │ └─ mjr3d.QNI57:5!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (210,211)\n" + + " │ ├─ tableId: 24\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:25!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ WHEN NOT\n" + + " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:26!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:25!null\n" + + " │ │ └─ mjr3d.TDEIU:6!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (212,213)\n" + + " │ ├─ tableId: 25\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:25!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5:0!null, mjr3d.BJUF2:1!null, mjr3d.M22QN:2!null, mjr3d.TUV25:3, mjr3d.ESFVY:4!null, mjr3d.QNI57:5!null, mjr3d.TDEIU:6!null, aac.id:7!null, aac.BTXC5:8, aac.FHCYT:9, sn.id:10!null, sn.BRQP2:11!null, sn.FFTBJ:12!null, sn.A7XO2:13, sn.KBO7R:14!null, sn.ECDKM:15, sn.NUMK2:16!null, sn.LETOE:17!null, sn.YKSSU:18, sn.FHCYT:19, CASE WHEN NOT\n" + + " │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:21!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:20!null\n" + + " │ │ └─ mjr3d.QNI57:5!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (210,211)\n" + + " │ ├─ tableId: 24\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:20!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ WHEN NOT\n" + + " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:21!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:20!null\n" + + " │ │ └─ mjr3d.TDEIU:6!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (212,213)\n" + + " │ ├─ tableId: 25\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:20!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + + " └─ LeftOuterJoin\n" + + " ├─ Or\n" + + " │ ├─ Or\n" + + " │ │ ├─ Or\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ │ │ │ │ └─ Eq\n" + + " │ │ │ │ │ ├─ sn.id:10!null\n" + + " │ │ │ │ │ └─ mjr3d.QNI57:5!null\n" + + " │ │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ │ │ └─ AND\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ │ │ │ └─ InSubquery\n" + + " │ │ │ │ ├─ left: sn.id:10!null\n" + + " │ │ │ │ └─ right: Subquery\n" + + " │ │ │ │ ├─ cacheable: false\n" + + " │ │ │ │ ├─ alias-string: select JTEHG.id from NOXN3 as JTEHG where BRQP2 = MJR3D.BJUF2\n" + + " │ │ │ │ └─ Project\n" + + " │ │ │ │ ├─ columns: [jtehg.id:20!null]\n" + + " │ │ │ │ └─ Filter\n" + + " │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ ├─ jtehg.BRQP2:21!null\n" + + " │ │ │ │ │ └─ mjr3d.BJUF2:1!null\n" + + " │ │ │ │ └─ TableAlias(jtehg)\n" + + " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + + " │ │ │ │ ├─ colSet: (180-189)\n" + + " │ │ │ │ ├─ tableId: 21\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ └─ columns: [id brqp2]\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ │ └─ AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ NOT\n" + + " │ │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ │ │ └─ InSubquery\n" + + " │ │ │ ├─ left: sn.id:10!null\n" + + " │ │ │ └─ right: Subquery\n" + + " │ │ │ ├─ cacheable: false\n" + + " │ │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.FJDP5\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [xmafz.id:20!null]\n" + + " │ │ │ └─ Filter\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ xmafz.BRQP2:21!null\n" + + " │ │ │ │ └─ mjr3d.FJDP5:0!null\n" + + " │ │ │ └─ TableAlias(xmafz)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ keys: [mjr3d.FJDP5:0!null]\n" + + " │ │ │ ├─ colSet: (190-199)\n" + + " │ │ │ ├─ tableId: 22\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ └─ AND\n" + + " │ ├─ AND\n" + + " │ │ ├─ NOT\n" + + " │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ │ └─ InSubquery\n" + + " │ │ ├─ left: sn.id:10!null\n" + + " │ │ └─ right: Subquery\n" + + " │ │ ├─ cacheable: false\n" + + " │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.BJUF2\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [xmafz.id:20!null]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ Eq\n" + + " │ │ │ ├─ xmafz.BRQP2:21!null\n" + + " │ │ │ └─ mjr3d.BJUF2:1!null\n" + + " │ │ └─ TableAlias(xmafz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + + " │ │ ├─ colSet: (200-209)\n" + + " │ │ ├─ tableId: 23\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: NOXN3\n" + + " │ │ └─ columns: [id brqp2]\n" + + " │ └─ NOT\n" + + " │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ ├─ colSet: (160-166)\n" + + " │ │ ├─ tableId: 18\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E:0!null->FJDP5:0, cpmfe.id:10!null->BJUF2:0, ism.M22QN:2!null->M22QN:0, g3yxs.TUV25:7->TUV25:0, g3yxs.ESFVY:6!null->ESFVY:0, yqif4.id:12!null->QNI57:0, yvhjz.id:15!null->TDEIU:0]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ Or\n" + + " │ │ │ ├─ NOT\n" + + " │ │ │ │ └─ yqif4.id:12!null IS NULL\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ yvhjz.id:15!null IS NULL\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ Eq\n" + + " │ │ │ ├─ yvhjz.BRQP2:16!null\n" + + " │ │ │ └─ ism.UJ6XY:1!null\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ yqif4.BRQP2:13!null\n" + + " │ │ │ │ └─ ism.FV24E:0!null\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ └─ Eq\n" + + " │ │ │ │ │ ├─ cpmfe.id:10!null\n" + + " │ │ │ │ │ └─ ism.FV24E:0!null\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ │ ├─ nhmxw.id:8!null\n" + + " │ │ │ │ │ │ └─ ism.PRUV2:4\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ │ │ │ ├─ ism.NZ4MQ:3!null\n" + + " │ │ │ │ │ │ │ └─ g3yxs.id:5!null\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ ├─ colSet: (15-23)\n" + + " │ │ │ │ │ │ │ ├─ tableId: 4\n" + + " │ │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ │ ├─ name: HDDVB\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ │ │ └─ g3yxs.TUV25:2 IS NULL\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ ├─ colSet: (24-31)\n" + + " │ │ │ │ │ │ ├─ tableId: 5\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: YYBCX\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: TUPLE(ism.PRUV2:4)\n" + + " │ │ │ │ │ ├─ right-key: TUPLE(nhmxw.id:0!null)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ ├─ columns: [id nohhr]\n" + + " │ │ │ │ │ ├─ colSet: (32-41)\n" + + " │ │ │ │ │ └─ tableId: 6\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ keys: [nhmxw.NOHHR:9!null]\n" + + " │ │ │ │ ├─ colSet: (42-58)\n" + + " │ │ │ │ ├─ tableId: 7\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: E2I7U\n" + + " │ │ │ │ └─ columns: [id zh72s]\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ keys: [ism.UJ6XY:1!null]\n" + + " │ │ │ ├─ colSet: (59-68)\n" + + " │ │ │ ├─ tableId: 8\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ keys: [ism.FV24E:0!null]\n" + + " │ │ ├─ colSet: (69-78)\n" + + " │ │ ├─ tableId: 9\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: NOXN3\n" + + " │ │ └─ columns: [id brqp2 fftbj]\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ ├─ keys: [mjr3d.M22QN:2!null]\n" + + " │ ├─ colSet: (167-169)\n" + + " │ ├─ tableId: 19\n" + + " │ └─ Table\n" + + " │ ├─ name: TPXBU\n" + + " │ └─ columns: [id btxc5 fhcyt]\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id brqp2 fftbj a7xo2 kbo7r ecdkm numk2 letoe ykssu fhcyt]\n" + + " ├─ colSet: (170-179)\n" + + " └─ tableId: 20\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [fs.T4IBQ as T4IBQ, fs.M6T2N as M6T2N, fs.TUV25 as TUV25, fs.BTXC5 as YEBDJ]\n" + @@ -12482,220 +12527,223 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (bs.id)\n" + - " │ ├─ right-key: (mf.GXLUB)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id brqp2]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (bs.id)\n" + + " │ ├─ right-key: (mf.GXLUB)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id brqp2]\n" + " └─ HashLookup\n" + " ├─ left-key: ((fs.T4IBQ, fs.M6T2N, fs.BTXC5, fs.TUV25))\n" + " ├─ right-key: ((zmspr.T4IBQ, zmspr.M6T2N, zmspr.BTXC5, zmspr.TUV25))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + - " └─ Filter\n" + - " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (bs.id)\n" + - " │ ├─ right-key: (mf.GXLUB)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id brqp2]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + - " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ LeftOuterJoin\n" + - " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [jtehg.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(jtehg)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.FJDP5\n" + - " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + - " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ └─ columns: [id nohhr]\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ columns: [id zh72s]\n" + - " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ │ └─ keys: ism.UJ6XY\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ keys: ism.FV24E\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ └─ keys: mjr3d.M22QN\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " └─ name: NOXN3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + + " └─ Filter\n" + + " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (bs.id)\n" + + " │ ├─ right-key: (mf.GXLUB)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id brqp2]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + + " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ LeftOuterJoin\n" + + " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [jtehg.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(jtehg)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.FJDP5\n" + + " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + + " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ └─ columns: [id nohhr]\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ columns: [id zh72s]\n" + + " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ │ └─ keys: ism.UJ6XY\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ keys: ism.FV24E\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ └─ keys: mjr3d.M22QN\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " └─ name: NOXN3\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [fs.T4IBQ as T4IBQ, fs.M6T2N as M6T2N, fs.TUV25 as TUV25, fs.BTXC5 as YEBDJ]\n" + @@ -12836,220 +12884,223 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (bs.id)\n" + - " │ ├─ right-key: (mf.GXLUB)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id brqp2]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (bs.id)\n" + + " │ ├─ right-key: (mf.GXLUB)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id brqp2]\n" + " └─ HashLookup\n" + " ├─ left-key: ((fs.T4IBQ, fs.M6T2N, fs.BTXC5, fs.TUV25))\n" + " ├─ right-key: ((zmspr.T4IBQ, zmspr.M6T2N, zmspr.BTXC5, zmspr.TUV25))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + - " └─ Filter\n" + - " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ MergeJoin\n" + - " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + - " │ │ ├─ Filter\n" + - " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ │ │ └─ TableAlias(cla)\n" + - " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + - " │ │ │ ├─ index: [YK2GW.id]\n" + - " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ └─ columns: [id ftqlq]\n" + - " │ │ └─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (bs.id)\n" + - " │ ├─ right-key: (mf.GXLUB)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + - " │ ├─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ TableAlias(sn)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id brqp2]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + - " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ LeftOuterJoin\n" + - " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [jtehg.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(jtehg)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.FJDP5\n" + - " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + - " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ └─ columns: [id nohhr]\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ columns: [id zh72s]\n" + - " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ │ └─ keys: ism.UJ6XY\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ keys: ism.FV24E\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ └─ keys: mjr3d.M22QN\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " └─ name: NOXN3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + + " └─ Filter\n" + + " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ MergeJoin\n" + + " │ │ ├─ cmp: (cla.id = bs.IXUXU)\n" + + " │ │ ├─ Filter\n" + + " │ │ │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ │ │ └─ TableAlias(cla)\n" + + " │ │ │ └─ IndexedTableAccess(YK2GW)\n" + + " │ │ │ ├─ index: [YK2GW.id]\n" + + " │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ └─ columns: [id ftqlq]\n" + + " │ │ └─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (bs.id)\n" + + " │ ├─ right-key: (mf.GXLUB)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (mf.LUEVY = sn.BRQP2)\n" + + " │ ├─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ TableAlias(sn)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id brqp2]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + + " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ LeftOuterJoin\n" + + " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [jtehg.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(jtehg)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.FJDP5\n" + + " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + + " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ └─ columns: [id nohhr]\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ columns: [id zh72s]\n" + + " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ │ └─ keys: ism.UJ6XY\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ keys: ism.FV24E\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ └─ keys: mjr3d.M22QN\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " └─ name: NOXN3\n" + "", }, { @@ -13567,481 +13618,484 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: TUPLE()\n" + " │ ├─ right-key: TUPLE()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (235)\n" + - " │ ├─ tableId: 29\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ:0!null]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (232-234)\n" + - " │ ├─ tableId: 17\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ:8!null->T4IBQ:0, sn.id:0!null->BDNYB:0, mf.M22QN:4!null->M22QN:0]\n" + - " │ └─ HashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ bs.id:5!null\n" + - " │ │ └─ mf.GXLUB:2!null\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ ├─ columns: [id brqp2]\n" + - " │ │ │ ├─ colSet: (144-153)\n" + - " │ │ │ └─ tableId: 15\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ keys: [sn.BRQP2:1!null]\n" + - " │ │ ├─ colSet: (93-109)\n" + - " │ │ ├─ tableId: 12\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(mf.GXLUB:2!null)\n" + - " │ ├─ right-key: TUPLE(bs.id:0!null)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ bs.IXUXU:6\n" + - " │ │ └─ cla.id:7!null\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (110-113)\n" + - " │ │ ├─ tableId: 13\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: THNTS\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ HashIn\n" + - " │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (114-143)\n" + - " │ ├─ tableId: 14\n" + - " │ └─ Table\n" + - " │ ├─ name: YK2GW\n" + - " │ └─ columns: [id ftqlq]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (235)\n" + + " │ ├─ tableId: 29\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ:0!null]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (232-234)\n" + + " │ ├─ tableId: 17\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ:8!null->T4IBQ:0, sn.id:0!null->BDNYB:0, mf.M22QN:4!null->M22QN:0]\n" + + " │ └─ HashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ bs.id:5!null\n" + + " │ │ └─ mf.GXLUB:2!null\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ ├─ columns: [id brqp2]\n" + + " │ │ │ ├─ colSet: (144-153)\n" + + " │ │ │ └─ tableId: 15\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ keys: [sn.BRQP2:1!null]\n" + + " │ │ ├─ colSet: (93-109)\n" + + " │ │ ├─ tableId: 12\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(mf.GXLUB:2!null)\n" + + " │ ├─ right-key: TUPLE(bs.id:0!null)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ bs.IXUXU:6\n" + + " │ │ └─ cla.id:7!null\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (110-113)\n" + + " │ │ ├─ tableId: 13\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: THNTS\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ HashIn\n" + + " │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (114-143)\n" + + " │ ├─ tableId: 14\n" + + " │ └─ Table\n" + + " │ ├─ name: YK2GW\n" + + " │ └─ columns: [id ftqlq]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(TUPLE(fs.T4IBQ:0!null, fs.M6T2N:1, fs.BTXC5:2, fs.TUV25:3))\n" + " ├─ right-key: TUPLE(TUPLE(zmspr.T4IBQ:0!null, zmspr.M6T2N:1, zmspr.BTXC5:2, zmspr.TUV25:3))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (264-267)\n" + - " ├─ tableId: 35\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ:0!null->T4IBQ:0, p4pjz.M6T2N:3->M6T2N:0, p4pjz.BTXC5:4->BTXC5:0, p4pjz.TUV25:7->TUV25:0]\n" + - " └─ Filter\n" + - " ├─ NOT\n" + - " │ └─ p4pjz.M6T2N:3 IS NULL\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ AND\n" + - " │ ├─ Eq\n" + - " │ │ ├─ p4pjz.LWQ6O:6!null\n" + - " │ │ └─ cld.BDNYB:1!null\n" + - " │ └─ Eq\n" + - " │ ├─ p4pjz.NTOFG:5!null\n" + - " │ └─ cld.M22QN:2!null\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (244-246)\n" + - " │ ├─ tableId: 32\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ:8!null->T4IBQ:0, sn.id:0!null->BDNYB:0, mf.M22QN:4!null->M22QN:0]\n" + - " │ └─ HashJoin\n" + - " │ ├─ Eq\n" + - " │ │ ├─ bs.id:5!null\n" + - " │ │ └─ mf.GXLUB:2!null\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ ├─ columns: [id brqp2]\n" + - " │ │ │ ├─ colSet: (144-153)\n" + - " │ │ │ └─ tableId: 15\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ keys: [sn.BRQP2:1!null]\n" + - " │ │ ├─ colSet: (93-109)\n" + - " │ │ ├─ tableId: 12\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [gxlub luevy m22qn]\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: TUPLE(mf.GXLUB:2!null)\n" + - " │ ├─ right-key: TUPLE(bs.id:0!null)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ bs.IXUXU:6\n" + - " │ │ └─ cla.id:7!null\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (110-113)\n" + - " │ │ ├─ tableId: 13\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: THNTS\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ HashIn\n" + - " │ │ ├─ cla.FTQLQ:1!null\n" + - " │ │ └─ TUPLE(SQ1 (longtext))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (114-143)\n" + - " │ ├─ tableId: 14\n" + - " │ └─ Table\n" + - " │ ├─ name: YK2GW\n" + - " │ └─ columns: [id ftqlq]\n" + - " └─ HashLookup\n" + - " ├─ left-key: TUPLE(cld.BDNYB:1!null, cld.M22QN:2!null)\n" + - " ├─ right-key: TUPLE(p4pjz.LWQ6O:3!null, p4pjz.NTOFG:2!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (247-251)\n" + - " ├─ tableId: 33\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN NOT\n" + - " │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:26!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:25!null\n" + - " │ │ └─ mjr3d.QNI57:5!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (210,211)\n" + - " │ ├─ tableId: 24\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:25!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ WHEN NOT\n" + - " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:26!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:25!null\n" + - " │ │ └─ mjr3d.TDEIU:6!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (212,213)\n" + - " │ ├─ tableId: 25\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:25!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5:0!null, mjr3d.BJUF2:1!null, mjr3d.M22QN:2!null, mjr3d.TUV25:3, mjr3d.ESFVY:4!null, mjr3d.QNI57:5!null, mjr3d.TDEIU:6!null, aac.id:7!null, aac.BTXC5:8, aac.FHCYT:9, sn.id:10!null, sn.BRQP2:11!null, sn.FFTBJ:12!null, sn.A7XO2:13, sn.KBO7R:14!null, sn.ECDKM:15, sn.NUMK2:16!null, sn.LETOE:17!null, sn.YKSSU:18, sn.FHCYT:19, CASE WHEN NOT\n" + - " │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:21!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:20!null\n" + - " │ │ └─ mjr3d.QNI57:5!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (210,211)\n" + - " │ ├─ tableId: 24\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:20!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ WHEN NOT\n" + - " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ THEN Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + - " │ └─ Project\n" + - " │ ├─ columns: [ei.M6T2N:21!null]\n" + - " │ └─ Filter\n" + - " │ ├─ Eq\n" + - " │ │ ├─ ei.id:20!null\n" + - " │ │ └─ mjr3d.TDEIU:6!null\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: ei\n" + - " │ ├─ outerVisibility: true\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (212,213)\n" + - " │ ├─ tableId: 25\n" + - " │ └─ Project\n" + - " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + - " │ └─ Window\n" + - " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + - " │ ├─ noxn3.id:20!null\n" + - " │ └─ Table\n" + - " │ ├─ name: NOXN3\n" + - " │ ├─ columns: [id]\n" + - " │ ├─ colSet: (1-10)\n" + - " │ └─ tableId: 1\n" + - " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + - " └─ LeftOuterJoin\n" + - " ├─ Or\n" + - " │ ├─ Or\n" + - " │ │ ├─ Or\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ │ │ │ │ └─ Eq\n" + - " │ │ │ │ │ ├─ sn.id:10!null\n" + - " │ │ │ │ │ └─ mjr3d.QNI57:5!null\n" + - " │ │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ │ │ └─ AND\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + - " │ │ │ │ └─ InSubquery\n" + - " │ │ │ │ ├─ left: sn.id:10!null\n" + - " │ │ │ │ └─ right: Subquery\n" + - " │ │ │ │ ├─ cacheable: false\n" + - " │ │ │ │ ├─ alias-string: select JTEHG.id from NOXN3 as JTEHG where BRQP2 = MJR3D.BJUF2\n" + - " │ │ │ │ └─ Project\n" + - " │ │ │ │ ├─ columns: [jtehg.id:20!null]\n" + - " │ │ │ │ └─ Filter\n" + - " │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ ├─ jtehg.BRQP2:21!null\n" + - " │ │ │ │ │ └─ mjr3d.BJUF2:1!null\n" + - " │ │ │ │ └─ TableAlias(jtehg)\n" + - " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + - " │ │ │ │ ├─ colSet: (180-189)\n" + - " │ │ │ │ ├─ tableId: 21\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: NOXN3\n" + - " │ │ │ │ └─ columns: [id brqp2]\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ │ └─ AND\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ NOT\n" + - " │ │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ │ │ └─ InSubquery\n" + - " │ │ │ ├─ left: sn.id:10!null\n" + - " │ │ │ └─ right: Subquery\n" + - " │ │ │ ├─ cacheable: false\n" + - " │ │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.FJDP5\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [xmafz.id:20!null]\n" + - " │ │ │ └─ Filter\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ xmafz.BRQP2:21!null\n" + - " │ │ │ │ └─ mjr3d.FJDP5:0!null\n" + - " │ │ │ └─ TableAlias(xmafz)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ │ ├─ keys: [mjr3d.FJDP5:0!null]\n" + - " │ │ │ ├─ colSet: (190-199)\n" + - " │ │ │ ├─ tableId: 22\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " │ └─ AND\n" + - " │ ├─ AND\n" + - " │ │ ├─ NOT\n" + - " │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + - " │ │ └─ InSubquery\n" + - " │ │ ├─ left: sn.id:10!null\n" + - " │ │ └─ right: Subquery\n" + - " │ │ ├─ cacheable: false\n" + - " │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.BJUF2\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [xmafz.id:20!null]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ Eq\n" + - " │ │ │ ├─ xmafz.BRQP2:21!null\n" + - " │ │ │ └─ mjr3d.BJUF2:1!null\n" + - " │ │ └─ TableAlias(xmafz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.BRQP2]\n" + - " │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + - " │ │ ├─ colSet: (200-209)\n" + - " │ │ ├─ tableId: 23\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: NOXN3\n" + - " │ │ └─ columns: [id brqp2]\n" + - " │ └─ NOT\n" + - " │ └─ mjr3d.BJUF2:1!null IS NULL\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ ├─ colSet: (160-166)\n" + - " │ │ ├─ tableId: 18\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E:0!null->FJDP5:0, cpmfe.id:10!null->BJUF2:0, ism.M22QN:2!null->M22QN:0, g3yxs.TUV25:7->TUV25:0, g3yxs.ESFVY:6!null->ESFVY:0, yqif4.id:12!null->QNI57:0, yvhjz.id:15!null->TDEIU:0]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ Or\n" + - " │ │ │ ├─ NOT\n" + - " │ │ │ │ └─ yqif4.id:12!null IS NULL\n" + - " │ │ │ └─ NOT\n" + - " │ │ │ └─ yvhjz.id:15!null IS NULL\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ Eq\n" + - " │ │ │ ├─ yvhjz.BRQP2:16!null\n" + - " │ │ │ └─ ism.UJ6XY:1!null\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ Eq\n" + - " │ │ │ │ ├─ yqif4.BRQP2:13!null\n" + - " │ │ │ │ └─ ism.FV24E:0!null\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ └─ Eq\n" + - " │ │ │ │ │ ├─ cpmfe.id:10!null\n" + - " │ │ │ │ │ └─ ism.FV24E:0!null\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ Eq\n" + - " │ │ │ │ │ │ ├─ nhmxw.id:8!null\n" + - " │ │ │ │ │ │ └─ ism.PRUV2:4\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: Eq\n" + - " │ │ │ │ │ │ │ ├─ ism.NZ4MQ:3!null\n" + - " │ │ │ │ │ │ │ └─ g3yxs.id:5!null\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ ├─ colSet: (15-23)\n" + - " │ │ │ │ │ │ │ ├─ tableId: 4\n" + - " │ │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ │ ├─ name: HDDVB\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ NOT\n" + - " │ │ │ │ │ │ │ └─ g3yxs.TUV25:2 IS NULL\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ ├─ colSet: (24-31)\n" + - " │ │ │ │ │ │ ├─ tableId: 5\n" + - " │ │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ │ ├─ name: YYBCX\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: TUPLE(ism.PRUV2:4)\n" + - " │ │ │ │ │ ├─ right-key: TUPLE(nhmxw.id:0!null)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ ├─ columns: [id nohhr]\n" + - " │ │ │ │ │ ├─ colSet: (32-41)\n" + - " │ │ │ │ │ └─ tableId: 6\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ keys: [nhmxw.NOHHR:9!null]\n" + - " │ │ │ │ ├─ colSet: (42-58)\n" + - " │ │ │ │ ├─ tableId: 7\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: E2I7U\n" + - " │ │ │ │ └─ columns: [id zh72s]\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ keys: [ism.UJ6XY:1!null]\n" + - " │ │ │ ├─ colSet: (59-68)\n" + - " │ │ │ ├─ tableId: 8\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ keys: [ism.FV24E:0!null]\n" + - " │ │ ├─ colSet: (69-78)\n" + - " │ │ ├─ tableId: 9\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: NOXN3\n" + - " │ │ └─ columns: [id brqp2 fftbj]\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ ├─ keys: [mjr3d.M22QN:2!null]\n" + - " │ ├─ colSet: (167-169)\n" + - " │ ├─ tableId: 19\n" + - " │ └─ Table\n" + - " │ ├─ name: TPXBU\n" + - " │ └─ columns: [id btxc5 fhcyt]\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id brqp2 fftbj a7xo2 kbo7r ecdkm numk2 letoe ykssu fhcyt]\n" + - " ├─ colSet: (170-179)\n" + - " └─ tableId: 20\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (264-267)\n" + + " ├─ tableId: 35\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ:0!null->T4IBQ:0, p4pjz.M6T2N:3->M6T2N:0, p4pjz.BTXC5:4->BTXC5:0, p4pjz.TUV25:7->TUV25:0]\n" + + " └─ Filter\n" + + " ├─ NOT\n" + + " │ └─ p4pjz.M6T2N:3 IS NULL\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ AND\n" + + " │ ├─ Eq\n" + + " │ │ ├─ p4pjz.LWQ6O:6!null\n" + + " │ │ └─ cld.BDNYB:1!null\n" + + " │ └─ Eq\n" + + " │ ├─ p4pjz.NTOFG:5!null\n" + + " │ └─ cld.M22QN:2!null\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (244-246)\n" + + " │ ├─ tableId: 32\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ:8!null->T4IBQ:0, sn.id:0!null->BDNYB:0, mf.M22QN:4!null->M22QN:0]\n" + + " │ └─ HashJoin\n" + + " │ ├─ Eq\n" + + " │ │ ├─ bs.id:5!null\n" + + " │ │ └─ mf.GXLUB:2!null\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ ├─ columns: [id brqp2]\n" + + " │ │ │ ├─ colSet: (144-153)\n" + + " │ │ │ └─ tableId: 15\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ keys: [sn.BRQP2:1!null]\n" + + " │ │ ├─ colSet: (93-109)\n" + + " │ │ ├─ tableId: 12\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [gxlub luevy m22qn]\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: TUPLE(mf.GXLUB:2!null)\n" + + " │ ├─ right-key: TUPLE(bs.id:0!null)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ bs.IXUXU:6\n" + + " │ │ └─ cla.id:7!null\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (110-113)\n" + + " │ │ ├─ tableId: 13\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: THNTS\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ HashIn\n" + + " │ │ ├─ cla.FTQLQ:1!null\n" + + " │ │ └─ TUPLE(SQ1 (longtext))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ static: [{[NULL, ∞)}]\n" + + " │ ├─ colSet: (114-143)\n" + + " │ ├─ tableId: 14\n" + + " │ └─ Table\n" + + " │ ├─ name: YK2GW\n" + + " │ └─ columns: [id ftqlq]\n" + + " └─ HashLookup\n" + + " ├─ left-key: TUPLE(cld.BDNYB:1!null, cld.M22QN:2!null)\n" + + " ├─ right-key: TUPLE(p4pjz.LWQ6O:3!null, p4pjz.NTOFG:2!null)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (247-251)\n" + + " ├─ tableId: 33\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN NOT\n" + + " │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:26!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:25!null\n" + + " │ │ └─ mjr3d.QNI57:5!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (210,211)\n" + + " │ ├─ tableId: 24\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:25!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ WHEN NOT\n" + + " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:26!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:25!null\n" + + " │ │ └─ mjr3d.TDEIU:6!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (212,213)\n" + + " │ ├─ tableId: 25\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:26!null, (row_number() over ( order by noxn3.id asc):25!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:25!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5:0!null, mjr3d.BJUF2:1!null, mjr3d.M22QN:2!null, mjr3d.TUV25:3, mjr3d.ESFVY:4!null, mjr3d.QNI57:5!null, mjr3d.TDEIU:6!null, aac.id:7!null, aac.BTXC5:8, aac.FHCYT:9, sn.id:10!null, sn.BRQP2:11!null, sn.FFTBJ:12!null, sn.A7XO2:13, sn.KBO7R:14!null, sn.ECDKM:15, sn.NUMK2:16!null, sn.LETOE:17!null, sn.YKSSU:18, sn.FHCYT:19, CASE WHEN NOT\n" + + " │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:21!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:20!null\n" + + " │ │ └─ mjr3d.QNI57:5!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (210,211)\n" + + " │ ├─ tableId: 24\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:20!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ WHEN NOT\n" + + " │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ THEN Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ ├─ alias-string: select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU\n" + + " │ └─ Project\n" + + " │ ├─ columns: [ei.M6T2N:21!null]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ ei.id:20!null\n" + + " │ │ └─ mjr3d.TDEIU:6!null\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: ei\n" + + " │ ├─ outerVisibility: true\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (212,213)\n" + + " │ ├─ tableId: 25\n" + + " │ └─ Project\n" + + " │ ├─ columns: [noxn3.id:21!null, (row_number() over ( order by noxn3.id asc):20!null - 1 (tinyint))->M6T2N:0]\n" + + " │ └─ Window\n" + + " │ ├─ row_number() over ( order by noxn3.id ASC)\n" + + " │ ├─ noxn3.id:20!null\n" + + " │ └─ Table\n" + + " │ ├─ name: NOXN3\n" + + " │ ├─ columns: [id]\n" + + " │ ├─ colSet: (1-10)\n" + + " │ └─ tableId: 1\n" + + " │ END->M6T2N:0, aac.BTXC5:8->BTXC5:0, aac.id:7!null->NTOFG:0, sn.id:10!null->LWQ6O:0, mjr3d.TUV25:3->TUV25:0]\n" + + " └─ LeftOuterJoin\n" + + " ├─ Or\n" + + " │ ├─ Or\n" + + " │ │ ├─ Or\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ │ │ │ │ └─ Eq\n" + + " │ │ │ │ │ ├─ sn.id:10!null\n" + + " │ │ │ │ │ └─ mjr3d.QNI57:5!null\n" + + " │ │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ │ │ └─ AND\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ └─ mjr3d.QNI57:5!null IS NULL\n" + + " │ │ │ │ └─ InSubquery\n" + + " │ │ │ │ ├─ left: sn.id:10!null\n" + + " │ │ │ │ └─ right: Subquery\n" + + " │ │ │ │ ├─ cacheable: false\n" + + " │ │ │ │ ├─ alias-string: select JTEHG.id from NOXN3 as JTEHG where BRQP2 = MJR3D.BJUF2\n" + + " │ │ │ │ └─ Project\n" + + " │ │ │ │ ├─ columns: [jtehg.id:20!null]\n" + + " │ │ │ │ └─ Filter\n" + + " │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ ├─ jtehg.BRQP2:21!null\n" + + " │ │ │ │ │ └─ mjr3d.BJUF2:1!null\n" + + " │ │ │ │ └─ TableAlias(jtehg)\n" + + " │ │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + + " │ │ │ │ ├─ colSet: (180-189)\n" + + " │ │ │ │ ├─ tableId: 21\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: NOXN3\n" + + " │ │ │ │ └─ columns: [id brqp2]\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ │ └─ AND\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ NOT\n" + + " │ │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ │ │ └─ InSubquery\n" + + " │ │ │ ├─ left: sn.id:10!null\n" + + " │ │ │ └─ right: Subquery\n" + + " │ │ │ ├─ cacheable: false\n" + + " │ │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.FJDP5\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [xmafz.id:20!null]\n" + + " │ │ │ └─ Filter\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ xmafz.BRQP2:21!null\n" + + " │ │ │ │ └─ mjr3d.FJDP5:0!null\n" + + " │ │ │ └─ TableAlias(xmafz)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ │ ├─ keys: [mjr3d.FJDP5:0!null]\n" + + " │ │ │ ├─ colSet: (190-199)\n" + + " │ │ │ ├─ tableId: 22\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " │ └─ AND\n" + + " │ ├─ AND\n" + + " │ │ ├─ NOT\n" + + " │ │ │ └─ mjr3d.TDEIU:6!null IS NULL\n" + + " │ │ └─ InSubquery\n" + + " │ │ ├─ left: sn.id:10!null\n" + + " │ │ └─ right: Subquery\n" + + " │ │ ├─ cacheable: false\n" + + " │ │ ├─ alias-string: select XMAFZ.id from NOXN3 as XMAFZ where BRQP2 = MJR3D.BJUF2\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [xmafz.id:20!null]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ Eq\n" + + " │ │ │ ├─ xmafz.BRQP2:21!null\n" + + " │ │ │ └─ mjr3d.BJUF2:1!null\n" + + " │ │ └─ TableAlias(xmafz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.BRQP2]\n" + + " │ │ ├─ keys: [mjr3d.BJUF2:1!null]\n" + + " │ │ ├─ colSet: (200-209)\n" + + " │ │ ├─ tableId: 23\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: NOXN3\n" + + " │ │ └─ columns: [id brqp2]\n" + + " │ └─ NOT\n" + + " │ └─ mjr3d.BJUF2:1!null IS NULL\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ ├─ colSet: (160-166)\n" + + " │ │ ├─ tableId: 18\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E:0!null->FJDP5:0, cpmfe.id:10!null->BJUF2:0, ism.M22QN:2!null->M22QN:0, g3yxs.TUV25:7->TUV25:0, g3yxs.ESFVY:6!null->ESFVY:0, yqif4.id:12!null->QNI57:0, yvhjz.id:15!null->TDEIU:0]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ Or\n" + + " │ │ │ ├─ NOT\n" + + " │ │ │ │ └─ yqif4.id:12!null IS NULL\n" + + " │ │ │ └─ NOT\n" + + " │ │ │ └─ yvhjz.id:15!null IS NULL\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ Eq\n" + + " │ │ │ ├─ yvhjz.BRQP2:16!null\n" + + " │ │ │ └─ ism.UJ6XY:1!null\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ Eq\n" + + " │ │ │ │ ├─ yqif4.BRQP2:13!null\n" + + " │ │ │ │ └─ ism.FV24E:0!null\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ └─ Eq\n" + + " │ │ │ │ │ ├─ cpmfe.id:10!null\n" + + " │ │ │ │ │ └─ ism.FV24E:0!null\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ Eq\n" + + " │ │ │ │ │ │ ├─ nhmxw.id:8!null\n" + + " │ │ │ │ │ │ └─ ism.PRUV2:4\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: Eq\n" + + " │ │ │ │ │ │ │ ├─ ism.NZ4MQ:3!null\n" + + " │ │ │ │ │ │ │ └─ g3yxs.id:5!null\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ ├─ colSet: (15-23)\n" + + " │ │ │ │ │ │ │ ├─ tableId: 4\n" + + " │ │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ │ ├─ name: HDDVB\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ NOT\n" + + " │ │ │ │ │ │ │ └─ g3yxs.TUV25:2 IS NULL\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ ├─ colSet: (24-31)\n" + + " │ │ │ │ │ │ ├─ tableId: 5\n" + + " │ │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ │ ├─ name: YYBCX\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: TUPLE(ism.PRUV2:4)\n" + + " │ │ │ │ │ ├─ right-key: TUPLE(nhmxw.id:0!null)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ ├─ columns: [id nohhr]\n" + + " │ │ │ │ │ ├─ colSet: (32-41)\n" + + " │ │ │ │ │ └─ tableId: 6\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ keys: [nhmxw.NOHHR:9!null]\n" + + " │ │ │ │ ├─ colSet: (42-58)\n" + + " │ │ │ │ ├─ tableId: 7\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: E2I7U\n" + + " │ │ │ │ └─ columns: [id zh72s]\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ keys: [ism.UJ6XY:1!null]\n" + + " │ │ │ ├─ colSet: (59-68)\n" + + " │ │ │ ├─ tableId: 8\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ keys: [ism.FV24E:0!null]\n" + + " │ │ ├─ colSet: (69-78)\n" + + " │ │ ├─ tableId: 9\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: NOXN3\n" + + " │ │ └─ columns: [id brqp2 fftbj]\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ ├─ keys: [mjr3d.M22QN:2!null]\n" + + " │ ├─ colSet: (167-169)\n" + + " │ ├─ tableId: 19\n" + + " │ └─ Table\n" + + " │ ├─ name: TPXBU\n" + + " │ └─ columns: [id btxc5 fhcyt]\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id brqp2 fftbj a7xo2 kbo7r ecdkm numk2 letoe ykssu fhcyt]\n" + + " ├─ colSet: (170-179)\n" + + " └─ tableId: 20\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [fs.T4IBQ as T4IBQ, fs.M6T2N as M6T2N, fs.TUV25 as TUV25, fs.BTXC5 as YEBDJ]\n" + @@ -14182,216 +14236,219 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ columns: [gxlub luevy m22qn]\n" + - " │ │ └─ keys: sn.BRQP2\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ftqlq]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ columns: [gxlub luevy m22qn]\n" + + " │ │ └─ keys: sn.BRQP2\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ftqlq]\n" + " └─ HashLookup\n" + " ├─ left-key: ((fs.T4IBQ, fs.M6T2N, fs.BTXC5, fs.TUV25))\n" + " ├─ right-key: ((zmspr.T4IBQ, zmspr.M6T2N, zmspr.BTXC5, zmspr.TUV25))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + - " └─ Filter\n" + - " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ columns: [gxlub luevy m22qn]\n" + - " │ │ └─ keys: sn.BRQP2\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ftqlq]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + - " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ LeftOuterJoin\n" + - " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [jtehg.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(jtehg)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.FJDP5\n" + - " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + - " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ └─ columns: [id nohhr]\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ columns: [id zh72s]\n" + - " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ │ └─ keys: ism.UJ6XY\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ keys: ism.FV24E\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ └─ keys: mjr3d.M22QN\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " └─ name: NOXN3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + + " └─ Filter\n" + + " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ columns: [gxlub luevy m22qn]\n" + + " │ │ └─ keys: sn.BRQP2\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ftqlq]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + + " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ LeftOuterJoin\n" + + " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [jtehg.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(jtehg)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.FJDP5\n" + + " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + + " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ └─ columns: [id nohhr]\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ columns: [id zh72s]\n" + + " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ │ └─ keys: ism.UJ6XY\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ keys: ism.FV24E\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ └─ keys: mjr3d.M22QN\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " └─ name: NOXN3\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [fs.T4IBQ as T4IBQ, fs.M6T2N as M6T2N, fs.TUV25 as TUV25, fs.BTXC5 as YEBDJ]\n" + @@ -14532,216 +14589,219 @@ WHERE " │ └─ HashLookup\n" + " │ ├─ left-key: ()\n" + " │ ├─ right-key: ()\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: rsa3y\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Distinct\n" + - " │ └─ Project\n" + - " │ ├─ columns: [htkbs.T4IBQ]\n" + - " │ └─ SubqueryAlias\n" + - " │ ├─ name: htkbs\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ columns: [gxlub luevy m22qn]\n" + - " │ │ └─ keys: sn.BRQP2\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ftqlq]\n" + + " │ └─ CachedResults\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: rsa3y\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Distinct\n" + + " │ └─ Project\n" + + " │ ├─ columns: [htkbs.T4IBQ]\n" + + " │ └─ SubqueryAlias\n" + + " │ ├─ name: htkbs\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ columns: [gxlub luevy m22qn]\n" + + " │ │ └─ keys: sn.BRQP2\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ftqlq]\n" + " └─ HashLookup\n" + " ├─ left-key: ((fs.T4IBQ, fs.M6T2N, fs.BTXC5, fs.TUV25))\n" + " ├─ right-key: ((zmspr.T4IBQ, zmspr.M6T2N, zmspr.BTXC5, zmspr.TUV25))\n" + - " └─ SubqueryAlias\n" + - " ├─ name: zmspr\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Distinct\n" + - " └─ Project\n" + - " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + - " └─ Filter\n" + - " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: cld\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + - " │ └─ HashJoin\n" + - " │ ├─ (bs.id = mf.GXLUB)\n" + - " │ ├─ LookupJoin\n" + - " │ │ ├─ TableAlias(sn)\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: NOXN3\n" + - " │ │ │ └─ columns: [id brqp2]\n" + - " │ │ └─ TableAlias(mf)\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.LUEVY]\n" + - " │ │ ├─ columns: [gxlub luevy m22qn]\n" + - " │ │ └─ keys: sn.BRQP2\n" + - " │ └─ HashLookup\n" + - " │ ├─ left-key: (mf.GXLUB)\n" + - " │ ├─ right-key: (bs.id)\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.IXUXU]\n" + - " │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ columns: [id ixuxu]\n" + - " │ └─ Filter\n" + - " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + - " │ └─ TableAlias(cla)\n" + - " │ └─ IndexedTableAccess(YK2GW)\n" + - " │ ├─ index: [YK2GW.id]\n" + - " │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ └─ columns: [id ftqlq]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + - " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: p4pjz\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ Project\n" + - " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + - " └─ LeftOuterJoin\n" + - " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [jtehg.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(jtehg)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.FJDP5\n" + - " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + - " │ ├─ left: sn.id\n" + - " │ └─ right: Subquery\n" + - " │ ├─ cacheable: false\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xmafz.id]\n" + - " │ └─ Filter\n" + - " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + - " │ └─ TableAlias(xmafz)\n" + - " │ └─ IndexedTableAccess(NOXN3)\n" + - " │ ├─ index: [NOXN3.BRQP2]\n" + - " │ ├─ columns: [id brqp2]\n" + - " │ └─ keys: mjr3d.BJUF2\n" + - " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + - " ├─ LookupJoin\n" + - " │ ├─ SubqueryAlias\n" + - " │ │ ├─ name: mjr3d\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Distinct\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + - " │ │ └─ LeftOuterLookupJoin\n" + - " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + - " │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + - " │ │ │ ├─ LeftOuterLookupJoin\n" + - " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + - " │ │ │ │ ├─ LeftOuterHashJoin\n" + - " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + - " │ │ │ │ │ ├─ MergeJoin\n" + - " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + - " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + - " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + - " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + - " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + - " │ │ │ │ │ │ └─ Filter\n" + - " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + - " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + - " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + - " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + - " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + - " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + - " │ │ │ │ │ └─ HashLookup\n" + - " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + - " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + - " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + - " │ │ │ │ │ └─ Table\n" + - " │ │ │ │ │ ├─ name: WGSDC\n" + - " │ │ │ │ │ └─ columns: [id nohhr]\n" + - " │ │ │ │ └─ TableAlias(cpmfe)\n" + - " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + - " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + - " │ │ │ │ ├─ columns: [id zh72s]\n" + - " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + - " │ │ │ └─ TableAlias(yqif4)\n" + - " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ │ └─ keys: ism.UJ6XY\n" + - " │ │ └─ TableAlias(yvhjz)\n" + - " │ │ └─ IndexedTableAccess(NOXN3)\n" + - " │ │ ├─ index: [NOXN3.FFTBJ]\n" + - " │ │ ├─ columns: [id brqp2 fftbj]\n" + - " │ │ └─ keys: ism.FV24E\n" + - " │ └─ TableAlias(aac)\n" + - " │ └─ IndexedTableAccess(TPXBU)\n" + - " │ ├─ index: [TPXBU.id]\n" + - " │ └─ keys: mjr3d.M22QN\n" + - " └─ TableAlias(sn)\n" + - " └─ Table\n" + - " └─ name: NOXN3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: zmspr\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [cld.T4IBQ as T4IBQ, p4pjz.M6T2N as M6T2N, p4pjz.BTXC5 as BTXC5, p4pjz.TUV25 as TUV25]\n" + + " └─ Filter\n" + + " ├─ (NOT(p4pjz.M6T2N IS NULL))\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ ((p4pjz.LWQ6O = cld.BDNYB) AND (p4pjz.NTOFG = cld.M22QN))\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: cld\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [cla.FTQLQ as T4IBQ, sn.id as BDNYB, mf.M22QN as M22QN]\n" + + " │ └─ HashJoin\n" + + " │ ├─ (bs.id = mf.GXLUB)\n" + + " │ ├─ LookupJoin\n" + + " │ │ ├─ TableAlias(sn)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: NOXN3\n" + + " │ │ │ └─ columns: [id brqp2]\n" + + " │ │ └─ TableAlias(mf)\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.LUEVY]\n" + + " │ │ ├─ columns: [gxlub luevy m22qn]\n" + + " │ │ └─ keys: sn.BRQP2\n" + + " │ └─ HashLookup\n" + + " │ ├─ left-key: (mf.GXLUB)\n" + + " │ ├─ right-key: (bs.id)\n" + + " │ └─ MergeJoin\n" + + " │ ├─ cmp: (bs.IXUXU = cla.id)\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ IndexedTableAccess(THNTS)\n" + + " │ │ ├─ index: [THNTS.IXUXU]\n" + + " │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ columns: [id ixuxu]\n" + + " │ └─ Filter\n" + + " │ ├─ (cla.FTQLQ HASH IN ('SQ1'))\n" + + " │ └─ TableAlias(cla)\n" + + " │ └─ IndexedTableAccess(YK2GW)\n" + + " │ ├─ index: [YK2GW.id]\n" + + " │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ └─ columns: [id ftqlq]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (cld.BDNYB, cld.M22QN)\n" + + " ├─ right-key: (p4pjz.LWQ6O, p4pjz.NTOFG)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: p4pjz\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ Project\n" + + " ├─ columns: [mjr3d.FJDP5, mjr3d.BJUF2, mjr3d.M22QN, mjr3d.TUV25, mjr3d.ESFVY, mjr3d.QNI57, mjr3d.TDEIU, aac.id, aac.BTXC5, aac.FHCYT, sn.id, sn.BRQP2, sn.FFTBJ, sn.A7XO2, sn.KBO7R, sn.ECDKM, sn.NUMK2, sn.LETOE, sn.YKSSU, sn.FHCYT, CASE WHEN (NOT(mjr3d.QNI57 IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.QNI57) WHEN (NOT(mjr3d.TDEIU IS NULL)) THEN Subquery(select ei.M6T2N from FZFVD as ei where ei.id = MJR3D.TDEIU) END as M6T2N, aac.BTXC5 as BTXC5, aac.id as NTOFG, sn.id as LWQ6O, mjr3d.TUV25 as TUV25]\n" + + " └─ LeftOuterJoin\n" + + " ├─ ((((((NOT(mjr3d.QNI57 IS NULL)) AND (sn.id = mjr3d.QNI57)) AND mjr3d.BJUF2 IS NULL) OR (((NOT(mjr3d.QNI57 IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [jtehg.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (jtehg.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(jtehg)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL)))) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.FJDP5)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.FJDP5\n" + + " │ ) AND mjr3d.BJUF2 IS NULL)) OR (((NOT(mjr3d.TDEIU IS NULL)) AND InSubquery\n" + + " │ ├─ left: sn.id\n" + + " │ └─ right: Subquery\n" + + " │ ├─ cacheable: false\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xmafz.id]\n" + + " │ └─ Filter\n" + + " │ ├─ (xmafz.BRQP2 = mjr3d.BJUF2)\n" + + " │ └─ TableAlias(xmafz)\n" + + " │ └─ IndexedTableAccess(NOXN3)\n" + + " │ ├─ index: [NOXN3.BRQP2]\n" + + " │ ├─ columns: [id brqp2]\n" + + " │ └─ keys: mjr3d.BJUF2\n" + + " │ ) AND (NOT(mjr3d.BJUF2 IS NULL))))\n" + + " ├─ LookupJoin\n" + + " │ ├─ SubqueryAlias\n" + + " │ │ ├─ name: mjr3d\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [ism.FV24E as FJDP5, cpmfe.id as BJUF2, ism.M22QN as M22QN, g3yxs.TUV25 as TUV25, g3yxs.ESFVY as ESFVY, yqif4.id as QNI57, yvhjz.id as TDEIU]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((NOT(yqif4.id IS NULL)) OR (NOT(yvhjz.id IS NULL)))\n" + + " │ │ └─ LeftOuterLookupJoin\n" + + " │ │ ├─ (yvhjz.BRQP2 = ism.UJ6XY)\n" + + " │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ ├─ (yqif4.BRQP2 = ism.FV24E)\n" + + " │ │ │ ├─ LeftOuterLookupJoin\n" + + " │ │ │ │ ├─ (NOT((cpmfe.id = ism.FV24E)))\n" + + " │ │ │ │ ├─ LeftOuterHashJoin\n" + + " │ │ │ │ │ ├─ (nhmxw.id = ism.PRUV2)\n" + + " │ │ │ │ │ ├─ MergeJoin\n" + + " │ │ │ │ │ │ ├─ cmp: (ism.NZ4MQ = g3yxs.id)\n" + + " │ │ │ │ │ │ ├─ TableAlias(ism)\n" + + " │ │ │ │ │ │ │ └─ IndexedTableAccess(HDDVB)\n" + + " │ │ │ │ │ │ │ ├─ index: [HDDVB.NZ4MQ]\n" + + " │ │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ │ └─ columns: [fv24e uj6xy m22qn nz4mq pruv2]\n" + + " │ │ │ │ │ │ └─ Filter\n" + + " │ │ │ │ │ │ ├─ (NOT(g3yxs.TUV25 IS NULL))\n" + + " │ │ │ │ │ │ └─ TableAlias(g3yxs)\n" + + " │ │ │ │ │ │ └─ IndexedTableAccess(YYBCX)\n" + + " │ │ │ │ │ │ ├─ index: [YYBCX.id]\n" + + " │ │ │ │ │ │ ├─ filters: [{[NULL, ∞)}]\n" + + " │ │ │ │ │ │ └─ columns: [id esfvy tuv25]\n" + + " │ │ │ │ │ └─ HashLookup\n" + + " │ │ │ │ │ ├─ left-key: (ism.PRUV2)\n" + + " │ │ │ │ │ ├─ right-key: (nhmxw.id)\n" + + " │ │ │ │ │ └─ TableAlias(nhmxw)\n" + + " │ │ │ │ │ └─ Table\n" + + " │ │ │ │ │ ├─ name: WGSDC\n" + + " │ │ │ │ │ └─ columns: [id nohhr]\n" + + " │ │ │ │ └─ TableAlias(cpmfe)\n" + + " │ │ │ │ └─ IndexedTableAccess(E2I7U)\n" + + " │ │ │ │ ├─ index: [E2I7U.ZH72S]\n" + + " │ │ │ │ ├─ columns: [id zh72s]\n" + + " │ │ │ │ └─ keys: nhmxw.NOHHR\n" + + " │ │ │ └─ TableAlias(yqif4)\n" + + " │ │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ │ └─ keys: ism.UJ6XY\n" + + " │ │ └─ TableAlias(yvhjz)\n" + + " │ │ └─ IndexedTableAccess(NOXN3)\n" + + " │ │ ├─ index: [NOXN3.FFTBJ]\n" + + " │ │ ├─ columns: [id brqp2 fftbj]\n" + + " │ │ └─ keys: ism.FV24E\n" + + " │ └─ TableAlias(aac)\n" + + " │ └─ IndexedTableAccess(TPXBU)\n" + + " │ ├─ index: [TPXBU.id]\n" + + " │ └─ keys: mjr3d.M22QN\n" + + " └─ TableAlias(sn)\n" + + " └─ Table\n" + + " └─ name: NOXN3\n" + "", }, { @@ -14908,23 +14968,24 @@ ORDER BY Y46B2 ASC`, " └─ HashLookup\n" + " ├─ left-key: TUPLE(xj2rd.HHVLX:1!null)\n" + " ├─ right-key: TUPLE(tusay.XLFIA:1!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (26,27)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc):0!null->Y3IOU:0, noxn3.id:1!null->XLFIA:0]\n" + - " └─ Window\n" + - " ├─ row_number() over ( order by noxn3.id ASC)\n" + - " ├─ noxn3.id:0!null\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " ├─ columns: [id]\n" + - " ├─ colSet: (13-22)\n" + - " └─ tableId: 3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (26,27)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc):0!null->Y3IOU:0, noxn3.id:1!null->XLFIA:0]\n" + + " └─ Window\n" + + " ├─ row_number() over ( order by noxn3.id ASC)\n" + + " ├─ noxn3.id:0!null\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " ├─ columns: [id]\n" + + " ├─ colSet: (13-22)\n" + + " └─ tableId: 3\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [tusay.Y3IOU as Q7H3X]\n" + @@ -14944,17 +15005,18 @@ ORDER BY Y46B2 ASC`, " └─ HashLookup\n" + " ├─ left-key: (xj2rd.HHVLX)\n" + " ├─ right-key: (tusay.XLFIA)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [tusay.Y3IOU as Q7H3X]\n" + @@ -14974,17 +15036,18 @@ ORDER BY Y46B2 ASC`, " └─ HashLookup\n" + " ├─ left-key: (xj2rd.HHVLX)\n" + " ├─ right-key: (tusay.XLFIA)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: tusay\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + - " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + - " └─ Table\n" + - " ├─ name: NOXN3\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: tusay\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by noxn3.id asc) as Y3IOU, noxn3.id as XLFIA]\n" + + " └─ Window(row_number() over ( order by noxn3.id ASC), noxn3.id)\n" + + " └─ Table\n" + + " ├─ name: NOXN3\n" + + " └─ columns: [id]\n" + "", }, { @@ -15047,53 +15110,55 @@ ORDER BY sn.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: TUPLE(sn.BRQP2:1!null)\n" + " ├─ right-key: TUPLE(i2gj5.LUEVY:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: i2gj5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (42,43)\n" + - " ├─ tableId: 7\n" + - " └─ Project\n" + - " ├─ columns: [nd.LUEVY:0!null, CASE WHEN Eq\n" + - " │ ├─ nma.DZLIM:3!null\n" + - " │ └─ Q5I4E (longtext)\n" + - " │ THEN 1 (tinyint) ELSE 0 (tinyint) END->R2SR7:0]\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ Eq\n" + - " │ ├─ nd.HPCMS:1!null\n" + - " │ └─ nma.MLECF:2!null\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: nd\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (33,34)\n" + - " │ ├─ tableId: 4\n" + - " │ └─ Project\n" + - " │ ├─ columns: [e2i7u.id:0!null->LUEVY:0, e2i7u.HPCMS:1!null->HPCMS:0]\n" + - " │ └─ Table\n" + - " │ ├─ name: E2I7U\n" + - " │ ├─ columns: [id hpcms]\n" + - " │ ├─ colSet: (14-30)\n" + - " │ └─ tableId: 3\n" + - " └─ HashLookup\n" + - " ├─ left-key: TUPLE(nd.HPCMS:1!null)\n" + - " ├─ right-key: TUPLE(nma.MLECF:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: nma\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (39,40)\n" + - " ├─ tableId: 6\n" + - " └─ Project\n" + - " ├─ columns: [tnmxi.id:0!null->MLECF:0, tnmxi.DZLIM:1!null]\n" + - " └─ Table\n" + - " ├─ name: TNMXI\n" + - " ├─ columns: [id dzlim]\n" + - " ├─ colSet: (35-37)\n" + - " └─ tableId: 5\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: i2gj5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (42,43)\n" + + " ├─ tableId: 7\n" + + " └─ Project\n" + + " ├─ columns: [nd.LUEVY:0!null, CASE WHEN Eq\n" + + " │ ├─ nma.DZLIM:3!null\n" + + " │ └─ Q5I4E (longtext)\n" + + " │ THEN 1 (tinyint) ELSE 0 (tinyint) END->R2SR7:0]\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ Eq\n" + + " │ ├─ nd.HPCMS:1!null\n" + + " │ └─ nma.MLECF:2!null\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: nd\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (33,34)\n" + + " │ ├─ tableId: 4\n" + + " │ └─ Project\n" + + " │ ├─ columns: [e2i7u.id:0!null->LUEVY:0, e2i7u.HPCMS:1!null->HPCMS:0]\n" + + " │ └─ Table\n" + + " │ ├─ name: E2I7U\n" + + " │ ├─ columns: [id hpcms]\n" + + " │ ├─ colSet: (14-30)\n" + + " │ └─ tableId: 3\n" + + " └─ HashLookup\n" + + " ├─ left-key: TUPLE(nd.HPCMS:1!null)\n" + + " ├─ right-key: TUPLE(nma.MLECF:0!null)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: nma\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (39,40)\n" + + " ├─ tableId: 6\n" + + " └─ Project\n" + + " ├─ columns: [tnmxi.id:0!null->MLECF:0, tnmxi.DZLIM:1!null]\n" + + " └─ Table\n" + + " ├─ name: TNMXI\n" + + " ├─ columns: [id dzlim]\n" + + " ├─ colSet: (35-37)\n" + + " └─ tableId: 5\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [i2gj5.R2SR7]\n" + @@ -15114,38 +15179,40 @@ ORDER BY sn.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: (sn.BRQP2)\n" + " ├─ right-key: (i2gj5.LUEVY)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: i2gj5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [nd.LUEVY, CASE WHEN (nma.DZLIM = 'Q5I4E') THEN 1 ELSE 0 END as R2SR7]\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ (nd.HPCMS = nma.MLECF)\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: nd\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [e2i7u.id as LUEVY, e2i7u.HPCMS as HPCMS]\n" + - " │ └─ Table\n" + - " │ ├─ name: E2I7U\n" + - " │ └─ columns: [id hpcms]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (nd.HPCMS)\n" + - " ├─ right-key: (nma.MLECF)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: nma\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [tnmxi.id as MLECF, tnmxi.DZLIM]\n" + - " └─ Table\n" + - " ├─ name: TNMXI\n" + - " └─ columns: [id dzlim]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: i2gj5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [nd.LUEVY, CASE WHEN (nma.DZLIM = 'Q5I4E') THEN 1 ELSE 0 END as R2SR7]\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ (nd.HPCMS = nma.MLECF)\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: nd\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [e2i7u.id as LUEVY, e2i7u.HPCMS as HPCMS]\n" + + " │ └─ Table\n" + + " │ ├─ name: E2I7U\n" + + " │ └─ columns: [id hpcms]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (nd.HPCMS)\n" + + " ├─ right-key: (nma.MLECF)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: nma\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [tnmxi.id as MLECF, tnmxi.DZLIM]\n" + + " └─ Table\n" + + " ├─ name: TNMXI\n" + + " └─ columns: [id dzlim]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [i2gj5.R2SR7]\n" + @@ -15166,38 +15233,40 @@ ORDER BY sn.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: (sn.BRQP2)\n" + " ├─ right-key: (i2gj5.LUEVY)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: i2gj5\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [nd.LUEVY, CASE WHEN (nma.DZLIM = 'Q5I4E') THEN 1 ELSE 0 END as R2SR7]\n" + - " └─ LeftOuterHashJoin\n" + - " ├─ (nd.HPCMS = nma.MLECF)\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: nd\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: false\n" + - " │ ├─ cacheable: true\n" + - " │ └─ Project\n" + - " │ ├─ columns: [e2i7u.id as LUEVY, e2i7u.HPCMS as HPCMS]\n" + - " │ └─ Table\n" + - " │ ├─ name: E2I7U\n" + - " │ └─ columns: [id hpcms]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (nd.HPCMS)\n" + - " ├─ right-key: (nma.MLECF)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: nma\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [tnmxi.id as MLECF, tnmxi.DZLIM]\n" + - " └─ Table\n" + - " ├─ name: TNMXI\n" + - " └─ columns: [id dzlim]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: i2gj5\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [nd.LUEVY, CASE WHEN (nma.DZLIM = 'Q5I4E') THEN 1 ELSE 0 END as R2SR7]\n" + + " └─ LeftOuterHashJoin\n" + + " ├─ (nd.HPCMS = nma.MLECF)\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: nd\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: false\n" + + " │ ├─ cacheable: true\n" + + " │ └─ Project\n" + + " │ ├─ columns: [e2i7u.id as LUEVY, e2i7u.HPCMS as HPCMS]\n" + + " │ └─ Table\n" + + " │ ├─ name: E2I7U\n" + + " │ └─ columns: [id hpcms]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (nd.HPCMS)\n" + + " ├─ right-key: (nma.MLECF)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: nma\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [tnmxi.id as MLECF, tnmxi.DZLIM]\n" + + " └─ Table\n" + + " ├─ name: TNMXI\n" + + " └─ columns: [id dzlim]\n" + "", }, { @@ -15242,23 +15311,24 @@ ORDER BY GRRB6.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: TUPLE(grrb6.AHMDT:1!null)\n" + " ├─ right-key: TUPLE(qi2ie.VIBZI:1!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: qi2ie\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (35,36)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by e2i7u.id asc):0!null->DICQO:0, e2i7u.id:1!null->VIBZI:0]\n" + - " └─ Window\n" + - " ├─ row_number() over ( order by e2i7u.id ASC)\n" + - " ├─ e2i7u.id:0!null\n" + - " └─ Table\n" + - " ├─ name: E2I7U\n" + - " ├─ columns: [id]\n" + - " ├─ colSet: (15-31)\n" + - " └─ tableId: 3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: qi2ie\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (35,36)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by e2i7u.id asc):0!null->DICQO:0, e2i7u.id:1!null->VIBZI:0]\n" + + " └─ Window\n" + + " ├─ row_number() over ( order by e2i7u.id ASC)\n" + + " ├─ e2i7u.id:0!null\n" + + " └─ Table\n" + + " ├─ name: E2I7U\n" + + " ├─ columns: [id]\n" + + " ├─ colSet: (15-31)\n" + + " └─ tableId: 3\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [qi2ie.DICQO as DICQO]\n" + @@ -15278,17 +15348,18 @@ ORDER BY GRRB6.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: (grrb6.AHMDT)\n" + " ├─ right-key: (qi2ie.VIBZI)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: qi2ie\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by e2i7u.id asc) as DICQO, e2i7u.id as VIBZI]\n" + - " └─ Window(row_number() over ( order by e2i7u.id ASC), e2i7u.id)\n" + - " └─ Table\n" + - " ├─ name: E2I7U\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: qi2ie\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by e2i7u.id asc) as DICQO, e2i7u.id as VIBZI]\n" + + " └─ Window(row_number() over ( order by e2i7u.id ASC), e2i7u.id)\n" + + " └─ Table\n" + + " ├─ name: E2I7U\n" + + " └─ columns: [id]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [qi2ie.DICQO as DICQO]\n" + @@ -15308,17 +15379,18 @@ ORDER BY GRRB6.XLFIA ASC`, " └─ HashLookup\n" + " ├─ left-key: (grrb6.AHMDT)\n" + " ├─ right-key: (qi2ie.VIBZI)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: qi2ie\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [row_number() over ( order by e2i7u.id asc) as DICQO, e2i7u.id as VIBZI]\n" + - " └─ Window(row_number() over ( order by e2i7u.id ASC), e2i7u.id)\n" + - " └─ Table\n" + - " ├─ name: E2I7U\n" + - " └─ columns: [id]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: qi2ie\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [row_number() over ( order by e2i7u.id asc) as DICQO, e2i7u.id as VIBZI]\n" + + " └─ Window(row_number() over ( order by e2i7u.id ASC), e2i7u.id)\n" + + " └─ Table\n" + + " ├─ name: E2I7U\n" + + " └─ columns: [id]\n" + "", }, { @@ -19002,34 +19074,35 @@ INNER JOIN D34QP vc ON C6PUD.AZ6SP LIKE CONCAT(CONCAT('%', vc.TWMSR), '%')`, " │ └─ Table\n" + " │ ├─ name: D34QP\n" + " │ └─ columns: [id twmsr]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: c6pud\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (48,49)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [mf.id:2!null->id:0, umf.AZ6SP:1->AZ6SP:0]\n" + - " └─ InnerJoin\n" + - " ├─ Eq\n" + - " │ ├─ umf.id:0!null\n" + - " │ └─ mf.TEUJA:3\n" + - " ├─ TableAlias(umf)\n" + - " │ └─ IndexedTableAccess(NZKPM)\n" + - " │ ├─ index: [NZKPM.id]\n" + - " │ ├─ static: [{[1, 1]}, {[2, 2]}, {[3, 3]}]\n" + - " │ ├─ colSet: (21-45)\n" + - " │ ├─ tableId: 3\n" + - " │ └─ Table\n" + - " │ ├─ name: NZKPM\n" + - " │ └─ columns: [id az6sp]\n" + - " └─ TableAlias(mf)\n" + - " └─ Table\n" + - " ├─ name: HGMQ6\n" + - " ├─ columns: [id teuja]\n" + - " ├─ colSet: (4-20)\n" + - " └─ tableId: 2\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: c6pud\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (48,49)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [mf.id:2!null->id:0, umf.AZ6SP:1->AZ6SP:0]\n" + + " └─ InnerJoin\n" + + " ├─ Eq\n" + + " │ ├─ umf.id:0!null\n" + + " │ └─ mf.TEUJA:3\n" + + " ├─ TableAlias(umf)\n" + + " │ └─ IndexedTableAccess(NZKPM)\n" + + " │ ├─ index: [NZKPM.id]\n" + + " │ ├─ static: [{[1, 1]}, {[2, 2]}, {[3, 3]}]\n" + + " │ ├─ colSet: (21-45)\n" + + " │ ├─ tableId: 3\n" + + " │ └─ Table\n" + + " │ ├─ name: NZKPM\n" + + " │ └─ columns: [id az6sp]\n" + + " └─ TableAlias(mf)\n" + + " └─ Table\n" + + " ├─ name: HGMQ6\n" + + " ├─ columns: [id teuja]\n" + + " ├─ colSet: (4-20)\n" + + " └─ tableId: 2\n" + "", }, { diff --git a/enginetest/queries/query_plans.go b/enginetest/queries/query_plans.go index e4d03fe830..91a8840db8 100644 --- a/enginetest/queries/query_plans.go +++ b/enginetest/queries/query_plans.go @@ -3882,53 +3882,55 @@ Select * from ( " ├─ right-key: TUPLE(cte1.u:0!null)\n" + " └─ Project\n" + " ├─ columns: [cte1.u:0!null]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte1\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (15,16)\n" + - " ├─ tableId: 7\n" + - " └─ Project\n" + - " ├─ columns: [cte2.u:1!null, cte2.v:2]\n" + - " └─ HashJoin\n" + - " ├─ Eq\n" + - " │ ├─ cte2.u:1!null\n" + - " │ └─ ab.b:0\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ ├─ columns: [b]\n" + - " │ ├─ colSet: (9,10)\n" + - " │ └─ tableId: 5\n" + - " └─ HashLookup\n" + - " ├─ left-key: TUPLE(ab.b:0)\n" + - " ├─ right-key: TUPLE(cte2.u:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [uv.u:1!null, uv.v:2]\n" + - " └─ InnerJoin\n" + - " ├─ Eq\n" + - " │ ├─ uv.u:1!null\n" + - " │ └─ ab.b:0\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ ├─ columns: [b]\n" + - " │ ├─ colSet: (3,4)\n" + - " │ └─ tableId: 2\n" + - " └─ IndexedTableAccess(uv)\n" + - " ├─ index: [uv.u]\n" + - " ├─ static: [{[2, 2]}, {[3, 3]}]\n" + - " ├─ colSet: (1,2)\n" + - " ├─ tableId: 1\n" + - " └─ Table\n" + - " ├─ name: uv\n" + - " └─ columns: [u v]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte1\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (15,16)\n" + + " ├─ tableId: 7\n" + + " └─ Project\n" + + " ├─ columns: [cte2.u:1!null, cte2.v:2]\n" + + " └─ HashJoin\n" + + " ├─ Eq\n" + + " │ ├─ cte2.u:1!null\n" + + " │ └─ ab.b:0\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ ├─ columns: [b]\n" + + " │ ├─ colSet: (9,10)\n" + + " │ └─ tableId: 5\n" + + " └─ HashLookup\n" + + " ├─ left-key: TUPLE(ab.b:0)\n" + + " ├─ right-key: TUPLE(cte2.u:0!null)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte2\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [uv.u:1!null, uv.v:2]\n" + + " └─ InnerJoin\n" + + " ├─ Eq\n" + + " │ ├─ uv.u:1!null\n" + + " │ └─ ab.b:0\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ ├─ columns: [b]\n" + + " │ ├─ colSet: (3,4)\n" + + " │ └─ tableId: 2\n" + + " └─ IndexedTableAccess(uv)\n" + + " ├─ index: [uv.u]\n" + + " ├─ static: [{[2, 2]}, {[3, 3]}]\n" + + " ├─ colSet: (1,2)\n" + + " ├─ tableId: 1\n" + + " └─ Table\n" + + " ├─ name: uv\n" + + " └─ columns: [u v]\n" + "", ExpectedEstimates: "Sort(xy.x ASC)\n" + " └─ Project\n" + @@ -3944,37 +3946,39 @@ Select * from ( " ├─ right-key: (cte1.u)\n" + " └─ Project\n" + " ├─ columns: [cte1.u]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte1\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [cte2.u, cte2.v]\n" + - " └─ HashJoin\n" + - " ├─ (cte2.u = ab.b)\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ └─ columns: [b]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (ab.b)\n" + - " ├─ right-key: (cte2.u)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [uv.u, uv.v]\n" + - " └─ InnerJoin\n" + - " ├─ (uv.u = ab.b)\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ └─ columns: [b]\n" + - " └─ IndexedTableAccess(uv)\n" + - " ├─ index: [uv.u]\n" + - " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + - " └─ columns: [u v]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte1\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [cte2.u, cte2.v]\n" + + " └─ HashJoin\n" + + " ├─ (cte2.u = ab.b)\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ └─ columns: [b]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (ab.b)\n" + + " ├─ right-key: (cte2.u)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte2\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [uv.u, uv.v]\n" + + " └─ InnerJoin\n" + + " ├─ (uv.u = ab.b)\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ └─ columns: [b]\n" + + " └─ IndexedTableAccess(uv)\n" + + " ├─ index: [uv.u]\n" + + " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + + " └─ columns: [u v]\n" + "", ExpectedAnalysis: "Sort(xy.x ASC)\n" + " └─ Project\n" + @@ -3990,37 +3994,39 @@ Select * from ( " ├─ right-key: (cte1.u)\n" + " └─ Project\n" + " ├─ columns: [cte1.u]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte1\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [cte2.u, cte2.v]\n" + - " └─ HashJoin\n" + - " ├─ (cte2.u = ab.b)\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ └─ columns: [b]\n" + - " └─ HashLookup\n" + - " ├─ left-key: (ab.b)\n" + - " ├─ right-key: (cte2.u)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: cte2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [uv.u, uv.v]\n" + - " └─ InnerJoin\n" + - " ├─ (uv.u = ab.b)\n" + - " ├─ Table\n" + - " │ ├─ name: ab\n" + - " │ └─ columns: [b]\n" + - " └─ IndexedTableAccess(uv)\n" + - " ├─ index: [uv.u]\n" + - " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + - " └─ columns: [u v]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte1\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [cte2.u, cte2.v]\n" + + " └─ HashJoin\n" + + " ├─ (cte2.u = ab.b)\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ └─ columns: [b]\n" + + " └─ HashLookup\n" + + " ├─ left-key: (ab.b)\n" + + " ├─ right-key: (cte2.u)\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte2\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [uv.u, uv.v]\n" + + " └─ InnerJoin\n" + + " ├─ (uv.u = ab.b)\n" + + " ├─ Table\n" + + " │ ├─ name: ab\n" + + " │ └─ columns: [b]\n" + + " └─ IndexedTableAccess(uv)\n" + + " ├─ index: [uv.u]\n" + + " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + + " └─ columns: [u v]\n" + "", }, { @@ -4185,29 +4191,30 @@ Select * from ( " └─ HashLookup\n" + " ├─ left-key: TUPLE(av.v:1)\n" + " ├─ right-key: TUPLE(xq.x:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: xq\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (11,12)\n" + - " ├─ tableId: 6\n" + - " └─ Project\n" + - " ├─ columns: [xy.x:2!null, pq.q:1]\n" + - " └─ LookupJoin\n" + - " ├─ Table\n" + - " │ ├─ name: pq\n" + - " │ ├─ columns: [p q]\n" + - " │ ├─ colSet: (9,10)\n" + - " │ └─ tableId: 5\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ keys: [pq.p:0!null]\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 4\n" + - " └─ Table\n" + - " ├─ name: xy\n" + - " └─ columns: [x]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: xq\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (11,12)\n" + + " ├─ tableId: 6\n" + + " └─ Project\n" + + " ├─ columns: [xy.x:2!null, pq.q:1]\n" + + " └─ LookupJoin\n" + + " ├─ Table\n" + + " │ ├─ name: pq\n" + + " │ ├─ columns: [p q]\n" + + " │ ├─ colSet: (9,10)\n" + + " │ └─ tableId: 5\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ keys: [pq.p:0!null]\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 4\n" + + " └─ Table\n" + + " ├─ name: xy\n" + + " └─ columns: [x]\n" + "", ExpectedEstimates: "HashJoin (estimated cost=402.250 rows=125)\n" + " ├─ (av.v = xq.x)\n" + @@ -4229,21 +4236,22 @@ Select * from ( " └─ HashLookup\n" + " ├─ left-key: (av.v)\n" + " ├─ right-key: (xq.x)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: xq\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [xy.x, pq.q]\n" + - " └─ LookupJoin\n" + - " ├─ Table\n" + - " │ ├─ name: pq\n" + - " │ └─ columns: [p q]\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ columns: [x]\n" + - " └─ keys: pq.p\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: xq\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [xy.x, pq.q]\n" + + " └─ LookupJoin\n" + + " ├─ Table\n" + + " │ ├─ name: pq\n" + + " │ └─ columns: [p q]\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x]\n" + + " └─ keys: pq.p\n" + "", ExpectedAnalysis: "HashJoin (estimated cost=402.250 rows=125) (actual rows=4 loops=1)\n" + " ├─ (av.v = xq.x)\n" + @@ -4265,21 +4273,22 @@ Select * from ( " └─ HashLookup\n" + " ├─ left-key: (av.v)\n" + " ├─ right-key: (xq.x)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: xq\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [xy.x, pq.q]\n" + - " └─ LookupJoin\n" + - " ├─ Table\n" + - " │ ├─ name: pq\n" + - " │ └─ columns: [p q]\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ columns: [x]\n" + - " └─ keys: pq.p\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: xq\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [xy.x, pq.q]\n" + + " └─ LookupJoin\n" + + " ├─ Table\n" + + " │ ├─ name: pq\n" + + " │ └─ columns: [p q]\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x]\n" + + " └─ keys: pq.p\n" + "", }, { @@ -7671,42 +7680,43 @@ inner join pq on true " │ └─ Table\n" + " │ ├─ name: othertable\n" + " │ └─ columns: [s2 i2]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sub\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (7-9)\n" + - " ├─ tableId: 4\n" + - " └─ Project\n" + - " ├─ columns: [mytable.i:0!null, othertable.i2:2!null, othertable.s2:1!null]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ mytable.i:0!null\n" + - " │ └─ othertable.i2:2!null\n" + - " ├─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ ├─ colSet: (3,4)\n" + - " │ ├─ tableId: 2\n" + - " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ └─ columns: [i]\n" + - " └─ Filter\n" + - " ├─ NOT\n" + - " │ └─ Eq\n" + - " │ ├─ convert\n" + - " │ │ ├─ type: signed\n" + - " │ │ └─ othertable.s2:0!null\n" + - " │ └─ 0 (tinyint)\n" + - " └─ IndexedTableAccess(othertable)\n" + - " ├─ index: [othertable.i2]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (5,6)\n" + - " ├─ tableId: 3\n" + - " └─ Table\n" + - " ├─ name: othertable\n" + - " └─ columns: [s2 i2]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: sub\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (7-9)\n" + + " ├─ tableId: 4\n" + + " └─ Project\n" + + " ├─ columns: [mytable.i:0!null, othertable.i2:2!null, othertable.s2:1!null]\n" + + " └─ MergeJoin\n" + + " ├─ cmp: Eq\n" + + " │ ├─ mytable.i:0!null\n" + + " │ └─ othertable.i2:2!null\n" + + " ├─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i,mytable.s]\n" + + " │ ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ ├─ colSet: (3,4)\n" + + " │ ├─ tableId: 2\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: [i]\n" + + " └─ Filter\n" + + " ├─ NOT\n" + + " │ └─ Eq\n" + + " │ ├─ convert\n" + + " │ │ ├─ type: signed\n" + + " │ │ └─ othertable.s2:0!null\n" + + " │ └─ 0 (tinyint)\n" + + " └─ IndexedTableAccess(othertable)\n" + + " ├─ index: [othertable.i2]\n" + + " ├─ static: [{[NULL, ∞)}]\n" + + " ├─ colSet: (5,6)\n" + + " ├─ tableId: 3\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " └─ columns: [s2 i2]\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [sub.i, sub.i2, sub.s2, ot.i2, ot.s2]\n" + @@ -7717,25 +7727,26 @@ inner join pq on true " │ ├─ index: [othertable.i2]\n" + " │ ├─ filters: [{(0, ∞)}]\n" + " │ └─ columns: [s2 i2]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sub\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [mytable.i, othertable.i2, othertable.s2]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (mytable.i = othertable.i2)\n" + - " ├─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ └─ columns: [i]\n" + - " └─ Filter\n" + - " ├─ (NOT((convert(othertable.s2, signed) = 0)))\n" + - " └─ IndexedTableAccess(othertable)\n" + - " ├─ index: [othertable.i2]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [s2 i2]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: sub\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [mytable.i, othertable.i2, othertable.s2]\n" + + " └─ MergeJoin\n" + + " ├─ cmp: (mytable.i = othertable.i2)\n" + + " ├─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i,mytable.s]\n" + + " │ ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ columns: [i]\n" + + " └─ Filter\n" + + " ├─ (NOT((convert(othertable.s2, signed) = 0)))\n" + + " └─ IndexedTableAccess(othertable)\n" + + " ├─ index: [othertable.i2]\n" + + " ├─ filters: [{[NULL, ∞)}]\n" + + " └─ columns: [s2 i2]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [sub.i, sub.i2, sub.s2, ot.i2, ot.s2]\n" + @@ -7746,25 +7757,26 @@ inner join pq on true " │ ├─ index: [othertable.i2]\n" + " │ ├─ filters: [{(0, ∞)}]\n" + " │ └─ columns: [s2 i2]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sub\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Project\n" + - " ├─ columns: [mytable.i, othertable.i2, othertable.s2]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (mytable.i = othertable.i2)\n" + - " ├─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ └─ columns: [i]\n" + - " └─ Filter\n" + - " ├─ (NOT((convert(othertable.s2, signed) = 0)))\n" + - " └─ IndexedTableAccess(othertable)\n" + - " ├─ index: [othertable.i2]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [s2 i2]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: sub\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Project\n" + + " ├─ columns: [mytable.i, othertable.i2, othertable.s2]\n" + + " └─ MergeJoin\n" + + " ├─ cmp: (mytable.i = othertable.i2)\n" + + " ├─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i,mytable.s]\n" + + " │ ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ columns: [i]\n" + + " └─ Filter\n" + + " ├─ (NOT((convert(othertable.s2, signed) = 0)))\n" + + " └─ IndexedTableAccess(othertable)\n" + + " ├─ index: [othertable.i2]\n" + + " ├─ filters: [{[NULL, ∞)}]\n" + + " └─ columns: [s2 i2]\n" + "", }, { @@ -8706,18 +8718,19 @@ inner join pq on true " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (5,6)\n" + - " ├─ tableId: 3\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " ├─ columns: [s2 i2]\n" + - " ├─ colSet: (3,4)\n" + - " └─ tableId: 2\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (5,6)\n" + + " ├─ tableId: 3\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " ├─ columns: [s2 i2]\n" + + " ├─ colSet: (3,4)\n" + + " └─ tableId: 2\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8726,14 +8739,15 @@ inner join pq on true " ├─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " └─ columns: [s2 i2]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " └─ columns: [s2 i2]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8742,14 +8756,15 @@ inner join pq on true " ├─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " └─ columns: [s2 i2]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " └─ columns: [s2 i2]\n" + "", }, { @@ -8764,18 +8779,19 @@ inner join pq on true " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (5,6)\n" + - " ├─ tableId: 3\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " ├─ columns: [s2 i2]\n" + - " ├─ colSet: (3,4)\n" + - " └─ tableId: 2\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (5,6)\n" + + " ├─ tableId: 3\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " ├─ columns: [s2 i2]\n" + + " ├─ colSet: (3,4)\n" + + " └─ tableId: 2\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8784,14 +8800,15 @@ inner join pq on true " ├─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " └─ columns: [s2 i2]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " └─ columns: [s2 i2]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8800,14 +8817,15 @@ inner join pq on true " ├─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: othertable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: othertable\n" + - " └─ columns: [s2 i2]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: othertable\n" + + " └─ columns: [s2 i2]\n" + "", }, { @@ -8833,18 +8851,19 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: TUPLE(othertable.i2:1!null)\n" + " ├─ right-key: TUPLE(mytable.i:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: mytable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: mytable\n" + - " ├─ columns: [i s]\n" + - " ├─ colSet: (1,2)\n" + - " └─ tableId: 1\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (3,4)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " ├─ columns: [i s]\n" + + " ├─ colSet: (1,2)\n" + + " └─ tableId: 1\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8861,14 +8880,15 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: (othertable.i2)\n" + " ├─ right-key: (mytable.i)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: mytable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [othertable.s2, othertable.i2, mytable.i]\n" + @@ -8885,14 +8905,15 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: (othertable.i2)\n" + " ├─ right-key: (mytable.i)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: mytable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", }, { @@ -11028,18 +11049,19 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: TUPLE(lefttable.i:0!null, lefttable.s:1!null)\n" + " ├─ right-key: TUPLE(righttable.i:0!null, righttable.s:1!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: righttable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 4\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " ├─ columns: [i s]\n" + - " ├─ colSet: (5,6)\n" + - " └─ tableId: 3\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: righttable\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 4\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " ├─ columns: [i s]\n" + + " ├─ colSet: (5,6)\n" + + " └─ tableId: 3\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [lefttable.i, righttable.s]\n" + @@ -11057,14 +11079,15 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: (lefttable.i, lefttable.s)\n" + " ├─ right-key: (righttable.i, righttable.s)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: righttable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: righttable\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [lefttable.i, righttable.s]\n" + @@ -11082,14 +11105,15 @@ inner join pq on true " └─ HashLookup\n" + " ├─ left-key: (lefttable.i, lefttable.s)\n" + " ├─ right-key: (righttable.i, righttable.s)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: righttable\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: righttable\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", }, { @@ -17830,26 +17854,27 @@ inner join pq on true " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i s]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 4\n" + - " └─ CrossJoin\n" + - " ├─ TableAlias(b)\n" + - " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ ├─ columns: []\n" + - " │ ├─ colSet: (3,4)\n" + - " │ └─ tableId: 2\n" + - " └─ TableAlias(a)\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " ├─ columns: [i s]\n" + - " ├─ colSet: (1,2)\n" + - " └─ tableId: 1\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 4\n" + + " └─ CrossJoin\n" + + " ├─ TableAlias(b)\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ ├─ columns: []\n" + + " │ ├─ colSet: (3,4)\n" + + " │ └─ tableId: 2\n" + + " └─ TableAlias(a)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " ├─ columns: [i s]\n" + + " ├─ colSet: (1,2)\n" + + " └─ tableId: 1\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [a.i, a.s, c.i, c.s]\n" + @@ -17859,20 +17884,21 @@ inner join pq on true " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i s]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ CrossJoin\n" + - " ├─ TableAlias(b)\n" + - " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ └─ columns: []\n" + - " └─ TableAlias(a)\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ CrossJoin\n" + + " ├─ TableAlias(b)\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: []\n" + + " └─ TableAlias(a)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [a.i, a.s, c.i, c.s]\n" + @@ -17880,22 +17906,23 @@ inner join pq on true " ├─ ((a.i + 1) = (c.i - 1))\n" + " ├─ TableAlias(c)\n" + " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ └─ columns: [i s]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ CrossJoin\n" + - " ├─ TableAlias(b)\n" + - " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ └─ columns: []\n" + - " └─ TableAlias(a)\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ CrossJoin\n" + + " ├─ TableAlias(b)\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: []\n" + + " └─ TableAlias(a)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", }, { @@ -19406,28 +19433,29 @@ inner join pq on true " ├─ Eq\n" + " │ ├─ 1 (tinyint)\n" + " │ └─ a.1:0!null\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (3)\n" + - " ├─ tableId: 3\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1 (tinyint)]\n" + - " │ └─ Table\n" + - " │ ├─ name: \n" + - " │ ├─ columns: []\n" + - " │ ├─ colSet: ()\n" + - " │ └─ tableId: 0\n" + - " └─ Project\n" + - " ├─ columns: [2 (tinyint)]\n" + - " └─ Table\n" + - " ├─ name: \n" + - " ├─ columns: []\n" + - " ├─ colSet: ()\n" + - " └─ tableId: 0\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (3)\n" + + " ├─ tableId: 3\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1 (tinyint)]\n" + + " │ └─ Table\n" + + " │ ├─ name: \n" + + " │ ├─ columns: []\n" + + " │ ├─ colSet: ()\n" + + " │ └─ tableId: 0\n" + + " └─ Project\n" + + " ├─ columns: [2 (tinyint)]\n" + + " └─ Table\n" + + " ├─ name: \n" + + " ├─ columns: []\n" + + " ├─ colSet: ()\n" + + " └─ tableId: 0\n" + "", ExpectedEstimates: "SubqueryAlias\n" + " ├─ name: temp\n" + @@ -19441,20 +19469,21 @@ inner join pq on true " │ └─ name: \n" + " └─ Filter\n" + " ├─ (1 = a.1)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1]\n" + - " │ └─ Table\n" + - " │ └─ name: \n" + - " └─ Project\n" + - " ├─ columns: [2]\n" + - " └─ Table\n" + - " └─ name: \n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1]\n" + + " │ └─ Table\n" + + " │ └─ name: \n" + + " └─ Project\n" + + " ├─ columns: [2]\n" + + " └─ Table\n" + + " └─ name: \n" + "", ExpectedAnalysis: "SubqueryAlias\n" + " ├─ name: temp\n" + @@ -19468,20 +19497,21 @@ inner join pq on true " │ └─ name: \n" + " └─ Filter\n" + " ├─ (1 = a.1)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1]\n" + - " │ └─ Table\n" + - " │ └─ name: \n" + - " └─ Project\n" + - " ├─ columns: [2]\n" + - " └─ Table\n" + - " └─ name: \n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1]\n" + + " │ └─ Table\n" + + " │ └─ name: \n" + + " └─ Project\n" + + " ├─ columns: [2]\n" + + " └─ Table\n" + + " └─ name: \n" + "", }, { @@ -20392,28 +20422,29 @@ inner join pq on true " ├─ Eq\n" + " │ ├─ 1 (tinyint)\n" + " │ └─ a.1:0!null\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (3)\n" + - " ├─ tableId: 3\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1 (tinyint)]\n" + - " │ └─ Table\n" + - " │ ├─ name: \n" + - " │ ├─ columns: []\n" + - " │ ├─ colSet: ()\n" + - " │ └─ tableId: 0\n" + - " └─ Project\n" + - " ├─ columns: [2 (tinyint)]\n" + - " └─ Table\n" + - " ├─ name: \n" + - " ├─ columns: []\n" + - " ├─ colSet: ()\n" + - " └─ tableId: 0\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (3)\n" + + " ├─ tableId: 3\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1 (tinyint)]\n" + + " │ └─ Table\n" + + " │ ├─ name: \n" + + " │ ├─ columns: []\n" + + " │ ├─ colSet: ()\n" + + " │ └─ tableId: 0\n" + + " └─ Project\n" + + " ├─ columns: [2 (tinyint)]\n" + + " └─ Table\n" + + " ├─ name: \n" + + " ├─ columns: []\n" + + " ├─ colSet: ()\n" + + " └─ tableId: 0\n" + "", ExpectedEstimates: "SubqueryAlias\n" + " ├─ name: temp\n" + @@ -20427,20 +20458,21 @@ inner join pq on true " │ └─ name: \n" + " └─ Filter\n" + " ├─ (1 = a.1)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1]\n" + - " │ └─ Table\n" + - " │ └─ name: \n" + - " └─ Project\n" + - " ├─ columns: [2]\n" + - " └─ Table\n" + - " └─ name: \n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1]\n" + + " │ └─ Table\n" + + " │ └─ name: \n" + + " └─ Project\n" + + " ├─ columns: [2]\n" + + " └─ Table\n" + + " └─ name: \n" + "", ExpectedAnalysis: "SubqueryAlias\n" + " ├─ name: temp\n" + @@ -20454,20 +20486,21 @@ inner join pq on true " │ └─ name: \n" + " └─ Filter\n" + " ├─ (1 = a.1)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: a\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Union distinct\n" + - " ├─ Project\n" + - " │ ├─ columns: [1]\n" + - " │ └─ Table\n" + - " │ └─ name: \n" + - " └─ Project\n" + - " ├─ columns: [2]\n" + - " └─ Table\n" + - " └─ name: \n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: a\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Union distinct\n" + + " ├─ Project\n" + + " │ ├─ columns: [1]\n" + + " │ └─ Table\n" + + " │ └─ name: \n" + + " └─ Project\n" + + " ├─ columns: [2]\n" + + " └─ Table\n" + + " └─ name: \n" + "", }, { @@ -20937,20 +20970,21 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: TUPLE(t1.j:0!null)\n" + " │ │ ├─ right-key: TUPLE(t2.j:0!null)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ ├─ colSet: (6)\n" + - " │ │ ├─ tableId: 6\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [1 (tinyint)]\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: \n" + - " │ │ ├─ columns: []\n" + - " │ │ ├─ colSet: ()\n" + - " │ │ └─ tableId: 0\n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ ├─ colSet: (6)\n" + + " │ │ ├─ tableId: 6\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [1 (tinyint)]\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: \n" + + " │ │ ├─ columns: []\n" + + " │ │ ├─ colSet: ()\n" + + " │ │ └─ tableId: 0\n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21000,15 +21034,16 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: (t1.j)\n" + " │ │ ├─ right-key: (t2.j)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [1]\n" + - " │ │ └─ Table\n" + - " │ │ └─ name: \n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [1]\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: \n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21048,15 +21083,16 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: (t1.j)\n" + " │ │ ├─ right-key: (t2.j)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [1]\n" + - " │ │ └─ Table\n" + - " │ │ └─ name: \n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [1]\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: \n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21122,36 +21158,37 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: TUPLE(t1.j:0!null)\n" + " │ │ ├─ right-key: TUPLE(t2.j:0!null)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ ├─ colSet: (9)\n" + - " │ │ ├─ tableId: 9\n" + - " │ │ └─ Union distinct\n" + - " │ │ ├─ Union distinct\n" + - " │ │ │ ├─ Project\n" + - " │ │ │ │ ├─ columns: [1 (tinyint)]\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ ├─ name: \n" + - " │ │ │ │ ├─ columns: []\n" + - " │ │ │ │ ├─ colSet: ()\n" + - " │ │ │ │ └─ tableId: 0\n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [2 (tinyint)]\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: \n" + - " │ │ │ ├─ columns: []\n" + - " │ │ │ ├─ colSet: ()\n" + - " │ │ │ └─ tableId: 0\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [3 (tinyint)]\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: \n" + - " │ │ ├─ columns: []\n" + - " │ │ ├─ colSet: ()\n" + - " │ │ └─ tableId: 0\n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ ├─ colSet: (9)\n" + + " │ │ ├─ tableId: 9\n" + + " │ │ └─ Union distinct\n" + + " │ │ ├─ Union distinct\n" + + " │ │ │ ├─ Project\n" + + " │ │ │ │ ├─ columns: [1 (tinyint)]\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ ├─ name: \n" + + " │ │ │ │ ├─ columns: []\n" + + " │ │ │ │ ├─ colSet: ()\n" + + " │ │ │ │ └─ tableId: 0\n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [2 (tinyint)]\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: \n" + + " │ │ │ ├─ columns: []\n" + + " │ │ │ ├─ colSet: ()\n" + + " │ │ │ └─ tableId: 0\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [3 (tinyint)]\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: \n" + + " │ │ ├─ columns: []\n" + + " │ │ ├─ colSet: ()\n" + + " │ │ └─ tableId: 0\n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21235,25 +21272,26 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: (t1.j)\n" + " │ │ ├─ right-key: (t2.j)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Union distinct\n" + - " │ │ ├─ Union distinct\n" + - " │ │ │ ├─ Project\n" + - " │ │ │ │ ├─ columns: [1]\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ └─ name: \n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [2]\n" + - " │ │ │ └─ Table\n" + - " │ │ │ └─ name: \n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [3]\n" + - " │ │ └─ Table\n" + - " │ │ └─ name: \n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Union distinct\n" + + " │ │ ├─ Union distinct\n" + + " │ │ │ ├─ Project\n" + + " │ │ │ │ ├─ columns: [1]\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ └─ name: \n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [2]\n" + + " │ │ │ └─ Table\n" + + " │ │ │ └─ name: \n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [3]\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: \n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21318,25 +21356,26 @@ inner join pq on true " │ │ └─ HashLookup\n" + " │ │ ├─ left-key: (t1.j)\n" + " │ │ ├─ right-key: (t2.j)\n" + - " │ │ └─ SubqueryAlias\n" + - " │ │ ├─ name: t2\n" + - " │ │ ├─ outerVisibility: false\n" + - " │ │ ├─ isLateral: false\n" + - " │ │ ├─ cacheable: true\n" + - " │ │ └─ Union distinct\n" + - " │ │ ├─ Union distinct\n" + - " │ │ │ ├─ Project\n" + - " │ │ │ │ ├─ columns: [1]\n" + - " │ │ │ │ └─ Table\n" + - " │ │ │ │ └─ name: \n" + - " │ │ │ └─ Project\n" + - " │ │ │ ├─ columns: [2]\n" + - " │ │ │ └─ Table\n" + - " │ │ │ └─ name: \n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [3]\n" + - " │ │ └─ Table\n" + - " │ │ └─ name: \n" + + " │ │ └─ CachedResults\n" + + " │ │ └─ SubqueryAlias\n" + + " │ │ ├─ name: t2\n" + + " │ │ ├─ outerVisibility: false\n" + + " │ │ ├─ isLateral: false\n" + + " │ │ ├─ cacheable: true\n" + + " │ │ └─ Union distinct\n" + + " │ │ ├─ Union distinct\n" + + " │ │ │ ├─ Project\n" + + " │ │ │ │ ├─ columns: [1]\n" + + " │ │ │ │ └─ Table\n" + + " │ │ │ │ └─ name: \n" + + " │ │ │ └─ Project\n" + + " │ │ │ ├─ columns: [2]\n" + + " │ │ │ └─ Table\n" + + " │ │ │ └─ name: \n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [3]\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: \n" + " │ └─ SubqueryAlias\n" + " │ ├─ name: b\n" + " │ ├─ outerVisibility: false\n" + @@ -21780,22 +21819,23 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: TUPLE(b.I:0!null)\n" + " ├─ right-key: TUPLE(e.i:0!null)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: e\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (9,10)\n" + - " ├─ tableId: 5\n" + - " └─ TableAlias(t1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ static: [{[2, 2]}, {[3, 3]}]\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 4\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: e\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (9,10)\n" + + " ├─ tableId: 5\n" + + " └─ TableAlias(t1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ static: [{[2, 2]}, {[3, 3]}]\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 4\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i s]\n" + "", ExpectedEstimates: "SubqueryAlias\n" + " ├─ name: c\n" + @@ -21833,16 +21873,17 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: (b.I)\n" + " ├─ right-key: (e.i)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: e\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ TableAlias(t1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: e\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ TableAlias(t1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + + " └─ columns: [i s]\n" + "", ExpectedAnalysis: "SubqueryAlias\n" + " ├─ name: c\n" + @@ -21880,16 +21921,17 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: (b.I)\n" + " ├─ right-key: (e.i)\n" + - " └─ SubqueryAlias\n" + - " ├─ name: e\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ TableAlias(t1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + - " └─ columns: [i s]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: e\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ TableAlias(t1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ filters: [{[2, 2]}, {[3, 3]}]\n" + + " └─ columns: [i s]\n" + "", }, { @@ -22523,22 +22565,23 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: TUPLE()\n" + " ├─ right-key: TUPLE()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: b\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (10)\n" + - " ├─ tableId: 4\n" + - " └─ Limit(1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ static: [{(1, ∞)}]\n" + - " ├─ colSet: (8,9)\n" + - " ├─ tableId: 3\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: b\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (10)\n" + + " ├─ tableId: 4\n" + + " └─ Limit(1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ static: [{(1, ∞)}]\n" + + " ├─ colSet: (8,9)\n" + + " ├─ tableId: 3\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i]\n" + "", ExpectedEstimates: "CrossHashJoin (estimated cost=402.250 rows=125)\n" + " ├─ SubqueryAlias\n" + @@ -22556,16 +22599,17 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: b\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Limit(1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{(1, ∞)}]\n" + - " └─ columns: [i]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: b\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Limit(1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ filters: [{(1, ∞)}]\n" + + " └─ columns: [i]\n" + "", ExpectedAnalysis: "CrossHashJoin (estimated cost=402.250 rows=125) (actual rows=0 loops=1)\n" + " ├─ SubqueryAlias\n" + @@ -22583,16 +22627,17 @@ With c as ( " └─ HashLookup\n" + " ├─ left-key: ()\n" + " ├─ right-key: ()\n" + - " └─ SubqueryAlias\n" + - " ├─ name: b\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: false\n" + - " ├─ cacheable: true\n" + - " └─ Limit(1)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{(1, ∞)}]\n" + - " └─ columns: [i]\n" + + " └─ CachedResults\n" + + " └─ SubqueryAlias\n" + + " ├─ name: b\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: false\n" + + " ├─ cacheable: true\n" + + " └─ Limit(1)\n" + + " └─ IndexedTableAccess(mytable)\n" + + " ├─ index: [mytable.i]\n" + + " ├─ filters: [{(1, ∞)}]\n" + + " └─ columns: [i]\n" + "", }, { @@ -24272,39 +24317,40 @@ order by i;`, " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i s]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (10)\n" + - " ├─ tableId: 7\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " ├─ colSet: (9)\n" + - " ├─ tableId: 5\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ ├─ columns: [y]\n" + - " │ ├─ colSet: (3,4)\n" + - " │ └─ tableId: 2\n" + - " └─ Project\n" + - " ├─ columns: [xy.x:3!null]\n" + - " └─ LookupJoin\n" + - " ├─ RecursiveTable(cte)\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ keys: [cte.a:2]\n" + - " ├─ colSet: (7,8)\n" + - " ├─ tableId: 5\n" + - " └─ Table\n" + - " ├─ name: xy\n" + - " └─ columns: [x]\n" + + " ├─ colSet: (10)\n" + + " ├─ tableId: 7\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (9)\n" + + " ├─ tableId: 5\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ ├─ columns: [y]\n" + + " │ ├─ colSet: (3,4)\n" + + " │ └─ tableId: 2\n" + + " └─ Project\n" + + " ├─ columns: [xy.x:3!null]\n" + + " └─ LookupJoin\n" + + " ├─ RecursiveTable(cte)\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ keys: [cte.a:2]\n" + + " ├─ colSet: (7,8)\n" + + " ├─ tableId: 5\n" + + " └─ Table\n" + + " ├─ name: xy\n" + + " └─ columns: [x]\n" + "", ExpectedEstimates: "Sort(mytable.i ASC)\n" + " └─ Filter\n" + @@ -24312,29 +24358,30 @@ order by i;`, " └─ LateralCrossJoin\n" + " ├─ Table\n" + " │ └─ name: mytable\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [y]\n" + - " └─ Project\n" + - " ├─ columns: [xy.x]\n" + - " └─ LookupJoin\n" + - " ├─ RecursiveTable(cte)\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ columns: [x]\n" + - " └─ keys: cte.a\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [y]\n" + + " └─ Project\n" + + " ├─ columns: [xy.x]\n" + + " └─ LookupJoin\n" + + " ├─ RecursiveTable(cte)\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x]\n" + + " └─ keys: cte.a\n" + "", ExpectedAnalysis: "Sort(mytable.i ASC)\n" + " └─ Filter\n" + @@ -24342,29 +24389,30 @@ order by i;`, " └─ LateralCrossJoin\n" + " ├─ Table\n" + " │ └─ name: mytable\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [y]\n" + - " └─ Project\n" + - " ├─ columns: [xy.x]\n" + - " └─ LookupJoin\n" + - " ├─ RecursiveTable(cte)\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ columns: [x]\n" + - " └─ keys: cte.a\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [y]\n" + + " └─ Project\n" + + " ├─ columns: [xy.x]\n" + + " └─ LookupJoin\n" + + " ├─ RecursiveTable(cte)\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x]\n" + + " └─ keys: cte.a\n" + "", }, { @@ -24398,50 +24446,51 @@ order by i;`, " │ └─ Table\n" + " │ ├─ name: mytable\n" + " │ └─ columns: [i s]\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + - " ├─ colSet: (12)\n" + - " ├─ tableId: 8\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa2\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " ├─ colSet: (11)\n" + - " ├─ tableId: 5\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ limit: 3\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ ├─ columns: [y]\n" + - " │ ├─ colSet: (3,4)\n" + - " │ └─ tableId: 2\n" + - " └─ Project\n" + - " ├─ columns: [sqa1.x:2!null]\n" + - " └─ InnerJoin\n" + - " ├─ Eq\n" + - " │ ├─ sqa1.x:2!null\n" + - " │ └─ cte.a:4\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: sqa1\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: true\n" + - " │ ├─ cacheable: true\n" + - " │ ├─ colSet: (9,10)\n" + - " │ ├─ tableId: 6\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ static: [{[1, 1]}]\n" + - " │ ├─ colSet: (7,8)\n" + - " │ ├─ tableId: 5\n" + - " │ └─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [x y]\n" + - " └─ RecursiveTable(cte)\n" + + " ├─ colSet: (12)\n" + + " ├─ tableId: 8\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " ├─ colSet: (11)\n" + + " ├─ tableId: 5\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ limit: 3\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ ├─ columns: [y]\n" + + " │ ├─ colSet: (3,4)\n" + + " │ └─ tableId: 2\n" + + " └─ Project\n" + + " ├─ columns: [sqa1.x:2!null]\n" + + " └─ InnerJoin\n" + + " ├─ Eq\n" + + " │ ├─ sqa1.x:2!null\n" + + " │ └─ cte.a:4\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: sqa1\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: true\n" + + " │ ├─ cacheable: true\n" + + " │ ├─ colSet: (9,10)\n" + + " │ ├─ tableId: 6\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.x]\n" + + " │ ├─ static: [{[1, 1]}]\n" + + " │ ├─ colSet: (7,8)\n" + + " │ ├─ tableId: 5\n" + + " │ └─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [x y]\n" + + " └─ RecursiveTable(cte)\n" + "", ExpectedEstimates: "Sort(mytable.i ASC)\n" + " └─ Filter\n" + @@ -24449,36 +24498,37 @@ order by i;`, " └─ LateralCrossJoin\n" + " ├─ Table\n" + " │ └─ name: mytable\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa2\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ limit: 3\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [y]\n" + - " └─ Project\n" + - " ├─ columns: [sqa1.x]\n" + - " └─ InnerJoin\n" + - " ├─ (sqa1.x = cte.a)\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: sqa1\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: true\n" + - " │ ├─ cacheable: true\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ filters: [{[1, 1]}]\n" + - " │ └─ columns: [x y]\n" + - " └─ RecursiveTable(cte)\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ limit: 3\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [y]\n" + + " └─ Project\n" + + " ├─ columns: [sqa1.x]\n" + + " └─ InnerJoin\n" + + " ├─ (sqa1.x = cte.a)\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: sqa1\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: true\n" + + " │ ├─ cacheable: true\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.x]\n" + + " │ ├─ filters: [{[1, 1]}]\n" + + " │ └─ columns: [x y]\n" + + " └─ RecursiveTable(cte)\n" + "", ExpectedAnalysis: "Sort(mytable.i ASC)\n" + " └─ Filter\n" + @@ -24486,36 +24536,37 @@ order by i;`, " └─ LateralCrossJoin\n" + " ├─ Table\n" + " │ └─ name: mytable\n" + - " └─ SubqueryAlias\n" + - " ├─ name: sqa2\n" + - " ├─ outerVisibility: false\n" + - " ├─ isLateral: true\n" + - " ├─ cacheable: true\n" + + " └─ CachedResults\n" + " └─ SubqueryAlias\n" + - " ├─ name: cte\n" + + " ├─ name: sqa2\n" + " ├─ outerVisibility: false\n" + " ├─ isLateral: true\n" + " ├─ cacheable: true\n" + - " └─ RecursiveCTE\n" + - " └─ Union distinct\n" + - " ├─ limit: 3\n" + - " ├─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [y]\n" + - " └─ Project\n" + - " ├─ columns: [sqa1.x]\n" + - " └─ InnerJoin\n" + - " ├─ (sqa1.x = cte.a)\n" + - " ├─ SubqueryAlias\n" + - " │ ├─ name: sqa1\n" + - " │ ├─ outerVisibility: false\n" + - " │ ├─ isLateral: true\n" + - " │ ├─ cacheable: true\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ filters: [{[1, 1]}]\n" + - " │ └─ columns: [x y]\n" + - " └─ RecursiveTable(cte)\n" + + " └─ SubqueryAlias\n" + + " ├─ name: cte\n" + + " ├─ outerVisibility: false\n" + + " ├─ isLateral: true\n" + + " ├─ cacheable: true\n" + + " └─ RecursiveCTE\n" + + " └─ Union distinct\n" + + " ├─ limit: 3\n" + + " ├─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [y]\n" + + " └─ Project\n" + + " ├─ columns: [sqa1.x]\n" + + " └─ InnerJoin\n" + + " ├─ (sqa1.x = cte.a)\n" + + " ├─ SubqueryAlias\n" + + " │ ├─ name: sqa1\n" + + " │ ├─ outerVisibility: false\n" + + " │ ├─ isLateral: true\n" + + " │ ├─ cacheable: true\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.x]\n" + + " │ ├─ filters: [{[1, 1]}]\n" + + " │ └─ columns: [x y]\n" + + " └─ RecursiveTable(cte)\n" + "", }, { From a17d15aab8d613913d8c753a79c78db8ff935997 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Sep 2025 15:29:13 -0700 Subject: [PATCH 30/73] fix equality check in buildSingleLookupPlan --- enginetest/join_planning_tests.go | 28 ++++++++++++++++++++++++++++ enginetest/memory_engine_test.go | 30 +++++++++++++++++++----------- sql/memo/join_order_builder.go | 3 +-- sql/memo/rel_props.go | 12 ++++++++++++ 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/enginetest/join_planning_tests.go b/enginetest/join_planning_tests.go index 67c75297b7..ac886391d8 100644 --- a/enginetest/join_planning_tests.go +++ b/enginetest/join_planning_tests.go @@ -1788,6 +1788,34 @@ join uv d on d.u = c.x`, }, }, }, + { + name: "single look up plan does not drop complex equality filters", + setup: []string{ + "create table t1 (i int primary key);", + "create table t2 (j int);", + "create table t3 (k int);", + "insert into t1 values (1), (2);", + "insert into t2 values (1), (2);", + "insert into t3 values (3);", + }, + tests: []JoinPlanTest{ + { + q: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k = t2.j;", + types: []plan.JoinType{plan.JoinTypeHash, plan.JoinTypeCross}, + exp: []sql.Row{}, + }, + { + q: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k >= t2.j order by i, j, k;", + types: []plan.JoinType{plan.JoinTypeInner, plan.JoinTypeCross}, + exp: []sql.Row{ + {1, 1, 3}, + {1, 2, 3}, + {2, 1, 3}, + {2, 2, 3}, + }, + }, + }, + }, } func TestJoinPlanning(t *testing.T, harness Harness) { diff --git a/enginetest/memory_engine_test.go b/enginetest/memory_engine_test.go index f1ec7b45d0..293c2f9acd 100644 --- a/enginetest/memory_engine_test.go +++ b/enginetest/memory_engine_test.go @@ -200,22 +200,30 @@ func TestSingleQueryPrepared(t *testing.T) { // Convenience test for debugging a single query. Unskip and set to the desired query. func TestSingleScript(t *testing.T) { - t.Skip() + //t.Skip() var scripts = []queries.ScriptTest{ { - Name: "AS OF propagates to nested CALLs", - SetUpScript: []string{}, + Name: "test", + SetUpScript: []string{ + "create table t1 (i int primary key);", + "create table t2 (j int);", + "create table t3 (k int);", + "insert into t1 values (1), (2);", + "insert into t2 values (1), (2);", + "insert into t3 values (3);", + }, Assertions: []queries.ScriptTestAssertion{ { - Query: "create procedure create_proc() create table t (i int primary key, j int);", - Expected: []sql.Row{ - {types.NewOkResult(0)}, - }, + Query: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k = t2.j;", + Expected: []sql.Row{}, }, { - Query: "call create_proc()", + Query: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k >= t2.j order by i, j, k;", Expected: []sql.Row{ - {types.NewOkResult(0)}, + {1, 1, 3}, + {1, 2, 3}, + {2, 1, 3}, + {2, 2, 3}, }, }, }, @@ -230,8 +238,8 @@ func TestSingleScript(t *testing.T) { panic(err) } - //engine.EngineAnalyzer().Debug = true - //engine.EngineAnalyzer().Verbose = true + engine.EngineAnalyzer().Debug = true + engine.EngineAnalyzer().Verbose = true enginetest.TestScriptWithEngine(t, engine, harness, test) } diff --git a/sql/memo/join_order_builder.go b/sql/memo/join_order_builder.go index ab8787a738..e51042d857 100644 --- a/sql/memo/join_order_builder.go +++ b/sql/memo/join_order_builder.go @@ -285,7 +285,7 @@ func (j *joinOrderBuilder) buildSingleLookupPlan() bool { } filter := edge.filters[0] _, tables, _ := getExprScalarProps(filter) - if tables.Len() != 2 { + if tables.Len() != 2 || !isSimpleEquality(filter) { // We have encountered a filter condition more complicated than a simple equality check. // We probably can't optimize this, so bail out. return false @@ -319,7 +319,6 @@ func (j *joinOrderBuilder) buildSingleLookupPlan() bool { for idx, ok := remainingVertexes.next(0); ok; idx, ok = remainingVertexes.next(idx + 1) { nextVertex := newBitSet(idx) j.addJoin(plan.JoinTypeCross, currentlyJoinedVertexes, nextVertex, nil, nil, false) - currentlyJoinedVertexes = currentlyJoinedVertexes.union(nextVertex) } return false diff --git a/sql/memo/rel_props.go b/sql/memo/rel_props.go index 951ce63403..8ca71719ec 100644 --- a/sql/memo/rel_props.go +++ b/sql/memo/rel_props.go @@ -538,6 +538,18 @@ func getExprScalarProps(e sql.Expression) (sql.ColSet, sql.FastIntSet, bool) { return cols, tables, nullRej } +func isSimpleEquality(expr sql.Expression) bool { + hasOnlyEquals := true + transform.InspectExpr(expr, func(e sql.Expression) bool { + if _, isEq := e.(*expression.Equals); !isEq { + hasOnlyEquals = false + return true + } + return false + }) + return hasOnlyEquals +} + // allTableCols returns the full schema of a table ignoring // declared projections. func allTableCols(rel SourceRel) sql.Schema { From b624244dc597745744b181e89ba0494953c9677e Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Tue, 9 Sep 2025 15:38:01 -0700 Subject: [PATCH 31/73] Simplify logic for `cacheSubqueryAliasesInJoins`. This seems to result in the exact same plans, but requires less tracking. --- sql/analyzer/resolve_subqueries.go | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/sql/analyzer/resolve_subqueries.go b/sql/analyzer/resolve_subqueries.go index 5da35c9998..654795ca83 100644 --- a/sql/analyzer/resolve_subqueries.go +++ b/sql/analyzer/resolve_subqueries.go @@ -291,24 +291,18 @@ func analyzeSubqueryAlias(ctx *sql.Context, a *Analyzer, sqa *plan.SubqueryAlias // node on top of those nodes. The left-most child of a join root is an exception // that cannot be cached. func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) { - foundFirstRel := false - var recurse func(n sql.Node, parentCached, inJoin bool, rootJoinT1 *bool) (sql.Node, transform.TreeIdentity, error) - recurse = func(n sql.Node, parentCached, inJoin bool, foundFirstRel *bool) (sql.Node, transform.TreeIdentity, error) { + var recurse func(n sql.Node, parentCached, inJoin, leftChild bool) (sql.Node, transform.TreeIdentity, error) + recurse = func(n sql.Node, parentCached, inJoin, leftChild bool) (sql.Node, transform.TreeIdentity, error) { _, isOp := n.(sql.OpaqueNode) var isCacheableSq bool var isCachedRs bool var isMax1Row bool - // If we enter a new join, we use this stack-allocated variable to track whether or not we've encountered - // a nameable child in that node. - childFoundFirstRel := false switch n := n.(type) { case *plan.JoinNode: - if !inJoin { - inJoin = true - foundFirstRel = &childFoundFirstRel - } + inJoin = true + leftChild = true case *plan.SubqueryAlias: - isCacheableSq = n.CanCacheResults() + isCacheableSq = n.CanCacheResults() && !leftChild case *plan.CachedResults: isCachedRs = true case *plan.Max1Row: @@ -320,19 +314,10 @@ func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scop doCache := isCacheableSq && inJoin && !parentCached childInJoin := inJoin && !isOp - if inJoin && !(*foundFirstRel) { - switch n.(type) { - case sql.Nameable: - doCache = false - *foundFirstRel = true - default: - } - } - children := n.Children() var newChildren []sql.Node for i, c := range children { - child, same, _ := recurse(c, doCache || isCachedRs || isMax1Row, childInJoin, foundFirstRel) + child, same, _ := recurse(c, doCache || isCachedRs || isMax1Row, childInJoin, leftChild) if !same { if newChildren == nil { newChildren = make([]sql.Node, len(children)) @@ -340,6 +325,7 @@ func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scop } newChildren[i] = child } + leftChild = false } if len(newChildren) == 0 && !doCache { @@ -355,5 +341,5 @@ func cacheSubqueryAliasesInJoins(ctx *sql.Context, a *Analyzer, n sql.Node, scop } return ret, transform.NewTree, nil } - return recurse(n, false, false, &foundFirstRel) + return recurse(n, false, false, false) } From ded0f643e8e508d616e858163681f7f98f330ef6 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Sep 2025 15:43:57 -0700 Subject: [PATCH 32/73] fix check --- sql/memo/rel_props.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sql/memo/rel_props.go b/sql/memo/rel_props.go index 8ca71719ec..5ff722e95b 100644 --- a/sql/memo/rel_props.go +++ b/sql/memo/rel_props.go @@ -541,7 +541,10 @@ func getExprScalarProps(e sql.Expression) (sql.ColSet, sql.FastIntSet, bool) { func isSimpleEquality(expr sql.Expression) bool { hasOnlyEquals := true transform.InspectExpr(expr, func(e sql.Expression) bool { - if _, isEq := e.(*expression.Equals); !isEq { + switch e.(type) { + case *expression.GetField: + case *expression.Equals: + default: hasOnlyEquals = false return true } From 0a15664417bb442ae9ead0dd7e7ad36c11f59baa Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Sep 2025 15:44:05 -0700 Subject: [PATCH 33/73] fix check --- sql/memo/rel_props.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/memo/rel_props.go b/sql/memo/rel_props.go index 5ff722e95b..f1cc8d5d17 100644 --- a/sql/memo/rel_props.go +++ b/sql/memo/rel_props.go @@ -543,7 +543,7 @@ func isSimpleEquality(expr sql.Expression) bool { transform.InspectExpr(expr, func(e sql.Expression) bool { switch e.(type) { case *expression.GetField: - case *expression.Equals: + case *expression.Equals, *expression.NullSafeEquals: default: hasOnlyEquals = false return true From 23a6eb7efd47675b74dd6df165ce98233f8bd051 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Sep 2025 15:44:55 -0700 Subject: [PATCH 34/73] Revert --- enginetest/memory_engine_test.go | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/enginetest/memory_engine_test.go b/enginetest/memory_engine_test.go index 293c2f9acd..f1ec7b45d0 100644 --- a/enginetest/memory_engine_test.go +++ b/enginetest/memory_engine_test.go @@ -200,30 +200,22 @@ func TestSingleQueryPrepared(t *testing.T) { // Convenience test for debugging a single query. Unskip and set to the desired query. func TestSingleScript(t *testing.T) { - //t.Skip() + t.Skip() var scripts = []queries.ScriptTest{ { - Name: "test", - SetUpScript: []string{ - "create table t1 (i int primary key);", - "create table t2 (j int);", - "create table t3 (k int);", - "insert into t1 values (1), (2);", - "insert into t2 values (1), (2);", - "insert into t3 values (3);", - }, + Name: "AS OF propagates to nested CALLs", + SetUpScript: []string{}, Assertions: []queries.ScriptTestAssertion{ { - Query: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k = t2.j;", - Expected: []sql.Row{}, + Query: "create procedure create_proc() create table t (i int primary key, j int);", + Expected: []sql.Row{ + {types.NewOkResult(0)}, + }, }, { - Query: "select * from t1 cross join t2 join (select * from t3) v3 on v3.k >= t2.j order by i, j, k;", + Query: "call create_proc()", Expected: []sql.Row{ - {1, 1, 3}, - {1, 2, 3}, - {2, 1, 3}, - {2, 2, 3}, + {types.NewOkResult(0)}, }, }, }, @@ -238,8 +230,8 @@ func TestSingleScript(t *testing.T) { panic(err) } - engine.EngineAnalyzer().Debug = true - engine.EngineAnalyzer().Verbose = true + //engine.EngineAnalyzer().Debug = true + //engine.EngineAnalyzer().Verbose = true enginetest.TestScriptWithEngine(t, engine, harness, test) } From 2b90e9b874d6fe9d21be159725a78b5d29427b6f Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 10 Sep 2025 13:24:19 -0700 Subject: [PATCH 35/73] fix ret type --- sql/expression/bit_ops.go | 28 +++++++++++++---------- sql/expression/bit_ops_test.go | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/sql/expression/bit_ops.go b/sql/expression/bit_ops.go index ba1f24bd20..4a269c3581 100644 --- a/sql/expression/bit_ops.go +++ b/sql/expression/bit_ops.go @@ -91,17 +91,8 @@ func (b *BitOp) Type() sql.Type { return lTyp } - if types.IsText(lTyp) || types.IsText(rTyp) { - return types.Float64 - } - - if types.IsUnsigned(lTyp) && types.IsUnsigned(rTyp) { - return types.Uint64 - } else if types.IsSigned(lTyp) && types.IsSigned(rTyp) { - return types.Int64 - } - - return types.Float64 + // MySQL bitwise operations always return unsigned results, even for signed operands. + return types.Uint64 } // CollationCoercibility implements the interface sql.CollationCoercible. @@ -168,7 +159,20 @@ func (b *BitOp) evalLeftRight(ctx *sql.Context, row sql.Row) (interface{}, inter } func (b *BitOp) convertLeftRight(ctx *sql.Context, left interface{}, right interface{}) (interface{}, interface{}, error) { - typ := b.Type() + // Determine the appropriate conversion type based on operand types + var typ sql.Type + lTyp := b.LeftChild.Type() + rTyp := b.RightChild.Type() + + if types.IsText(lTyp) || types.IsText(rTyp) { + typ = types.Float64 + } else if types.IsUnsigned(lTyp) && types.IsUnsigned(rTyp) { + typ = types.Uint64 + } else if types.IsSigned(lTyp) && types.IsSigned(rTyp) { + typ = types.Int64 + } else { + typ = types.Float64 + } left = convertValueToType(ctx, typ, left, types.IsTime(b.LeftChild.Type())) right = convertValueToType(ctx, typ, right, types.IsTime(b.RightChild.Type())) diff --git a/sql/expression/bit_ops_test.go b/sql/expression/bit_ops_test.go index c1a4d6bce4..ef66247efc 100644 --- a/sql/expression/bit_ops_test.go +++ b/sql/expression/bit_ops_test.go @@ -196,3 +196,44 @@ func TestAllUint64(t *testing.T) { }) } } + +func TestBitOpType(t *testing.T) { + testCases := []struct { + name string + leftType sql.Type + rightType sql.Type + expectedType sql.Type + description string + }{ + {"unsigned & unsigned", types.Uint64, types.Uint64, types.Uint64, "Both operands are unsigned"}, + {"signed & signed", types.Int64, types.Int64, types.Uint64, "Both operands are signed - should return Uint64"}, + {"mixed signed & unsigned", types.Int64, types.Uint64, types.Uint64, "Mixed signed/unsigned operands"}, + {"text & text", types.Text, types.Text, types.Uint64, "Text operands should return Float64"}, + {"text & int", types.Text, types.Int64, types.Uint64, "Mixed text and numeric operands"}, + {"float & float", types.Float64, types.Float64, types.Uint64, "Float operands should return Uint64"}, + } + + operations := []struct { + name string + op func(left, right sql.Expression) *BitOp + }{ + {"BitAnd", NewBitAnd}, + {"BitOr", NewBitOr}, + {"BitXor", NewBitXor}, + {"ShiftLeft", NewShiftLeft}, + {"ShiftRight", NewShiftRight}, + } + + for _, tt := range testCases { + for _, op := range operations { + t.Run(tt.name+"_"+op.name, func(t *testing.T) { + require := require.New(t) + bitOp := op.op(NewLiteral(1, tt.leftType), NewLiteral(1, tt.rightType)) + actualType := bitOp.Type() + require.Equal(tt.expectedType, actualType, + "BitOp.Type() should return %v for %s: %s", + tt.expectedType, tt.name, tt.description) + }) + } + } +} From dd1406951b5b70f593bd4df3a3a4632ed6f47084 Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 10 Sep 2025 13:44:48 -0700 Subject: [PATCH 36/73] amend query plans --- enginetest/queries/query_plans.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enginetest/queries/query_plans.go b/enginetest/queries/query_plans.go index 91a8840db8..1ba0f413bb 100644 --- a/enginetest/queries/query_plans.go +++ b/enginetest/queries/query_plans.go @@ -9396,7 +9396,7 @@ inner join pq on true " ├─ HashIn\n" + " │ ├─ Eq\n" + " │ │ ├─ mytable.i:0!null\n" + - " │ │ └─ 1 (bigint)\n" + + " │ │ └─ 1 (bigint unsigned)\n" + " │ └─ TUPLE(true (tinyint(1)))\n" + " └─ ProcessTable\n" + " └─ Table\n" + @@ -9422,7 +9422,7 @@ inner join pq on true " ├─ HashIn\n" + " │ ├─ Eq\n" + " │ │ ├─ mytable.i:0!null\n" + - " │ │ └─ 0 (bigint)\n" + + " │ │ └─ 0 (bigint unsigned)\n" + " │ └─ TUPLE(true (tinyint(1)))\n" + " └─ ProcessTable\n" + " └─ Table\n" + From 4fa662877fc6fd27f7a357ba6c90d91d4c59aced Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 10 Sep 2025 20:48:16 +0000 Subject: [PATCH 37/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/expression/bit_ops.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/expression/bit_ops.go b/sql/expression/bit_ops.go index 4a269c3581..009f5ba98a 100644 --- a/sql/expression/bit_ops.go +++ b/sql/expression/bit_ops.go @@ -163,7 +163,7 @@ func (b *BitOp) convertLeftRight(ctx *sql.Context, left interface{}, right inter var typ sql.Type lTyp := b.LeftChild.Type() rTyp := b.RightChild.Type() - + if types.IsText(lTyp) || types.IsText(rTyp) { typ = types.Float64 } else if types.IsUnsigned(lTyp) && types.IsUnsigned(rTyp) { From 991ec5f0ef17cf73a5cd26867c6adbff1a64b059 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 14:05:55 -0700 Subject: [PATCH 38/73] add tests --- enginetest/queries/function_queries.go | 9 +++++++++ enginetest/queries/script_queries.go | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/enginetest/queries/function_queries.go b/enginetest/queries/function_queries.go index 9d30477ce6..d73832649f 100644 --- a/enginetest/queries/function_queries.go +++ b/enginetest/queries/function_queries.go @@ -572,6 +572,15 @@ var FunctionQueryTests = []QueryTest{ {64}, }, }, + { + // https://github.com/dolthub/dolt/issues/9818 + Query: "select bit_length(10)", + Expected: []sql.Row{{16}}, + }, + { + Query: "select bit_length(now())", + Expected: []sql.Row{{152}}, + }, { Query: "select date_format(datetime_col, '%D') from datetime_table order by 1", Expected: []sql.Row{ diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 275c914271..e1391ce9b4 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -9466,6 +9466,14 @@ where {"hijkl", 5}, }, }, + { + Query: "select e, bit_length(e) from t order by e;", + Expected: []sql.Row{ + {"abc", 24}, + {"defg", 32}, + {"hijkl", 40}, + }, + }, { Query: "select e, concat(e, 'test') from t order by e;", Expected: []sql.Row{ @@ -10129,6 +10137,15 @@ where {"abc,defg,hijkl", 14}, }, }, + { + Query: "select s, bit_length(s) from t order by s;", + Expected: []sql.Row{ + {"abc", 24}, + {"defg", 32}, + {"abc,defg", 64}, + {"abc,defg,hijkl", 112}, + }, + }, { Query: "select s, concat(s, 'test') from t order by s;", Expected: []sql.Row{ From 61ec6b45c3496f02d845adf69ff0acb9957cebc9 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 14:16:43 -0700 Subject: [PATCH 39/73] convert arg to string before calculating bit_length --- enginetest/queries/function_queries.go | 2 +- sql/expression/function/string.go | 22 +++++----------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/enginetest/queries/function_queries.go b/enginetest/queries/function_queries.go index d73832649f..a8a166b0d7 100644 --- a/enginetest/queries/function_queries.go +++ b/enginetest/queries/function_queries.go @@ -569,7 +569,7 @@ var FunctionQueryTests = []QueryTest{ { Query: "SELECT BIT_LENGTH(i) from mytable order by i limit 1", Expected: []sql.Row{ - {64}, + {8}, }, }, { diff --git a/sql/expression/function/string.go b/sql/expression/function/string.go index 0092202fc6..7ecb7e7431 100644 --- a/sql/expression/function/string.go +++ b/sql/expression/function/string.go @@ -552,7 +552,7 @@ func (h *Bin) convertToInt64(v interface{}) (int64, error) { } } -// Bitlength implements the sql function "bit_length" which returns the data length of the argument in bits +// Bitlength implements the sql function "bit_length" which returns the length of a string in bits type Bitlength struct { *UnaryFunc } @@ -590,24 +590,12 @@ func (h *Bitlength) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { return nil, nil } - switch val := arg.(type) { - case uint8, int8, bool: - return 8, nil - case uint16, int16: - return 16, nil - case int, uint, uint32, int32, float32: - return 32, nil - case uint64, int64, float64: - return 64, nil - case string: - return 8 * len([]byte(val)), nil - case []byte: - return 8 * len(val), nil - case time.Time: - return 128, nil + content, _, err := types.ConvertToCollatedString(ctx, arg, h.Child.Type()) + if err != nil { + return nil, err } - return nil, sql.ErrInvalidArgumentDetails.New("bit_length", fmt.Sprint(arg)) + return 8 * len(content), nil } // WithChildren implements the sql.Expression interface From 95d7b974d39e89ce7ca97498b0bba26f717f96ad Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 14:26:56 -0700 Subject: [PATCH 40/73] update tests --- enginetest/queries/function_queries.go | 8 ++++++++ sql/expression/function/string_test.go | 18 ++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/enginetest/queries/function_queries.go b/enginetest/queries/function_queries.go index a8a166b0d7..b5f74422b1 100644 --- a/enginetest/queries/function_queries.go +++ b/enginetest/queries/function_queries.go @@ -581,6 +581,14 @@ var FunctionQueryTests = []QueryTest{ Query: "select bit_length(now())", Expected: []sql.Row{{152}}, }, + { + Query: "select bit_length(-10)", + Expected: []sql.Row{{24}}, + }, + { + Query: "select bit_length(true)", + Expected: []sql.Row{{8}}, + }, { Query: "select date_format(datetime_col, '%D') from datetime_table order by 1", Expected: []sql.Row{ diff --git a/sql/expression/function/string_test.go b/sql/expression/function/string_test.go index 9c255c07ba..e3e97e7898 100644 --- a/sql/expression/function/string_test.go +++ b/sql/expression/function/string_test.go @@ -143,24 +143,14 @@ func TestBinFunc(t *testing.T) { } func TestBitLength(t *testing.T) { - f := sql.Function1{Name: "bin", Fn: NewBitlength} + f := sql.Function1{Name: "bit_length", Fn: NewBitlength} tf := NewTestFactory(f.Fn) tf.AddSucceeding(nil, nil) tf.AddSucceeding(32, "test") tf.AddSucceeding(8, true) - tf.AddSucceeding(8, int8(0)) - tf.AddSucceeding(8, uint8(0)) - tf.AddSucceeding(16, int16(0)) - tf.AddSucceeding(16, uint16(0)) - tf.AddSucceeding(32, uint32(0)) - tf.AddSucceeding(32, int32(0)) - tf.AddSucceeding(32, uint(0)) - tf.AddSucceeding(32, 0) - tf.AddSucceeding(64, uint64(0)) - tf.AddSucceeding(64, int64(0)) - tf.AddSucceeding(64, float64(0)) - tf.AddSucceeding(32, float32(0)) - tf.AddSucceeding(128, time.Now()) + tf.AddSucceeding(8, 0) + tf.AddSucceeding(16, 10) + tf.AddSucceeding(24, -10) tf.Test(t, nil, nil) } From de207f58b009fcf70ab85acafa569adede129a6d Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 14:58:43 -0700 Subject: [PATCH 41/73] rename left and right to primary and secondary --- sql/rowexec/join_iters.go | 124 +++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index af02d2ac40..1a272e6bdf 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -716,18 +716,18 @@ func (i *crossJoinIterator) Close(ctx *sql.Context) (err error) { // +---+---+ // cond is passed to the filter iter to be evaluated. type lateralJoinIterator struct { - lIter sql.RowIter - rIter sql.RowIter - rNode sql.Node - cond sql.Expression - b sql.NodeExecBuilder - pRow sql.Row - lRow sql.Row - rRow sql.Row - rowSize int - scopeLen int - jType plan.JoinType - foundMatch bool + primary sql.RowIter + secondary sql.RowIter + secondaryNode sql.Node + cond sql.Expression + b sql.NodeExecBuilder + parentRow sql.Row + primaryRow sql.Row + secondaryRow sql.Row + rowSize int + scopeLen int + jType plan.JoinType + foundMatch bool } func newLateralJoinIter(ctx *sql.Context, b sql.NodeExecBuilder, j *plan.JoinNode, row sql.Row) (sql.RowIter, error) { @@ -755,105 +755,105 @@ func newLateralJoinIter(ctx *sql.Context, b sql.NodeExecBuilder, j *plan.JoinNod } return sql.NewSpanIter(span, &lateralJoinIterator{ - pRow: row, - lIter: l, - rNode: j.Right(), - cond: j.Filter, - jType: j.Op, - rowSize: len(row) + len(j.Left().Schema()) + len(j.Right().Schema()), - scopeLen: j.ScopeLen, - b: b, + parentRow: row, + primary: l, + secondaryNode: j.Right(), + cond: j.Filter, + jType: j.Op, + rowSize: len(row) + len(j.Left().Schema()) + len(j.Right().Schema()), + scopeLen: j.ScopeLen, + b: b, }), nil } -func (i *lateralJoinIterator) loadLeft(ctx *sql.Context) error { - if i.lRow == nil { - lRow, err := i.lIter.Next(ctx) +func (i *lateralJoinIterator) loadPrimary(ctx *sql.Context) error { + if i.primaryRow == nil { + lRow, err := i.primary.Next(ctx) if err != nil { return err } - i.lRow = lRow + i.primaryRow = lRow i.foundMatch = false } return nil } -func (i *lateralJoinIterator) buildRight(ctx *sql.Context) error { - if i.rIter == nil { - prepended, _, err := transform.Node(i.rNode, plan.PrependRowInPlan(i.lRow, true)) +func (i *lateralJoinIterator) buildSecondary(ctx *sql.Context) error { + if i.secondary == nil { + prepended, _, err := transform.Node(i.secondaryNode, plan.PrependRowInPlan(i.primaryRow, true)) if err != nil { return err } - iter, err := i.b.Build(ctx, prepended, i.lRow) + iter, err := i.b.Build(ctx, prepended, i.primaryRow) if err != nil { return err } - i.rIter = iter + i.secondary = iter } return nil } -func (i *lateralJoinIterator) loadRight(ctx *sql.Context) error { - if i.rRow == nil { - rRow, err := i.rIter.Next(ctx) +func (i *lateralJoinIterator) loadSecondary(ctx *sql.Context) error { + if i.secondaryRow == nil { + sRow, err := i.secondary.Next(ctx) if err != nil { return err } - i.rRow = rRow[len(i.lRow):] + i.secondaryRow = sRow[len(i.primaryRow):] } return nil } -func (i *lateralJoinIterator) buildRow(lRow, rRow sql.Row) sql.Row { +func (i *lateralJoinIterator) buildRow(primaryRow, secondaryRow sql.Row) sql.Row { row := make(sql.Row, i.rowSize) - copy(row, lRow) - copy(row[len(lRow):], rRow) + copy(row, primaryRow) + copy(row[len(primaryRow):], secondaryRow) return row } func (i *lateralJoinIterator) removeParentRow(r sql.Row) sql.Row { - copy(r[i.scopeLen:], r[len(i.pRow):]) - r = r[:len(r)-len(i.pRow)+i.scopeLen] + copy(r[i.scopeLen:], r[len(i.parentRow):]) + r = r[:len(r)-len(i.parentRow)+i.scopeLen] return r } func (i *lateralJoinIterator) reset(ctx *sql.Context) (err error) { - if i.rIter != nil { - err = i.rIter.Close(ctx) - i.rIter = nil + if i.secondary != nil { + err = i.secondary.Close(ctx) + i.secondary = nil } - i.lRow = nil - i.rRow = nil + i.primaryRow = nil + i.secondaryRow = nil return } func (i *lateralJoinIterator) Next(ctx *sql.Context) (sql.Row, error) { for { - if err := i.loadLeft(ctx); err != nil { + if err := i.loadPrimary(ctx); err != nil { return nil, err } - if err := i.buildRight(ctx); err != nil { + if err := i.buildSecondary(ctx); err != nil { return nil, err } - if err := i.loadRight(ctx); err != nil { + if err := i.loadSecondary(ctx); err != nil { if errors.Is(err, io.EOF) { if !i.foundMatch && i.jType == plan.JoinTypeLateralLeft { - res := i.buildRow(i.lRow, nil) - if rerr := i.reset(ctx); rerr != nil { - return nil, rerr + res := i.buildRow(i.primaryRow, nil) + if resetErr := i.reset(ctx); resetErr != nil { + return nil, resetErr } return i.removeParentRow(res), nil } - if rerr := i.reset(ctx); rerr != nil { - return nil, rerr + if resetErr := i.reset(ctx); resetErr != nil { + return nil, resetErr } continue } return nil, err } - row := i.buildRow(i.lRow, i.rRow) - i.rRow = nil + row := i.buildRow(i.primaryRow, i.secondaryRow) + i.secondaryRow = nil if i.cond != nil { if res, err := sql.EvaluateCondition(ctx, i.cond, row); err != nil { return nil, err @@ -868,18 +868,18 @@ func (i *lateralJoinIterator) Next(ctx *sql.Context) (sql.Row, error) { } func (i *lateralJoinIterator) Close(ctx *sql.Context) error { - var lerr, rerr error - if i.lIter != nil { - lerr = i.lIter.Close(ctx) + var pErr, sErr error + if i.primary != nil { + pErr = i.primary.Close(ctx) } - if i.rIter != nil { - rerr = i.rIter.Close(ctx) + if i.secondary != nil { + sErr = i.secondary.Close(ctx) } - if lerr != nil { - return lerr + if pErr != nil { + return pErr } - if rerr != nil { - return rerr + if sErr != nil { + return sErr } return nil } From f994321304fe064513fd14a03fc1619da518d462 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 15:02:00 -0700 Subject: [PATCH 42/73] copy parent row when building row --- sql/rowexec/join_iters.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index 1a272e6bdf..ee25400023 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -688,7 +688,7 @@ func (i *crossJoinIterator) Close(ctx *sql.Context) (err error) { return err } -// lateralJoinIter is an iterator that performs a lateral join. +// lateralJoinIterator is an iterator that performs a lateral join. // A LateralJoin is a join where the right side is a subquery that can reference the left side, like through a filter. // MySQL Docs: https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html // Example: @@ -806,8 +806,9 @@ func (i *lateralJoinIterator) loadSecondary(ctx *sql.Context) error { func (i *lateralJoinIterator) buildRow(primaryRow, secondaryRow sql.Row) sql.Row { row := make(sql.Row, i.rowSize) - copy(row, primaryRow) - copy(row[len(primaryRow):], secondaryRow) + copy(row, i.parentRow) + copy(row[len(i.parentRow):], primaryRow) + copy(row[len(i.parentRow)+len(primaryRow):], secondaryRow) return row } From 9fdcaeb80151d712f126331a30d68bccd8930b63 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 15:13:17 -0700 Subject: [PATCH 43/73] add test --- enginetest/queries/join_queries.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index 7296f2d0c8..5ea3e97c55 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -1429,4 +1429,20 @@ LATERAL ( }, }, }, + { + // https://github.com/dolthub/dolt/issues/9820 + Name: "lateral cross join with subquery", + SetUpScript: []string{ + "create table t0(c0 boolean)", + "create table t1(c0 int)", + "insert into t0 values (true)", + "insert into t1 values(0)", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "select v.c0, t1.c0 from t0 cross join lateral (select 1 as c0) as v join t1 on v.c0 > t1.c0)", + Expected: []sql.Row{{1, 0}}, + }, + }, + }, } From 731c9da1cfade96ecf6353b326ad209cb7394f87 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Wed, 10 Sep 2025 15:20:23 -0700 Subject: [PATCH 44/73] fix typo --- enginetest/queries/join_queries.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index 5ea3e97c55..b3840c48df 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -1440,7 +1440,7 @@ LATERAL ( }, Assertions: []ScriptTestAssertion{ { - Query: "select v.c0, t1.c0 from t0 cross join lateral (select 1 as c0) as v join t1 on v.c0 > t1.c0)", + Query: "select v.c0, t1.c0 from t0 cross join lateral (select 1 as c0) as v join t1 on v.c0 > t1.c0", Expected: []sql.Row{{1, 0}}, }, }, From 1839a3ef6dcdf4be1e1a86508264fd8a1769393d Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Thu, 11 Sep 2025 10:38:02 -0700 Subject: [PATCH 45/73] update exists iter --- sql/rowexec/join_iters.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index af02d2ac40..a8f2959504 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -247,7 +247,7 @@ func newExistsIter(ctx *sql.Context, b sql.NodeExecBuilder, j *plan.JoinNode, ro cond: j.Filter, scopeLen: j.ScopeLen, rowSize: rowSize, - nullRej: !(j.Filter != nil && plan.IsNullRejecting(j.Filter)), + nullRej: j.Filter != nil && plan.IsNullRejecting(j.Filter), }, nil } @@ -303,10 +303,22 @@ func (i *existsIter) Next(ctx *sql.Context) (sql.Row, error) { return nil, err } if plan.IsEmptyIter(rIter) { - if i.nullRej || i.typ.IsAnti() { - return nil, io.EOF + switch { + case i.typ.IsSemi(): + // EXISTS with empty right is always false → skip this left row + nextState = esIncLeft + case i.typ.IsAnti(): + if i.nullRej { + // Filter is null-rejecting: need to run condition once with nil right so NULL can propagate + // and row may be excluded + nextState = esRet + } else { + // Filter is not null-rejecting: no matches possible, row passes + nextState = esCompare + } + default: + nextState = esCompare } - nextState = esCompare } else { nextState = esIncRight } From ffc890cef639845ac9c24facc927720b5927d957 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Thu, 11 Sep 2025 10:54:19 -0700 Subject: [PATCH 46/73] add test --- enginetest/join_op_tests.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/enginetest/join_op_tests.go b/enginetest/join_op_tests.go index 2cb23ed527..d51d634a39 100644 --- a/enginetest/join_op_tests.go +++ b/enginetest/join_op_tests.go @@ -1980,12 +1980,21 @@ SELECT SUM(x) FROM xy WHERE x IN ( name: "where not exists", setup: [][]string{ setup.XyData[0], + { + "create table t(c varchar(500))", + "insert into t values ('a'),('a')", + }, }, tests: []JoinOpTests{ { Query: `select * from xy_hasnull x where not exists(select 1 from ab_hasnull a where a.b = x.y)`, Expected: []sql.Row{{1, 0}, {3, nil}}, }, + { + // https://github.com/dolthub/dolt/issues/9828 + Query: "with v as (select 'a' as c where false) select null from t where not exists (select 1 from v where v.c <> t.c);", + Expected: []sql.Row{{nil}, {nil}}, + }, }, }, { From 8720cc4f94c48ceb1822aa03c0cbff27494e7703 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Thu, 11 Sep 2025 11:59:32 -0700 Subject: [PATCH 47/73] add tests --- enginetest/join_op_tests.go | 36 ++++++++++++++++++++++++++++++- enginetest/join_planning_tests.go | 32 +++++++++++++++------------ sql/rowexec/join_iters.go | 4 ++-- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/enginetest/join_op_tests.go b/enginetest/join_op_tests.go index d51d634a39..820426c2e3 100644 --- a/enginetest/join_op_tests.go +++ b/enginetest/join_op_tests.go @@ -1977,12 +1977,14 @@ SELECT SUM(x) FROM xy WHERE x IN ( }, }, { - name: "where not exists", + name: "where exists and where not exists", setup: [][]string{ setup.XyData[0], { "create table t(c varchar(500))", "insert into t values ('a'),('a')", + "create table u(c0 int, c1 int, primary key(c0, c1))", + "insert into u values (1, 1),(2,2),(2,3)", }, }, tests: []JoinOpTests{ @@ -1990,11 +1992,43 @@ SELECT SUM(x) FROM xy WHERE x IN ( Query: `select * from xy_hasnull x where not exists(select 1 from ab_hasnull a where a.b = x.y)`, Expected: []sql.Row{{1, 0}, {3, nil}}, }, + { + Query: "select x from xy where exists (select 1 from ab where ab.b = -1)", + Expected: []sql.Row{}, + }, + { + Query: "select x from xy where exists (select 1 from ab where ab.b = xy.y)", + Expected: []sql.Row{{0}, {2}}, + }, + { + Query: "select x from xy where not exists (select 1 from ab where ab.b = xy.y)", + Expected: []sql.Row{{1}, {3}}, + }, + { + Query: "select x from xy_hasnull where not exists(select 1 from ab_hasnull where ab_hasnull.b <> xy_hasnull.y)", + Expected: []sql.Row{{3}}, + }, + { + // TODO: this fails as a merge join. it seems related to https://github.com/dolthub/dolt/issues/9797 + Skip: true, + Query: "select x from xy_hasnull_idx where exists(select 1 from rs where rs.s = xy_hasnull_idx.y)", + Expected: []sql.Row{{1}}, + }, + { + Query: "select x from xy_hasnull_idx where not exists(select 1 from rs where rs.s = xy_hasnull_idx.y)", + Expected: []sql.Row{{2}, {0}, {3}}, + }, { // https://github.com/dolthub/dolt/issues/9828 Query: "with v as (select 'a' as c where false) select null from t where not exists (select 1 from v where v.c <> t.c);", Expected: []sql.Row{{nil}, {nil}}, }, + { + // https://github.com/dolthub/dolt/issues/9797 + Skip: true, + Query: "select * from u where exists (select 1 from u as x where x.c0 = u.c0)", + Expected: []sql.Row{{1, 1}, {2, 2}, {2, 3}}, + }, }, }, { diff --git a/enginetest/join_planning_tests.go b/enginetest/join_planning_tests.go index ac886391d8..554e67208e 100644 --- a/enginetest/join_planning_tests.go +++ b/enginetest/join_planning_tests.go @@ -1943,24 +1943,28 @@ func evalIndexTest(t *testing.T, harness Harness, e QueryEngine, q string, index }) } -func evalJoinCorrectness(t *testing.T, harness Harness, e QueryEngine, name, q string, exp []sql.Row, skipOld bool) { - t.Run(name, func(t *testing.T) { - ctx := NewContext(harness) - ctx = ctx.WithQuery(q) +func evalJoinCorrectness(t *testing.T, harness Harness, e QueryEngine, name, q string, exp []sql.Row, skip bool) { + if skip { + t.Skip() + } else { + t.Run(name, func(t *testing.T) { + ctx := NewContext(harness) + ctx = ctx.WithQuery(q) - sch, iter, _, err := e.QueryWithBindings(ctx, q, nil, nil, nil) - require.NoError(t, err, "Unexpected error for query %s: %s", q, err) + sch, iter, _, err := e.QueryWithBindings(ctx, q, nil, nil, nil) + require.NoError(t, err, "Unexpected error for query %s: %s", q, err) - rows, err := sql.RowIterToRows(ctx, iter) - require.NoError(t, err, "Unexpected error for query %s: %s", q, err) + rows, err := sql.RowIterToRows(ctx, iter) + require.NoError(t, err, "Unexpected error for query %s: %s", q, err) - if exp != nil { - CheckResults(ctx, t, harness, exp, nil, sch, rows, q, e) - } + if exp != nil { + CheckResults(ctx, t, harness, exp, nil, sch, rows, q, e) + } - require.Equal(t, 0, ctx.Memory.NumCaches()) - validateEngine(t, ctx, harness, e) - }) + require.Equal(t, 0, ctx.Memory.NumCaches()) + validateEngine(t, ctx, harness, e) + }) + } } func collectJoinTypes(n sql.Node) []plan.JoinType { diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index a8f2959504..a4026496ef 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -311,10 +311,10 @@ func (i *existsIter) Next(ctx *sql.Context) (sql.Row, error) { if i.nullRej { // Filter is null-rejecting: need to run condition once with nil right so NULL can propagate // and row may be excluded - nextState = esRet + nextState = esCompare } else { // Filter is not null-rejecting: no matches possible, row passes - nextState = esCompare + nextState = esRet } default: nextState = esCompare From 20923af9927aa40c36799db157279a659209e0ab Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Thu, 11 Sep 2025 15:17:51 -0700 Subject: [PATCH 48/73] Wrap right side in distinct when converting semijoins to inner joins --- enginetest/join_op_tests.go | 3 - enginetest/queries/integration_plans.go | 170 +++--- enginetest/queries/query_plan_script_tests.go | 27 +- enginetest/queries/query_plans.go | 484 +++++++----------- enginetest/queries/tpch_plans.go | 178 +++---- optgen/cmd/source/memo.yaml | 1 - sql/analyzer/indexed_joins.go | 9 +- sql/memo/exec_builder.go | 9 +- sql/memo/memo.go | 19 + sql/memo/memo.og.go | 4 +- 10 files changed, 393 insertions(+), 511 deletions(-) diff --git a/enginetest/join_op_tests.go b/enginetest/join_op_tests.go index 820426c2e3..22bb667e1a 100644 --- a/enginetest/join_op_tests.go +++ b/enginetest/join_op_tests.go @@ -2009,8 +2009,6 @@ SELECT SUM(x) FROM xy WHERE x IN ( Expected: []sql.Row{{3}}, }, { - // TODO: this fails as a merge join. it seems related to https://github.com/dolthub/dolt/issues/9797 - Skip: true, Query: "select x from xy_hasnull_idx where exists(select 1 from rs where rs.s = xy_hasnull_idx.y)", Expected: []sql.Row{{1}}, }, @@ -2025,7 +2023,6 @@ SELECT SUM(x) FROM xy WHERE x IN ( }, { // https://github.com/dolthub/dolt/issues/9797 - Skip: true, Query: "select * from u where exists (select 1 from u as x where x.c0 = u.c0)", Expected: []sql.Row{{1, 1}, {2, 2}, {2, 3}}, }, diff --git a/enginetest/queries/integration_plans.go b/enginetest/queries/integration_plans.go index ad392501d8..762899ecd4 100644 --- a/enginetest/queries/integration_plans.go +++ b/enginetest/queries/integration_plans.go @@ -15422,31 +15422,22 @@ ORDER BY cla.FTQLQ ASC`, " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU:2]\n" + " │ └─ SemiLookupJoin\n" + - " │ ├─ Project\n" + - " │ │ ├─ columns: [bs.id:0!null, bs.NFRYN:1!null, bs.IXUXU:2, bs.FHCYT:3]\n" + - " │ │ └─ MergeJoin\n" + - " │ │ ├─ cmp: Eq\n" + - " │ │ │ ├─ bs.id:0!null\n" + - " │ │ │ └─ hgmq6.GXLUB:4!null\n" + - " │ │ ├─ TableAlias(bs)\n" + - " │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ ├─ index: [THNTS.id]\n" + - " │ │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ │ ├─ colSet: (31-34)\n" + - " │ │ │ ├─ tableId: 2\n" + - " │ │ │ └─ Table\n" + - " │ │ │ ├─ name: THNTS\n" + - " │ │ │ └─ columns: [id nfryn ixuxu fhcyt]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [hgmq6.GXLUB:1!null]\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.GXLUB]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (35-51)\n" + - " │ │ ├─ tableId: 3\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: HGMQ6\n" + - " │ │ └─ columns: [id gxlub luevy m22qn tjpt7 arn5p xosd4 ide43 hmw4h zbt6r fsdy2 lt7k6 sppyd qcgts teuja qqv4m fhcyt]\n" + + " │ ├─ SemiLookupJoin\n" + + " │ │ ├─ TableAlias(bs)\n" + + " │ │ │ └─ ProcessTable\n" + + " │ │ │ └─ Table\n" + + " │ │ │ ├─ name: THNTS\n" + + " │ │ │ └─ columns: [id nfryn ixuxu fhcyt]\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [hgmq6.GXLUB:1!null]\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.GXLUB]\n" + + " │ │ ├─ keys: [bs.id:0!null]\n" + + " │ │ ├─ colSet: (35-51)\n" + + " │ │ ├─ tableId: 3\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: HGMQ6\n" + + " │ │ └─ columns: [id gxlub luevy m22qn tjpt7 arn5p xosd4 ide43 hmw4h zbt6r fsdy2 lt7k6 sppyd qcgts teuja qqv4m fhcyt]\n" + " │ └─ Project\n" + " │ ├─ columns: [amyxq.GXLUB:1!null]\n" + " │ └─ IndexedTableAccess(AMYXQ)\n" + @@ -15478,19 +15469,15 @@ ORDER BY cla.FTQLQ ASC`, " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU]\n" + " │ └─ SemiLookupJoin\n" + - " │ ├─ Project\n" + - " │ │ ├─ columns: [bs.id, bs.NFRYN, bs.IXUXU, bs.FHCYT]\n" + - " │ │ └─ MergeJoin\n" + - " │ │ ├─ cmp: (bs.id = hgmq6.GXLUB)\n" + - " │ │ ├─ TableAlias(bs)\n" + - " │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ ├─ index: [THNTS.id]\n" + - " │ │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [hgmq6.GXLUB]\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.GXLUB]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + + " │ ├─ SemiLookupJoin\n" + + " │ │ ├─ TableAlias(bs)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ └─ name: THNTS\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [hgmq6.GXLUB]\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.GXLUB]\n" + + " │ │ └─ keys: bs.id\n" + " │ └─ Project\n" + " │ ├─ columns: [amyxq.GXLUB]\n" + " │ └─ IndexedTableAccess(AMYXQ)\n" + @@ -15515,19 +15502,15 @@ ORDER BY cla.FTQLQ ASC`, " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU]\n" + " │ └─ SemiLookupJoin\n" + - " │ ├─ Project\n" + - " │ │ ├─ columns: [bs.id, bs.NFRYN, bs.IXUXU, bs.FHCYT]\n" + - " │ │ └─ MergeJoin\n" + - " │ │ ├─ cmp: (bs.id = hgmq6.GXLUB)\n" + - " │ │ ├─ TableAlias(bs)\n" + - " │ │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ │ ├─ index: [THNTS.id]\n" + - " │ │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [hgmq6.GXLUB]\n" + - " │ │ └─ IndexedTableAccess(HGMQ6)\n" + - " │ │ ├─ index: [HGMQ6.GXLUB]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + + " │ ├─ SemiLookupJoin\n" + + " │ │ ├─ TableAlias(bs)\n" + + " │ │ │ └─ Table\n" + + " │ │ │ └─ name: THNTS\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [hgmq6.GXLUB]\n" + + " │ │ └─ IndexedTableAccess(HGMQ6)\n" + + " │ │ ├─ index: [HGMQ6.GXLUB]\n" + + " │ │ └─ keys: bs.id\n" + " │ └─ Project\n" + " │ ├─ columns: [amyxq.GXLUB]\n" + " │ └─ IndexedTableAccess(AMYXQ)\n" + @@ -15665,31 +15648,22 @@ ORDER BY cla.FTQLQ ASC`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU:2]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id:0!null, bs.NFRYN:1!null, bs.IXUXU:2, bs.FHCYT:3]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ bs.id:0!null\n" + - " │ │ └─ amyxq.GXLUB:4!null\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.id]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (31-34)\n" + - " │ │ ├─ tableId: 2\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: THNTS\n" + - " │ │ └─ columns: [id nfryn ixuxu fhcyt]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [amyxq.GXLUB:1!null]\n" + - " │ └─ IndexedTableAccess(AMYXQ)\n" + - " │ ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + - " │ ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ ├─ colSet: (35-42)\n" + - " │ ├─ tableId: 3\n" + - " │ └─ Table\n" + - " │ ├─ name: AMYXQ\n" + - " │ └─ columns: [id gxlub luevy xqdyt amyxq oztqf z35gy kkgn5]\n" + + " │ └─ SemiLookupJoin\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ ProcessTable\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: THNTS\n" + + " │ │ └─ columns: [id nfryn ixuxu fhcyt]\n" + + " │ └─ Project\n" + + " │ ├─ columns: [amyxq.GXLUB:1!null]\n" + + " │ └─ IndexedTableAccess(AMYXQ)\n" + + " │ ├─ index: [AMYXQ.GXLUB]\n" + + " │ ├─ keys: [bs.id:0!null]\n" + + " │ ├─ colSet: (35-42)\n" + + " │ ├─ tableId: 3\n" + + " │ └─ Table\n" + + " │ ├─ name: AMYXQ\n" + + " │ └─ columns: [id gxlub luevy xqdyt amyxq oztqf z35gy kkgn5]\n" + " └─ HashLookup\n" + " ├─ left-key: TUPLE(bs.IXUXU:0)\n" + " ├─ right-key: TUPLE(cla.id:0!null)\n" + @@ -15710,19 +15684,15 @@ ORDER BY cla.FTQLQ ASC`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id, bs.NFRYN, bs.IXUXU, bs.FHCYT]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.id = amyxq.GXLUB)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.id]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [amyxq.GXLUB]\n" + - " │ └─ IndexedTableAccess(AMYXQ)\n" + - " │ ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + - " │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ SemiLookupJoin\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: THNTS\n" + + " │ └─ Project\n" + + " │ ├─ columns: [amyxq.GXLUB]\n" + + " │ └─ IndexedTableAccess(AMYXQ)\n" + + " │ ├─ index: [AMYXQ.GXLUB]\n" + + " │ └─ keys: bs.id\n" + " └─ HashLookup\n" + " ├─ left-key: (bs.IXUXU)\n" + " ├─ right-key: (cla.id)\n" + @@ -15741,19 +15711,15 @@ ORDER BY cla.FTQLQ ASC`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [bs.IXUXU]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [bs.id, bs.NFRYN, bs.IXUXU, bs.FHCYT]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: (bs.id = amyxq.GXLUB)\n" + - " │ ├─ TableAlias(bs)\n" + - " │ │ └─ IndexedTableAccess(THNTS)\n" + - " │ │ ├─ index: [THNTS.id]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [amyxq.GXLUB]\n" + - " │ └─ IndexedTableAccess(AMYXQ)\n" + - " │ ├─ index: [AMYXQ.GXLUB,AMYXQ.LUEVY]\n" + - " │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ SemiLookupJoin\n" + + " │ ├─ TableAlias(bs)\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: THNTS\n" + + " │ └─ Project\n" + + " │ ├─ columns: [amyxq.GXLUB]\n" + + " │ └─ IndexedTableAccess(AMYXQ)\n" + + " │ ├─ index: [AMYXQ.GXLUB]\n" + + " │ └─ keys: bs.id\n" + " └─ HashLookup\n" + " ├─ left-key: (bs.IXUXU)\n" + " ├─ right-key: (cla.id)\n" + diff --git a/enginetest/queries/query_plan_script_tests.go b/enginetest/queries/query_plan_script_tests.go index 30419fdc12..09f7e27fb3 100644 --- a/enginetest/queries/query_plan_script_tests.go +++ b/enginetest/queries/query_plan_script_tests.go @@ -170,19 +170,20 @@ var QueryPlanScriptTests = []ScriptTest{ " │ └─ Table\n" + " │ ├─ name: t1\n" + " │ └─ columns: [i]\n" + - " └─ Filter\n" + - " ├─ GreaterThan\n" + - " │ ├─ t2.j:0!null\n" + - " │ └─ 2 (int)\n" + - " └─ IndexedTableAccess(t2)\n" + - " ├─ index: [t2.j]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ reverse: true\n" + - " ├─ colSet: (2)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: t2\n" + - " └─ columns: [j]\n" + + " └─ Distinct\n" + + " └─ Filter\n" + + " ├─ GreaterThan\n" + + " │ ├─ t2.j:0!null\n" + + " │ └─ 2 (int)\n" + + " └─ IndexedTableAccess(t2)\n" + + " ├─ index: [t2.j]\n" + + " ├─ static: [{[NULL, ∞)}]\n" + + " ├─ reverse: true\n" + + " ├─ colSet: (2)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: t2\n" + + " └─ columns: [j]\n" + "", }, { diff --git a/enginetest/queries/query_plans.go b/enginetest/queries/query_plans.go index 1ba0f413bb..a17ff034ef 100644 --- a/enginetest/queries/query_plans.go +++ b/enginetest/queries/query_plans.go @@ -383,32 +383,23 @@ offset 1;`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [xy_1.x:0!null]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_1.x:0!null, xy_1.y:1]\n" + - " │ └─ MergeJoin\n" + - " │ ├─ cmp: Eq\n" + - " │ │ ├─ xy_1.x:0!null\n" + - " │ │ └─ xy_2.y:2\n" + - " │ ├─ TableAlias(xy_1)\n" + - " │ │ └─ IndexedTableAccess(xy)\n" + - " │ │ ├─ index: [xy.x]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (3,4)\n" + - " │ │ ├─ tableId: 2\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: xy\n" + - " │ │ └─ columns: [x y]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_2.y:1]\n" + - " │ └─ TableAlias(xy_2)\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.y]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (5,6)\n" + - " │ ├─ tableId: 3\n" + - " │ └─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [x y]\n" + + " │ └─ SemiLookupJoin\n" + + " │ ├─ TableAlias(xy_1)\n" + + " │ │ └─ ProcessTable\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: xy\n" + + " │ │ └─ columns: [x y]\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xy_2.y:1]\n" + + " │ └─ TableAlias(xy_2)\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.y]\n" + + " │ ├─ keys: [xy_1.x:0!null]\n" + + " │ ├─ colSet: (5,6)\n" + + " │ ├─ tableId: 3\n" + + " │ └─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [x y]\n" + " └─ IndexedTableAccess(xy)\n" + " ├─ index: [xy.y]\n" + " ├─ keys: [xy_1.x:0!null]\n" + @@ -425,20 +416,16 @@ offset 1;`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [xy_1.x]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_1.x, xy_1.y]\n" + - " │ └─ MergeJoin (estimated cost=2030.000 rows=1000)\n" + - " │ ├─ cmp: (xy_1.x = xy_2.y)\n" + - " │ ├─ TableAlias(xy_1)\n" + - " │ │ └─ IndexedTableAccess(xy)\n" + - " │ │ ├─ index: [xy.x]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_2.y]\n" + - " │ └─ TableAlias(xy_2)\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.y]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + + " │ └─ SemiLookupJoin (estimated cost=3300.000 rows=1000)\n" + + " │ ├─ TableAlias(xy_1)\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: xy\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xy_2.y]\n" + + " │ └─ TableAlias(xy_2)\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.y]\n" + + " │ └─ keys: xy_1.x\n" + " └─ IndexedTableAccess(xy)\n" + " ├─ index: [xy.y]\n" + " └─ keys: xy_1.x\n" + @@ -450,20 +437,16 @@ offset 1;`, " ├─ Distinct\n" + " │ └─ Project\n" + " │ ├─ columns: [xy_1.x]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_1.x, xy_1.y]\n" + - " │ └─ MergeJoin (estimated cost=2030.000 rows=1000) (actual rows=4 loops=1)\n" + - " │ ├─ cmp: (xy_1.x = xy_2.y)\n" + - " │ ├─ TableAlias(xy_1)\n" + - " │ │ └─ IndexedTableAccess(xy)\n" + - " │ │ ├─ index: [xy.x]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + - " │ └─ Project\n" + - " │ ├─ columns: [xy_2.y]\n" + - " │ └─ TableAlias(xy_2)\n" + - " │ └─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.y]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + + " │ └─ SemiLookupJoin (estimated cost=3300.000 rows=1000) (actual rows=4 loops=1)\n" + + " │ ├─ TableAlias(xy_1)\n" + + " │ │ └─ Table\n" + + " │ │ └─ name: xy\n" + + " │ └─ Project\n" + + " │ ├─ columns: [xy_2.y]\n" + + " │ └─ TableAlias(xy_2)\n" + + " │ └─ IndexedTableAccess(xy)\n" + + " │ ├─ index: [xy.y]\n" + + " │ └─ keys: xy_1.x\n" + " └─ IndexedTableAccess(xy)\n" + " ├─ index: [xy.y]\n" + " └─ keys: xy_1.x\n" + @@ -2305,56 +2288,39 @@ Select * from ( }, { Query: `select /*+ LOOKUP_JOIN(xy,scalarSubq0) */ * from xy where x in (select a from ab);`, - ExpectedPlan: "Project\n" + - " ├─ columns: [xy.x:0!null, xy.y:1]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ xy.x:0!null\n" + - " │ └─ ab.a:2!null\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (1,2)\n" + - " │ ├─ tableId: 1\n" + - " │ └─ Table\n" + - " │ ├─ name: xy\n" + - " │ └─ columns: [x y]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a:0!null]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: ab\n" + - " └─ columns: [a b]\n" + + ExpectedPlan: "SemiLookupJoin\n" + + " ├─ ProcessTable\n" + + " │ └─ Table\n" + + " │ ├─ name: xy\n" + + " │ └─ columns: [x y]\n" + + " └─ Project\n" + + " ├─ columns: [ab.a:0!null]\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ keys: [xy.x:0!null]\n" + + " ├─ colSet: (3,4)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: ab\n" + + " └─ columns: [a b]\n" + "", - ExpectedEstimates: "Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin (estimated cost=2030.000 rows=1000)\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " └─ filters: [{[NULL, ∞)}]\n" + + ExpectedEstimates: "SemiLookupJoin (estimated cost=3300.000 rows=1000)\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ Project\n" + + " ├─ columns: [ab.a]\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " └─ keys: xy.x\n" + "", - ExpectedAnalysis: "Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin (estimated cost=2030.000 rows=1000) (actual rows=4 loops=1)\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " └─ filters: [{[NULL, ∞)}]\n" + + ExpectedAnalysis: "SemiLookupJoin (estimated cost=3300.000 rows=1000) (actual rows=4 loops=1)\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ Project\n" + + " ├─ columns: [ab.a]\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " └─ keys: xy.x\n" + "", }, { @@ -4817,68 +4783,45 @@ Select * from ( " └─ GroupBy\n" + " ├─ select: COUNT(1 (bigint))\n" + " ├─ group: ab.a:0!null\n" + - " └─ Project\n" + - " ├─ columns: [ab.a:0!null, ab.b:1]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ ab.a:0!null\n" + - " │ └─ xy.x:2!null\n" + - " ├─ IndexedTableAccess(ab)\n" + - " │ ├─ index: [ab.a]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (1,2)\n" + - " │ ├─ tableId: 1\n" + - " │ └─ Table\n" + - " │ ├─ name: ab\n" + - " │ └─ columns: [a b]\n" + - " └─ Project\n" + - " ├─ columns: [xy.x:0!null]\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: xy\n" + - " └─ columns: [x y]\n" + + " └─ SemiLookupJoin\n" + + " ├─ ProcessTable\n" + + " │ └─ Table\n" + + " │ ├─ name: ab\n" + + " │ └─ columns: [a b]\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ keys: [ab.a:0!null]\n" + + " ├─ colSet: (3,4)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: xy\n" + + " └─ columns: [x y]\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [count(1) as cnt]\n" + " └─ GroupBy\n" + " ├─ SelectDeps(COUNT(1))\n" + " ├─ Grouping(ab.a)\n" + - " └─ Project\n" + - " ├─ columns: [ab.a, ab.b]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (ab.a = xy.x)\n" + - " ├─ IndexedTableAccess(ab)\n" + - " │ ├─ index: [ab.a]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [xy.x]\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [x y]\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: ab\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x y]\n" + + " └─ keys: ab.a\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [count(1) as cnt]\n" + " └─ GroupBy\n" + " ├─ SelectDeps(COUNT(1))\n" + " ├─ Grouping(ab.a)\n" + - " └─ Project\n" + - " ├─ columns: [ab.a, ab.b]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (ab.a = xy.x)\n" + - " ├─ IndexedTableAccess(ab)\n" + - " │ ├─ index: [ab.a]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [xy.x]\n" + - " └─ IndexedTableAccess(xy)\n" + - " ├─ index: [xy.x]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [x y]\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: ab\n" + + " └─ IndexedTableAccess(xy)\n" + + " ├─ index: [xy.x]\n" + + " ├─ columns: [x y]\n" + + " └─ keys: ab.a\n" + "", }, { @@ -5332,117 +5275,77 @@ Select * from ( }, { Query: `select * from xy where exists (select * from ab where a = x) order by x`, - ExpectedPlan: "Project\n" + - " ├─ columns: [xy.x:0!null, xy.y:1]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ xy.x:0!null\n" + - " │ └─ ab.a:2!null\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (1,2)\n" + - " │ ├─ tableId: 1\n" + + ExpectedPlan: "Sort(xy.x:0!null ASC nullsFirst)\n" + + " └─ SemiLookupJoin\n" + + " ├─ ProcessTable\n" + " │ └─ Table\n" + " │ ├─ name: xy\n" + " │ └─ columns: [x y]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a:0!null]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: ab\n" + - " └─ columns: [a b]\n" + - "", - ExpectedEstimates: "Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin (estimated cost=2030.000 rows=1000)\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ keys: [xy.x:0!null]\n" + + " ├─ colSet: (3,4)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: ab\n" + " └─ columns: [a b]\n" + "", - ExpectedAnalysis: "Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin (estimated cost=2030.000 rows=1000) (actual rows=4 loops=1)\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [a b]\n" + + ExpectedEstimates: "Sort(xy.x ASC)\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ columns: [a b]\n" + + " └─ keys: xy.x\n" + + "", + ExpectedAnalysis: "Sort(xy.x ASC)\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ columns: [a b]\n" + + " └─ keys: xy.x\n" + "", }, { Query: `select * from xy where exists (select * from ab where a = x order by a limit 2) order by x limit 5`, ExpectedPlan: "Limit(5)\n" + - " └─ Project\n" + - " ├─ columns: [xy.x:0!null, xy.y:1]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ xy.x:0!null\n" + - " │ └─ ab.a:2!null\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ ├─ static: [{[NULL, ∞)}]\n" + - " │ ├─ colSet: (1,2)\n" + - " │ ├─ tableId: 1\n" + + " └─ TopN(Limit: [5 (bigint)]; xy.x:0!null ASC nullsFirst)\n" + + " └─ SemiLookupJoin\n" + + " ├─ ProcessTable\n" + " │ └─ Table\n" + " │ ├─ name: xy\n" + " │ └─ columns: [x y]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a:0!null]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: ab\n" + - " └─ columns: [a b]\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ keys: [xy.x:0!null]\n" + + " ├─ colSet: (3,4)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: ab\n" + + " └─ columns: [a b]\n" + "", ExpectedEstimates: "Limit(5)\n" + - " └─ Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [a b]\n" + + " └─ TopN(Limit: [5]; xy.x ASC)\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ columns: [a b]\n" + + " └─ keys: xy.x\n" + "", ExpectedAnalysis: "Limit(5)\n" + - " └─ Project\n" + - " ├─ columns: [xy.x, xy.y]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: (xy.x = ab.a)\n" + - " ├─ IndexedTableAccess(xy)\n" + - " │ ├─ index: [xy.x]\n" + - " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [ab.a]\n" + - " └─ IndexedTableAccess(ab)\n" + - " ├─ index: [ab.a]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [a b]\n" + + " └─ TopN(Limit: [5]; xy.x ASC)\n" + + " └─ SemiLookupJoin\n" + + " ├─ Table\n" + + " │ └─ name: xy\n" + + " └─ IndexedTableAccess(ab)\n" + + " ├─ index: [ab.a]\n" + + " ├─ columns: [a b]\n" + + " └─ keys: xy.x\n" + "", }, { @@ -5696,7 +5599,7 @@ where exists (select * from pq where a = p) " └─ HashLookup\n" + " ├─ left-key: TUPLE(alias1.a:0!null)\n" + " ├─ right-key: TUPLE(pq.p:0!null)\n" + - " └─ OrderedDistinct\n" + + " └─ Distinct\n" + " └─ Project\n" + " ├─ columns: [pq.p:0!null]\n" + " └─ ProcessTable\n" + @@ -5731,7 +5634,7 @@ where exists (select * from pq where a = p) " └─ HashLookup\n" + " ├─ left-key: (alias1.a)\n" + " ├─ right-key: (pq.p)\n" + - " └─ OrderedDistinct\n" + + " └─ Distinct\n" + " └─ Project\n" + " ├─ columns: [pq.p]\n" + " └─ Table\n" + @@ -5765,7 +5668,7 @@ where exists (select * from pq where a = p) " └─ HashLookup\n" + " ├─ left-key: (alias1.a)\n" + " ├─ right-key: (pq.p)\n" + - " └─ OrderedDistinct\n" + + " └─ Distinct\n" + " └─ Project\n" + " ├─ columns: [pq.p]\n" + " └─ Table\n" + @@ -6082,62 +5985,45 @@ inner join pq on true Query: `select i from mytable a where exists (select 1 from mytable b where a.i = b.i)`, ExpectedPlan: "Project\n" + " ├─ columns: [a.i:0!null]\n" + - " └─ Project\n" + - " ├─ columns: [a.i:0!null, a.s:1!null]\n" + - " └─ MergeJoin\n" + - " ├─ cmp: Eq\n" + - " │ ├─ a.i:0!null\n" + - " │ └─ b.i:2!null\n" + - " ├─ TableAlias(a)\n" + - " │ └─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ ├─ colSet: (1,2)\n" + - " │ ├─ tableId: 1\n" + - " │ └─ Table\n" + - " │ ├─ name: mytable\n" + - " │ └─ columns: [i s]\n" + - " └─ TableAlias(b)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ static: [{[NULL, ∞)}]\n" + - " ├─ colSet: (3,4)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: mytable\n" + - " └─ columns: [i]\n" + + " └─ SemiJoin\n" + + " ├─ Eq\n" + + " │ ├─ a.i:0!null\n" + + " │ └─ b.i:2!null\n" + + " ├─ TableAlias(a)\n" + + " │ └─ ProcessTable\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: [i s]\n" + + " └─ TableAlias(b)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " ├─ columns: [i]\n" + + " ├─ colSet: (3,4)\n" + + " └─ tableId: 2\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [a.i]\n" + - " └─ Project\n" + - " ├─ columns: [a.i, a.s]\n" + - " └─ MergeJoin (estimated cost=6.090 rows=3)\n" + - " ├─ cmp: (a.i = b.i)\n" + - " ├─ TableAlias(a)\n" + - " │ └─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " └─ TableAlias(b)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [i]\n" + + " └─ SemiJoin (estimated cost=7.545 rows=3)\n" + + " ├─ (a.i = b.i)\n" + + " ├─ TableAlias(a)\n" + + " │ └─ Table\n" + + " │ └─ name: mytable\n" + + " └─ TableAlias(b)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [a.i]\n" + - " └─ Project\n" + - " ├─ columns: [a.i, a.s]\n" + - " └─ MergeJoin (estimated cost=6.090 rows=3) (actual rows=3 loops=1)\n" + - " ├─ cmp: (a.i = b.i)\n" + - " ├─ TableAlias(a)\n" + - " │ └─ IndexedTableAccess(mytable)\n" + - " │ ├─ index: [mytable.i,mytable.s]\n" + - " │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " └─ TableAlias(b)\n" + - " └─ IndexedTableAccess(mytable)\n" + - " ├─ index: [mytable.i]\n" + - " ├─ filters: [{[NULL, ∞)}]\n" + - " └─ columns: [i]\n" + + " └─ SemiJoin (estimated cost=7.545 rows=3) (actual rows=3 loops=1)\n" + + " ├─ (a.i = b.i)\n" + + " ├─ TableAlias(a)\n" + + " │ └─ Table\n" + + " │ └─ name: mytable\n" + + " └─ TableAlias(b)\n" + + " └─ Table\n" + + " ├─ name: mytable\n" + + " └─ columns: [i]\n" + "", }, { diff --git a/enginetest/queries/tpch_plans.go b/enginetest/queries/tpch_plans.go index fb068b4950..f0a67d0e69 100644 --- a/enginetest/queries/tpch_plans.go +++ b/enginetest/queries/tpch_plans.go @@ -488,20 +488,21 @@ order by " │ └─ Table\n" + " │ ├─ name: orders\n" + " │ └─ columns: [o_orderkey o_custkey o_orderstatus o_totalprice o_orderdate o_orderpriority o_clerk o_shippriority o_comment]\n" + - " └─ Project\n" + - " ├─ columns: [lineitem.l_orderkey:0!null]\n" + - " └─ Filter\n" + - " ├─ LessThan\n" + - " │ ├─ lineitem.l_commitdate:11!null\n" + - " │ └─ lineitem.l_receiptdate:12!null\n" + - " └─ IndexedTableAccess(lineitem)\n" + - " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + - " ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + - " ├─ colSet: (10-25)\n" + - " ├─ tableId: 2\n" + - " └─ Table\n" + - " ├─ name: lineitem\n" + - " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [lineitem.l_orderkey:0!null]\n" + + " └─ Filter\n" + + " ├─ LessThan\n" + + " │ ├─ lineitem.l_commitdate:11!null\n" + + " │ └─ lineitem.l_receiptdate:12!null\n" + + " └─ IndexedTableAccess(lineitem)\n" + + " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + + " ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + + " ├─ colSet: (10-25)\n" + + " ├─ tableId: 2\n" + + " └─ Table\n" + + " ├─ name: lineitem\n" + + " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + "", ExpectedEstimates: "Project\n" + " ├─ columns: [orders.o_orderpriority, count(1) as order_count]\n" + @@ -518,14 +519,15 @@ order by " │ └─ IndexedTableAccess(orders)\n" + " │ ├─ index: [orders.O_ORDERKEY]\n" + " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [lineitem.l_orderkey]\n" + - " └─ Filter\n" + - " ├─ (lineitem.l_commitdate < lineitem.l_receiptdate)\n" + - " └─ IndexedTableAccess(lineitem)\n" + - " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + - " ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [lineitem.l_orderkey]\n" + + " └─ Filter\n" + + " ├─ (lineitem.l_commitdate < lineitem.l_receiptdate)\n" + + " └─ IndexedTableAccess(lineitem)\n" + + " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + + " ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + "", ExpectedAnalysis: "Project\n" + " ├─ columns: [orders.o_orderpriority, count(1) as order_count]\n" + @@ -542,14 +544,15 @@ order by " │ └─ IndexedTableAccess(orders)\n" + " │ ├─ index: [orders.O_ORDERKEY]\n" + " │ └─ filters: [{[NULL, ∞)}]\n" + - " └─ Project\n" + - " ├─ columns: [lineitem.l_orderkey]\n" + - " └─ Filter\n" + - " ├─ (lineitem.l_commitdate < lineitem.l_receiptdate)\n" + - " └─ IndexedTableAccess(lineitem)\n" + - " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + - " ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + + " └─ Distinct\n" + + " └─ Project\n" + + " ├─ columns: [lineitem.l_orderkey]\n" + + " └─ Filter\n" + + " ├─ (lineitem.l_commitdate < lineitem.l_receiptdate)\n" + + " └─ IndexedTableAccess(lineitem)\n" + + " ├─ index: [lineitem.L_ORDERKEY,lineitem.L_LINENUMBER]\n" + + " ├─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " └─ columns: [l_orderkey l_partkey l_suppkey l_linenumber l_quantity l_extendedprice l_discount l_tax l_returnflag l_linestatus l_shipdate l_commitdate l_receiptdate l_shipinstruct l_shipmode l_comment]\n" + "", }, { @@ -3061,48 +3064,49 @@ order by " │ │ │ └─ Table\n" + " │ │ │ ├─ name: partsupp\n" + " │ │ │ └─ columns: [ps_partkey ps_suppkey ps_availqty ps_supplycost ps_comment]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [part.p_partkey:0!null]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ AND\n" + - " │ │ │ ├─ AND\n" + - " │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ │ │ │ ├─ AND\n" + - " │ │ │ │ │ │ │ │ │ ├─ GreaterThanOrEqual\n" + - " │ │ │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ │ │ │ │ │ └─ forest (longtext)\n" + - " │ │ │ │ │ │ │ │ │ └─ LessThanOrEqual\n" + - " │ │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ │ │ │ │ └─ forestÿ (longtext)\n" + - " │ │ │ │ │ │ │ │ └─ GreaterThanOrEqual\n" + - " │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ │ │ │ └─ forest (longtext)\n" + - " │ │ │ │ │ │ │ └─ LessThanOrEqual\n" + - " │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ │ │ └─ forestÿ (longtext)\n" + - " │ │ │ │ │ │ └─ GreaterThanOrEqual\n" + - " │ │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ │ └─ forest (longtext)\n" + - " │ │ │ │ │ └─ LessThanOrEqual\n" + - " │ │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ │ └─ forestÿ (longtext)\n" + - " │ │ │ │ └─ GreaterThanOrEqual\n" + - " │ │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ │ └─ forest (longtext)\n" + - " │ │ │ └─ LessThanOrEqual\n" + - " │ │ │ ├─ part.p_name:1!null\n" + - " │ │ │ └─ forestÿ (longtext)\n" + - " │ │ └─ IndexedTableAccess(part)\n" + - " │ │ ├─ index: [part.P_PARTKEY]\n" + - " │ │ ├─ static: [{[NULL, ∞)}]\n" + - " │ │ ├─ colSet: (17-25)\n" + - " │ │ ├─ tableId: 4\n" + - " │ │ └─ Table\n" + - " │ │ ├─ name: part\n" + - " │ │ └─ columns: [p_partkey p_name p_mfgr p_brand p_type p_size p_container p_retailprice p_comment]\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [part.p_partkey:0!null]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ AND\n" + + " │ │ │ ├─ AND\n" + + " │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ │ │ │ ├─ AND\n" + + " │ │ │ │ │ │ │ │ │ ├─ GreaterThanOrEqual\n" + + " │ │ │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ │ │ │ │ │ └─ forest (longtext)\n" + + " │ │ │ │ │ │ │ │ │ └─ LessThanOrEqual\n" + + " │ │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ │ │ │ │ └─ forestÿ (longtext)\n" + + " │ │ │ │ │ │ │ │ └─ GreaterThanOrEqual\n" + + " │ │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ │ │ │ └─ forest (longtext)\n" + + " │ │ │ │ │ │ │ └─ LessThanOrEqual\n" + + " │ │ │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ │ │ └─ forestÿ (longtext)\n" + + " │ │ │ │ │ │ └─ GreaterThanOrEqual\n" + + " │ │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ │ └─ forest (longtext)\n" + + " │ │ │ │ │ └─ LessThanOrEqual\n" + + " │ │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ │ └─ forestÿ (longtext)\n" + + " │ │ │ │ └─ GreaterThanOrEqual\n" + + " │ │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ │ └─ forest (longtext)\n" + + " │ │ │ └─ LessThanOrEqual\n" + + " │ │ │ ├─ part.p_name:1!null\n" + + " │ │ │ └─ forestÿ (longtext)\n" + + " │ │ └─ IndexedTableAccess(part)\n" + + " │ │ ├─ index: [part.P_PARTKEY]\n" + + " │ │ ├─ static: [{[NULL, ∞)}]\n" + + " │ │ ├─ colSet: (17-25)\n" + + " │ │ ├─ tableId: 4\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: part\n" + + " │ │ └─ columns: [p_partkey p_name p_mfgr p_brand p_type p_size p_container p_retailprice p_comment]\n" + " │ └─ IndexedTableAccess(supplier)\n" + " │ ├─ index: [supplier.S_SUPPKEY]\n" + " │ ├─ keys: [partsupp.ps_suppkey:0!null]\n" + @@ -3142,13 +3146,14 @@ order by " │ │ ├─ IndexedTableAccess(partsupp)\n" + " │ │ │ ├─ index: [partsupp.PS_PARTKEY,partsupp.PS_SUPPKEY]\n" + " │ │ │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [part.p_partkey]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((((((((part.p_name >= 'forest') AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ'))\n" + - " │ │ └─ IndexedTableAccess(part)\n" + - " │ │ ├─ index: [part.P_PARTKEY]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [part.p_partkey]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((((((((part.p_name >= 'forest') AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ'))\n" + + " │ │ └─ IndexedTableAccess(part)\n" + + " │ │ ├─ index: [part.P_PARTKEY]\n" + + " │ │ └─ filters: [{[NULL, ∞)}]\n" + " │ └─ IndexedTableAccess(supplier)\n" + " │ ├─ index: [supplier.S_SUPPKEY]\n" + " │ └─ keys: partsupp.ps_suppkey\n" + @@ -3176,13 +3181,14 @@ order by " │ │ ├─ IndexedTableAccess(partsupp)\n" + " │ │ │ ├─ index: [partsupp.PS_PARTKEY,partsupp.PS_SUPPKEY]\n" + " │ │ │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + - " │ │ └─ Project\n" + - " │ │ ├─ columns: [part.p_partkey]\n" + - " │ │ └─ Filter\n" + - " │ │ ├─ ((((((((part.p_name >= 'forest') AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ'))\n" + - " │ │ └─ IndexedTableAccess(part)\n" + - " │ │ ├─ index: [part.P_PARTKEY]\n" + - " │ │ └─ filters: [{[NULL, ∞)}]\n" + + " │ │ └─ Distinct\n" + + " │ │ └─ Project\n" + + " │ │ ├─ columns: [part.p_partkey]\n" + + " │ │ └─ Filter\n" + + " │ │ ├─ ((((((((part.p_name >= 'forest') AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ')) AND (part.p_name >= 'forest')) AND (part.p_name <= 'forestÿ'))\n" + + " │ │ └─ IndexedTableAccess(part)\n" + + " │ │ ├─ index: [part.P_PARTKEY]\n" + + " │ │ └─ filters: [{[NULL, ∞)}]\n" + " │ └─ IndexedTableAccess(supplier)\n" + " │ ├─ index: [supplier.S_SUPPKEY]\n" + " │ └─ keys: partsupp.ps_suppkey\n" + diff --git a/optgen/cmd/source/memo.yaml b/optgen/cmd/source/memo.yaml index 285586012e..bd0ee98803 100644 --- a/optgen/cmd/source/memo.yaml +++ b/optgen/cmd/source/memo.yaml @@ -73,7 +73,6 @@ exprs: - [projections, "[]sql.Expression"] - name: "Distinct" unary: true - skipExec: true - name: "Max1Row" unary: true - name: "Filter" diff --git a/sql/analyzer/indexed_joins.go b/sql/analyzer/indexed_joins.go index 5d4ade4fbb..a250274c06 100644 --- a/sql/analyzer/indexed_joins.go +++ b/sql/analyzer/indexed_joins.go @@ -465,10 +465,11 @@ func convertSemiToInnerJoin(m *memo.Memo) error { projectExpressions = append(projectExpressions, p) } - // project is a new group - rightGrp := m.MemoizeProject(nil, semi.Right, projectExpressions) - if _, ok := semi.Right.First.(*memo.Distinct); !ok { - rightGrp.RelProps.Distinct = memo.HashDistinctOp + var rightGrp *memo.ExprGroup + if _, ok := semi.Right.First.(*memo.Distinct); ok { + rightGrp = m.MemoizeProject(nil, semi.Right, projectExpressions) + } else { + rightGrp = m.MemoizeDistinctProject(nil, semi.Right, projectExpressions) } // join and its commute are a new group diff --git a/sql/memo/exec_builder.go b/sql/memo/exec_builder.go index c8aa2dda05..36c4ac4052 100644 --- a/sql/memo/exec_builder.go +++ b/sql/memo/exec_builder.go @@ -21,7 +21,8 @@ func (b *ExecBuilder) buildRel(r RelExpr, children ...sql.Node) (sql.Node, error return nil, err } - return b.buildDistinct(n, r.Distinct()) + // TODO: distinctOp doesn't seem to be propagated through all the time + return b.buildDistinctWrapper(n, r.Distinct()) } func (b *ExecBuilder) buildInnerJoin(j *InnerJoin, children ...sql.Node) (sql.Node, error) { @@ -356,12 +357,16 @@ func (b *ExecBuilder) buildProject(r *Project, children ...sql.Node) (sql.Node, return plan.NewProject(proj, children[0]), nil } +func (b *ExecBuilder) buildDistinct(r *Distinct, children ...sql.Node) (sql.Node, error) { + return plan.NewDistinct(children[0]), nil +} + func (b *ExecBuilder) buildFilter(r *Filter, children ...sql.Node) (sql.Node, error) { ret := plan.NewFilter(expression.JoinAnd(r.Filters...), children[0]) return ret, nil } -func (b *ExecBuilder) buildDistinct(n sql.Node, d distinctOp) (sql.Node, error) { +func (b *ExecBuilder) buildDistinctWrapper(n sql.Node, d distinctOp) (sql.Node, error) { switch d { case HashDistinctOp: return plan.NewDistinct(n), nil diff --git a/sql/memo/memo.go b/sql/memo/memo.go index 715d38464a..cc017fad8d 100644 --- a/sql/memo/memo.go +++ b/sql/memo/memo.go @@ -305,6 +305,25 @@ func (m *Memo) MemoizeProject(grp, child *ExprGroup, projections []sql.Expressio return grp } +func (m *Memo) MemoizeDistinctProject(grp, child *ExprGroup, projections []sql.Expression) *ExprGroup { + proj := &Project{ + relBase: &relBase{}, + Child: child, + Projections: projections, + } + projGrp := m.NewExprGroup(proj) + distinct := &Distinct{ + relBase: &relBase{}, + Child: projGrp, + } + if grp == nil { + return m.NewExprGroup(distinct) + } + distinct.g = grp + grp.Prepend(distinct) + return grp +} + // memoizeIndexScan creates a source node that uses a specific index to // access data func (m *Memo) memoizeIndexScan(grp *ExprGroup, ita *plan.IndexedTableAccess, alias string, index *Index, stat sql.Statistic) *ExprGroup { diff --git a/sql/memo/memo.og.go b/sql/memo/memo.og.go index 60cfc61e65..09d52be0f9 100644 --- a/sql/memo/memo.og.go +++ b/sql/memo/memo.og.go @@ -234,11 +234,11 @@ func (r *TableScan) Children() []*ExprGroup { } type IndexScan struct { - Stats sql.Statistic *sourceBase Table *plan.IndexedTableAccess Index *Index Alias string + Stats sql.Statistic } var _ RelExpr = (*IndexScan)(nil) @@ -751,6 +751,8 @@ func buildRelExpr(b *ExecBuilder, r RelExpr, children ...sql.Node) (sql.Node, er result, err = b.buildSetOp(r, children...) case *Project: result, err = b.buildProject(r, children...) + case *Distinct: + result, err = b.buildDistinct(r, children...) case *Max1Row: result, err = b.buildMax1Row(r, children...) case *Filter: From f0850dae28bf196355496bb5974e886b7ff2963d Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Thu, 11 Sep 2025 15:47:46 -0700 Subject: [PATCH 49/73] rename buildDistinctWrapper to wrapInDistinct --- sql/memo/exec_builder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/memo/exec_builder.go b/sql/memo/exec_builder.go index 36c4ac4052..5007c66416 100644 --- a/sql/memo/exec_builder.go +++ b/sql/memo/exec_builder.go @@ -22,7 +22,7 @@ func (b *ExecBuilder) buildRel(r RelExpr, children ...sql.Node) (sql.Node, error } // TODO: distinctOp doesn't seem to be propagated through all the time - return b.buildDistinctWrapper(n, r.Distinct()) + return b.wrapInDistinct(n, r.Distinct()) } func (b *ExecBuilder) buildInnerJoin(j *InnerJoin, children ...sql.Node) (sql.Node, error) { @@ -366,7 +366,7 @@ func (b *ExecBuilder) buildFilter(r *Filter, children ...sql.Node) (sql.Node, er return ret, nil } -func (b *ExecBuilder) buildDistinctWrapper(n sql.Node, d distinctOp) (sql.Node, error) { +func (b *ExecBuilder) wrapInDistinct(n sql.Node, d distinctOp) (sql.Node, error) { switch d { case HashDistinctOp: return plan.NewDistinct(n), nil From 9388f0340bec96156f239dab823006134b9721e6 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 12 Sep 2025 09:42:42 -0700 Subject: [PATCH 50/73] Copy parent row in fullJoinIter --- sql/rowexec/join_iters.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index f122f9752e..0e24a16dfe 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -570,8 +570,9 @@ func (i *fullJoinIter) removeParentRow(r sql.Row) sql.Row { // buildRow builds the result set row using the rows from the primary and secondary tables func (i *fullJoinIter) buildRow(primary, secondary sql.Row) sql.Row { row := make(sql.Row, i.rowSize) - copy(row, primary) - copy(row[len(primary):], secondary) + copy(row, i.parentRow) + copy(row[len(i.parentRow):], primary) + copy(row[len(i.parentRow)+len(primary):], secondary) return row } From 6164474a0a7510829557182b95ac646b703fb8db Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 12 Sep 2025 09:50:07 -0700 Subject: [PATCH 51/73] add test --- enginetest/queries/join_queries.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/enginetest/queries/join_queries.go b/enginetest/queries/join_queries.go index b3840c48df..98125dd66c 100644 --- a/enginetest/queries/join_queries.go +++ b/enginetest/queries/join_queries.go @@ -1445,4 +1445,22 @@ LATERAL ( }, }, }, + { + Name: "full outer join as child of cross join", + SetUpScript: []string{ + "CREATE TABLE t1(c0 VARCHAR(500) , c1 INT , c2 BOOLEAN);", + "CREATE TABLE t2(c0 INT , c1 VARCHAR(500) , c2 BOOLEAN);", + "CREATE TABLE t3(c0 VARCHAR(500) , c1 INT);", + "INSERT INTO t1 VALUES ('UjhU', 9, TRUE);", + "INSERT INTO t2 VALUES (5, 'ao', TRUE);", + "INSERT INTO t3 VALUES ('4GD', 6);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT t2.c0, t2.c1, t2.c2 FROM t2 FULL OUTER JOIN t3 ON LEFT(t2.c1, 2) = t2.c1 CROSS JOIN (SELECT t1.c0 AS c0 FROM t1) AS vtable0;", + // TODO: possible type mismatch; 1 should be true + Expected: []sql.Row{{5, "ao", 1}}, + }, + }, + }, } From b763e436458f2f533acfc122b23fa984f9075afe Mon Sep 17 00:00:00 2001 From: elianddb Date: Tue, 9 Sep 2025 18:05:09 +0000 Subject: [PATCH 52/73] add test w warn and cast fix --- enginetest/queries/script_queries.go | 18 ++++++++++++ sql/expression/comparison.go | 6 ++-- sql/expression/convert.go | 1 + sql/expression/in.go | 42 +++++++--------------------- 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index e1391ce9b4..b0f03aec62 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -120,6 +120,24 @@ type ScriptTestAssertion struct { // Unlike other engine tests, ScriptTests must be self-contained. No other tables are created outside the definition of // the tests. var ScriptTests = []ScriptTest{ + { + // https://github.com/dolthub/dolt/issues/9812 + Name: "String-to-number comparison operators should behave consistently", + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT ('A') = (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: 1292, + }, + { + Query: "SELECT ('A') IN (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: 1292, + }, + }, + }, { // https://github.com/dolthub/dolt/issues/9794 Name: "UPDATE with TRIM function on TEXT column", diff --git a/sql/expression/comparison.go b/sql/expression/comparison.go index 97e5f4ba6e..7ea42c475d 100644 --- a/sql/expression/comparison.go +++ b/sql/expression/comparison.go @@ -141,7 +141,7 @@ func (c *comparison) Compare(ctx *sql.Context, row sql.Row) (int, error) { return c.Left().Type().Compare(ctx, left, right) } - l, r, compareType, err := c.castLeftAndRight(ctx, left, right) + l, r, compareType, err := c.CastLeftAndRight(ctx, left, right) if err != nil { return 0, err } @@ -171,7 +171,7 @@ func (c *comparison) evalLeftAndRight(ctx *sql.Context, row sql.Row) (interface{ return left, right, nil } -func (c *comparison) castLeftAndRight(ctx *sql.Context, left, right interface{}) (interface{}, interface{}, sql.Type, error) { +func (c *comparison) CastLeftAndRight(ctx *sql.Context, left, right interface{}) (interface{}, interface{}, sql.Type, error) { leftType := c.Left().Type() rightType := c.Right().Type() @@ -452,7 +452,7 @@ func (e *NullSafeEquals) Compare(ctx *sql.Context, row sql.Row) (int, error) { } var compareType sql.Type - left, right, compareType, err = e.castLeftAndRight(ctx, left, right) + left, right, compareType, err = e.CastLeftAndRight(ctx, left, right) if err != nil { return 0, err } diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 28a8ce385b..85220df2ab 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -488,6 +488,7 @@ func prepareForNumericContext(val interface{}, originType sql.Type, isInt bool) return convertHexBlobToDecimalForNumericContext(val, originType) } + // trimStringToNumberPrefix trims a string to the appropriate number prefix func trimStringToNumberPrefix(s string, isInt bool) string { if isInt { diff --git a/sql/expression/in.go b/sql/expression/in.go index fada137f48..ff83676b38 100644 --- a/sql/expression/in.go +++ b/sql/expression/in.go @@ -61,8 +61,7 @@ func NewInTuple(left sql.Expression, right sql.Expression) *InTuple { // Eval implements the Expression interface. func (in *InTuple) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { - typ := in.Left().Type().Promote() - leftElems := types.NumColumns(typ) + leftElems := types.NumColumns(in.Left().Type()) originalLeft, err := in.Left().Eval(ctx, row) if err != nil { return nil, err @@ -78,11 +77,6 @@ func (in *InTuple) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { // also if no match is found in the list and one of the expressions in the list is NULL. rightNull := false - left, _, err := typ.Convert(ctx, originalLeft) - if err != nil { - return nil, err - } - switch right := in.Right().(type) { case Tuple: for _, el := range right { @@ -102,31 +96,14 @@ func (in *InTuple) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { continue } - var cmp int - elType := el.Type() - if types.IsDecimal(elType) || types.IsFloat(elType) { - rtyp := el.Type().Promote() - left, err := types.ConvertOrTruncate(ctx, left, rtyp) - if err != nil { - return nil, err - } - right, err := types.ConvertOrTruncate(ctx, originalRight, rtyp) - if err != nil { - return nil, err - } - cmp, err = rtyp.Compare(ctx, left, right) - if err != nil { - return nil, err - } - } else { - right, err := types.ConvertOrTruncate(ctx, originalRight, typ) - if err != nil { - return nil, err - } - cmp, err = typ.Compare(ctx, left, right) - if err != nil { - return nil, err - } + comp := newComparison(NewLiteral(originalLeft, in.Left().Type()), NewLiteral(originalRight, el.Type())) + l, r, compareType, err := comp.CastLeftAndRight(ctx, originalLeft, originalRight) + if err != nil { + return nil, err + } + cmp, err := compareType.Compare(ctx, l, r) + if err != nil { + return nil, err } if cmp == 0 { @@ -175,6 +152,7 @@ func NewNotInTuple(left sql.Expression, right sql.Expression) sql.Expression { return NewNot(NewInTuple(left, right)) } + // HashInTuple is an expression that checks an expression is inside a list of expressions using a hashmap. type HashInTuple struct { in *InTuple From 576a3a709ff0674f3bd1b0c25b83901e760b3f08 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 18:16:45 +0000 Subject: [PATCH 53/73] add warning tests for dolthub/dolt#9834 --- enginetest/queries/script_queries.go | 42 ++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index b0f03aec62..931c676fbf 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -120,6 +120,48 @@ type ScriptTestAssertion struct { // Unlike other engine tests, ScriptTests must be self-contained. No other tables are created outside the definition of // the tests. var ScriptTests = []ScriptTest{ + { + // https://github.com/dolthub/dolt/issues/9733 + Name: "String to number casting should handle partial numeric strings with warnings", + SetUpScript: []string{ + "CREATE TABLE test01(pk VARCHAR(20) PRIMARY KEY)", + "INSERT INTO test01 VALUES ('11d'), ('11wha?'), ('11'), ('12')", + "CREATE TABLE test_cast(pk VARCHAR(50) PRIMARY KEY)", + "INSERT INTO test_cast VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234'), ('11-5'), ('1a1'), ('2,345'), ('4,12'), ('5.932887e+07'), ('5.932887e+07abc'), ('5.932887e7'), ('5.932887e7abc'), ('a1a1')", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT cast(pk as signed) FROM test01", + Expected: []sql.Row{{11}, {11}, {11}, {12}}, + ExpectedWarningsCount: 2, + ExpectedWarning: 1292, + }, + { + Query: "SELECT cast(pk as unsigned) FROM test01", + Expected: []sql.Row{{uint64(11)}, {uint64(11)}, {uint64(11)}, {uint64(12)}}, + ExpectedWarningsCount: 2, + ExpectedWarning: 1292, + }, + { + Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, + ExpectedWarningsCount: 16, + ExpectedWarning: 1292, + }, + { + Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{uint64(3)}, {uint64(18446744073709551613)}, {uint64(18446744073709551613)}, {uint64(18446744073709551611)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, + ExpectedWarningsCount: 22, + ExpectedWarning: 1292, + }, + { + Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, + ExpectedWarningsCount: 9, + ExpectedWarning: 1292, + }, + }, + }, { // https://github.com/dolthub/dolt/issues/9812 Name: "String-to-number comparison operators should behave consistently", From 17c53aefa0d5cd0130dace978bfde11b19229497 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 11:36:22 -0700 Subject: [PATCH 54/73] add 9733 and 9812 tests --- enginetest/queries/script_queries.go | 101 +++++++++++++++++++++------ 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 931c676fbf..d3b7c869e0 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -131,52 +131,107 @@ var ScriptTests = []ScriptTest{ }, Assertions: []ScriptTestAssertion{ { - Query: "SELECT cast(pk as signed) FROM test01", - Expected: []sql.Row{{11}, {11}, {11}, {12}}, - ExpectedWarningsCount: 2, - ExpectedWarning: 1292, + Query: "SELECT cast(pk as signed) FROM test01", + Expected: []sql.Row{{11}, {11}, {11}, {12}}, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningsCount: 2, }, { - Query: "SELECT cast(pk as unsigned) FROM test01", - Expected: []sql.Row{{uint64(11)}, {uint64(11)}, {uint64(11)}, {uint64(12)}}, - ExpectedWarningsCount: 2, - ExpectedWarning: 1292, + Query: "SELECT cast(pk as unsigned) FROM test01", + Expected: []sql.Row{{uint64(11)}, {uint64(11)}, {uint64(11)}, {uint64(12)}}, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningsCount: 2, }, { - Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, - ExpectedWarningsCount: 16, - ExpectedWarning: 1292, + Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", + //Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, + //actual :[]sql.Row{sql.Row{3}, sql.Row{3}, sql.Row{-3}, sql.Row{-3}, sql.Row{-5}, sql.Row{11}, sql.Row{1}, sql.Row{2}, sql.Row{3}, sql.Row{3}, sql.Row{4}, sql.Row{5}, sql.Row{5}, sql.Row{5}, sql.Row{5}, sql.Row{0}} + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningsCount: 16, }, { - Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{uint64(3)}, {uint64(18446744073709551613)}, {uint64(18446744073709551613)}, {uint64(18446744073709551611)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, - ExpectedWarningsCount: 22, - ExpectedWarning: 1292, + Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", + //Expected: []sql.Row{{uint64(3)}, {uint64(1844674407309552000)}, {uint64(1844674407309552000)}, {uint64(1844674407309552000)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, + //actual: [3, 3, 18446744073709551613, 18446744073709551613, 18446744073709551611, 11, 1, 2, 3, 3, 4, 5, 5, 5, 5, 0] + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningsCount: 19, }, { - Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, - ExpectedWarningsCount: 9, - ExpectedWarning: 1292, + Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", + //Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, + //actual : []sql.Row{sql.Row{3}, sql.Row{3.1234}, sql.Row{-3.1234}, sql.Row{-3.1}, sql.Row{-5}, sql.Row{11}, sql.Row{1}, sql.Row{2}, sql.Row{3}, sql.Row{3.2}, sql.Row{4}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{0}} + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningsCount: 9, }, }, }, { // https://github.com/dolthub/dolt/issues/9812 - Name: "String-to-number comparison operators should behave consistently", + Name: "String-to-number comparison operators should behave consistently", + Dialect: "mysql", Assertions: []ScriptTestAssertion{ { Query: "SELECT ('A') = (0)", Expected: []sql.Row{{true}}, ExpectedWarningsCount: 1, - ExpectedWarning: 1292, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') IN (0)", Expected: []sql.Row{{true}}, ExpectedWarningsCount: 1, - ExpectedWarning: 1292, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') != (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') <> (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') < (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') <= (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') > (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') >= (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + }, + { + Query: "SELECT ('A') NOT IN (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, + //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, }, }, From e27a01679663efd320ff24c14df963a28157e3f3 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 11:45:54 -0700 Subject: [PATCH 55/73] rm warning count --- enginetest/queries/script_queries.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index d3b7c869e0..33a03cbcf5 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -173,63 +173,63 @@ var ScriptTests = []ScriptTest{ { Query: "SELECT ('A') = (0)", Expected: []sql.Row{{true}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') IN (0)", Expected: []sql.Row{{true}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') != (0)", Expected: []sql.Row{{false}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') <> (0)", Expected: []sql.Row{{false}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') < (0)", Expected: []sql.Row{{false}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') <= (0)", Expected: []sql.Row{{true}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') > (0)", Expected: []sql.Row{{false}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') >= (0)", Expected: []sql.Row{{true}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { Query: "SELECT ('A') NOT IN (0)", Expected: []sql.Row{{false}}, - ExpectedWarningsCount: 1, + //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, From ca5ff6f2de5d078efe6e3fca9474ef945b3a9338 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 12 Sep 2025 12:05:26 -0700 Subject: [PATCH 56/73] trim string before converting to bool --- sql/core.go | 40 ++++++++++++++++++++++++++++++++++++--- sql/expression/convert.go | 14 +++++++------- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/sql/core.go b/sql/core.go index 1d28969be3..79d0141b6f 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,12 +18,14 @@ import ( "context" "encoding/json" "fmt" + "github.com/dolthub/go-mysql-server/sql/types" "math" trace2 "runtime/trace" "strconv" "strings" "sync/atomic" "time" + "unicode" "unsafe" "github.com/shopspring/decimal" @@ -314,10 +316,8 @@ func ConvertToBool(ctx *Context, v interface{}) (bool, error) { case float64: return b != 0, nil case string: - bFloat, err := strconv.ParseFloat(b, 64) + bFloat, err := strconv.ParseFloat(TrimStringToNumberPrefix(ctx, b, false), 64) if err != nil { - // In MySQL, if the string does not represent a float then it's false - ctx.Warn(1292, "Truncated incorrect DOUBLE value: '%s'", b) return false, nil } return bFloat != 0, nil @@ -330,6 +330,40 @@ func ConvertToBool(ctx *Context, v interface{}) (bool, error) { } } +func TrimStringToNumberPrefix(ctx *Context, s string, isInt bool) string { + if isInt { + s = strings.TrimLeft(s, types.IntCutSet) + } else { + s = strings.TrimLeft(s, types.NumericCutSet) + } + + seenDigit := false + seenDot := false + seenExp := false + signIndex := 0 + + for i := 0; i < len(s); i++ { + char := rune(s[i]) + + if unicode.IsDigit(char) { + seenDigit = true + } else if char == '.' && !seenDot && !isInt { + seenDot = true + } else if (char == 'e' || char == 'E') && !seenExp && seenDigit && !isInt { + seenExp = true + signIndex = i + 1 + } else if !((char == '-' || char == '+') && i == signIndex) { + if isInt { + ctx.Warn(1292, "Truncated incorrect INTEGER value: '%s'", s) + } else { + ctx.Warn(1292, "Truncated incorrect DOUBLE value: '%s'", s) + } + return s[:i] + } + } + return s +} + var ErrVectorInvalidBinaryLength = errors.NewKind("cannot convert BINARY(%d) to vector, byte length must be a multiple of 4 bytes") // DecodeVector decodes a byte slice that represents a vector. This is needed for distance functions. diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 28a8ce385b..7c0db1ad64 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -345,7 +345,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } return d, nil case ConvertToDecimal: - value, err := prepareForNumericContext(val, originType, false) + value, err := prepareForNumericContext(ctx, val, originType, false) if err != nil { return nil, err } @@ -356,7 +356,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } return d, nil case ConvertToFloat: - value, err := prepareForNumericContext(val, originType, false) + value, err := prepareForNumericContext(ctx, val, originType, false) if err != nil { return nil, err } @@ -366,7 +366,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } return d, nil case ConvertToDouble, ConvertToReal: - value, err := prepareForNumericContext(val, originType, false) + value, err := prepareForNumericContext(ctx, val, originType, false) if err != nil { return nil, err } @@ -386,7 +386,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } return js, nil case ConvertToSigned: - value, err := prepareForNumericContext(val, originType, true) + value, err := prepareForNumericContext(ctx, val, originType, true) if err != nil { return nil, err } @@ -403,7 +403,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s } return t, nil case ConvertToUnsigned: - value, err := prepareForNumericContext(val, originType, true) + value, err := prepareForNumericContext(ctx, val, originType, true) if err != nil { return nil, err } @@ -481,9 +481,9 @@ func createConvertedDecimalType(length, scale int, logErrors bool) sql.DecimalTy } // prepareForNumberContext makes necessary preparations to strings and byte arrays for conversions to numbers -func prepareForNumericContext(val interface{}, originType sql.Type, isInt bool) (interface{}, error) { +func prepareForNumericContext(ctx *sql.Context, val interface{}, originType sql.Type, isInt bool) (interface{}, error) { if s, isString := val.(string); isString && types.IsTextOnly(originType) { - return trimStringToNumberPrefix(s, isInt), nil + return sql.TrimStringToNumberPrefix(ctx, s, isInt), nil } return convertHexBlobToDecimalForNumericContext(val, originType) } From 38d8d4f6a59dd6963638a27d4f1bae40a135544e Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 13:26:32 -0700 Subject: [PATCH 57/73] add tests for warnings and order pk --- enginetest/queries/script_queries.go | 116 +++++++++++++++------------ 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 33a03cbcf5..e9a7859923 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -15,6 +15,7 @@ package queries import ( + "github.com/dolthub/vitess/go/mysql" "math" "time" @@ -121,114 +122,108 @@ type ScriptTestAssertion struct { // the tests. var ScriptTests = []ScriptTest{ { - // https://github.com/dolthub/dolt/issues/9733 - Name: "String to number casting should handle partial numeric strings with warnings", + // https://github.com/dolthub/dolt/issues/9836 + Name: "Ordering by pk does not change the order of results", SetUpScript: []string{ - "CREATE TABLE test01(pk VARCHAR(20) PRIMARY KEY)", - "INSERT INTO test01 VALUES ('11d'), ('11wha?'), ('11'), ('12')", "CREATE TABLE test_cast(pk VARCHAR(50) PRIMARY KEY)", "INSERT INTO test_cast VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234'), ('11-5'), ('1a1'), ('2,345'), ('4,12'), ('5.932887e+07'), ('5.932887e+07abc'), ('5.932887e7'), ('5.932887e7abc'), ('a1a1')", }, Assertions: []ScriptTestAssertion{ { - Query: "SELECT cast(pk as signed) FROM test01", - Expected: []sql.Row{{11}, {11}, {11}, {12}}, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningsCount: 2, - }, - { - Query: "SELECT cast(pk as unsigned) FROM test01", - Expected: []sql.Row{{uint64(11)}, {uint64(11)}, {uint64(11)}, {uint64(12)}}, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningsCount: 2, + Skip: true, + Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, + ExpectedWarningsCount: 16, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { - Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", - //Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, - //actual :[]sql.Row{sql.Row{3}, sql.Row{3}, sql.Row{-3}, sql.Row{-3}, sql.Row{-5}, sql.Row{11}, sql.Row{1}, sql.Row{2}, sql.Row{3}, sql.Row{3}, sql.Row{4}, sql.Row{5}, sql.Row{5}, sql.Row{5}, sql.Row{5}, sql.Row{0}} - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningsCount: 16, + Skip: true, + Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{uint64(3)}, {uint64(18446744073709551613)}, {uint64(18446744073709551613)}, {uint64(18446744073709551611)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, + ExpectedWarningsCount: 19, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { - Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", - //Expected: []sql.Row{{uint64(3)}, {uint64(1844674407309552000)}, {uint64(1844674407309552000)}, {uint64(1844674407309552000)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, - //actual: [3, 3, 18446744073709551613, 18446744073709551613, 18446744073709551611, 11, 1, 2, 3, 3, 4, 5, 5, 5, 5, 0] - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningsCount: 19, - }, - { - Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", - //Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, - //actual : []sql.Row{sql.Row{3}, sql.Row{3.1234}, sql.Row{-3.1234}, sql.Row{-3.1}, sql.Row{-5}, sql.Row{11}, sql.Row{1}, sql.Row{2}, sql.Row{3}, sql.Row{3.2}, sql.Row{4}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{5.932887e+07}, sql.Row{0}} - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningsCount: 9, + Skip: true, + Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", + Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, + ExpectedWarningsCount: 9, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, }, }, { // https://github.com/dolthub/dolt/issues/9812 Name: "String-to-number comparison operators should behave consistently", - Dialect: "mysql", Assertions: []ScriptTestAssertion{ { - Query: "SELECT ('A') = (0)", - Expected: []sql.Row{{true}}, + Dialect: "mysql", + Query: "SELECT ('A') = (0)", + Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') IN (0)", - Expected: []sql.Row{{true}}, + Dialect: "mysql", + Query: "SELECT ('A') IN (0)", + Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') != (0)", - Expected: []sql.Row{{false}}, + Dialect: "mysql", + Query: "SELECT ('A') != (0)", + Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') <> (0)", - Expected: []sql.Row{{false}}, + Dialect: "mysql", + Query: "SELECT ('A') <> (0)", + Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') < (0)", - Expected: []sql.Row{{false}}, + Dialect: "mysql", + Query: "SELECT ('A') < (0)", + Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') <= (0)", - Expected: []sql.Row{{true}}, + Dialect: "mysql", + Query: "SELECT ('A') <= (0)", + Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') > (0)", - Expected: []sql.Row{{false}}, + Dialect: "mysql", + Query: "SELECT ('A') > (0)", + Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') >= (0)", - Expected: []sql.Row{{true}}, + Dialect: "mysql", + Query: "SELECT ('A') >= (0)", + Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Query: "SELECT ('A') NOT IN (0)", - Expected: []sql.Row{{false}}, + Dialect: "mysql", + Query: "SELECT ('A') NOT IN (0)", + Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, //ExpectedWarning: mysql.ERTruncatedWrongValue, //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", @@ -11777,6 +11772,8 @@ select * from t1 except ( {"5.932887e7abc", float32(5.932887e+07)}, {"a1a1", float32(0)}, }, + //ExpectedWarningsCount: 12, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11801,6 +11798,8 @@ select * from t1 except ( {"5.932887e7abc", 5.932887e+07}, {"a1a1", 0.0}, }, + //ExpectedWarningsCount: 12, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11825,6 +11824,8 @@ select * from t1 except ( {"5.932887e7abc", 5}, {"a1a1", 0}, }, + //ExpectedWarningsCount: 12, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11849,6 +11850,8 @@ select * from t1 except ( {"5.932887e7abc", uint64(5)}, {"a1a1", uint64(0)}, }, + //ExpectedWarningsCount: 19, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11873,10 +11876,13 @@ select * from t1 except ( {"5.932887e7abc", "59328870.000"}, {"a1a1", "0.000"}, }, + //ExpectedWarningsCount: 13, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Query: "select * from test01 where pk in ('11')", Expected: []sql.Row{{"11"}}, + //ExpectedWarningsCount: 0, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11889,6 +11895,8 @@ select * from t1 except ( {"11d"}, {"11wha?"}, }, + //ExpectedWarningsCount: 12, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11900,6 +11908,8 @@ select * from t1 except ( {" 3. 12 4"}, {"3. 12 4"}, }, + //ExpectedWarningsCount: 12, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11913,6 +11923,8 @@ select * from t1 except ( {"+3.1234"}, {"3. 12 4"}, }, + //ExpectedWarningsCount: 20, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11920,6 +11932,8 @@ select * from t1 except ( Dialect: "mysql", Query: "select * from test02 where pk in ('11asdf')", Expected: []sql.Row{{"11"}}, + //ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11927,6 +11941,8 @@ select * from t1 except ( Dialect: "mysql", Query: "select * from test02 where pk='11.12asdf'", Expected: []sql.Row{}, + //ExpectedWarningsCount: 1, + //ExpectedWarning: mysql.ERTruncatedWrongValue, }, }, }, From 9fc0d7e5cb585a35fe7b1d90176bf3b626f5f087 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 14:37:38 -0700 Subject: [PATCH 58/73] amend tests --- enginetest/queries/script_queries.go | 45 +++++++++------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index e9a7859923..100be4ee8d 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -15,7 +15,6 @@ package queries import ( - "github.com/dolthub/vitess/go/mysql" "math" "time" @@ -123,41 +122,25 @@ type ScriptTestAssertion struct { var ScriptTests = []ScriptTest{ { // https://github.com/dolthub/dolt/issues/9836 + Skip: true, Name: "Ordering by pk does not change the order of results", SetUpScript: []string{ "CREATE TABLE test_cast(pk VARCHAR(50) PRIMARY KEY)", - "INSERT INTO test_cast VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234'), ('11-5'), ('1a1'), ('2,345'), ('4,12'), ('5.932887e+07'), ('5.932887e+07abc'), ('5.932887e7'), ('5.932887e7abc'), ('a1a1')", + "INSERT INTO test_cast VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234')", }, Assertions: []ScriptTestAssertion{ { - Skip: true, - Query: "SELECT cast(pk as signed) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{3}, {-3}, {-3}, {-5}, {3}, {11}, {1}, {2}, {3}, {3}, {4}, {5}, {5}, {5}, {5}, {0}}, - ExpectedWarningsCount: 16, - ExpectedWarning: mysql.ERTruncatedWrongValue, - }, - { - Skip: true, - Query: "SELECT cast(pk as unsigned) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{uint64(3)}, {uint64(18446744073709551613)}, {uint64(18446744073709551613)}, {uint64(18446744073709551611)}, {uint64(3)}, {uint64(11)}, {uint64(1)}, {uint64(2)}, {uint64(3)}, {uint64(3)}, {uint64(4)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(5)}, {uint64(0)}}, - ExpectedWarningsCount: 19, - ExpectedWarning: mysql.ERTruncatedWrongValue, - }, - { - Skip: true, - Query: "SELECT cast(pk as double) FROM test_cast ORDER BY pk", - Expected: []sql.Row{{3.0}, {-3.1234}, {-3.1}, {-5.0}, {3.1234}, {11.0}, {1.0}, {2.0}, {3.0}, {3.2}, {4.0}, {59328870.0}, {59328870.0}, {59328870.0}, {59328870.0}, {0.0}}, - ExpectedWarningsCount: 9, - ExpectedWarning: mysql.ERTruncatedWrongValue, + Query: "SELECT pk FROM test ORDER BY pk", + Expected: []sql.Row{{" 3 12 4"}, {"-3.1234"}, {"-3.1a"}, {"-5+8"}, {"+3.1234"}, {"3. 12 4"}, {"3.2 12 4"}}, }, }, }, { // https://github.com/dolthub/dolt/issues/9812 - Name: "String-to-number comparison operators should behave consistently", + Name: "String-to-number comparison operators should behave consistently", Assertions: []ScriptTestAssertion{ { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') = (0)", Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, @@ -165,7 +148,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') IN (0)", Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, @@ -173,7 +156,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') != (0)", Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, @@ -181,7 +164,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') <> (0)", Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, @@ -189,7 +172,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') < (0)", Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, @@ -197,7 +180,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') <= (0)", Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, @@ -205,7 +188,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') > (0)", Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, @@ -213,7 +196,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') >= (0)", Expected: []sql.Row{{true}}, //ExpectedWarningsCount: 1, @@ -221,7 +204,7 @@ var ScriptTests = []ScriptTest{ //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", + Dialect: "mysql", Query: "SELECT ('A') NOT IN (0)", Expected: []sql.Row{{false}}, //ExpectedWarningsCount: 1, From 99f6fd3610063bc76e2535fada4a6ba91060116b Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 12 Sep 2025 14:41:23 -0700 Subject: [PATCH 59/73] vitess bump --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c7e9970de7..bf0698d17c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20250820171420-f2b78f56ce9f github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 - github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d + github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788 github.com/go-sql-driver/mysql v1.9.3 github.com/gocraft/dbr/v2 v2.7.2 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index bbcc10293e..114c90c92d 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTE github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= -github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d h1:oTWJxjzRmuHKuICUunCUwNuonubkXwOqPa5hXX3dXBo= -github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= +github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788 h1:qZiVJ5smudQJ9DEPmD3KaufGtvsi9kjyYubet5Y2IDY= +github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= From 24af042ee249abf6a4af82280827f96e2d455564 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Fri, 12 Sep 2025 14:42:08 -0700 Subject: [PATCH 60/73] Revert "vitess bump" This reverts commit 99f6fd3610063bc76e2535fada4a6ba91060116b. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bf0698d17c..c7e9970de7 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20250820171420-f2b78f56ce9f github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 - github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788 + github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d github.com/go-sql-driver/mysql v1.9.3 github.com/gocraft/dbr/v2 v2.7.2 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 114c90c92d..bbcc10293e 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTE github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= -github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788 h1:qZiVJ5smudQJ9DEPmD3KaufGtvsi9kjyYubet5Y2IDY= -github.com/dolthub/vitess v0.0.0-20250912213401-e062bc173788/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= +github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d h1:oTWJxjzRmuHKuICUunCUwNuonubkXwOqPa5hXX3dXBo= +github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= From 64bd0a1ef6b2a3e0a9bf4d61049d01e6e57d9fdb Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Fri, 12 Sep 2025 21:46:01 +0000 Subject: [PATCH 61/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/core.go b/sql/core.go index 79d0141b6f..9007d847fa 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/dolthub/go-mysql-server/sql/types" "math" trace2 "runtime/trace" "strconv" @@ -31,6 +30,7 @@ import ( "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" + "github.com/dolthub/go-mysql-server/sql/types" "github.com/dolthub/go-mysql-server/sql/values" ) From 103116698677f047b8e7584626cb4581af9c7e6d Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 14:54:34 -0700 Subject: [PATCH 62/73] fix table name in test --- enginetest/queries/script_queries.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 100be4ee8d..406c5c050e 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -125,8 +125,8 @@ var ScriptTests = []ScriptTest{ Skip: true, Name: "Ordering by pk does not change the order of results", SetUpScript: []string{ - "CREATE TABLE test_cast(pk VARCHAR(50) PRIMARY KEY)", - "INSERT INTO test_cast VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234')", + "CREATE TABLE test(pk VARCHAR(50) PRIMARY KEY)", + "INSERT INTO test VALUES (' 3 12 4'), ('3. 12 4'), ('3.2 12 4'), ('-3.1234'), ('-3.1a'), ('-5+8'), ('+3.1234')", }, Assertions: []ScriptTestAssertion{ { From 8efd2f7a72867b5093ab9fd8bc7e3510489822b9 Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 12 Sep 2025 21:55:55 +0000 Subject: [PATCH 63/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/expression/convert.go | 1 - sql/expression/in.go | 1 - 2 files changed, 2 deletions(-) diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 85220df2ab..28a8ce385b 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -488,7 +488,6 @@ func prepareForNumericContext(val interface{}, originType sql.Type, isInt bool) return convertHexBlobToDecimalForNumericContext(val, originType) } - // trimStringToNumberPrefix trims a string to the appropriate number prefix func trimStringToNumberPrefix(s string, isInt bool) string { if isInt { diff --git a/sql/expression/in.go b/sql/expression/in.go index ff83676b38..622ee5779f 100644 --- a/sql/expression/in.go +++ b/sql/expression/in.go @@ -152,7 +152,6 @@ func NewNotInTuple(left sql.Expression, right sql.Expression) sql.Expression { return NewNot(NewInTuple(left, right)) } - // HashInTuple is an expression that checks an expression is inside a list of expressions using a hashmap. type HashInTuple struct { in *InTuple From dce5acfa328ec58d38a6328d94b84b253428e533 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 09:49:16 -0700 Subject: [PATCH 64/73] remove cyclical dependency --- sql/core.go | 16 ++++++++++++---- sql/types/conversion.go | 1 + sql/types/number.go | 21 ++++++--------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/sql/core.go b/sql/core.go index 79d0141b6f..9d65ee1961 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,7 +18,7 @@ import ( "context" "encoding/json" "fmt" - "github.com/dolthub/go-mysql-server/sql/types" + "github.com/shopspring/decimal" "math" trace2 "runtime/trace" "strconv" @@ -28,7 +28,6 @@ import ( "unicode" "unsafe" - "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" "github.com/dolthub/go-mysql-server/sql/values" @@ -330,11 +329,20 @@ func ConvertToBool(ctx *Context, v interface{}) (bool, error) { } } +const ( + // IntCutSet is the set of characters that should be trimmed from the beginning and end of a string + // when converting to a signed or unsigned integer + IntCutSet = " \t" + + // NumericCutSet is the set of characters to trim from a string before converting it to a number. + NumericCutSet = " \t\n\r" +) + func TrimStringToNumberPrefix(ctx *Context, s string, isInt bool) string { if isInt { - s = strings.TrimLeft(s, types.IntCutSet) + s = strings.TrimLeft(s, IntCutSet) } else { - s = strings.TrimLeft(s, types.NumericCutSet) + s = strings.TrimLeft(s, NumericCutSet) } seenDigit := false diff --git a/sql/types/conversion.go b/sql/types/conversion.go index 3fb22c781b..2801cbf2a1 100644 --- a/sql/types/conversion.go +++ b/sql/types/conversion.go @@ -763,6 +763,7 @@ func TypeAwareConversion(ctx *sql.Context, val interface{}, originalType sql.Typ return convertedType.Convert(ctx, val) } +// TODO: Instead of truncating to zero, truncate strings to number prefix // ConvertOrTruncate converts the value |i| to type |t| and returns the converted value; if the value does not convert // cleanly and the type is automatically coerced (i.e. string and numeric types), then a warning is logged and the // value is truncated to the Zero value for type |t|. If the value does not convert and the type is not automatically diff --git a/sql/types/number.go b/sql/types/number.go index 8b74d813d2..cb4dee0978 100644 --- a/sql/types/number.go +++ b/sql/types/number.go @@ -87,15 +87,6 @@ var ( numre = regexp.MustCompile(`^[ ]*[0-9]*\.?[0-9]+`) ) -const ( - // IntCutSet is the set of characters that should be trimmed from the beginning and end of a string - // when converting to a signed or unsigned integer - IntCutSet = " \t" - - // NumericCutSet is the set of characters to trim from a string before converting it to a number. - NumericCutSet = " \t\n\r" -) - type NumberTypeImpl_ struct { baseType query.Type displayWidth int @@ -991,7 +982,7 @@ func convertToInt64(t NumberTypeImpl_, v interface{}) (int64, sql.ConvertInRange } return i, sql.InRange, nil case string: - v = strings.Trim(v, IntCutSet) + v = strings.Trim(v, sql.IntCutSet) if v == "" { // StringType{}.Zero() returns empty string, but should represent "0" for number value return 0, sql.InRange, nil @@ -1178,7 +1169,7 @@ func convertToUint64(t NumberTypeImpl_, v interface{}) (uint64, sql.ConvertInRan } return i, sql.InRange, nil case string: - v = strings.Trim(v, IntCutSet) + v = strings.Trim(v, sql.IntCutSet) if i, err := strconv.ParseUint(v, 10, 64); err == nil { return i, sql.InRange, nil } else if err == strconv.ErrRange { @@ -1281,7 +1272,7 @@ func convertToUint32(t NumberTypeImpl_, v interface{}) (uint32, sql.ConvertInRan } return uint32(i), sql.InRange, nil case string: - v = strings.Trim(v, IntCutSet) + v = strings.Trim(v, sql.IntCutSet) if i, err := strconv.ParseUint(v, 10, 32); err == nil { return uint32(i), sql.InRange, nil } @@ -1377,7 +1368,7 @@ func convertToUint16(t NumberTypeImpl_, v interface{}) (uint16, sql.ConvertInRan } return uint16(i), sql.InRange, nil case string: - v = strings.Trim(v, IntCutSet) + v = strings.Trim(v, sql.IntCutSet) if i, err := strconv.ParseUint(v, 10, 16); err == nil { return uint16(i), sql.InRange, nil } @@ -1477,7 +1468,7 @@ func convertToUint8(t NumberTypeImpl_, v interface{}) (uint8, sql.ConvertInRange } return uint8(i), sql.InRange, nil case string: - v = strings.Trim(v, IntCutSet) + v = strings.Trim(v, sql.IntCutSet) if i, err := strconv.ParseUint(v, 10, 8); err == nil { return uint8(i), sql.InRange, nil } @@ -1537,7 +1528,7 @@ func convertToFloat64(t NumberTypeImpl_, v interface{}) (float64, error) { } return float64(i), nil case string: - v = strings.Trim(v, NumericCutSet) + v = strings.Trim(v, sql.NumericCutSet) i, err := strconv.ParseFloat(v, 64) if err != nil { // parse the first longest valid numbers From 7e8c61aa585cc2776374f9dce579db07c76b96e1 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 15 Sep 2025 16:53:11 +0000 Subject: [PATCH 65/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/core.go b/sql/core.go index 9d65ee1961..41b6d0ab88 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/shopspring/decimal" "math" trace2 "runtime/trace" "strconv" @@ -28,6 +27,7 @@ import ( "unicode" "unsafe" + "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" "github.com/dolthub/go-mysql-server/sql/values" From 823e0b1176028b25f215c3ee0085379bc95c4a6e Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 09:57:40 -0700 Subject: [PATCH 66/73] fix package for NumericCutSet --- sql/types/decimal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/types/decimal.go b/sql/types/decimal.go index 5c6cc0d8ea..48fa0288bc 100644 --- a/sql/types/decimal.go +++ b/sql/types/decimal.go @@ -202,7 +202,7 @@ func (t DecimalType_) ConvertToNullDecimal(v interface{}) (decimal.NullDecimal, return t.ConvertToNullDecimal(decimal.NewFromFloat(value)) case string: // TODO: implement truncation here - value = strings.Trim(value, NumericCutSet) + value = strings.Trim(value, sql.NumericCutSet) if len(value) == 0 { return t.ConvertToNullDecimal(decimal.NewFromInt(0)) } From 0f2bd97fbce2bdc3c448805c3819d2f96cc82565 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 10:07:30 -0700 Subject: [PATCH 67/73] remove duplicate function --- sql/expression/convert.go | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 7c0db1ad64..4fc2731fe9 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -17,14 +17,12 @@ package expression import ( "encoding/hex" "fmt" - "strconv" - "strings" - "time" - "unicode" - "github.com/dolthub/vitess/go/sqltypes" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" + "strconv" + "strings" + "time" "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/types" @@ -488,36 +486,6 @@ func prepareForNumericContext(ctx *sql.Context, val interface{}, originType sql. return convertHexBlobToDecimalForNumericContext(val, originType) } -// trimStringToNumberPrefix trims a string to the appropriate number prefix -func trimStringToNumberPrefix(s string, isInt bool) string { - if isInt { - s = strings.TrimLeft(s, types.IntCutSet) - } else { - s = strings.TrimLeft(s, types.NumericCutSet) - } - - seenDigit := false - seenDot := false - seenExp := false - signIndex := 0 - - for i := 0; i < len(s); i++ { - char := rune(s[i]) - - if unicode.IsDigit(char) { - seenDigit = true - } else if char == '.' && !seenDot && !isInt { - seenDot = true - } else if (char == 'e' || char == 'E') && !seenExp && seenDigit && !isInt { - seenExp = true - signIndex = i + 1 - } else if !((char == '-' || char == '+') && i == signIndex) { - return s[:i] - } - } - return s -} - // convertHexBlobToDecimalForNumericContext converts byte array value to unsigned int value if originType is BLOB type. // This function is called when convertTo type is number type only. The hex literal values are parsed into blobs as // binary string as default, but for numeric context, the value should be a number. From bd69509dcb308394ee57398c268c641f6f3c1be3 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 15 Sep 2025 17:08:45 +0000 Subject: [PATCH 68/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/expression/convert.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 4fc2731fe9..0e84e30ccb 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -17,13 +17,14 @@ package expression import ( "encoding/hex" "fmt" - "github.com/dolthub/vitess/go/sqltypes" - "github.com/sirupsen/logrus" - "gopkg.in/src-d/go-errors.v1" "strconv" "strings" "time" + "github.com/dolthub/vitess/go/sqltypes" + "github.com/sirupsen/logrus" + "gopkg.in/src-d/go-errors.v1" + "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/types" ) From f63503cffe6a7104c41a43926f2ba23e7c92d005 Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 11:42:35 -0700 Subject: [PATCH 69/73] test for warnings --- enginetest/queries/script_queries.go | 225 +++++++++++++++++---------- sql/core.go | 14 +- sql/expression/convert.go | 3 +- 3 files changed, 153 insertions(+), 89 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 406c5c050e..89962c371c 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -15,6 +15,7 @@ package queries import ( + "github.com/dolthub/vitess/go/mysql" "math" "time" @@ -140,76 +141,76 @@ var ScriptTests = []ScriptTest{ Name: "String-to-number comparison operators should behave consistently", Assertions: []ScriptTestAssertion{ { - Dialect: "mysql", - Query: "SELECT ('A') = (0)", - Expected: []sql.Row{{true}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') = (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') IN (0)", - Expected: []sql.Row{{true}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') IN (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') != (0)", - Expected: []sql.Row{{false}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') != (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') <> (0)", - Expected: []sql.Row{{false}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') <> (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') < (0)", - Expected: []sql.Row{{false}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') < (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') <= (0)", - Expected: []sql.Row{{true}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') <= (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') > (0)", - Expected: []sql.Row{{false}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') > (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') >= (0)", - Expected: []sql.Row{{true}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') >= (0)", + Expected: []sql.Row{{true}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, { - Dialect: "mysql", - Query: "SELECT ('A') NOT IN (0)", - Expected: []sql.Row{{false}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, - //ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", + Dialect: "mysql", + Query: "SELECT ('A') NOT IN (0)", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningMessageSubstring: "Truncated incorrect double value: A", }, }, }, @@ -11755,8 +11756,8 @@ select * from t1 except ( {"5.932887e7abc", float32(5.932887e+07)}, {"a1a1", float32(0)}, }, - //ExpectedWarningsCount: 12, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 12, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11781,8 +11782,8 @@ select * from t1 except ( {"5.932887e7abc", 5.932887e+07}, {"a1a1", 0.0}, }, - //ExpectedWarningsCount: 12, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 12, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11807,8 +11808,8 @@ select * from t1 except ( {"5.932887e7abc", 5}, {"a1a1", 0}, }, - //ExpectedWarningsCount: 12, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 16, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11833,8 +11834,10 @@ select * from t1 except ( {"5.932887e7abc", uint64(5)}, {"a1a1", uint64(0)}, }, - //ExpectedWarningsCount: 19, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + // TODO: Should be 19. Missing warnings for "Cast to unsigned converted negative integer to its positive + // complement" (1105) + ExpectedWarningsCount: 16, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { Dialect: "mysql", @@ -11859,13 +11862,14 @@ select * from t1 except ( {"5.932887e7abc", "59328870.000"}, {"a1a1", "0.000"}, }, - //ExpectedWarningsCount: 13, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + // TODO: should be 13. Missing warning for "Incorrect DECIMAL value: '0' for column '' at row -1" (1366) + ExpectedWarningsCount: 12, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { - Query: "select * from test01 where pk in ('11')", - Expected: []sql.Row{{"11"}}, - //ExpectedWarningsCount: 0, + Query: "select * from test01 where pk in ('11')", + Expected: []sql.Row{{"11"}}, + ExpectedWarningsCount: 0, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11878,8 +11882,8 @@ select * from t1 except ( {"11d"}, {"11wha?"}, }, - //ExpectedWarningsCount: 12, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 12, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11891,8 +11895,8 @@ select * from t1 except ( {" 3. 12 4"}, {"3. 12 4"}, }, - //ExpectedWarningsCount: 12, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 12, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 @@ -11906,26 +11910,77 @@ select * from t1 except ( {"+3.1234"}, {"3. 12 4"}, }, - //ExpectedWarningsCount: 20, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 20, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 - Skip: true, - Dialect: "mysql", - Query: "select * from test02 where pk in ('11asdf')", - Expected: []sql.Row{{"11"}}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + Skip: true, + Dialect: "mysql", + Query: "select * from test02 where pk in ('11asdf')", + Expected: []sql.Row{{"11"}}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, }, { // https://github.com/dolthub/dolt/issues/9739 - Skip: true, - Dialect: "mysql", - Query: "select * from test02 where pk='11.12asdf'", - Expected: []sql.Row{}, - //ExpectedWarningsCount: 1, - //ExpectedWarning: mysql.ERTruncatedWrongValue, + Skip: true, + Dialect: "mysql", + Query: "select * from test02 where pk='11.12asdf'", + Expected: []sql.Row{}, + ExpectedWarningsCount: 1, + ExpectedWarning: mysql.ERTruncatedWrongValue, + }, + }, + }, + { + // https://github.com/dolthub/dolt/issues/9821 + Name: "strings convert to booleans", + Assertions: []ScriptTestAssertion{ + { + Query: `select '3bxu' and true`, + Expected: []sql.Row{{true}}, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 1, + }, + { + Query: "select '3bxu' or false", + Expected: []sql.Row{{true}}, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 1, + }, + { + Query: "select '3bxu' xor false", + Expected: []sql.Row{{true}}, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 1, + }, + { + Query: "select '' or false", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 0, + }, + { + Query: "select '0' or false", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 0, + }, + { + Query: "select '00' or false", + Expected: []sql.Row{{false}}, + ExpectedWarningsCount: 0, + }, + { + Query: "select '00asdf' or false", + Expected: []sql.Row{{false}}, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 1, + }, + { + Query: "select 'asdf' or false", + Expected: []sql.Row{{false}}, + ExpectedWarning: mysql.ERTruncatedWrongValue, + ExpectedWarningsCount: 1, }, }, }, diff --git a/sql/core.go b/sql/core.go index 41b6d0ab88..1dc38ed34d 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/dolthub/vitess/go/mysql" "math" trace2 "runtime/trace" "strconv" @@ -362,13 +363,20 @@ func TrimStringToNumberPrefix(ctx *Context, s string, isInt bool) string { signIndex = i + 1 } else if !((char == '-' || char == '+') && i == signIndex) { if isInt { - ctx.Warn(1292, "Truncated incorrect INTEGER value: '%s'", s) + ctx.Warn(mysql.ERTruncatedWrongValue, "Truncated incorrect INTEGER value: '%s'", s) } else { - ctx.Warn(1292, "Truncated incorrect DOUBLE value: '%s'", s) + ctx.Warn(mysql.ERTruncatedWrongValue, "Truncated incorrect DOUBLE value: '%s'", s) } - return s[:i] + return convertEmptyStringToZero(s[:i]) } } + return convertEmptyStringToZero(s) +} + +func convertEmptyStringToZero(s string) string { + if s == "" { + return "0" + } return s } diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 4fc2731fe9..70f5a84d91 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -17,6 +17,7 @@ package expression import ( "encoding/hex" "fmt" + "github.com/dolthub/vitess/go/mysql" "github.com/dolthub/vitess/go/sqltypes" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" @@ -371,7 +372,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s d, _, err := types.Float64.Convert(ctx, value) if err != nil { if sql.ErrTruncatedIncorrect.Is(err) { - ctx.Warn(1265, "%s", err.Error()) + ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error()) return d, nil } return types.Float64.Zero(), nil From 44cf13c94572308ddd72498f4515a18a844c0dca Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 15 Sep 2025 18:45:25 +0000 Subject: [PATCH 70/73] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/script_queries.go | 2 +- sql/core.go | 2 +- sql/expression/convert.go | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 89962c371c..ea63844f0b 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -15,10 +15,10 @@ package queries import ( - "github.com/dolthub/vitess/go/mysql" "math" "time" + "github.com/dolthub/vitess/go/mysql" "github.com/dolthub/vitess/go/sqltypes" "github.com/dolthub/vitess/go/vt/sqlparser" "gopkg.in/src-d/go-errors.v1" diff --git a/sql/core.go b/sql/core.go index 1dc38ed34d..132bdf718f 100644 --- a/sql/core.go +++ b/sql/core.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/dolthub/vitess/go/mysql" "math" trace2 "runtime/trace" "strconv" @@ -28,6 +27,7 @@ import ( "unicode" "unsafe" + "github.com/dolthub/vitess/go/mysql" "github.com/shopspring/decimal" "gopkg.in/src-d/go-errors.v1" diff --git a/sql/expression/convert.go b/sql/expression/convert.go index 70f5a84d91..09f948aa9d 100644 --- a/sql/expression/convert.go +++ b/sql/expression/convert.go @@ -17,13 +17,14 @@ package expression import ( "encoding/hex" "fmt" + "strconv" + "strings" + "time" + "github.com/dolthub/vitess/go/mysql" "github.com/dolthub/vitess/go/sqltypes" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" - "strconv" - "strings" - "time" "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/types" From 3583a8151e3bd28fcb149295ec20bfb76b84f05b Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 12:52:38 -0700 Subject: [PATCH 71/73] add mysql dialect tag --- enginetest/queries/script_queries.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index ea63844f0b..be47bfa108 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -11938,18 +11938,21 @@ select * from t1 except ( Name: "strings convert to booleans", Assertions: []ScriptTestAssertion{ { + Dialect: "mysql", Query: `select '3bxu' and true`, Expected: []sql.Row{{true}}, ExpectedWarning: mysql.ERTruncatedWrongValue, ExpectedWarningsCount: 1, }, { + Dialect: "mysql", Query: "select '3bxu' or false", Expected: []sql.Row{{true}}, ExpectedWarning: mysql.ERTruncatedWrongValue, ExpectedWarningsCount: 1, }, { + Dialect: "mysql", Query: "select '3bxu' xor false", Expected: []sql.Row{{true}}, ExpectedWarning: mysql.ERTruncatedWrongValue, @@ -11971,12 +11974,14 @@ select * from t1 except ( ExpectedWarningsCount: 0, }, { + Dialect: "mysql", Query: "select '00asdf' or false", Expected: []sql.Row{{false}}, ExpectedWarning: mysql.ERTruncatedWrongValue, ExpectedWarningsCount: 1, }, { + Dialect: "mysql", Query: "select 'asdf' or false", Expected: []sql.Row{{false}}, ExpectedWarning: mysql.ERTruncatedWrongValue, From fbc08af8cb648b98091e8094b82e5ace33eee99a Mon Sep 17 00:00:00 2001 From: Angela Xie Date: Mon, 15 Sep 2025 13:20:18 -0700 Subject: [PATCH 72/73] updated TODOs --- enginetest/queries/script_queries.go | 2 +- sql/core.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index be47bfa108..ad4a3e82a1 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -11835,7 +11835,7 @@ select * from t1 except ( {"a1a1", uint64(0)}, }, // TODO: Should be 19. Missing warnings for "Cast to unsigned converted negative integer to its positive - // complement" (1105) + // complement" (1105) https://github.com/dolthub/dolt/issues/9840 ExpectedWarningsCount: 16, ExpectedWarning: mysql.ERTruncatedWrongValue, }, diff --git a/sql/core.go b/sql/core.go index 132bdf718f..4dad97dc13 100644 --- a/sql/core.go +++ b/sql/core.go @@ -362,6 +362,7 @@ func TrimStringToNumberPrefix(ctx *Context, s string, isInt bool) string { seenExp = true signIndex = i + 1 } else if !((char == '-' || char == '+') && i == signIndex) { + // TODO add different warning for DECIMAL conversion if isInt { ctx.Warn(mysql.ERTruncatedWrongValue, "Truncated incorrect INTEGER value: '%s'", s) } else { From 63a1648e2263deba31c4f242a1736c0711adac19 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 15 Sep 2025 22:15:08 +0000 Subject: [PATCH 73/73] [ga-bump-dep] Bump dependency in GMS by angelamayxie --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c7e9970de7..f8f266adbd 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20250820171420-f2b78f56ce9f github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 - github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d + github.com/dolthub/vitess v0.0.0-20250915221346-753c44800850 github.com/go-sql-driver/mysql v1.9.3 github.com/gocraft/dbr/v2 v2.7.2 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index bbcc10293e..5695efef83 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9X github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d h1:oTWJxjzRmuHKuICUunCUwNuonubkXwOqPa5hXX3dXBo= github.com/dolthub/vitess v0.0.0-20250902225707-0159e964d73d/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= +github.com/dolthub/vitess v0.0.0-20250915221346-753c44800850 h1:QXkIRTquxaGUgKVHnKZxU+ikARdszUUDU6C9B/76+a0= +github.com/dolthub/vitess v0.0.0-20250915221346-753c44800850/go.mod h1:tV3BrIVyDWVkkYy8dKt2o6hjJ89cHb5opY5FpCyhncQ= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=