// debugNext is a helper function used by Next() when in explainDebug mode. func (n *scanNode) debugNext() (bool, error) { // In debug mode, we output a set of debug values for each key. n.debugVals.rowIdx = n.rowIndex var err error var encRow sqlbase.EncDatumRow n.debugVals.key, n.debugVals.value, encRow, err = n.fetcher.NextKeyDebug() if err != nil || n.debugVals.key == "" { return false, err } if encRow == nil { n.row = nil n.debugVals.output = debugValuePartial return true, nil } tuple := make(parser.DTuple, len(encRow)) var da sqlbase.DatumAlloc if err := sqlbase.EncDatumRowToDTuple(tuple, encRow, &da); err != nil { return false, errors.Errorf("Could not decode row: %v", err) } n.row = tuple passesFilter, err := sqlbase.RunFilter(n.filter, &n.p.evalCtx) if err != nil { return false, err } if passesFilter { n.debugVals.output = debugValueRow } else { n.debugVals.output = debugValueFiltered } n.rowIndex++ return true, nil }
func (n *scanNode) Next() (bool, error) { tracing.AnnotateTrace() if !n.scanInitialized { if err := n.initScan(); err != nil { return false, err } } if n.explain == explainDebug { return n.debugNext() } // We fetch one row at a time until we find one that passes the filter. for { var err error n.row, err = n.fetcher.NextRowDecoded() if err != nil || n.row == nil { return false, err } passesFilter, err := sqlbase.RunFilter(n.filter, &n.p.evalCtx) if err != nil { return false, err } if passesFilter { return true, nil } } }
func (s *selectNode) Next() (bool, error) { for { if next, err := s.source.plan.Next(); !next { return false, err } if s.explain == explainDebug { s.debugVals = s.source.plan.DebugValues() if s.debugVals.output != debugValueRow { // Let the debug values pass through. return true, nil } } row := s.source.plan.Values() s.curSourceRow = row passesFilter, err := sqlbase.RunFilter(s.filter, &s.planner.evalCtx) if err != nil { return false, err } if passesFilter { err := s.renderRow() return err == nil, err } else if s.explain == explainDebug { // Mark the row as filtered out. s.debugVals.output = debugValueFiltered return true, nil } // Row was filtered out; grab the next row. } }
// debugNext is a helper function used by Next() when in explainDebug mode. func (n *scanNode) debugNext() (bool, error) { // In debug mode, we output a set of debug values for each key. n.debugVals.rowIdx = n.rowIndex var err error n.debugVals.key, n.debugVals.value, n.row, err = n.fetcher.NextKeyDebug() if err != nil || n.debugVals.key == "" { return false, err } if n.row != nil { passesFilter, err := sqlbase.RunFilter(n.filter, &n.p.evalCtx) if err != nil { return false, err } if passesFilter { n.debugVals.output = debugValueRow } else { n.debugVals.output = debugValueFiltered } n.rowIndex++ } else { n.debugVals.output = debugValuePartial } return true, nil }
// Next implements the planNode interface. func (f *filterNode) Next() (bool, error) { for { if next, err := f.source.plan.Next(); !next { return false, err } if f.explain == explainDebug { f.debugVals = f.source.plan.DebugValues() if f.debugVals.output != debugValueRow { // Let the debug values pass through. return true, nil } } passesFilter, err := sqlbase.RunFilter(f.filter, &f.p.evalCtx) if err != nil { return false, err } if passesFilter { return true, nil } else if f.explain == explainDebug { // Mark the row as filtered out. f.debugVals.output = debugValueFiltered return true, nil } // Row was filtered out; grab the next row. } }
// eval for joinPredicate runs the on condition across the columns that do // not participate in the equality (the equality columns are checked // in the join algorithm already). // Returns true if there is no on condition or the on condition accepts the // row. func (p *joinPredicate) eval( ctx *parser.EvalContext, result, leftRow, rightRow parser.DTuple, ) (bool, error) { if p.onCond != nil { p.curRow = result copy(p.curRow[p.numMergedEqualityColumns:p.numMergedEqualityColumns+len(leftRow)], leftRow) copy(p.curRow[p.numMergedEqualityColumns+len(leftRow):], rightRow) return sqlbase.RunFilter(p.onCond, ctx) } return true, nil }
// evalFilter is used for filter expressions; it evaluates the expression and // returns whether the filter passes. func (eh *exprHelper) evalFilter(row sqlbase.EncDatumRow) (bool, error) { eh.row = row return sqlbase.RunFilter(eh.expr, eh.evalCtx) }