-
Notifications
You must be signed in to change notification settings - Fork 579
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(batch): support system column _rw_timestamp for tables #19232
base: main
Are you sure you want to change the base?
Conversation
// `get_row` doesn't support select `_rw_timestamp` yet. | ||
assert!(self.epoch_idx.is_none()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we extend the get
interface to also return the user key (thus epoch)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. We do have a plan to add an extended interface (get_with_epoch) to return the epoch from the storage. Let's leave it for a later PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See #19345
.batch_chunk_iter_with_pk_bounds( | ||
epoch.into(), | ||
&pk_prefix, | ||
range_bounds, | ||
false, | ||
1, | ||
PrefetchOptions::new(false, false), | ||
) | ||
.await?; | ||
pin_mut!(iter); | ||
let chunk = iter.next().await.transpose().map_err(BatchError::from)?; | ||
if let Some(chunk) = chunk { | ||
let row = chunk.row_at(0).0.to_owned_row(); | ||
Ok(Some(row)) | ||
} else { | ||
Ok(None) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactoring this into a separate method like get_row_with_rw_timestamp
, and calling it here seems more readable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lots of change is caused by planner tests, the core change is about 200+ LOC.
Why _rw_timestamp
must appear in the LogicalScan. Can we prune it in the LogicalScan?
After column pruning, this column will be pruned. |
Ohhh SORRY for misreading |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this work for MVs? (If not, do we have relate issue for that)
Yes, it works for MVs. |
"selecting `_rw_timestamp` in a streaming query is not allowed".to_string(), | ||
"please run the sql in batch mode or remove the column `_rw_timestamp` from the streaming query".to_string(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's theoretically feasible, right? For example, use the epoch of the persisted entry for historical data, and the current epoch for incremental data.
Do we plan to support it in the future? If so, can we open an issue for it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and the current epoch for incremental data.
Yes, it is theoretically possible. We need to fetch the old epoch for delate mesage from the storage as well. Whethr we plan to support it in the future is depended on the requirement. If just for debugging purpose, I think batch query is enough, and it won't be invasive to the streaming proto.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the problem here is the same as when we try to specify the proctime
in the streaming query, which generates inconsistent delete messages. We don't know what the previous time value was when processing the delete message
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't know what the previous time value was when processing the delete message
Makes sense to me. Some ideas:
- For append-only table / materialized views, there's no confusion and it sounds feasible.
- For table with on-conflict checks, since we already have to lookup the storage for every deletes, we can obtain the deleted timestamp at the same time.
I hereby agree to the terms of the RisingWave Labs, Inc. Contributor License Agreement.
What's changed and what's your intention?
rw_timestamp
for any tables #11629_rw_timestamp
(datatype is timestamptz) for tables. We will add a hidden column_rw_timestamp
to every table catalog when loading it from a proto, but we never persist this column info._rw_timestamp
in a batch query. Using it in a streaming query will cause an error.epoch_idx
to the storage table which indicates the position where we should put the epoch into._rw_timestamp
is selected.Example:
Checklist
./risedev check
(or alias,./risedev c
)Documentation
Release note
If this PR includes changes that directly affect users or other significant modifications relevant to the community, kindly draft a release note to provide a concise summary of these changes. Please prioritize highlighting the impact these changes will have on users.
_rw_timestamp
system column for tables. Users can use a batch query to select this column to check the internal epoch/timestamp of each row which is useful when you want to know when the rows have been updated recently.