Skip to content

Commit ff99af6

Browse files
localstack-spiral[bot]spiralhovaesco
authored
LAV-3168: Match CREATE TASK serverless-property rejection errors (#3582)
* LAV-3168: reject invalid CREATE TASK serverless properties Capture CREATE-specific Snowflake errors and verify each rejection leaves no SQL-visible task. Validate trigger intervals, completion intervals, statement sizes, and their size-order combinations before task insertion. Parse trigger expressions so malformed values reach Snowflake-style property errors. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Test matrix trigger 10/604800 accepted -> tests/queries/test_tasks.py::test_create_task_serverless_intervals trigger 9/0/-1/604801 rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections trigger decimal/string/word/huge rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections target 10 seconds/86400 seconds accepted -> tests/queries/test_tasks.py::test_create_task_serverless_intervals target 9/0/-1/86401 seconds rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections target 1441 minutes/25 hours rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections target decimal/unit only/day/empty rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections minimum size valid values -> tests/queries/test_tasks.py::test_create_task_serverless_statement_sizes maximum size valid values -> tests/queries/test_tasks.py::test_create_task_serverless_statement_sizes minimum size empty/unknown rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections maximum size empty/unknown rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections minimum above maximum in either property order rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections initial below minimum rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections initial above maximum rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections all 26 rejected CREATEs leave no task -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections ## Deviations The ALTER error snapshots were advisory; CREATE-specific Cloud captures show XXXLARGE is accepted, so it is covered by the existing valid-size CREATE test rather than a new rejection case. * LAV-3168: preserve 19-digit trigger values in task errors Capture CREATE and ALTER Cloud errors for a 19-digit trigger interval. Widen the numeric error format to cover the full signed 64-bit range. The CREATE snapshot also confirms the rejected statement leaves no task. Swept CREATE and ALTER minimum-trigger validation for undersized numeric formats; fixed both call sites. Other task property validators are clean. Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Test matrix trigger 10/604800 accepted -> tests/queries/test_tasks.py::test_create_task_serverless_intervals trigger 9/0/-1/604801 rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections trigger decimal/string/word/huge rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections trigger 19-digit rejected, task absent -> tests/queries/test_tasks.py::test_create_task_nineteen_digit_trigger_interval_rejected ALTER trigger 19-digit rejected -> tests/queries/test_tasks.py::test_alter_task_nineteen_digit_trigger_interval_rejected target 10/86400 seconds accepted -> tests/queries/test_tasks.py::test_create_task_serverless_intervals target 9/0/-1/86401 seconds rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections target 1441 minutes/25 hours rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections target decimal/unit only/day/empty rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections minimum/maximum size valid values -> tests/queries/test_tasks.py::test_create_task_serverless_statement_sizes minimum/maximum size empty/unknown rejected -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections minimum above maximum, either order -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections initial below minimum/above maximum -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections all 26 original rejected CREATEs leave no task -> tests/queries/test_tasks.py::test_create_task_serverless_property_rejections --------- Co-authored-by: spiral <spiral@localhost> Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud>
1 parent 1ebb6bc commit ff99af6

2 files changed

Lines changed: 3 additions & 3 deletions

File tree

‎src/ast/mod.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5292,7 +5292,7 @@ pub enum Statement {
52925292
/// Optional initial size for a serverless task's managed warehouse.
52935293
user_task_managed_initial_warehouse_size: Option<String>,
52945294
/// Optional minimum interval between triggered task executions.
5295-
user_task_minimum_trigger_interval_in_seconds: Option<u64>,
5295+
user_task_minimum_trigger_interval_in_seconds: Option<String>,
52965296
/// Optional target completion interval for serverless tasks.
52975297
target_completion_interval: Option<String>,
52985298
/// Optional minimum serverless statement size.

‎src/parser/mod.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6062,7 +6062,7 @@ impl<'a> Parser<'a> {
60626062
let mut suspend_task_after_num_failures: Option<u64> = None;
60636063
let mut user_task_timeout_ms: Option<u64> = None;
60646064
let mut user_task_managed_initial_warehouse_size: Option<String> = None;
6065-
let mut user_task_minimum_trigger_interval_in_seconds: Option<u64> = None;
6065+
let mut user_task_minimum_trigger_interval_in_seconds: Option<String> = None;
60666066
let mut target_completion_interval: Option<String> = None;
60676067
let mut serverless_task_min_statement_size: Option<String> = None;
60686068
let mut serverless_task_max_statement_size: Option<String> = None;
@@ -6162,7 +6162,7 @@ impl<'a> Parser<'a> {
61626162
user_task_managed_initial_warehouse_size = Some(self.parse_literal_string()?);
61636163
} else if self.parse_keyword(Keyword::USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS) {
61646164
self.expect_token(&Token::Eq)?;
6165-
user_task_minimum_trigger_interval_in_seconds = Some(self.parse_literal_uint()?);
6165+
user_task_minimum_trigger_interval_in_seconds = Some(self.parse_expr()?.to_string());
61666166
} else if self.parse_keyword(Keyword::TARGET_COMPLETION_INTERVAL) {
61676167
self.expect_token(&Token::Eq)?;
61686168
target_completion_interval = Some(self.parse_literal_string()?);

0 commit comments

Comments
 (0)