code: func (e *SelectionExec) unBatchedNext(ctx context.Context, chk *chunk.Chunk) error {
  	for {
  		for ; e.inputRow != e.inputIter.End(); e.inputRow = e.inputIter.Next() {
  			selected, _, err := expression.EvalBool(e.ctx, e.filters, e.inputRow)
  			if err != nil {
  				return err
  			}
  			if selected {
  				chk.AppendRow(e.inputRow)
  				e.inputRow = e.inputIter.Next()
  				return nil
  			}
  		}
  		err := e.children[0].Next(ctx, chunk.NewRecordBatch(e.childResult))
  		if err != nil {
  			return err
  		}
  		e.inputRow = e.inputIter.Begin()
  		// no more data.
  		if e.childResult.NumRows() == 0 {
  			return nil
  		}
  	}
  }
docs: // unBatchedNext filters input rows one by one and returns once an input row is selected.
  // For sql with "SETVAR" in filter and "GETVAR" in projection, for example: "SELECT @a FROM t WHERE (@a := 2) > 0",
  // we have to set batch size to 1 to do the evaluation of filter and projection.