@@ -141,15 +141,15 @@ type nestedIterState struct {
141
141
}
142
142
143
143
func (i * ProjectIter ) Next (ctx * sql.Context ) (sql.Row , error ) {
144
+ if i .hasNestedIters {
145
+ return i .ProjectRowWithNestedIters (ctx )
146
+ }
147
+
144
148
childRow , err := i .childIter .Next (ctx )
145
149
if err != nil {
146
150
return nil , err
147
151
}
148
152
149
- if i .hasNestedIters {
150
- return i .ProjectRowWithNestedIters (ctx , i .projs , childRow )
151
- }
152
-
153
153
return ProjectRow (ctx , i .projs , childRow )
154
154
}
155
155
@@ -172,29 +172,41 @@ func (i *ProjectIter) GetChildIter() sql.RowIter {
172
172
// ProjectRowWithNestedIters evaluates a set of projections, allowing for nested iterators in the expressions.
173
173
func (i * ProjectIter ) ProjectRowWithNestedIters (
174
174
ctx * sql.Context ,
175
- projections []sql.Expression ,
176
- row sql.Row ,
177
175
) (sql.Row , error ) {
178
176
177
+ projections := i .projs
178
+
179
179
// For the set of iterators, we return one row each element in the longest of the iterators provided.
180
180
// Other iterator values will be NULL after they are depleted. All non-iterator fields for the row are returned
181
181
// identically for each row in the result set.
182
182
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
184
189
for _ , evaluator := range i .nestedState .iterEvaluators {
185
190
if ! evaluator .finished {
186
- stillIterating = true
191
+ nestedIterationFinished = false
187
192
break
188
193
}
189
194
}
190
-
191
- if ! stillIterating {
195
+
196
+ if nestedIterationFinished {
192
197
i .nestedState = nil
193
- return i .ProjectRowWithNestedIters (ctx , i . nestedState . projections , i . nestedState . sourceRow )
198
+ return i .ProjectRowWithNestedIters (ctx )
194
199
}
200
+
201
+ return row , nil
195
202
}
196
203
197
- nestedState := & nestedIterState {
204
+ row , err := i .childIter .Next (ctx )
205
+ if err != nil {
206
+ return nil , err
207
+ }
208
+
209
+ i .nestedState = & nestedIterState {
198
210
sourceRow : row ,
199
211
}
200
212
@@ -228,10 +240,10 @@ func (i *ProjectIter) ProjectRowWithNestedIters(
228
240
newProjs [i ] = p
229
241
}
230
242
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 )
235
247
}
236
248
237
249
type RowIterEvaluator struct {
0 commit comments