Skip to content

Commit 20ef18c

Browse files
Merge #271
271: Lambda fixes r=WireBaron a=JLockerman Two minor fixes to lambdas: 1. Allow newlines within lambdas. 2. Allow the parsing of multiple successive `let`s instead of stopping at the first. Altogether this allows the parsing of expressions such as ```SQL let $foo = -2; let $bar = $foo * $foo; $bar * $bar ``` Co-authored-by: Joshua Lockerman <[email protected]>
2 parents a3e3ec9 + 5347226 commit 20ef18c

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

extension/src/time_series/pipeline/lambda.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,24 @@ mod tests {
780780
r#" binop Plus Double: "Double(6.0)""#,
781781
],
782782
);
783+
784+
let rows: Vec<_> = trace_lambda!(
785+
client,
786+
"let $foo = -2;\nlet $bar = $foo * $foo;\n $bar * $bar"
787+
);
788+
assert_eq!(
789+
&*rows,
790+
[ // TODO try and fix parsing so than `-2` parses as a constant `-2`
791+
r#" f64 const: "Double(2.0)""#,
792+
r#"uop Negative Double: "Double(-2.0)""#,
793+
r#" user var 0: Double: "Double(-2.0)""#,
794+
r#" user var 0: Double: "Double(-2.0)""#,
795+
r#" binop Mul Double: "Double(4.0)""#,
796+
r#" user var 1: Double: "Double(4.0)""#,
797+
r#" user var 1: Double: "Double(4.0)""#,
798+
r#" binop Mul Double: "Double(16.0)""#,
799+
],
800+
);
783801
});
784802
}
785803
}

extension/src/time_series/pipeline/lambda/lambda_expr.pest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ string = _{ "'" ~ (!"'" ~ ANY)* ~ "'" }
4444
var = @{ "$" ~ (ASCII_ALPHANUMERIC | "_")+ }
4545
function_name = @{ ASCII_ALPHA ~ ASCII_ALPHANUMERIC* }
4646

47-
WHITESPACE = _{ " " | "\t" }
47+
WHITESPACE = _{ " " | "\t" | NEWLINE }

extension/src/time_series/pipeline/lambda/parser.rs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -151,29 +151,27 @@ fn parse_primary<'a>(
151151
binops => build_expression(pair.into_inner(), var_expressions, known_vars),
152152

153153
let_expr => {
154-
// let_expr has two forms
155-
// `let <variable> = <expression>; <expression>` and `<expression>`
156-
// if we have more than one sub-pair in our pairs then we know we're
157-
// in the first state, otherwise we must be in the second.
158154
let mut pairs = pair.into_inner();
159-
let var_name_or_expr = pairs.next().unwrap();
160-
let var_value = match pairs.next() {
161-
None => return parse_primary(var_name_or_expr, var_expressions, known_vars),
162-
Some(val) => val,
163-
164-
};
165-
let remaining = pairs.next().unwrap();
166-
assert!(pairs.next().is_none());
167-
168-
let var_value = parse_primary(var_value, var_expressions, known_vars);
169-
170-
let var_name = var_name_or_expr.as_str();
171-
known_vars.entry(var_name)
172-
.and_modify(|_| panic!("duplicate var {}", var_name))
173-
.or_insert_with(|| (var_value.ty().clone(), var_expressions.len()));
174-
var_expressions.push(var_value);
175-
176-
parse_primary(remaining, var_expressions, known_vars)
155+
loop {
156+
// let_expr has two forms
157+
// `let <variable> = <expression>; <expression>` and `<expression>`
158+
// if we have more than one sub-pair in our pairs then we know we're
159+
// in the first state, otherwise we must be in the second.
160+
let var_name_or_expr = pairs.next().unwrap();
161+
let var_value = match pairs.next() {
162+
None => return parse_primary(var_name_or_expr, var_expressions, known_vars),
163+
Some(val) => val,
164+
165+
};
166+
167+
let var_value = parse_primary(var_value, var_expressions, known_vars);
168+
169+
let var_name = var_name_or_expr.as_str();
170+
known_vars.entry(var_name)
171+
.and_modify(|_| panic!("duplicate var {}", var_name))
172+
.or_insert_with(|| (var_value.ty().clone(), var_expressions.len()));
173+
var_expressions.push(var_value);
174+
}
177175
},
178176

179177
tuple => {

0 commit comments

Comments
 (0)