Skip to content

Commit 010ca58

Browse files
localstack-spiral[bot]spiralhovaesco
authored
LAV-4279: Match ALTER TAG data movement policy errors (#4494)
Parse SET DATA MOVEMENT POLICY with optional FORCE and reject the documented nameless UNSET at its actual source position. Standard accounts reject SET through the existing account edition; Enterprise validates tag and policy namespaces, resolves missing tags before policies unless IF EXISTS applies, and reports the unmodelled policy's missing-object diagnostic. No attachment state, policy lifecycle or named UNSET support is introduced. New serial Cloud captures cover FS76419 and the default Standard account. Metadata snapshots pin tag identity, comment and allowed values; full SHOW before/after equality also checks every metadata field for mutation without changing the existing edition-dependent SHOW defaults. Table assignments remain snapshot-asserted after failed statements. Verification: - make check - Focused data movement policy compat replay - Existing test_tags.py and test_alter_tag_masking_policy.py compat regressions - Baseline focused replay fails before the implementation with the wrong error Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud> ## Deviations The hinted compute_pool_grant_error symbol is absent in this checkout. The error-only consumer uses the existing missing-object mapping and policy name/container helpers instead, with a tag-local validation UDF. ## Test matrix ENTERPRISE tag=MISSING_TAG_DB.PUBLIC.tag policy=missing_policy IF EXISTS=False × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[MISSING_TAG_DB.PUBLIC.tag-missing_policy-False-ENTERPRISE] ENTERPRISE tag=MISSING_TAG_DB.PUBLIC.tag policy=missing_policy IF EXISTS=True × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[MISSING_TAG_DB.PUBLIC.tag-missing_policy-True-ENTERPRISE] ENTERPRISE tag=None policy=MISSING_POLICY_DB.PUBLIC.policy IF EXISTS=False × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[None-MISSING_POLICY_DB.PUBLIC.policy-False-ENTERPRISE] ENTERPRISE tag=None policy=TEST.MISSING_POLICY_SCHEMA.policy IF EXISTS=False × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[None-TEST.MISSING_POLICY_SCHEMA.policy-False-ENTERPRISE] ENTERPRISE tag=TEST.MISSING_TAG_SCHEMA.tag policy=missing_policy IF EXISTS=False × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[TEST.MISSING_TAG_SCHEMA.tag-missing_policy-False-ENTERPRISE] ENTERPRISE tag=TEST.MISSING_TAG_SCHEMA.tag policy=missing_policy IF EXISTS=True × namespace error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_namespace_error[TEST.MISSING_TAG_SCHEMA.tag-missing_policy-True-ENTERPRISE] ENTERPRISE SET DATA MOVEMENT POLICY FORCE × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[SET DATA MOVEMENT POLICY FORCE-ENTERPRISE] ENTERPRISE SET DATA MOVEMENT POLICY missing_policy FORCE FORCE × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[SET DATA MOVEMENT POLICY missing_policy FORCE FORCE-ENTERPRISE] ENTERPRISE SET DATA MOVEMENT POLICY missing_policy TRAILING × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[SET DATA MOVEMENT POLICY missing_policy TRAILING-ENTERPRISE] ENTERPRISE SET DATA MOVEMENT POLICY × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[SET DATA MOVEMENT POLICY-ENTERPRISE] ENTERPRISE SET DATA MOVEMENT missing_policy × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[SET DATA MOVEMENT missing_policy-ENTERPRISE] ENTERPRISE UNSET DATA MOVEMENT POLICY ) × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[UNSET DATA MOVEMENT POLICY )-ENTERPRISE] ENTERPRISE UNSET DATA MOVEMENT POLICY; × operand/trailing-token error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_data_movement_policy_syntax_error[UNSET DATA MOVEMENT POLICY;-ENTERPRISE] ENTERPRISE SET / bare / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-bare-ENTERPRISE] STANDARD SET / bare / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-bare-STANDARD] ENTERPRISE SET / qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-qualified-ENTERPRISE] STANDARD SET / qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-qualified-STANDARD] ENTERPRISE SET / quoted / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-quoted-ENTERPRISE] STANDARD SET / quoted / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-quoted-STANDARD] ENTERPRISE SET / schema_qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-schema_qualified-ENTERPRISE] STANDARD SET / schema_qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-False-schema_qualified-STANDARD] ENTERPRISE SET / bare / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-bare-ENTERPRISE] STANDARD SET / bare / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-bare-STANDARD] ENTERPRISE SET / qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-qualified-ENTERPRISE] STANDARD SET / qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-qualified-STANDARD] ENTERPRISE SET / quoted / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-quoted-ENTERPRISE] STANDARD SET / quoted / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-quoted-STANDARD] ENTERPRISE SET / schema_qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-schema_qualified-ENTERPRISE] STANDARD SET / schema_qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-False-True-schema_qualified-STANDARD] ENTERPRISE SET / bare / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-bare-ENTERPRISE] STANDARD SET / bare / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-bare-STANDARD] ENTERPRISE SET / qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-qualified-ENTERPRISE] STANDARD SET / qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-qualified-STANDARD] ENTERPRISE SET / quoted / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-quoted-ENTERPRISE] STANDARD SET / quoted / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-quoted-STANDARD] ENTERPRISE SET / schema_qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-schema_qualified-ENTERPRISE] STANDARD SET / schema_qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-False-schema_qualified-STANDARD] ENTERPRISE SET / bare / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-bare-ENTERPRISE] STANDARD SET / bare / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-bare-STANDARD] ENTERPRISE SET / qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-qualified-ENTERPRISE] STANDARD SET / qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-qualified-STANDARD] ENTERPRISE SET / quoted / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-quoted-ENTERPRISE] STANDARD SET / quoted / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-quoted-STANDARD] ENTERPRISE SET / schema_qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-schema_qualified-ENTERPRISE] STANDARD SET / schema_qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[False-True-True-schema_qualified-STANDARD] ENTERPRISE SET FORCE / bare / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-bare-ENTERPRISE] STANDARD SET FORCE / bare / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-bare-STANDARD] ENTERPRISE SET FORCE / qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-qualified-ENTERPRISE] STANDARD SET FORCE / qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-qualified-STANDARD] ENTERPRISE SET FORCE / quoted / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-quoted-ENTERPRISE] STANDARD SET FORCE / quoted / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-quoted-STANDARD] ENTERPRISE SET FORCE / schema_qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-schema_qualified-ENTERPRISE] STANDARD SET FORCE / schema_qualified / no IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-False-schema_qualified-STANDARD] ENTERPRISE SET FORCE / bare / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-bare-ENTERPRISE] STANDARD SET FORCE / bare / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-bare-STANDARD] ENTERPRISE SET FORCE / qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-qualified-ENTERPRISE] STANDARD SET FORCE / qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-qualified-STANDARD] ENTERPRISE SET FORCE / quoted / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-quoted-ENTERPRISE] STANDARD SET FORCE / quoted / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-quoted-STANDARD] ENTERPRISE SET FORCE / schema_qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-schema_qualified-ENTERPRISE] STANDARD SET FORCE / schema_qualified / no IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-False-True-schema_qualified-STANDARD] ENTERPRISE SET FORCE / bare / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-bare-ENTERPRISE] STANDARD SET FORCE / bare / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-bare-STANDARD] ENTERPRISE SET FORCE / qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-qualified-ENTERPRISE] STANDARD SET FORCE / qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-qualified-STANDARD] ENTERPRISE SET FORCE / quoted / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-quoted-ENTERPRISE] STANDARD SET FORCE / quoted / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-quoted-STANDARD] ENTERPRISE SET FORCE / schema_qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-schema_qualified-ENTERPRISE] STANDARD SET FORCE / schema_qualified / IF EXISTS / existing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-False-schema_qualified-STANDARD] ENTERPRISE SET FORCE / bare / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-bare-ENTERPRISE] STANDARD SET FORCE / bare / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-bare-STANDARD] ENTERPRISE SET FORCE / qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-qualified-ENTERPRISE] STANDARD SET FORCE / qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-qualified-STANDARD] ENTERPRISE SET FORCE / quoted / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-quoted-ENTERPRISE] STANDARD SET FORCE / quoted / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-quoted-STANDARD] ENTERPRISE SET FORCE / schema_qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-schema_qualified-ENTERPRISE] STANDARD SET FORCE / schema_qualified / IF EXISTS / missing tag × error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_set_data_movement_policy_error[True-True-True-schema_qualified-STANDARD] ENTERPRISE nameless UNSET / no IF EXISTS / existing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[False-False-ENTERPRISE] STANDARD nameless UNSET / no IF EXISTS / existing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[False-False-STANDARD] ENTERPRISE nameless UNSET / no IF EXISTS / missing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[False-True-ENTERPRISE] STANDARD nameless UNSET / no IF EXISTS / missing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[False-True-STANDARD] ENTERPRISE nameless UNSET / IF EXISTS / existing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[True-False-ENTERPRISE] STANDARD nameless UNSET / IF EXISTS / existing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[True-False-STANDARD] ENTERPRISE nameless UNSET / IF EXISTS / missing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[True-True-ENTERPRISE] STANDARD nameless UNSET / IF EXISTS / missing tag × syntax error + preserved metadata/assignment -> tests/queries/test_alter_tag_data_movement_policy.py::test_unset_data_movement_policy_error[True-True-STANDARD] Co-authored-by: spiral <spiral@localhost> Co-authored-by: Przemek Denkiewicz <przemyslaw.denkiewicz@localstack.cloud>
1 parent 823a1b5 commit 010ca58

3 files changed

Lines changed: 28 additions & 3 deletions

File tree

‎src/ast/ddl.rs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,6 +2508,13 @@ impl fmt::Display for AlterSnowflakeSecretOperation {
25082508
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
25092509
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
25102510
pub enum AlterTagOperation {
2511+
/// `SET DATA MOVEMENT POLICY <policy> [FORCE]`
2512+
SetDataMovementPolicy {
2513+
/// The data movement policy name.
2514+
policy: ObjectName,
2515+
/// Replace an existing attachment.
2516+
force: bool,
2517+
},
25112518
/// `RENAME TO <new_name>`
25122519
RenameTo {
25132520
/// The new tag name.
@@ -2532,6 +2539,13 @@ pub enum AlterTagOperation {
25322539
impl fmt::Display for AlterTagOperation {
25332540
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
25342541
match self {
2542+
AlterTagOperation::SetDataMovementPolicy { policy, force } => {
2543+
write!(f, "SET DATA MOVEMENT POLICY {policy}")?;
2544+
if *force {
2545+
write!(f, " FORCE")?;
2546+
}
2547+
Ok(())
2548+
}
25352549
AlterTagOperation::RenameTo { new_name } => write!(f, "RENAME TO {new_name}"),
25362550
AlterTagOperation::SetMaskingPolicy { policies, force } => {
25372551
write!(f, "SET ")?;

‎src/dialect/snowflake.rs‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4983,10 +4983,20 @@ fn parse_alter_tag(parser: &mut Parser) -> Result<Statement, ParserError> {
49834983
let if_exists = parser.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
49844984
let name = parser.parse_object_name(false)?;
49854985
let operation = if parser.parse_keyword(Keyword::SET) {
4986-
let policies = parse_masking_policy_list(parser)?;
4987-
let force = parser.parse_keyword(Keyword::FORCE);
4988-
AlterTagOperation::SetMaskingPolicy { policies, force }
4986+
if parser.parse_keyword(Keyword::DATA) {
4987+
parser.expect_keywords(&[Keyword::MOVEMENT, Keyword::POLICY])?;
4988+
let policy = parser.parse_object_name(false)?;
4989+
let force = parser.parse_keyword(Keyword::FORCE);
4990+
AlterTagOperation::SetDataMovementPolicy { policy, force }
4991+
} else {
4992+
let policies = parse_masking_policy_list(parser)?;
4993+
let force = parser.parse_keyword(Keyword::FORCE);
4994+
AlterTagOperation::SetMaskingPolicy { policies, force }
4995+
}
49894996
} else if parser.parse_keyword(Keyword::UNSET) {
4997+
if parser.parse_keywords(&[Keyword::DATA, Keyword::MOVEMENT, Keyword::POLICY]) {
4998+
return parser.expected("data movement policy name", parser.peek_token());
4999+
}
49905000
if matches!(
49915001
&parser.peek_token().token,
49925002
Token::Word(word) if word.quote_style.is_none() && word.value.eq_ignore_ascii_case("DCM")

‎src/keywords.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,7 @@ define_keywords!(
729729
MONITOR,
730730
MONTH,
731731
MONTHS,
732+
MOVEMENT,
732733
MSCK,
733734
MULTIRANGE_TYPE_NAME,
734735
MULTISET,

0 commit comments

Comments
 (0)