diff --git a/lib/lookup/src/field.rs b/lib/lookup/src/field.rs index f4a170c3dcfa5..4f5224867d75d 100644 --- a/lib/lookup/src/field.rs +++ b/lib/lookup/src/field.rs @@ -2,7 +2,7 @@ use once_cell::sync::Lazy; use regex::Regex; static VALID_FIELD: Lazy = - Lazy::new(|| Regex::new("^[0-9]*[a-zA-Z_][0-9a-zA-Z_]*$").unwrap()); + Lazy::new(|| Regex::new("^[0-9]*[a-zA-Z_@][0-9a-zA-Z_@]*$").unwrap()); /// A valid fieldname can contain alphanumeric characters and an underscore. /// It may start with a number, but has to consist of more than just a number. diff --git a/lib/lookup/src/path.lalrpop b/lib/lookup/src/path.lalrpop index 091a1c98d9369..512fa48c6b624 100644 --- a/lib/lookup/src/path.lalrpop +++ b/lib/lookup/src/path.lalrpop @@ -25,7 +25,7 @@ PathSegment: Segment<'input> = { } Field: Field<'input> = { - => Field::from(s), + => Field::from(s), => Field::from(s), } diff --git a/lib/vrl/compiler/src/expression/assignment.rs b/lib/vrl/compiler/src/expression/assignment.rs index f06e47105061f..392b089226d63 100644 --- a/lib/vrl/compiler/src/expression/assignment.rs +++ b/lib/vrl/compiler/src/expression/assignment.rs @@ -228,10 +228,10 @@ fn verify_overwriteable( let (variant, segment_span, valid) = match last { segment @ (SegmentBuf::Field(_) | SegmentBuf::Coalesce(_)) => { let segment_str = segment.to_string(); - let segment_start = parent_span.end() - segment_str.len(); + let segment_start = parent_span.end().saturating_sub(segment_str.len()); let segment_span = Span::new(segment_start, parent_span.end()); - parent_span = Span::new(parent_span.start(), segment_start - 1); + parent_span = Span::new(parent_span.start(), segment_start.saturating_sub(1)); remainder_str.insert_str(0, &format!(".{}", segment_str)); ("object", segment_span, parent_kind.contains_object()) diff --git a/lib/vrl/tests/tests/issues/13461/1.vrl b/lib/vrl/tests/tests/issues/13461/1.vrl new file mode 100644 index 0000000000000..a9bf511047522 --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/1.vrl @@ -0,0 +1,2 @@ +# result: true +.(a|b) = true diff --git a/lib/vrl/tests/tests/issues/13461/2.vrl b/lib/vrl/tests/tests/issues/13461/2.vrl new file mode 100644 index 0000000000000..065fae3b6973a --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/2.vrl @@ -0,0 +1,2 @@ +# result: true +.("a b" | c) = true diff --git a/lib/vrl/tests/tests/issues/13461/3.vrl b/lib/vrl/tests/tests/issues/13461/3.vrl new file mode 100644 index 0000000000000..109d9b64e91db --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/3.vrl @@ -0,0 +1,2 @@ +# result: true +."foo @bar".baz = true diff --git a/lib/vrl/tests/tests/issues/13461/4.vrl b/lib/vrl/tests/tests/issues/13461/4.vrl new file mode 100644 index 0000000000000..53682c001b6e6 --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/4.vrl @@ -0,0 +1,2 @@ +# result: true +.@@foo = true diff --git a/lib/vrl/tests/tests/issues/13461/5.vrl b/lib/vrl/tests/tests/issues/13461/5.vrl new file mode 100644 index 0000000000000..e50c77316504e --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/5.vrl @@ -0,0 +1,2 @@ +# result: true +.@foo = true diff --git a/lib/vrl/tests/tests/issues/13461/6.vrl b/lib/vrl/tests/tests/issues/13461/6.vrl new file mode 100644 index 0000000000000..f56ccae2391f0 --- /dev/null +++ b/lib/vrl/tests/tests/issues/13461/6.vrl @@ -0,0 +1,2 @@ +# result: true +."$foo" = true