Skip to content

Commit fdfdc00

Browse files
committed
Small fixes
1 parent aa12bb0 commit fdfdc00

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

sql/rowexec/rel_iters.go

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,15 @@ type nestedIterState struct {
141141
}
142142

143143
func (i *ProjectIter) Next(ctx *sql.Context) (sql.Row, error) {
144+
if i.hasNestedIters {
145+
return i.ProjectRowWithNestedIters(ctx)
146+
}
147+
144148
childRow, err := i.childIter.Next(ctx)
145149
if err != nil {
146150
return nil, err
147151
}
148152

149-
if i.hasNestedIters {
150-
return i.ProjectRowWithNestedIters(ctx, i.projs, childRow)
151-
}
152-
153153
return ProjectRow(ctx, i.projs, childRow)
154154
}
155155

@@ -172,29 +172,41 @@ func (i *ProjectIter) GetChildIter() sql.RowIter {
172172
// ProjectRowWithNestedIters evaluates a set of projections, allowing for nested iterators in the expressions.
173173
func (i *ProjectIter) ProjectRowWithNestedIters(
174174
ctx *sql.Context,
175-
projections []sql.Expression,
176-
row sql.Row,
177175
) (sql.Row, error) {
178176

177+
projections := i.projs
178+
179179
// For the set of iterators, we return one row each element in the longest of the iterators provided.
180180
// Other iterator values will be NULL after they are depleted. All non-iterator fields for the row are returned
181181
// identically for each row in the result set.
182182
if i.nestedState != nil {
183-
var stillIterating
183+
row, err := ProjectRow(ctx, i.nestedState.projections, i.nestedState.sourceRow)
184+
if err != nil {
185+
return nil, err
186+
}
187+
188+
nestedIterationFinished := true
184189
for _, evaluator := range i.nestedState.iterEvaluators {
185190
if !evaluator.finished {
186-
stillIterating = true
191+
nestedIterationFinished = false
187192
break
188193
}
189194
}
190-
191-
if !stillIterating {
195+
196+
if nestedIterationFinished {
192197
i.nestedState = nil
193-
return i.ProjectRowWithNestedIters(ctx, i.nestedState.projections, i.nestedState.sourceRow)
198+
return i.ProjectRowWithNestedIters(ctx)
194199
}
200+
201+
return row, nil
195202
}
196203

197-
nestedState := &nestedIterState{
204+
row, err := i.childIter.Next(ctx)
205+
if err != nil {
206+
return nil, err
207+
}
208+
209+
i.nestedState = &nestedIterState{
198210
sourceRow: row,
199211
}
200212

@@ -228,10 +240,10 @@ func (i *ProjectIter) ProjectRowWithNestedIters(
228240
newProjs[i] = p
229241
}
230242

231-
nestedState.projections = newProjs
232-
nestedState.iterEvaluators = rowIterEvaluators
233-
i.nestedState = nestedState
234-
return i.ProjectRowWithNestedIters(ctx, projections, row)
243+
i.nestedState.projections = newProjs
244+
i.nestedState.iterEvaluators = rowIterEvaluators
245+
246+
return i.ProjectRowWithNestedIters(ctx)
235247
}
236248

237249
type RowIterEvaluator struct {

0 commit comments

Comments
 (0)