Skip to content

Commit db83bd9

Browse files
committed
Fix profile child computation
A range variable "lives" at the same virtual address during the whole for scope. Without this fix, this means the plan children slice will be made of n times the same profile plan instance (i.e. the last one).
1 parent 118b786 commit db83bd9

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

neo4j/resultsummary.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package neo4j
2121

2222
import (
23+
"fmt"
2324
"github.com/neo4j/neo4j-go-driver/v4/neo4j/db"
2425
"time"
2526
)
@@ -355,6 +356,10 @@ type profile struct {
355356
profile *db.ProfiledPlan
356357
}
357358

359+
func (p *profile) String() string {
360+
return fmt.Sprintf("%v", *p.profile)
361+
}
362+
358363
func (p *profile) Operator() string {
359364
return p.profile.Operator
360365
}
@@ -378,7 +383,8 @@ func (p *profile) Records() int64 {
378383
func (p *profile) Children() []ProfiledPlan {
379384
children := make([]ProfiledPlan, len(p.profile.Children))
380385
for i, c := range p.profile.Children {
381-
children[i] = &profile{profile: &c}
386+
child := c
387+
children[i] = &profile{profile: &child}
382388
}
383389
return children
384390
}

neo4j/resultsummary_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
20+
package neo4j
21+
22+
import (
23+
"github.com/neo4j/neo4j-go-driver/v4/neo4j/db"
24+
"reflect"
25+
"testing"
26+
)
27+
28+
func TestProfiledPlan(st *testing.T) {
29+
leaf1 := db.ProfiledPlan{Operator: "bar"}
30+
leaf2 := db.ProfiledPlan{Operator: "fighters"}
31+
root := &profile{profile: &db.ProfiledPlan{Operator: "foo", Children: []db.ProfiledPlan{leaf1, leaf2}}}
32+
33+
st.Run("Child plans are correctly populated", func(t *testing.T) {
34+
expected := []ProfiledPlan{
35+
&profile{profile: &leaf1},
36+
&profile{profile: &leaf2},
37+
}
38+
39+
children := root.Children()
40+
41+
if !reflect.DeepEqual(children, expected) {
42+
t.Errorf("Expected %v to equal %v", children, expected)
43+
}
44+
})
45+
}

0 commit comments

Comments
 (0)