Skip to content

Commit 0f6f235

Browse files
scottleppandresmgotzoltanbedi
authored
fix: dynamic frame panic (#958)
fix: dynamic frame panic --------- Co-authored-by: Andres Martinez Gotor <[email protected]> Co-authored-by: Zoltán Bedi <[email protected]>
1 parent ceadf1f commit 0f6f235

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

data/sqlutil/dynamic_frame.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ import (
1010

1111
const STRING = "string"
1212

13-
func isDynamic(converters []Converter) bool {
13+
// removeDynamicConverter filters out the dynamic converter. It is not a valid converter.
14+
func removeDynamicConverter(converters []Converter) (bool, []Converter) {
15+
var filtered []Converter
16+
var isDynamic bool
1417
for _, conv := range converters {
1518
if conv.Dynamic {
16-
return true
19+
isDynamic = true
20+
} else {
21+
filtered = append(filtered, conv)
1722
}
1823
}
19-
return false
24+
return isDynamic, filtered
2025
}
2126

2227
func findDataTypes(rows Rows, rowLimit int64, types []*sql.ColumnType) ([]Field, [][]interface{}, error) {

data/sqlutil/dynamic_frame_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func TestDynamicFrame(t *testing.T) {
2929
itr: mock,
3030
}
3131

32+
_, converters = removeDynamicConverter(converters)
3233
frame, err := frameDynamic(rows, 100, types, converters)
3334
assert.Nil(t, err)
3435
assert.NotNil(t, frame)
@@ -64,3 +65,42 @@ func (rs *MockRows) Scan(dest ...interface{}) error {
6465
}
6566
return nil
6667
}
68+
69+
func TestDynamicFrameShouldNotPanic(t *testing.T) {
70+
kind := &sql.ColumnType{}
71+
types := []*sql.ColumnType{}
72+
types = append(types, kind)
73+
converters := []Converter{dynamic()}
74+
data := [][]interface{}{}
75+
mockRow := []interface{}{}
76+
val := string("foo")
77+
mockRow = append(mockRow, val)
78+
data = append(data, mockRow)
79+
mock := &MockRows{
80+
data: data,
81+
index: -1,
82+
}
83+
rows := Rows{
84+
itr: mock,
85+
}
86+
87+
_, converters = removeDynamicConverter(converters)
88+
frame, err := frameDynamic(rows, 100, types, converters)
89+
assert.Nil(t, err)
90+
assert.NotNil(t, frame)
91+
92+
assert.Equal(t, 1, frame.Rows())
93+
94+
actual := frame.Fields[0].At(0).(*string)
95+
assert.Equal(t, val, *actual)
96+
}
97+
98+
// dynamic is the converter that uses the results to determine data types
99+
func dynamic() Converter {
100+
kind := "dynamic"
101+
return Converter{
102+
Name: kind,
103+
InputTypeName: kind,
104+
Dynamic: true,
105+
}
106+
}

data/sqlutil/sql.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ func FrameFromRows(rows *sql.Rows, rowLimit int64, converters ...Converter) (*da
2525
return nil, err
2626
}
2727

28-
if isDynamic(converters) {
28+
// If there is a dynamic converter, we need to use the dynamic framer
29+
// and remove the dynamic converter from the list of converters ( it is not valid, just a flag )
30+
if isDynamic, converters := removeDynamicConverter(converters); isDynamic {
2931
rows := Rows{itr: rows}
3032
return frameDynamic(rows, rowLimit, types, converters)
3133
}

0 commit comments

Comments
 (0)