Skip to content

Commit 64bd3ed

Browse files
authored
Merge branch 'main' into eric/support_label_in_parser
Signed-off-by: Eric Fu <[email protected]>
2 parents 88fde61 + 99e8301 commit 64bd3ed

File tree

4 files changed

+59
-14
lines changed

4 files changed

+59
-14
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,23 @@ SELECT id FROM test;
140140
----
141141
1
142142
143+
query error retry 3 backoff 5s
144+
SELECT id FROM test;
145+
----
146+
database error: table not found
147+
148+
143149
statement ok retry 3 backoff 5s
144150
UPDATE test SET id = 1;
151+
152+
statement error
153+
UPDATE test SET value = value + 1;
154+
----
155+
database error: table not found
145156
```
146157

158+
Due to the limitation of syntax, the retry clause can't be used along with the single-line regex error message extension.
159+
147160
### Extension: Environment variable substitution in query and statement
148161

149162
It needs to be enabled by adding `control substitution on` to the test file.

sqllogictest/src/parser.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -765,12 +765,16 @@ fn parse_inner<T: ColumnType>(loc: &Location, script: &str) -> Result<Vec<Record
765765
["statement", res @ ..] => {
766766
let (mut expected, res) = match res {
767767
["ok", retry @ ..] => (StatementExpect::Ok, retry),
768-
["error", err_tokens @ ..] => {
769-
// NOTE: `statement error` can't be used with `retry` now because all the
770-
// tokens after `error` are treated as error message.
771-
let error = ExpectedError::parse_inline_tokens(err_tokens)
772-
.map_err(|e| e.at(loc.clone()))?;
773-
(StatementExpect::Error(error), &[][..])
768+
["error", res @ ..] => {
769+
if res.len() == 4 && res[0] == "retry" && res[2] == "backoff" {
770+
// `statement error retry <num> backoff <duration>`
771+
// To keep syntax simple, let's assume the error message must be multiline.
772+
(StatementExpect::Error(ExpectedError::Empty), res)
773+
} else {
774+
let error = ExpectedError::parse_inline_tokens(res)
775+
.map_err(|e| e.at(loc.clone()))?;
776+
(StatementExpect::Error(error), &[][..])
777+
}
774778
}
775779
["count", count_str, retry @ ..] => {
776780
let count = count_str.parse::<u64>().map_err(|_| {
@@ -809,12 +813,16 @@ fn parse_inner<T: ColumnType>(loc: &Location, script: &str) -> Result<Vec<Record
809813
}
810814
["query", res @ ..] => {
811815
let (mut expected, res) = match res {
812-
["error", err_tokens @ ..] => {
813-
// NOTE: `query error` can't be used with `retry` now because all the tokens
814-
// after `error` are treated as error message.
815-
let error = ExpectedError::parse_inline_tokens(err_tokens)
816-
.map_err(|e| e.at(loc.clone()))?;
817-
(QueryExpect::Error(error), &[][..])
816+
["error", res @ ..] => {
817+
if res.len() == 4 && res[0] == "retry" && res[2] == "backoff" {
818+
// `query error retry <num> backoff <duration>`
819+
// To keep syntax simple, let's assume the error message must be multiline.
820+
(QueryExpect::Error(ExpectedError::Empty), res)
821+
} else {
822+
let error = ExpectedError::parse_inline_tokens(res)
823+
.map_err(|e| e.at(loc.clone()))?;
824+
(QueryExpect::Error(error), &[][..])
825+
}
818826
}
819827
[type_str, res @ ..] => {
820828
// query <type-string> [<sort-mode>] [<label>] [retry <attempts> backoff <backoff>]

tests/retry/query_retry.slt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ SELECT id FROM test ORDER BY random();
1111
2
1212
3
1313

14-
query I retry 1 backoff 500ms
14+
query I retry 2 backoff 500ms
1515
SELECT id FROM test;
1616
----
1717
1
@@ -45,3 +45,15 @@ query I
4545
SELECT id FROM test;
4646
----
4747
1
48+
49+
query error retry 2 backoff 500ms
50+
SELECT id FROM test;
51+
----
52+
table not found
53+
54+
55+
query error
56+
SELECT id FROM test;
57+
----
58+
table not found
59+

tests/retry/statement_retry.slt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,16 @@ statement ok retry 3 backoff 5s
22
INSERT INTO test VALUES (1);
33

44
statement count 5 retry 2 backoff 1s
5-
UPDATE test SET value = value + 1;
5+
UPDATE test SET value = value + 1;
6+
7+
statement error retry 2 backoff 500ms
8+
UPDATE test SET value = value + 1;
9+
----
10+
table not found
11+
12+
13+
statement error
14+
UPDATE test SET value = value + 1;
15+
----
16+
table not found
17+

0 commit comments

Comments
 (0)