mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Fix bug with "maximum recursion depth exceeded" in imports.
Summary: Our date-guessing logic analyzes text in full looking for date parts. This diff skip all that work when text is so long that we don't need to consider it to be a valid date. This is a quick fix. There are probably many other cases when we don't need to try hard to parse arbitrary text as dates. Test Plan: Added a fixture and test case that would trigger the error without the fix. Reviewers: paulfitz Subscribers: paulfitz Differential Revision: https://phab.getgrist.com/D2992
This commit is contained in:
parent
9916a2d919
commit
26356fe588
@ -420,6 +420,12 @@ def guess(date):
|
|||||||
>>> guess('12/12/12')
|
>>> guess('12/12/12')
|
||||||
set(['%y/%m/%d', '%d/%m/%y', '%m/%d/%y', '%y/%d/%m'])
|
set(['%y/%m/%d', '%d/%m/%y', '%m/%d/%y', '%y/%d/%m'])
|
||||||
"""
|
"""
|
||||||
|
# Don't attempt to parse strings that are so long as to be certainly non-dates. Somewhat long
|
||||||
|
# strings could be dates (like "Wednesday, September 16, 2020 A.D. 08:47:02.2667911 AM -06:00",
|
||||||
|
# and who knows what other languages do). A limit is important also because the current approach
|
||||||
|
# can run into "maximum recursion depth exceeded" on a very long string.
|
||||||
|
if len(date) > 150:
|
||||||
|
return set()
|
||||||
tokens = _tokenize_by_character_class(date)
|
tokens = _tokenize_by_character_class(date)
|
||||||
_analyze_tokens(tokens)
|
_analyze_tokens(tokens)
|
||||||
return _generate_all_permutations(tuple(tokens))
|
return _generate_all_permutations(tuple(tokens))
|
||||||
|
23
sandbox/grist/imports/fixtures/test_long_cell.csv
Normal file
23
sandbox/grist/imports/fixtures/test_long_cell.csv
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
ID,LongText
|
||||||
|
17,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Neque viverra justo nec ultrices dui sapien eget mi proin. Id aliquet risus feugiat in ante. Duis convallis convallis tellus id interdum velit laoreet id. Nunc faucibus a pellentesque sit amet. Enim ut tellus elementum sagittis vitae et. Nam at lectus urna duis convallis. In iaculis nunc sed augue lacus. Aenean et tortor at risus. Ultrices gravida dictum fusce ut placerat orci nulla. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Nibh sit amet commodo nulla facilisi. Amet justo donec enim diam vulputate ut pharetra sit. Pellentesque elit eget gravida cum sociis. Sed vulputate mi sit amet mauris commodo quis.
|
||||||
|
|
||||||
|
Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui.
|
||||||
|
|
||||||
|
Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta.
|
||||||
|
|
||||||
|
Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui.
|
||||||
|
|
||||||
|
Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta.
|
||||||
|
|
||||||
|
Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui.
|
||||||
|
|
||||||
|
Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta.
|
||||||
|
|
||||||
|
Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui.
|
||||||
|
|
||||||
|
Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta.
|
||||||
|
|
||||||
|
Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui.
|
||||||
|
|
||||||
|
Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta.
|
||||||
|
"
|
|
@ -328,6 +328,14 @@ class TestImportCSV(unittest.TestCase):
|
|||||||
self._check_col(parsed_file, 2, "n3", "Text", ["c1", "c2", "c3"])
|
self._check_col(parsed_file, 2, "n3", "Text", ["c1", "c2", "c3"])
|
||||||
self._check_col(parsed_file, 3, "", "Text", [ "d1", "", ""])
|
self._check_col(parsed_file, 3, "", "Text", [ "d1", "", ""])
|
||||||
|
|
||||||
|
def test_csv_with_very_long_cell(self):
|
||||||
|
parsed_file = import_csv.parse_file(_get_fixture('test_long_cell.csv'), parse_options='')
|
||||||
|
sheet = parsed_file[1][0]
|
||||||
|
long_cell = sheet["table_data"][1][0]
|
||||||
|
self.assertEqual(len(long_cell), 8058)
|
||||||
|
self._check_col(sheet, 0, "ID", "Int", [17])
|
||||||
|
self._check_col(sheet, 1, "LongText", "Text", [long_cell])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user