risingwave_pb/
batch_plan.rs

1// This file is @generated by prost-build.
2#[derive(prost_helpers::AnyPB)]
3#[derive(Clone, PartialEq, ::prost::Message)]
4pub struct RowSeqScanNode {
5    #[prost(message, optional, tag = "1")]
6    pub table_desc: ::core::option::Option<super::plan_common::StorageTableDesc>,
7    #[prost(int32, repeated, tag = "2")]
8    pub column_ids: ::prost::alloc::vec::Vec<i32>,
9    /// All the ranges need to be read. i.e., they are OR'ed.
10    ///
11    /// Empty `scan_ranges` means full table scan.
12    #[prost(message, repeated, tag = "3")]
13    pub scan_ranges: ::prost::alloc::vec::Vec<ScanRange>,
14    /// The partition to read for scan tasks.
15    ///
16    /// Will be filled by the scheduler.
17    #[prost(message, optional, tag = "4")]
18    pub vnode_bitmap: ::core::option::Option<super::common::Buffer>,
19    /// Whether the order on output columns should be preserved.
20    #[prost(bool, tag = "5")]
21    pub ordered: bool,
22    /// The pushed down `batch_limit`. Max rows needed to return.
23    #[prost(uint64, optional, tag = "6")]
24    pub limit: ::core::option::Option<u64>,
25    #[prost(message, optional, tag = "7")]
26    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
27}
28#[derive(prost_helpers::AnyPB)]
29#[derive(Clone, PartialEq, ::prost::Message)]
30pub struct SysRowSeqScanNode {
31    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
32    pub table_id: crate::id::TableId,
33    #[prost(message, repeated, tag = "2")]
34    pub column_descs: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
35}
36/// The range to scan, which specifies a consecutive range of the PK
37/// and can represent: (Suppose there are N columns in the PK)
38///
39/// * full table scan: Should not occur. Use an empty `Vec<ScanRange>` instead.
40/// * index range scan: `eq_conds` includes i (between 0 and N-1, inclusive) values,
41///   and `lower_bound` & `upper_bound` is the range for the (i+1)th column
42/// * index point get: `eq_conds` includes N values, and `lower_bound` & `upper_bound` are `None`
43#[derive(prost_helpers::AnyPB)]
44#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
45pub struct ScanRange {
46    /// The i-th element represents the value of the i-th PK column.
47    #[prost(bytes = "vec", repeated, tag = "1")]
48    pub eq_conds: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec<u8>>,
49    /// The lower bound of the next PK column subsequent to those in `eq_conds`.
50    #[prost(message, optional, tag = "2")]
51    pub lower_bound: ::core::option::Option<scan_range::Bound>,
52    /// The upper bound of the next PK column subsequent to those in `eq_conds`.
53    #[prost(message, optional, tag = "3")]
54    pub upper_bound: ::core::option::Option<scan_range::Bound>,
55}
56/// Nested message and enum types in `ScanRange`.
57pub mod scan_range {
58    /// `None` represent unbounded.
59    #[derive(prost_helpers::AnyPB)]
60    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
61    pub struct Bound {
62        #[prost(bytes = "vec", repeated, tag = "1")]
63        pub value: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec<u8>>,
64        #[prost(bool, tag = "2")]
65        pub inclusive: bool,
66    }
67}
68#[derive(prost_helpers::AnyPB)]
69#[derive(Clone, PartialEq, ::prost::Message)]
70pub struct SourceNode {
71    #[prost(uint32, tag = "1", wrapper = "crate::id::SourceId")]
72    pub source_id: crate::id::SourceId,
73    #[prost(message, repeated, tag = "2")]
74    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnCatalog>,
75    #[prost(btree_map = "string, string", tag = "3")]
76    pub with_properties: ::prost::alloc::collections::BTreeMap<
77        ::prost::alloc::string::String,
78        ::prost::alloc::string::String,
79    >,
80    #[prost(bytes = "vec", repeated, tag = "4")]
81    pub split: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec<u8>>,
82    #[prost(message, optional, tag = "5")]
83    pub info: ::core::option::Option<super::catalog::StreamSourceInfo>,
84    #[prost(btree_map = "string, message", tag = "6")]
85    pub secret_refs: ::prost::alloc::collections::BTreeMap<
86        ::prost::alloc::string::String,
87        super::secret::SecretRef,
88    >,
89}
90#[derive(prost_helpers::AnyPB)]
91#[derive(Clone, PartialEq, ::prost::Message)]
92pub struct IcebergScanNode {
93    #[prost(message, repeated, tag = "1")]
94    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnCatalog>,
95    #[prost(btree_map = "string, string", tag = "2")]
96    pub with_properties: ::prost::alloc::collections::BTreeMap<
97        ::prost::alloc::string::String,
98        ::prost::alloc::string::String,
99    >,
100    #[prost(bytes = "vec", repeated, tag = "3")]
101    pub split: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec<u8>>,
102    #[prost(btree_map = "string, message", tag = "4")]
103    pub secret_refs: ::prost::alloc::collections::BTreeMap<
104        ::prost::alloc::string::String,
105        super::secret::SecretRef,
106    >,
107    #[prost(enumeration = "iceberg_scan_node::IcebergScanType", tag = "5")]
108    pub iceberg_scan_type: i32,
109}
110/// Nested message and enum types in `IcebergScanNode`.
111pub mod iceberg_scan_node {
112    #[derive(prost_helpers::AnyPB)]
113    #[derive(
114        Clone,
115        Copy,
116        Debug,
117        PartialEq,
118        Eq,
119        Hash,
120        PartialOrd,
121        Ord,
122        ::prost::Enumeration
123    )]
124    #[repr(i32)]
125    pub enum IcebergScanType {
126        Unspecified = 0,
127        DataScan = 1,
128        EqualityDeleteScan = 2,
129        PositionDeleteScan = 3,
130        #[deprecated]
131        CountStar = 4,
132    }
133    impl IcebergScanType {
134        /// String value of the enum field names used in the ProtoBuf definition.
135        ///
136        /// The values are not transformed in any way and thus are considered stable
137        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
138        pub fn as_str_name(&self) -> &'static str {
139            match self {
140                Self::Unspecified => "ICEBERG_SCAN_TYPE_UNSPECIFIED",
141                Self::DataScan => "ICEBERG_SCAN_TYPE_DATA_SCAN",
142                Self::EqualityDeleteScan => "ICEBERG_SCAN_TYPE_EQUALITY_DELETE_SCAN",
143                Self::PositionDeleteScan => "ICEBERG_SCAN_TYPE_POSITION_DELETE_SCAN",
144                #[allow(deprecated)]
145                Self::CountStar => "ICEBERG_SCAN_TYPE_COUNT_STAR",
146            }
147        }
148        /// Creates an enum from field names used in the ProtoBuf definition.
149        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
150            match value {
151                "ICEBERG_SCAN_TYPE_UNSPECIFIED" => Some(Self::Unspecified),
152                "ICEBERG_SCAN_TYPE_DATA_SCAN" => Some(Self::DataScan),
153                "ICEBERG_SCAN_TYPE_EQUALITY_DELETE_SCAN" => {
154                    Some(Self::EqualityDeleteScan)
155                }
156                "ICEBERG_SCAN_TYPE_POSITION_DELETE_SCAN" => {
157                    Some(Self::PositionDeleteScan)
158                }
159                "ICEBERG_SCAN_TYPE_COUNT_STAR" => {
160                    Some(#[allow(deprecated)] Self::CountStar)
161                }
162                _ => None,
163            }
164        }
165    }
166}
167#[derive(prost_helpers::AnyPB)]
168#[derive(Clone, PartialEq, ::prost::Message)]
169pub struct FileScanNode {
170    #[prost(message, repeated, tag = "1")]
171    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
172    #[prost(enumeration = "file_scan_node::FileFormat", tag = "2")]
173    pub file_format: i32,
174    #[prost(enumeration = "file_scan_node::StorageType", tag = "3")]
175    pub storage_type: i32,
176    #[prost(string, tag = "4")]
177    pub s3_region: ::prost::alloc::string::String,
178    #[prost(string, tag = "5")]
179    pub s3_access_key: ::prost::alloc::string::String,
180    #[prost(string, tag = "6")]
181    pub s3_secret_key: ::prost::alloc::string::String,
182    #[prost(string, repeated, tag = "7")]
183    pub file_location: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
184    #[prost(string, tag = "8")]
185    pub s3_endpoint: ::prost::alloc::string::String,
186}
187/// Nested message and enum types in `FileScanNode`.
188pub mod file_scan_node {
189    #[derive(prost_helpers::AnyPB)]
190    #[derive(
191        Clone,
192        Copy,
193        Debug,
194        PartialEq,
195        Eq,
196        Hash,
197        PartialOrd,
198        Ord,
199        ::prost::Enumeration
200    )]
201    #[repr(i32)]
202    pub enum FileFormat {
203        Unspecified = 0,
204        Parquet = 1,
205    }
206    impl FileFormat {
207        /// String value of the enum field names used in the ProtoBuf definition.
208        ///
209        /// The values are not transformed in any way and thus are considered stable
210        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
211        pub fn as_str_name(&self) -> &'static str {
212            match self {
213                Self::Unspecified => "FILE_FORMAT_UNSPECIFIED",
214                Self::Parquet => "PARQUET",
215            }
216        }
217        /// Creates an enum from field names used in the ProtoBuf definition.
218        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
219            match value {
220                "FILE_FORMAT_UNSPECIFIED" => Some(Self::Unspecified),
221                "PARQUET" => Some(Self::Parquet),
222                _ => None,
223            }
224        }
225    }
226    #[derive(prost_helpers::AnyPB)]
227    #[derive(
228        Clone,
229        Copy,
230        Debug,
231        PartialEq,
232        Eq,
233        Hash,
234        PartialOrd,
235        Ord,
236        ::prost::Enumeration
237    )]
238    #[repr(i32)]
239    pub enum StorageType {
240        Unspecified = 0,
241        S3 = 1,
242        Gcs = 2,
243        Azblob = 3,
244    }
245    impl StorageType {
246        /// String value of the enum field names used in the ProtoBuf definition.
247        ///
248        /// The values are not transformed in any way and thus are considered stable
249        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
250        pub fn as_str_name(&self) -> &'static str {
251            match self {
252                Self::Unspecified => "STORAGE_TYPE_UNSPECIFIED",
253                Self::S3 => "S3",
254                Self::Gcs => "GCS",
255                Self::Azblob => "AZBLOB",
256            }
257        }
258        /// Creates an enum from field names used in the ProtoBuf definition.
259        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
260            match value {
261                "STORAGE_TYPE_UNSPECIFIED" => Some(Self::Unspecified),
262                "S3" => Some(Self::S3),
263                "GCS" => Some(Self::Gcs),
264                "AZBLOB" => Some(Self::Azblob),
265                _ => None,
266            }
267        }
268    }
269}
270#[derive(prost_helpers::AnyPB)]
271#[derive(Clone, PartialEq, ::prost::Message)]
272pub struct GcsFileScanNode {
273    #[prost(message, repeated, tag = "1")]
274    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
275    #[prost(enumeration = "gcs_file_scan_node::FileFormat", tag = "2")]
276    pub file_format: i32,
277    #[prost(string, tag = "3")]
278    pub credential: ::prost::alloc::string::String,
279    #[prost(string, repeated, tag = "4")]
280    pub file_location: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
281}
282/// Nested message and enum types in `GcsFileScanNode`.
283pub mod gcs_file_scan_node {
284    #[derive(prost_helpers::AnyPB)]
285    #[derive(
286        Clone,
287        Copy,
288        Debug,
289        PartialEq,
290        Eq,
291        Hash,
292        PartialOrd,
293        Ord,
294        ::prost::Enumeration
295    )]
296    #[repr(i32)]
297    pub enum FileFormat {
298        Unspecified = 0,
299        Parquet = 1,
300    }
301    impl FileFormat {
302        /// String value of the enum field names used in the ProtoBuf definition.
303        ///
304        /// The values are not transformed in any way and thus are considered stable
305        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
306        pub fn as_str_name(&self) -> &'static str {
307            match self {
308                Self::Unspecified => "FILE_FORMAT_UNSPECIFIED",
309                Self::Parquet => "PARQUET",
310            }
311        }
312        /// Creates an enum from field names used in the ProtoBuf definition.
313        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
314            match value {
315                "FILE_FORMAT_UNSPECIFIED" => Some(Self::Unspecified),
316                "PARQUET" => Some(Self::Parquet),
317                _ => None,
318            }
319        }
320    }
321}
322#[derive(prost_helpers::AnyPB)]
323#[derive(Clone, PartialEq, ::prost::Message)]
324pub struct AzblobFileScanNode {
325    #[prost(message, repeated, tag = "1")]
326    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
327    #[prost(enumeration = "azblob_file_scan_node::FileFormat", tag = "2")]
328    pub file_format: i32,
329    #[prost(string, tag = "3")]
330    pub account_name: ::prost::alloc::string::String,
331    #[prost(string, tag = "4")]
332    pub account_key: ::prost::alloc::string::String,
333    #[prost(string, tag = "5")]
334    pub endpoint: ::prost::alloc::string::String,
335    #[prost(string, repeated, tag = "6")]
336    pub file_location: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
337}
338/// Nested message and enum types in `AzblobFileScanNode`.
339pub mod azblob_file_scan_node {
340    #[derive(prost_helpers::AnyPB)]
341    #[derive(
342        Clone,
343        Copy,
344        Debug,
345        PartialEq,
346        Eq,
347        Hash,
348        PartialOrd,
349        Ord,
350        ::prost::Enumeration
351    )]
352    #[repr(i32)]
353    pub enum FileFormat {
354        Unspecified = 0,
355        Parquet = 1,
356    }
357    impl FileFormat {
358        /// String value of the enum field names used in the ProtoBuf definition.
359        ///
360        /// The values are not transformed in any way and thus are considered stable
361        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
362        pub fn as_str_name(&self) -> &'static str {
363            match self {
364                Self::Unspecified => "FILE_FORMAT_UNSPECIFIED",
365                Self::Parquet => "PARQUET",
366            }
367        }
368        /// Creates an enum from field names used in the ProtoBuf definition.
369        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
370            match value {
371                "FILE_FORMAT_UNSPECIFIED" => Some(Self::Unspecified),
372                "PARQUET" => Some(Self::Parquet),
373                _ => None,
374            }
375        }
376    }
377}
378/// NOTE(kwannoel): This will only be used in batch mode. We can change the definition as needed.
379#[derive(prost_helpers::AnyPB)]
380#[derive(Clone, PartialEq, ::prost::Message)]
381pub struct PostgresQueryNode {
382    #[prost(message, repeated, tag = "1")]
383    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
384    #[prost(string, tag = "2")]
385    pub hostname: ::prost::alloc::string::String,
386    #[prost(string, tag = "3")]
387    pub port: ::prost::alloc::string::String,
388    #[prost(string, tag = "4")]
389    pub username: ::prost::alloc::string::String,
390    #[prost(string, tag = "5")]
391    pub password: ::prost::alloc::string::String,
392    #[prost(string, tag = "6")]
393    pub database: ::prost::alloc::string::String,
394    #[prost(string, tag = "7")]
395    pub query: ::prost::alloc::string::String,
396    #[prost(string, tag = "8")]
397    pub ssl_mode: ::prost::alloc::string::String,
398    #[prost(string, tag = "9")]
399    pub ssl_root_cert: ::prost::alloc::string::String,
400}
401/// NOTE(kwannoel): This will only be used in batch mode. We can change the definition as needed.
402#[derive(prost_helpers::AnyPB)]
403#[derive(Clone, PartialEq, ::prost::Message)]
404pub struct MySqlQueryNode {
405    #[prost(message, repeated, tag = "1")]
406    pub columns: ::prost::alloc::vec::Vec<super::plan_common::ColumnDesc>,
407    #[prost(string, tag = "2")]
408    pub hostname: ::prost::alloc::string::String,
409    #[prost(string, tag = "3")]
410    pub port: ::prost::alloc::string::String,
411    #[prost(string, tag = "4")]
412    pub username: ::prost::alloc::string::String,
413    #[prost(string, tag = "5")]
414    pub password: ::prost::alloc::string::String,
415    #[prost(string, tag = "6")]
416    pub database: ::prost::alloc::string::String,
417    #[prost(string, tag = "7")]
418    pub query: ::prost::alloc::string::String,
419}
420#[derive(prost_helpers::AnyPB)]
421#[derive(Clone, PartialEq, ::prost::Message)]
422pub struct ProjectNode {
423    #[prost(message, repeated, tag = "1")]
424    pub select_list: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
425}
426#[derive(prost_helpers::AnyPB)]
427#[derive(Clone, PartialEq, ::prost::Message)]
428pub struct FilterNode {
429    #[prost(message, optional, tag = "1")]
430    pub search_condition: ::core::option::Option<super::expr::ExprNode>,
431}
432#[derive(prost_helpers::AnyPB)]
433#[derive(Clone, PartialEq, ::prost::Message)]
434pub struct LogRowSeqScanNode {
435    #[prost(message, optional, tag = "1")]
436    pub table_desc: ::core::option::Option<super::plan_common::StorageTableDesc>,
437    /// This records the mandatory column_ids of the original table, excluding op
438    #[prost(int32, repeated, tag = "2")]
439    pub column_ids: ::prost::alloc::vec::Vec<i32>,
440    /// The partition to read for scan tasks.
441    ///
442    /// Will be filled by the scheduler.
443    #[prost(message, optional, tag = "3")]
444    pub vnode_bitmap: ::core::option::Option<super::common::Buffer>,
445    #[prost(message, optional, tag = "4")]
446    pub old_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
447    #[prost(message, optional, tag = "5")]
448    pub new_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
449    #[prost(bool, tag = "6")]
450    pub ordered: bool,
451    #[prost(message, optional, tag = "7")]
452    pub scan_range: ::core::option::Option<ScanRange>,
453}
454#[derive(prost_helpers::AnyPB)]
455#[derive(Clone, PartialEq, ::prost::Message)]
456pub struct InsertNode {
457    /// Id of the table to perform inserting.
458    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
459    pub table_id: crate::id::TableId,
460    /// Version of the table.
461    #[prost(uint64, tag = "5")]
462    pub table_version_id: u64,
463    #[prost(uint32, repeated, tag = "2")]
464    pub column_indices: ::prost::alloc::vec::Vec<u32>,
465    #[prost(message, optional, tag = "6")]
466    pub default_columns: ::core::option::Option<super::plan_common::DefaultColumns>,
467    /// An optional field and will be `None` for tables without user-defined pk.
468    /// The `BatchInsertExecutor` should add a column with NULL value which will
469    /// be filled in streaming.
470    #[prost(uint32, optional, tag = "3")]
471    pub row_id_index: ::core::option::Option<u32>,
472    #[prost(bool, tag = "4")]
473    pub returning: bool,
474    /// Session id is used to ensure that dml data from the same session should be sent to a fixed worker node and channel.
475    #[prost(uint32, tag = "7")]
476    pub session_id: u32,
477    /// If enabled, wait until this DML transaction is included in a successful checkpoint.
478    #[prost(bool, tag = "8")]
479    pub wait_for_persistence: bool,
480}
481#[derive(prost_helpers::AnyPB)]
482#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
483pub struct DeleteNode {
484    /// Id of the table to perform deleting.
485    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
486    pub table_id: crate::id::TableId,
487    /// Version of the table.
488    #[prost(uint64, tag = "3")]
489    pub table_version_id: u64,
490    /// Primary key indices of the table.
491    #[prost(uint32, repeated, tag = "5")]
492    pub pk_indices: ::prost::alloc::vec::Vec<u32>,
493    #[prost(bool, tag = "2")]
494    pub returning: bool,
495    /// If enabled, only key columns are kept and the rest are NULL.
496    #[prost(bool, tag = "6")]
497    pub upsert: bool,
498    /// Session id is used to ensure that dml data from the same session should be sent to a fixed worker node and channel.
499    #[prost(uint32, tag = "4")]
500    pub session_id: u32,
501    /// If enabled, wait until this DML transaction is included in a successful checkpoint.
502    #[prost(bool, tag = "7")]
503    pub wait_for_persistence: bool,
504}
505#[derive(prost_helpers::AnyPB)]
506#[derive(Clone, PartialEq, ::prost::Message)]
507pub struct UpdateNode {
508    /// Id of the table to perform updating.
509    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
510    pub table_id: crate::id::TableId,
511    /// Version of the table.
512    #[prost(uint64, tag = "2")]
513    pub table_version_id: u64,
514    /// Expressions to generate `U-` records.
515    #[prost(message, repeated, tag = "3")]
516    pub old_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
517    /// Expressions to generate `U+` records.
518    #[prost(message, repeated, tag = "4")]
519    pub new_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
520    #[prost(bool, tag = "5")]
521    pub returning: bool,
522    /// If enabled, only `Insert` records are emitted for new rows.
523    #[prost(bool, tag = "7")]
524    pub upsert: bool,
525    /// Session id is used to ensure that dml data from the same session should be sent to a fixed worker node and channel.
526    #[prost(uint32, tag = "6")]
527    pub session_id: u32,
528    /// If enabled, wait until this DML transaction is included in a successful checkpoint.
529    #[prost(bool, tag = "8")]
530    pub wait_for_persistence: bool,
531}
532#[derive(prost_helpers::AnyPB)]
533#[derive(Clone, PartialEq, ::prost::Message)]
534pub struct ValuesNode {
535    #[prost(message, repeated, tag = "1")]
536    pub tuples: ::prost::alloc::vec::Vec<values_node::ExprTuple>,
537    #[prost(message, repeated, tag = "2")]
538    pub fields: ::prost::alloc::vec::Vec<super::plan_common::Field>,
539}
540/// Nested message and enum types in `ValuesNode`.
541pub mod values_node {
542    #[derive(prost_helpers::AnyPB)]
543    #[derive(Clone, PartialEq, ::prost::Message)]
544    pub struct ExprTuple {
545        #[prost(message, repeated, tag = "1")]
546        pub cells: ::prost::alloc::vec::Vec<super::super::expr::ExprNode>,
547    }
548}
549#[derive(prost_helpers::AnyPB)]
550#[derive(Clone, PartialEq, ::prost::Message)]
551pub struct SortNode {
552    #[prost(message, repeated, tag = "1")]
553    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
554}
555#[derive(prost_helpers::AnyPB)]
556#[derive(Clone, PartialEq, ::prost::Message)]
557pub struct TopNNode {
558    #[prost(message, repeated, tag = "1")]
559    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
560    #[prost(uint64, tag = "2")]
561    pub limit: u64,
562    #[prost(uint64, tag = "3")]
563    pub offset: u64,
564    #[prost(bool, tag = "4")]
565    pub with_ties: bool,
566}
567#[derive(prost_helpers::AnyPB)]
568#[derive(Clone, PartialEq, ::prost::Message)]
569pub struct GroupTopNNode {
570    #[prost(message, repeated, tag = "1")]
571    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
572    #[prost(uint64, tag = "2")]
573    pub limit: u64,
574    #[prost(uint64, tag = "3")]
575    pub offset: u64,
576    #[prost(uint32, repeated, tag = "4")]
577    pub group_key: ::prost::alloc::vec::Vec<u32>,
578    #[prost(bool, tag = "5")]
579    pub with_ties: bool,
580}
581#[derive(prost_helpers::AnyPB)]
582#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
583pub struct LimitNode {
584    #[prost(uint64, tag = "1")]
585    pub limit: u64,
586    #[prost(uint64, tag = "2")]
587    pub offset: u64,
588}
589#[derive(prost_helpers::AnyPB)]
590#[derive(Clone, PartialEq, ::prost::Message)]
591pub struct NestedLoopJoinNode {
592    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
593    pub join_type: i32,
594    #[prost(message, optional, tag = "2")]
595    pub join_cond: ::core::option::Option<super::expr::ExprNode>,
596    #[prost(uint32, repeated, tag = "3")]
597    pub output_indices: ::prost::alloc::vec::Vec<u32>,
598}
599#[derive(prost_helpers::AnyPB)]
600#[derive(Clone, PartialEq, ::prost::Message)]
601pub struct HashAggNode {
602    #[prost(uint32, repeated, tag = "1")]
603    pub group_key: ::prost::alloc::vec::Vec<u32>,
604    #[prost(message, repeated, tag = "2")]
605    pub agg_calls: ::prost::alloc::vec::Vec<super::expr::AggCall>,
606}
607#[derive(prost_helpers::AnyPB)]
608#[derive(Clone, PartialEq, ::prost::Message)]
609pub struct ExpandNode {
610    #[prost(message, repeated, tag = "1")]
611    pub column_subsets: ::prost::alloc::vec::Vec<expand_node::Subset>,
612}
613/// Nested message and enum types in `ExpandNode`.
614pub mod expand_node {
615    #[derive(prost_helpers::AnyPB)]
616    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
617    pub struct Subset {
618        #[prost(uint32, repeated, tag = "1")]
619        pub column_indices: ::prost::alloc::vec::Vec<u32>,
620    }
621}
622#[derive(prost_helpers::AnyPB)]
623#[derive(Clone, PartialEq, ::prost::Message)]
624pub struct ProjectSetNode {
625    #[prost(message, repeated, tag = "1")]
626    pub select_list: ::prost::alloc::vec::Vec<super::expr::ProjectSetSelectItem>,
627}
628#[derive(prost_helpers::AnyPB)]
629#[derive(Clone, PartialEq, ::prost::Message)]
630pub struct SortAggNode {
631    #[prost(message, repeated, tag = "1")]
632    pub group_key: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
633    #[prost(message, repeated, tag = "2")]
634    pub agg_calls: ::prost::alloc::vec::Vec<super::expr::AggCall>,
635}
636#[derive(prost_helpers::AnyPB)]
637#[derive(Clone, PartialEq, ::prost::Message)]
638pub struct HashJoinNode {
639    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
640    pub join_type: i32,
641    #[prost(int32, repeated, tag = "2")]
642    pub left_key: ::prost::alloc::vec::Vec<i32>,
643    #[prost(int32, repeated, tag = "3")]
644    pub right_key: ::prost::alloc::vec::Vec<i32>,
645    #[prost(message, optional, tag = "4")]
646    pub condition: ::core::option::Option<super::expr::ExprNode>,
647    #[prost(uint32, repeated, tag = "5")]
648    pub output_indices: ::prost::alloc::vec::Vec<u32>,
649    /// Null safe means it treats `null = null` as true.
650    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
651    #[prost(bool, repeated, tag = "6")]
652    pub null_safe: ::prost::alloc::vec::Vec<bool>,
653    #[prost(message, optional, tag = "7")]
654    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
655}
656#[derive(prost_helpers::AnyPB)]
657#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
658pub struct SortMergeJoinNode {
659    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
660    pub join_type: i32,
661    #[prost(int32, repeated, tag = "2")]
662    pub left_key: ::prost::alloc::vec::Vec<i32>,
663    #[prost(int32, repeated, tag = "3")]
664    pub right_key: ::prost::alloc::vec::Vec<i32>,
665    #[prost(enumeration = "super::common::Direction", tag = "4")]
666    pub direction: i32,
667    #[prost(uint32, repeated, tag = "5")]
668    pub output_indices: ::prost::alloc::vec::Vec<u32>,
669}
670#[derive(prost_helpers::AnyPB)]
671#[derive(Clone, PartialEq, ::prost::Message)]
672pub struct HopWindowNode {
673    #[prost(uint32, tag = "1")]
674    pub time_col: u32,
675    #[prost(message, optional, tag = "2")]
676    pub window_slide: ::core::option::Option<super::data::Interval>,
677    #[prost(message, optional, tag = "3")]
678    pub window_size: ::core::option::Option<super::data::Interval>,
679    #[prost(uint32, repeated, tag = "4")]
680    pub output_indices: ::prost::alloc::vec::Vec<u32>,
681    #[prost(message, repeated, tag = "5")]
682    pub window_start_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
683    #[prost(message, repeated, tag = "6")]
684    pub window_end_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
685}
686#[derive(prost_helpers::AnyPB)]
687#[derive(Clone, PartialEq, ::prost::Message)]
688pub struct TableFunctionNode {
689    #[prost(message, optional, tag = "1")]
690    pub table_function: ::core::option::Option<super::expr::TableFunction>,
691}
692/// Task is a running instance of Stage.
693#[derive(prost_helpers::AnyPB)]
694#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
695pub struct TaskId {
696    #[prost(string, tag = "1")]
697    pub query_id: ::prost::alloc::string::String,
698    #[prost(uint32, tag = "2")]
699    pub stage_id: u32,
700    #[prost(uint64, tag = "3")]
701    pub task_id: u64,
702}
703/// Every task will create N buffers (channels) for parent operators to fetch results from,
704/// where N is the parallelism of parent stage.
705#[derive(prost_helpers::AnyPB)]
706#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
707pub struct TaskOutputId {
708    #[prost(message, optional, tag = "1")]
709    pub task_id: ::core::option::Option<TaskId>,
710    /// The id of output channel to fetch from
711    #[prost(uint64, tag = "2")]
712    pub output_id: u64,
713}
714#[derive(prost_helpers::AnyPB)]
715#[derive(Clone, PartialEq, ::prost::Message)]
716pub struct LocalExecutePlan {
717    #[prost(message, optional, tag = "1")]
718    pub plan: ::core::option::Option<PlanFragment>,
719    #[prost(map = "string, string", tag = "3")]
720    pub tracing_context: ::std::collections::HashMap<
721        ::prost::alloc::string::String,
722        ::prost::alloc::string::String,
723    >,
724}
725/// ExchangeSource describes where to read results from children operators
726#[derive(prost_helpers::AnyPB)]
727#[derive(Clone, PartialEq, ::prost::Message)]
728pub struct ExchangeSource {
729    #[prost(message, optional, tag = "1")]
730    pub task_output_id: ::core::option::Option<TaskOutputId>,
731    #[prost(message, optional, tag = "2")]
732    pub host: ::core::option::Option<super::common::HostAddress>,
733    #[prost(oneof = "exchange_source::LocalExecutePlan", tags = "3")]
734    pub local_execute_plan: ::core::option::Option<exchange_source::LocalExecutePlan>,
735}
736/// Nested message and enum types in `ExchangeSource`.
737pub mod exchange_source {
738    #[derive(prost_helpers::AnyPB)]
739    #[derive(Clone, PartialEq, ::prost::Oneof)]
740    pub enum LocalExecutePlan {
741        #[prost(message, tag = "3")]
742        Plan(super::LocalExecutePlan),
743    }
744}
745#[derive(prost_helpers::AnyPB)]
746#[derive(Clone, PartialEq, ::prost::Message)]
747pub struct ExchangeNode {
748    #[prost(message, repeated, tag = "1")]
749    pub sources: ::prost::alloc::vec::Vec<ExchangeSource>,
750    /// sequential means each tasks of the exchange node will be executed sequentially.
751    #[prost(bool, tag = "2")]
752    pub sequential: bool,
753    #[prost(message, repeated, tag = "3")]
754    pub input_schema: ::prost::alloc::vec::Vec<super::plan_common::Field>,
755}
756#[derive(prost_helpers::AnyPB)]
757#[derive(Clone, PartialEq, ::prost::Message)]
758pub struct MergeSortExchangeNode {
759    #[prost(message, optional, tag = "1")]
760    pub exchange: ::core::option::Option<ExchangeNode>,
761    #[prost(message, repeated, tag = "2")]
762    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
763}
764#[derive(prost_helpers::AnyPB)]
765#[derive(Clone, PartialEq, ::prost::Message)]
766pub struct LocalLookupJoinNode {
767    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
768    pub join_type: i32,
769    #[prost(message, optional, tag = "2")]
770    pub condition: ::core::option::Option<super::expr::ExprNode>,
771    #[prost(uint32, repeated, tag = "3")]
772    pub outer_side_key: ::prost::alloc::vec::Vec<u32>,
773    #[prost(uint32, repeated, tag = "4")]
774    pub inner_side_key: ::prost::alloc::vec::Vec<u32>,
775    #[prost(uint32, tag = "5")]
776    pub lookup_prefix_len: u32,
777    #[prost(message, optional, tag = "6")]
778    pub inner_side_table_desc: ::core::option::Option<
779        super::plan_common::StorageTableDesc,
780    >,
781    #[prost(uint64, repeated, tag = "7")]
782    pub inner_side_vnode_mapping: ::prost::alloc::vec::Vec<u64>,
783    #[prost(int32, repeated, tag = "8")]
784    pub inner_side_column_ids: ::prost::alloc::vec::Vec<i32>,
785    #[prost(uint32, repeated, tag = "9")]
786    pub output_indices: ::prost::alloc::vec::Vec<u32>,
787    #[prost(message, repeated, tag = "10")]
788    pub worker_nodes: ::prost::alloc::vec::Vec<super::common::WorkerNode>,
789    /// Null safe means it treats `null = null` as true.
790    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
791    #[prost(bool, repeated, tag = "11")]
792    pub null_safe: ::prost::alloc::vec::Vec<bool>,
793    #[prost(message, optional, tag = "12")]
794    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
795    #[prost(message, optional, tag = "13")]
796    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
797}
798/// RFC: A new schedule way for distributed lookup join
799/// <https://github.com/risingwavelabs/rfcs/pull/6>
800#[derive(prost_helpers::AnyPB)]
801#[derive(Clone, PartialEq, ::prost::Message)]
802pub struct DistributedLookupJoinNode {
803    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
804    pub join_type: i32,
805    #[prost(message, optional, tag = "2")]
806    pub condition: ::core::option::Option<super::expr::ExprNode>,
807    #[prost(uint32, repeated, tag = "3")]
808    pub outer_side_key: ::prost::alloc::vec::Vec<u32>,
809    #[prost(uint32, repeated, tag = "4")]
810    pub inner_side_key: ::prost::alloc::vec::Vec<u32>,
811    #[prost(uint32, tag = "5")]
812    pub lookup_prefix_len: u32,
813    #[prost(message, optional, tag = "6")]
814    pub inner_side_table_desc: ::core::option::Option<
815        super::plan_common::StorageTableDesc,
816    >,
817    #[prost(int32, repeated, tag = "7")]
818    pub inner_side_column_ids: ::prost::alloc::vec::Vec<i32>,
819    #[prost(uint32, repeated, tag = "8")]
820    pub output_indices: ::prost::alloc::vec::Vec<u32>,
821    /// Null safe means it treats `null = null` as true.
822    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
823    #[prost(bool, repeated, tag = "9")]
824    pub null_safe: ::prost::alloc::vec::Vec<bool>,
825    #[prost(message, optional, tag = "10")]
826    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
827    #[prost(message, optional, tag = "11")]
828    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
829}
830#[derive(prost_helpers::AnyPB)]
831#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
832pub struct UnionNode {}
833#[derive(prost_helpers::AnyPB)]
834#[derive(Clone, PartialEq, ::prost::Message)]
835pub struct SortOverWindowNode {
836    #[prost(message, repeated, tag = "1")]
837    pub calls: ::prost::alloc::vec::Vec<super::expr::WindowFunction>,
838    #[prost(uint32, repeated, tag = "2")]
839    pub partition_by: ::prost::alloc::vec::Vec<u32>,
840    #[prost(message, repeated, tag = "3")]
841    pub order_by: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
842}
843#[derive(prost_helpers::AnyPB)]
844#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
845pub struct MaxOneRowNode {}
846#[derive(prost_helpers::AnyPB)]
847#[derive(Clone, PartialEq, ::prost::Message)]
848pub struct VectorIndexNearestNode {
849    #[prost(message, optional, tag = "1")]
850    pub reader_desc: ::core::option::Option<super::plan_common::VectorIndexReaderDesc>,
851    #[prost(uint32, tag = "2")]
852    pub vector_column_idx: u32,
853    #[prost(message, optional, tag = "8")]
854    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
855}
856#[derive(prost_helpers::AnyPB)]
857#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
858pub struct GetChannelDeltaStatsNode {
859    /// Optional timestamp to get channel stats at a specific time
860    #[prost(uint64, optional, tag = "1")]
861    pub at_time: ::core::option::Option<u64>,
862    /// Time offset in seconds for the query window
863    #[prost(uint64, optional, tag = "2")]
864    pub time_offset: ::core::option::Option<u64>,
865}
866#[derive(prost_helpers::AnyPB)]
867#[derive(Clone, PartialEq, ::prost::Message)]
868pub struct PlanNode {
869    #[prost(message, repeated, tag = "1")]
870    pub children: ::prost::alloc::vec::Vec<PlanNode>,
871    #[prost(string, tag = "24")]
872    pub identity: ::prost::alloc::string::String,
873    #[prost(
874        oneof = "plan_node::NodeBody",
875        tags = "2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 21, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 100, 101"
876    )]
877    pub node_body: ::core::option::Option<plan_node::NodeBody>,
878}
879/// Nested message and enum types in `PlanNode`.
880pub mod plan_node {
881    #[derive(prost_helpers::AnyPB)]
882    #[derive(::enum_as_inner::EnumAsInner, ::strum::Display, ::strum::EnumDiscriminants)]
883    #[strum_discriminants(derive(::strum::Display, Hash))]
884    #[derive(Clone, PartialEq, ::prost::Oneof)]
885    pub enum NodeBody {
886        #[prost(message, tag = "2")]
887        Insert(super::InsertNode),
888        #[prost(message, tag = "3")]
889        Delete(super::DeleteNode),
890        #[prost(message, tag = "4")]
891        Update(super::UpdateNode),
892        #[prost(message, tag = "5")]
893        Project(super::ProjectNode),
894        #[prost(message, tag = "7")]
895        HashAgg(super::HashAggNode),
896        #[prost(message, tag = "8")]
897        Filter(super::FilterNode),
898        #[prost(message, tag = "9")]
899        Exchange(super::ExchangeNode),
900        #[prost(message, tag = "10")]
901        Sort(super::SortNode),
902        #[prost(message, tag = "11")]
903        NestedLoopJoin(super::NestedLoopJoinNode),
904        #[prost(message, tag = "14")]
905        TopN(super::TopNNode),
906        #[prost(message, tag = "15")]
907        SortAgg(super::SortAggNode),
908        #[prost(message, tag = "16")]
909        RowSeqScan(super::RowSeqScanNode),
910        #[prost(message, tag = "17")]
911        Limit(super::LimitNode),
912        #[prost(message, tag = "18")]
913        Values(super::ValuesNode),
914        #[prost(message, tag = "19")]
915        HashJoin(super::HashJoinNode),
916        #[prost(message, tag = "21")]
917        MergeSortExchange(super::MergeSortExchangeNode),
918        #[prost(message, tag = "25")]
919        HopWindow(super::HopWindowNode),
920        #[prost(message, tag = "26")]
921        TableFunction(super::TableFunctionNode),
922        #[prost(message, tag = "27")]
923        SysRowSeqScan(super::SysRowSeqScanNode),
924        #[prost(message, tag = "28")]
925        Expand(super::ExpandNode),
926        #[prost(message, tag = "29")]
927        LocalLookupJoin(super::LocalLookupJoinNode),
928        #[prost(message, tag = "30")]
929        ProjectSet(super::ProjectSetNode),
930        #[prost(message, tag = "31")]
931        Union(super::UnionNode),
932        #[prost(message, tag = "32")]
933        GroupTopN(super::GroupTopNNode),
934        #[prost(message, tag = "33")]
935        DistributedLookupJoin(super::DistributedLookupJoinNode),
936        #[prost(message, tag = "34")]
937        Source(super::SourceNode),
938        #[prost(message, tag = "35")]
939        SortOverWindow(super::SortOverWindowNode),
940        #[prost(message, tag = "36")]
941        MaxOneRow(super::MaxOneRowNode),
942        #[prost(message, tag = "37")]
943        LogRowSeqScan(super::LogRowSeqScanNode),
944        #[prost(message, tag = "38")]
945        FileScan(super::FileScanNode),
946        #[prost(message, tag = "39")]
947        IcebergScan(super::IcebergScanNode),
948        #[prost(message, tag = "40")]
949        PostgresQuery(super::PostgresQueryNode),
950        #[prost(message, tag = "41")]
951        MysqlQuery(super::MySqlQueryNode),
952        #[prost(message, tag = "42")]
953        GcsFileScan(super::GcsFileScanNode),
954        #[prost(message, tag = "43")]
955        AzblobFileScan(super::AzblobFileScanNode),
956        #[prost(message, tag = "44")]
957        VectorIndexNearest(super::VectorIndexNearestNode),
958        #[prost(message, tag = "45")]
959        GetChannelDeltaStats(super::GetChannelDeltaStatsNode),
960        /// The following nodes are used for testing.
961        #[prost(bool, tag = "100")]
962        BlockExecutor(bool),
963        #[prost(bool, tag = "101")]
964        BusyLoopExecutor(bool),
965    }
966}
967/// ExchangeInfo determines how to distribute results to tasks of next stage.
968///
969/// Note that the fragment itself does not know the where are the receivers. Instead, it prepares results in
970/// N buffers and wait for parent operators (`Exchange` nodes) to pull data from a specified buffer
971#[derive(prost_helpers::AnyPB)]
972#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
973pub struct ExchangeInfo {
974    #[prost(enumeration = "exchange_info::DistributionMode", tag = "1")]
975    pub mode: i32,
976    #[prost(oneof = "exchange_info::Distribution", tags = "2, 3, 4")]
977    pub distribution: ::core::option::Option<exchange_info::Distribution>,
978}
979/// Nested message and enum types in `ExchangeInfo`.
980pub mod exchange_info {
981    #[derive(prost_helpers::AnyPB)]
982    #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
983    pub struct BroadcastInfo {
984        #[prost(uint32, tag = "1")]
985        pub count: u32,
986    }
987    #[derive(prost_helpers::AnyPB)]
988    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
989    pub struct HashInfo {
990        #[prost(uint32, tag = "1")]
991        pub output_count: u32,
992        #[prost(uint32, repeated, tag = "3")]
993        pub key: ::prost::alloc::vec::Vec<u32>,
994    }
995    #[derive(prost_helpers::AnyPB)]
996    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
997    pub struct ConsistentHashInfo {
998        /// `vmap` maps virtual node to down stream task id
999        #[prost(uint32, repeated, tag = "1")]
1000        pub vmap: ::prost::alloc::vec::Vec<u32>,
1001        #[prost(uint32, repeated, tag = "2")]
1002        pub key: ::prost::alloc::vec::Vec<u32>,
1003    }
1004    #[derive(prost_helpers::AnyPB)]
1005    #[derive(
1006        Clone,
1007        Copy,
1008        Debug,
1009        PartialEq,
1010        Eq,
1011        Hash,
1012        PartialOrd,
1013        Ord,
1014        ::prost::Enumeration
1015    )]
1016    #[repr(i32)]
1017    pub enum DistributionMode {
1018        /// No partitioning at all, used for root segment which aggregates query results
1019        Unspecified = 0,
1020        Single = 1,
1021        Broadcast = 2,
1022        Hash = 3,
1023        ConsistentHash = 4,
1024    }
1025    impl DistributionMode {
1026        /// String value of the enum field names used in the ProtoBuf definition.
1027        ///
1028        /// The values are not transformed in any way and thus are considered stable
1029        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1030        pub fn as_str_name(&self) -> &'static str {
1031            match self {
1032                Self::Unspecified => "UNSPECIFIED",
1033                Self::Single => "SINGLE",
1034                Self::Broadcast => "BROADCAST",
1035                Self::Hash => "HASH",
1036                Self::ConsistentHash => "CONSISTENT_HASH",
1037            }
1038        }
1039        /// Creates an enum from field names used in the ProtoBuf definition.
1040        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1041            match value {
1042                "UNSPECIFIED" => Some(Self::Unspecified),
1043                "SINGLE" => Some(Self::Single),
1044                "BROADCAST" => Some(Self::Broadcast),
1045                "HASH" => Some(Self::Hash),
1046                "CONSISTENT_HASH" => Some(Self::ConsistentHash),
1047                _ => None,
1048            }
1049        }
1050    }
1051    #[derive(prost_helpers::AnyPB)]
1052    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)]
1053    pub enum Distribution {
1054        #[prost(message, tag = "2")]
1055        BroadcastInfo(BroadcastInfo),
1056        #[prost(message, tag = "3")]
1057        HashInfo(HashInfo),
1058        #[prost(message, tag = "4")]
1059        ConsistentHashInfo(ConsistentHashInfo),
1060    }
1061}
1062#[derive(prost_helpers::AnyPB)]
1063#[derive(Clone, PartialEq, ::prost::Message)]
1064pub struct PlanFragment {
1065    #[prost(message, optional, tag = "1")]
1066    pub root: ::core::option::Option<PlanNode>,
1067    #[prost(message, optional, tag = "2")]
1068    pub exchange_info: ::core::option::Option<ExchangeInfo>,
1069}