iffyio commented on code in PR #2352:
URL:
https://github.com/apache/datafusion-sqlparser-rs/pull/2352#discussion_r3310342696
##########
src/parser/mod.rs:
##########
@@ -1717,6 +1731,23 @@ impl<'a> Parser<'a> {
return prefix;
}
+ // Memoize parse_prefix failures to break 2^N speculation when both
+ // prefix arms fail at every level (e.g. `IF(current_time(...x`).
+ // The per-arm cache in `parse_prefix_inner` complements this for
+ // chains where the reserved arm fails but the unreserved fallback
+ // succeeds (e.g. `case-case-...c`).
+ let start_index = self.index;
+ if let Some(cached) = self.failed_prefix_positions.get(&start_index) {
+ return Err(cached.clone());
+ }
+ let result = self.parse_prefix_inner();
+ if let Err(ref e) = result {
+ self.failed_prefix_positions.insert(start_index, e.clone());
Review Comment:
wondering about memory usage, how large do we expect the caches to get in
the worse case scenarios?
##########
src/parser/mod.rs:
##########
@@ -1801,7 +1832,21 @@ impl<'a> Parser<'a> {
// We first try to parse the word and following tokens as a
special expression, and if that fails,
// we rollback and try to parse it as an identifier.
let w = w.clone();
- match self.try_parse(|parser|
parser.parse_expr_prefix_by_reserved_word(&w, span)) {
+ // Memoize failed speculative reserved-word parses. When
+ // the reserved arm (CASE, CURRENT_TIME, etc.) does
+ // exponential work but the unreserved fallback ultimately
+ // succeeds, the overall `parse_prefix` returns `Ok` and the
+ // outer cache never fires. Chains like `case-case-...c`
+ // need this per-arm cache to break the doubling.
Review Comment:
I wasn't able to follow this comment, what is 'outer cache' and 'break
doubling' referring to?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]