SQL Datasources: Prevent Call Stack Overflows with Large Numbers of Values for Variable (#64937)

* Push values with every map call to avoid hitting the maximum call stack size.

* Add test and refactor to for of

* Use native fill instead of lodash

---------

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
This commit is contained in:
Kyle Cunningham 2023-03-22 20:50:54 +07:00 committed by GitHub
parent 5435ae25f7
commit bf687fff45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 7 deletions

View File

@ -0,0 +1,23 @@
import { DataFrameDTO, FieldType, MutableDataFrame } from '@grafana/data';
import { ResponseParser } from './ResponseParser';
describe('transformMetricFindResponse function', () => {
it('should handle big arrays', () => {
const responseParser = new ResponseParser();
const stringValues = new Array(150_000).fill('a');
const numberValues = new Array(150_000).fill(1);
const frame: DataFrameDTO = {
fields: [
{ name: 'name', type: FieldType.string, values: stringValues },
{ name: 'value', type: FieldType.number, values: numberValues },
],
};
const dataFrame = new MutableDataFrame(frame);
const result = responseParser.transformMetricFindResponse(dataFrame);
expect(result).toHaveLength(2);
});
});

View File

@ -14,13 +14,11 @@ export class ResponseParser implements ResponseParserType {
values.push({ text: '' + textField.values.get(i), value: '' + valueField.values.get(i) });
}
} else {
values.push(
...frame.fields
.flatMap((f) => f.values.toArray())
.map((v) => ({
text: v,
}))
);
for (const field of frame.fields) {
for (const value of field.values.toArray()) {
values.push({ text: value });
}
}
}
return uniqBy(values, 'text');