suhuruli commented on code in PR #57149:
URL: https://github.com/apache/spark/pull/57149#discussion_r3754698619


##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.

Review Comment:
   Fixed all four: the intro is now "Auto CDC does this automatically. Given a 
source of change events and a rule for identifying and ordering them, SDP 
maintains..."; "needs two things to make sense of a change feed"; "...with no 
`format` produces"; and the end-to-end intro now says "appending a batch and 
re-running shows the incremental behavior".



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing

Review Comment:
   Fixed. All section and how-to headings are now Title Case (Keys and 
Sequencing, What Auto CDC Does, Handling Deletes, Selecting Which Columns Land 
in the Target, Handling Out-of-Order and Duplicate Events, Using a Composite 
Key, Changing the Key Set).



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.

Review Comment:
   Deliberately keeping the "SCD Type 1 is the only mode currently supported" 
wording for now, at the request of the change author -- the intent is to add 
the SCD Type 2 documentation and remove this line in the same follow-up 
(SPARK-58570), so the guide never briefly describes Type 2 without documenting 
it. You are right that Type 2 is present on all shippable branches (I confirmed 
`ScdType.Type2` in `ChangeArgs.scala` on `branch-4.2`, `branch-4.x`, and 
`master`), so this is a scoping choice rather than a factual claim we stand 
behind long-term. If you would rather not merge with the line as-is, I will 
switch to the scoped phrasing you suggested.



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, take these change events. Note that they are **not** in `version` 
order: the last event for `id = 1` is a stale update that arrives after the 
newer one.
+
+| id | name   | version | op     |
+|----|--------|---------|--------|
+| 1  | alice  | 1       | UPSERT |
+| 2  | bob    | 1       | UPSERT |
+| 1  | alicia | 2       | UPSERT |
+| 2  | bob    | 2       | DELETE |
+| 3  | carol  | 1       | UPSERT |
+| 1  | alice  | 1       | UPSERT |
+
+Auto CDC with `stored_as_scd_type=1`, keyed on `id` and sequenced by 
`version`, produces this target table:

Review Comment:
   Fixed. The sentence above the table now reads "...produces this target table 
(dropping the `op` column, and shown without the internal metadata column Auto 
CDC appends - covered under Considerations)", so both the `op` exclusion and 
the four-vs-three-column point are addressed before the table.



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, take these change events. Note that they are **not** in `version` 
order: the last event for `id = 1` is a stale update that arrives after the 
newer one.
+
+| id | name   | version | op     |
+|----|--------|---------|--------|
+| 1  | alice  | 1       | UPSERT |
+| 2  | bob    | 1       | UPSERT |
+| 1  | alicia | 2       | UPSERT |
+| 2  | bob    | 2       | DELETE |
+| 3  | carol  | 1       | UPSERT |
+| 1  | alice  | 1       | UPSERT |
+
+Auto CDC with `stored_as_scd_type=1`, keyed on `id` and sequenced by 
`version`, produces this target table:
+
+| id | name   | version |
+|----|--------|---------|
+| 1  | alicia | 2       |
+| 3  | carol  | 1       |
+
+Walking through it by key:
+
+- **id 1** was inserted as `alice`, then updated to `alicia` at version 2. The 
re-delivered `alice` event at version 1 arrives last but is ignored, because 
version 1 is older than the version 2 already applied. The row keeps `alicia`.
+- **id 2** was inserted, then deleted at version 2, so it is absent from the 
target.
+- **id 3** was inserted and never changed.
+
+### Requirements

Review Comment:
   Added. New Requirements bullet: the target must have exactly one input flow, 
and a target fed by more than one flow (one being Auto CDC) fails with 
`AUTOCDC_MULTIPLE_FLOWS_TO_TARGET`. It explicitly calls out that this rules out 
the fan-in pattern from the "Using Multiple Flows..." sections above.



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, take these change events. Note that they are **not** in `version` 
order: the last event for `id = 1` is a stale update that arrives after the 
newer one.
+
+| id | name   | version | op     |
+|----|--------|---------|--------|
+| 1  | alice  | 1       | UPSERT |
+| 2  | bob    | 1       | UPSERT |
+| 1  | alicia | 2       | UPSERT |
+| 2  | bob    | 2       | DELETE |
+| 3  | carol  | 1       | UPSERT |
+| 1  | alice  | 1       | UPSERT |
+
+Auto CDC with `stored_as_scd_type=1`, keyed on `id` and sequenced by 
`version`, produces this target table:
+
+| id | name   | version |
+|----|--------|---------|
+| 1  | alicia | 2       |
+| 3  | carol  | 1       |
+
+Walking through it by key:
+
+- **id 1** was inserted as `alice`, then updated to `alicia` at version 2. The 
re-delivered `alice` event at version 1 arrives last but is ignored, because 
version 1 is older than the version 2 already applied. The row keeps `alicia`.
+- **id 2** was inserted, then deleted at version 2, so it is absent from the 
target.
+- **id 3** was inserted and never changed.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.

Review Comment:
   Fixed. Reworded to "The target must be a streaming table defined in the 
pipeline... Order within the source file does not matter; the graph is resolved 
after all definitions are registered."



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, take these change events. Note that they are **not** in `version` 
order: the last event for `id = 1` is a stale update that arrives after the 
newer one.
+
+| id | name   | version | op     |
+|----|--------|---------|--------|
+| 1  | alice  | 1       | UPSERT |
+| 2  | bob    | 1       | UPSERT |
+| 1  | alicia | 2       | UPSERT |
+| 2  | bob    | 2       | DELETE |
+| 3  | carol  | 1       | UPSERT |
+| 1  | alice  | 1       | UPSERT |
+
+Auto CDC with `stored_as_scd_type=1`, keyed on `id` and sequenced by 
`version`, produces this target table:
+
+| id | name   | version |
+|----|--------|---------|
+| 1  | alicia | 2       |
+| 3  | carol  | 1       |
+
+Walking through it by key:
+
+- **id 1** was inserted as `alice`, then updated to `alicia` at version 2. The 
re-delivered `alice` event at version 1 arrives last but is ignored, because 
version 1 is older than the version 2 already applied. The row keeps `alicia`.
+- **id 2** was inserted, then deleted at version 2, so it is absent from the 
target.
+- **id 3** was inserted and never changed.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **target's format must support row-level operations.** Auto CDC 
maintains the target with MERGE, so the table must be backed by a connector 
implementing the DSv2 `SupportsRowLevelOperations` interface. A target that 
does not fails at startup with `AUTOCDC_TARGET_DOES_NOT_SUPPORT_MERGE`. Spark's 
built-in file formats, including Parquet, do **not** qualify; see [Choosing a 
target format](#choosing-a-target-format).
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide **keys** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).

Review Comment:
   Fixed. "The flow must specify keys ... and a sequencing expression"; "The 
expression may change between incremental runs, but not its type"; "for 
deterministic results across replays".



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,360 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### Keys and sequencing
+
+Auto CDC needs two things from you to make sense of a change feed:
+
+- The **keys** are the columns that identify a row across events. Events 
sharing a key describe the same logical row over time. In a customer feed, that 
is usually the customer id.
+- The **sequencing expression** says what order the events for a key happened 
in. Its value for an event is that event's **sequence value**, and Auto CDC 
treats the highest sequence value it has seen for a key as the most recent 
state. Change feeds normally carry something suitable already: a monotonically 
increasing version or commit number, or a commit timestamp.
+
+Sequence values matter because a change feed does not have to arrive in order. 
Sequencing is what lets Auto CDC recognize that an event it just received is 
older than what it already applied, and place it correctly, rather than letting 
arrival order corrupt the table.
+
+### What Auto CDC does
+
+Given a stream of change events, Auto CDC keeps the target table in sync with 
the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order and duplicate events** - Events don't have to arrive in 
order, and you don't need to de-duplicate the source. An event whose sequence 
value is older than the state already applied for its key is discarded, and a 
re-delivered event converges to the same result.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, take these change events. Note that they are **not** in `version` 
order: the last event for `id = 1` is a stale update that arrives after the 
newer one.
+
+| id | name   | version | op     |
+|----|--------|---------|--------|
+| 1  | alice  | 1       | UPSERT |
+| 2  | bob    | 1       | UPSERT |
+| 1  | alicia | 2       | UPSERT |
+| 2  | bob    | 2       | DELETE |
+| 3  | carol  | 1       | UPSERT |
+| 1  | alice  | 1       | UPSERT |
+
+Auto CDC with `stored_as_scd_type=1`, keyed on `id` and sequenced by 
`version`, produces this target table:
+
+| id | name   | version |
+|----|--------|---------|
+| 1  | alicia | 2       |
+| 3  | carol  | 1       |
+
+Walking through it by key:
+
+- **id 1** was inserted as `alice`, then updated to `alicia` at version 2. The 
re-delivered `alice` event at version 1 arrives last but is ignored, because 
version 1 is older than the version 2 already applied. The row keeps `alicia`.
+- **id 2** was inserted, then deleted at version 2, so it is absent from the 
target.
+- **id 3** was inserted and never changed.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **target's format must support row-level operations.** Auto CDC 
maintains the target with MERGE, so the table must be backed by a connector 
implementing the DSv2 `SupportsRowLevelOperations` interface. A target that 
does not fails at startup with `AUTOCDC_TARGET_DOES_NOT_SUPPORT_MERGE`. Spark's 
built-in file formats, including Parquet, do **not** qualify; see [Choosing a 
target format](#choosing-a-target-format).
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide **keys** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).
+
+The sequencing expression may be any SQL expression over the source columns, 
not just a bare column reference, so `SEQUENCE BY` on a struct of `(commit_ts, 
seq_no)` or a cast is fine. It must satisfy three constraints:
+
+- **Its type must be orderable.** A non-orderable type fails with 
`AUTOCDC_MICROBATCH_VALIDATION.NON_ORDERABLE_SEQUENCE`.
+- **It must never be null.** A microbatch containing a null sequence value 
fails with `AUTOCDC_MICROBATCH_VALIDATION.NULL_SEQUENCE` rather than guessing 
an order.
+- **Its result type must stay the same across runs.** You may change the 
expression between incremental runs, but not its type, or recorded values would 
stop being comparable; that fails with `SEQUENCING_TYPE_DRIFT` and needs a full 
refresh.

Review Comment:
   Fixed -- now `AUTOCDC_INVALID_STATE.SEQUENCING_TYPE_DRIFT`, matching the 
qualified `AUTOCDC_MICROBATCH_VALIDATION.*` names in the two bullets above.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to