| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
The regular expressions which look for a quoted field matched its body lazily, so a closing quote which was not followed by a delimiter was retried with every following quote, to the end of the sample. Match the body possessively instead: it ends at the first quote which is not doubled, as it does for a reader.
# Conflicts: # Lib/test/test_csv.py
sniff() now replaces \r\n and \r with \n before these regular expressions are used. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14. |
Sorry, something went wrong.
|
GH-155117 is a backport of this pull request to the 3.14 branch. |
Sorry, something went wrong.
|
GH-155118 is a backport of this pull request to the 3.13 branch. |
Sorry, something went wrong.
…H-154867) (#155118) [3.15] gh-98820: Fix quadratic time in csv.Sniffer for quoted fields (GH-154867) The regular expressions which look for a quoted field matched its body lazily, so a closing quote which was not followed by a delimiter was retried with every following quote, to the end of the sample. Match the body possessively instead: it ends at the first quote which is not doubled, as it does for a reader. (cherry picked from commit 476fb09) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
GH-155166 is a backport of this pull request to the 3.12 branch. |
Sorry, something went wrong.
…H-154867) (GH-155117) The regular expressions which look for a quoted field matched its body lazily, so a closing quote which was not followed by a delimiter was retried with every following quote, to the end of the sample. Match the body possessively instead: it ends at the first quote which is not doubled, as it does for a reader. (cherry picked from commit 476fb09) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ields (pythonGH-154867) (pythonGH-155117) The regular expressions which look for a quoted field matched its body lazily, so a closing quote which was not followed by a delimiter was retried with every following quote, to the end of the sample. Match the body possessively instead: it ends at the first quote which is not doubled, as it does for a reader. (cherry picked from commit 476fb09) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
GH-155538 is a backport of this pull request to the 3.11 branch. |
Sorry, something went wrong.
|
GH-155539 is a backport of this pull request to the 3.10 branch. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
The four regular expressions which look for a quoted field match its body lazily. A closing quote which is not followed by a delimiter is therefore retried with every following quote, to the very end of the sample, and findall() repeats that from every start position -- so the search is quadratic. On a single column of quoted fields none of them ever matches, so the whole cost is a failing scan.
The body now ends at the first quote which is not doubled, which is the only closing quote a reader would accept, and is matched possessively.
A minimal reproducer needs no quoted fields at all -- ',"x' * n is quadratic too, because two of the four patterns are anchored on a delimiter rather than a line.
Being unambiguous is what makes it linear, so a few matches necessarily change: 16 of 560 files in the CSVsniffer corpora. Against their ground truth the net is positive -- delimiter 73.3% -> 74.5%, quotechar 81.3% -> 81.1%, doublequote unchanged.
main is not affected: the sniffer was rewritten there in gh-83273.