Skip to content

Commit 88fde61

Browse files
committed
add back parser support of label
1 parent c3b9d45 commit 88fde61

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

sqllogictest/src/parser.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ pub enum QueryExpect<T: ColumnType> {
9595
types: Vec<T>,
9696
sort_mode: Option<SortMode>,
9797
result_mode: Option<ResultMode>,
98+
label: Option<String>,
9899
results: Vec<String>,
99100
},
100101
/// Query should fail with the given error message.
@@ -108,6 +109,7 @@ impl<T: ColumnType> QueryExpect<T> {
108109
types: Vec::new(),
109110
sort_mode: None,
110111
result_mode: None,
112+
label: None,
111113
results: Vec::new(),
112114
}
113115
}
@@ -255,12 +257,18 @@ impl<T: ColumnType> std::fmt::Display for Record<T> {
255257
write!(f, "query ")?;
256258
match expected {
257259
QueryExpect::Results {
258-
types, sort_mode, ..
260+
types,
261+
sort_mode,
262+
label,
263+
..
259264
} => {
260265
write!(f, "{}", types.iter().map(|c| c.to_char()).join(""))?;
261266
if let Some(sort_mode) = sort_mode {
262267
write!(f, " {}", sort_mode.as_str())?;
263268
}
269+
if let Some(label) = label {
270+
write!(f, " {label}")?;
271+
}
264272
}
265273
QueryExpect::Error(err) => err.fmt_inline(f)?,
266274
}
@@ -281,6 +289,8 @@ impl<T: ColumnType> std::fmt::Display for Record<T> {
281289
for result in results {
282290
write!(f, "\n{result}")?;
283291
}
292+
293+
// query always ends with a blank line
284294
writeln!(f)?
285295
}
286296
QueryExpect::Error(err) => err.fmt_multiline(f)?,
@@ -807,24 +817,38 @@ fn parse_inner<T: ColumnType>(loc: &Location, script: &str) -> Result<Vec<Record
807817
(QueryExpect::Error(error), &[][..])
808818
}
809819
[type_str, res @ ..] => {
820+
// query <type-string> [<sort-mode>] [<label>] [retry <attempts> backoff <backoff>]
810821
let types = type_str
811822
.chars()
812823
.map(|ch| {
813824
T::from_char(ch)
814825
.ok_or_else(|| ParseErrorKind::InvalidType(ch).at(loc.clone()))
815826
})
816827
.try_collect()?;
817-
let sort_mode = res.first().and_then(|&s| SortMode::try_from_str(s).ok()); // Could be `retry`
828+
let sort_mode = res.first().and_then(|&s| SortMode::try_from_str(s).ok()); // Could be `retry` or label
829+
830+
// To support `retry`, we assume the label must *not* be "retry"
831+
let label_start = if sort_mode.is_some() { 1 } else { 0 };
832+
let res = &res[label_start..];
833+
let label = res.first().and_then(|&s| {
834+
if s != "retry" {
835+
Some(s.to_owned())
836+
} else {
837+
None // `retry` is not a valid label
838+
}
839+
});
818840

819-
let retry_start = if sort_mode.is_some() { 1 } else { 0 };
841+
let retry_start = if label.is_some() { 1 } else { 0 };
842+
let res = &res[retry_start..];
820843
(
821844
QueryExpect::Results {
822845
types,
823846
sort_mode,
824847
result_mode: None,
848+
label,
825849
results: Vec::new(),
826850
},
827-
&res[retry_start..],
851+
res,
828852
)
829853
}
830854
[] => (QueryExpect::empty_results(), &[][..]),

sqllogictest/src/runner.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1640,20 +1640,22 @@ pub fn update_record_with_output<T: ColumnType>(
16401640
expected: match expected {
16411641
QueryExpect::Results {
16421642
sort_mode,
1643-
1643+
label,
16441644
result_mode,
16451645
..
16461646
} => QueryExpect::Results {
16471647
results,
16481648
types,
16491649
sort_mode,
16501650
result_mode,
1651+
label,
16511652
},
16521653
QueryExpect::Error(_) => QueryExpect::Results {
16531654
results,
16541655
types,
16551656
sort_mode: None,
16561657
result_mode: None,
1658+
label: None,
16571659
},
16581660
},
16591661
retry,

tests/retry/query_retry.slt

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# SYNTAX: query <type-string> [<sort-mode>] [<label>] [retry <attempts> backoff <backoff>]
12
query I retry 3 backoff 5s
23
SELECT id FROM test;
34
----
@@ -13,4 +14,34 @@ SELECT id FROM test ORDER BY random();
1314
query I retry 1 backoff 500ms
1415
SELECT id FROM test;
1516
----
16-
1
17+
1
18+
19+
query I my_label retry 1 backoff 500ms
20+
SELECT id FROM test;
21+
----
22+
1
23+
24+
query I rowsort my_label retry 1 backoff 500ms
25+
SELECT id FROM test;
26+
----
27+
1
28+
29+
query I rowsort my_label
30+
SELECT id FROM test;
31+
----
32+
1
33+
34+
query I rowsort
35+
SELECT id FROM test;
36+
----
37+
1
38+
39+
query I my_label
40+
SELECT id FROM test;
41+
----
42+
1
43+
44+
query I
45+
SELECT id FROM test;
46+
----
47+
1

0 commit comments

Comments
 (0)