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}
478#[derive(prost_helpers::AnyPB)]
479#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
480pub struct DeleteNode {
481    /// Id of the table to perform deleting.
482    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
483    pub table_id: crate::id::TableId,
484    /// Version of the table.
485    #[prost(uint64, tag = "3")]
486    pub table_version_id: u64,
487    /// Primary key indices of the table.
488    #[prost(uint32, repeated, tag = "5")]
489    pub pk_indices: ::prost::alloc::vec::Vec<u32>,
490    #[prost(bool, tag = "2")]
491    pub returning: bool,
492    /// If enabled, only key columns are kept and the rest are NULL.
493    #[prost(bool, tag = "6")]
494    pub upsert: bool,
495    /// Session id is used to ensure that dml data from the same session should be sent to a fixed worker node and channel.
496    #[prost(uint32, tag = "4")]
497    pub session_id: u32,
498}
499#[derive(prost_helpers::AnyPB)]
500#[derive(Clone, PartialEq, ::prost::Message)]
501pub struct UpdateNode {
502    /// Id of the table to perform updating.
503    #[prost(uint32, tag = "1", wrapper = "crate::id::TableId")]
504    pub table_id: crate::id::TableId,
505    /// Version of the table.
506    #[prost(uint64, tag = "2")]
507    pub table_version_id: u64,
508    /// Expressions to generate `U-` records.
509    #[prost(message, repeated, tag = "3")]
510    pub old_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
511    /// Expressions to generate `U+` records.
512    #[prost(message, repeated, tag = "4")]
513    pub new_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
514    #[prost(bool, tag = "5")]
515    pub returning: bool,
516    /// If enabled, only `Insert` records are emitted for new rows.
517    #[prost(bool, tag = "7")]
518    pub upsert: bool,
519    /// Session id is used to ensure that dml data from the same session should be sent to a fixed worker node and channel.
520    #[prost(uint32, tag = "6")]
521    pub session_id: u32,
522}
523#[derive(prost_helpers::AnyPB)]
524#[derive(Clone, PartialEq, ::prost::Message)]
525pub struct ValuesNode {
526    #[prost(message, repeated, tag = "1")]
527    pub tuples: ::prost::alloc::vec::Vec<values_node::ExprTuple>,
528    #[prost(message, repeated, tag = "2")]
529    pub fields: ::prost::alloc::vec::Vec<super::plan_common::Field>,
530}
531/// Nested message and enum types in `ValuesNode`.
532pub mod values_node {
533    #[derive(prost_helpers::AnyPB)]
534    #[derive(Clone, PartialEq, ::prost::Message)]
535    pub struct ExprTuple {
536        #[prost(message, repeated, tag = "1")]
537        pub cells: ::prost::alloc::vec::Vec<super::super::expr::ExprNode>,
538    }
539}
540#[derive(prost_helpers::AnyPB)]
541#[derive(Clone, PartialEq, ::prost::Message)]
542pub struct SortNode {
543    #[prost(message, repeated, tag = "1")]
544    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
545}
546#[derive(prost_helpers::AnyPB)]
547#[derive(Clone, PartialEq, ::prost::Message)]
548pub struct TopNNode {
549    #[prost(message, repeated, tag = "1")]
550    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
551    #[prost(uint64, tag = "2")]
552    pub limit: u64,
553    #[prost(uint64, tag = "3")]
554    pub offset: u64,
555    #[prost(bool, tag = "4")]
556    pub with_ties: bool,
557}
558#[derive(prost_helpers::AnyPB)]
559#[derive(Clone, PartialEq, ::prost::Message)]
560pub struct GroupTopNNode {
561    #[prost(message, repeated, tag = "1")]
562    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
563    #[prost(uint64, tag = "2")]
564    pub limit: u64,
565    #[prost(uint64, tag = "3")]
566    pub offset: u64,
567    #[prost(uint32, repeated, tag = "4")]
568    pub group_key: ::prost::alloc::vec::Vec<u32>,
569    #[prost(bool, tag = "5")]
570    pub with_ties: bool,
571}
572#[derive(prost_helpers::AnyPB)]
573#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
574pub struct LimitNode {
575    #[prost(uint64, tag = "1")]
576    pub limit: u64,
577    #[prost(uint64, tag = "2")]
578    pub offset: u64,
579}
580#[derive(prost_helpers::AnyPB)]
581#[derive(Clone, PartialEq, ::prost::Message)]
582pub struct NestedLoopJoinNode {
583    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
584    pub join_type: i32,
585    #[prost(message, optional, tag = "2")]
586    pub join_cond: ::core::option::Option<super::expr::ExprNode>,
587    #[prost(uint32, repeated, tag = "3")]
588    pub output_indices: ::prost::alloc::vec::Vec<u32>,
589}
590#[derive(prost_helpers::AnyPB)]
591#[derive(Clone, PartialEq, ::prost::Message)]
592pub struct HashAggNode {
593    #[prost(uint32, repeated, tag = "1")]
594    pub group_key: ::prost::alloc::vec::Vec<u32>,
595    #[prost(message, repeated, tag = "2")]
596    pub agg_calls: ::prost::alloc::vec::Vec<super::expr::AggCall>,
597}
598#[derive(prost_helpers::AnyPB)]
599#[derive(Clone, PartialEq, ::prost::Message)]
600pub struct ExpandNode {
601    #[prost(message, repeated, tag = "1")]
602    pub column_subsets: ::prost::alloc::vec::Vec<expand_node::Subset>,
603}
604/// Nested message and enum types in `ExpandNode`.
605pub mod expand_node {
606    #[derive(prost_helpers::AnyPB)]
607    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
608    pub struct Subset {
609        #[prost(uint32, repeated, tag = "1")]
610        pub column_indices: ::prost::alloc::vec::Vec<u32>,
611    }
612}
613#[derive(prost_helpers::AnyPB)]
614#[derive(Clone, PartialEq, ::prost::Message)]
615pub struct ProjectSetNode {
616    #[prost(message, repeated, tag = "1")]
617    pub select_list: ::prost::alloc::vec::Vec<super::expr::ProjectSetSelectItem>,
618}
619#[derive(prost_helpers::AnyPB)]
620#[derive(Clone, PartialEq, ::prost::Message)]
621pub struct SortAggNode {
622    #[prost(message, repeated, tag = "1")]
623    pub group_key: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
624    #[prost(message, repeated, tag = "2")]
625    pub agg_calls: ::prost::alloc::vec::Vec<super::expr::AggCall>,
626}
627#[derive(prost_helpers::AnyPB)]
628#[derive(Clone, PartialEq, ::prost::Message)]
629pub struct HashJoinNode {
630    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
631    pub join_type: i32,
632    #[prost(int32, repeated, tag = "2")]
633    pub left_key: ::prost::alloc::vec::Vec<i32>,
634    #[prost(int32, repeated, tag = "3")]
635    pub right_key: ::prost::alloc::vec::Vec<i32>,
636    #[prost(message, optional, tag = "4")]
637    pub condition: ::core::option::Option<super::expr::ExprNode>,
638    #[prost(uint32, repeated, tag = "5")]
639    pub output_indices: ::prost::alloc::vec::Vec<u32>,
640    /// Null safe means it treats `null = null` as true.
641    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
642    #[prost(bool, repeated, tag = "6")]
643    pub null_safe: ::prost::alloc::vec::Vec<bool>,
644    #[prost(message, optional, tag = "7")]
645    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
646}
647#[derive(prost_helpers::AnyPB)]
648#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
649pub struct SortMergeJoinNode {
650    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
651    pub join_type: i32,
652    #[prost(int32, repeated, tag = "2")]
653    pub left_key: ::prost::alloc::vec::Vec<i32>,
654    #[prost(int32, repeated, tag = "3")]
655    pub right_key: ::prost::alloc::vec::Vec<i32>,
656    #[prost(enumeration = "super::common::Direction", tag = "4")]
657    pub direction: i32,
658    #[prost(uint32, repeated, tag = "5")]
659    pub output_indices: ::prost::alloc::vec::Vec<u32>,
660}
661#[derive(prost_helpers::AnyPB)]
662#[derive(Clone, PartialEq, ::prost::Message)]
663pub struct HopWindowNode {
664    #[prost(uint32, tag = "1")]
665    pub time_col: u32,
666    #[prost(message, optional, tag = "2")]
667    pub window_slide: ::core::option::Option<super::data::Interval>,
668    #[prost(message, optional, tag = "3")]
669    pub window_size: ::core::option::Option<super::data::Interval>,
670    #[prost(uint32, repeated, tag = "4")]
671    pub output_indices: ::prost::alloc::vec::Vec<u32>,
672    #[prost(message, repeated, tag = "5")]
673    pub window_start_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
674    #[prost(message, repeated, tag = "6")]
675    pub window_end_exprs: ::prost::alloc::vec::Vec<super::expr::ExprNode>,
676}
677#[derive(prost_helpers::AnyPB)]
678#[derive(Clone, PartialEq, ::prost::Message)]
679pub struct TableFunctionNode {
680    #[prost(message, optional, tag = "1")]
681    pub table_function: ::core::option::Option<super::expr::TableFunction>,
682}
683/// Task is a running instance of Stage.
684#[derive(prost_helpers::AnyPB)]
685#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
686pub struct TaskId {
687    #[prost(string, tag = "1")]
688    pub query_id: ::prost::alloc::string::String,
689    #[prost(uint32, tag = "2")]
690    pub stage_id: u32,
691    #[prost(uint64, tag = "3")]
692    pub task_id: u64,
693}
694/// Every task will create N buffers (channels) for parent operators to fetch results from,
695/// where N is the parallelism of parent stage.
696#[derive(prost_helpers::AnyPB)]
697#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
698pub struct TaskOutputId {
699    #[prost(message, optional, tag = "1")]
700    pub task_id: ::core::option::Option<TaskId>,
701    /// The id of output channel to fetch from
702    #[prost(uint64, tag = "2")]
703    pub output_id: u64,
704}
705#[derive(prost_helpers::AnyPB)]
706#[derive(Clone, PartialEq, ::prost::Message)]
707pub struct LocalExecutePlan {
708    #[prost(message, optional, tag = "1")]
709    pub plan: ::core::option::Option<PlanFragment>,
710    #[prost(map = "string, string", tag = "3")]
711    pub tracing_context: ::std::collections::HashMap<
712        ::prost::alloc::string::String,
713        ::prost::alloc::string::String,
714    >,
715}
716/// ExchangeSource describes where to read results from children operators
717#[derive(prost_helpers::AnyPB)]
718#[derive(Clone, PartialEq, ::prost::Message)]
719pub struct ExchangeSource {
720    #[prost(message, optional, tag = "1")]
721    pub task_output_id: ::core::option::Option<TaskOutputId>,
722    #[prost(message, optional, tag = "2")]
723    pub host: ::core::option::Option<super::common::HostAddress>,
724    #[prost(oneof = "exchange_source::LocalExecutePlan", tags = "3")]
725    pub local_execute_plan: ::core::option::Option<exchange_source::LocalExecutePlan>,
726}
727/// Nested message and enum types in `ExchangeSource`.
728pub mod exchange_source {
729    #[derive(prost_helpers::AnyPB)]
730    #[derive(Clone, PartialEq, ::prost::Oneof)]
731    pub enum LocalExecutePlan {
732        #[prost(message, tag = "3")]
733        Plan(super::LocalExecutePlan),
734    }
735}
736#[derive(prost_helpers::AnyPB)]
737#[derive(Clone, PartialEq, ::prost::Message)]
738pub struct ExchangeNode {
739    #[prost(message, repeated, tag = "1")]
740    pub sources: ::prost::alloc::vec::Vec<ExchangeSource>,
741    /// sequential means each tasks of the exchange node will be executed sequentially.
742    #[prost(bool, tag = "2")]
743    pub sequential: bool,
744    #[prost(message, repeated, tag = "3")]
745    pub input_schema: ::prost::alloc::vec::Vec<super::plan_common::Field>,
746}
747#[derive(prost_helpers::AnyPB)]
748#[derive(Clone, PartialEq, ::prost::Message)]
749pub struct MergeSortExchangeNode {
750    #[prost(message, optional, tag = "1")]
751    pub exchange: ::core::option::Option<ExchangeNode>,
752    #[prost(message, repeated, tag = "2")]
753    pub column_orders: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
754}
755#[derive(prost_helpers::AnyPB)]
756#[derive(Clone, PartialEq, ::prost::Message)]
757pub struct LocalLookupJoinNode {
758    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
759    pub join_type: i32,
760    #[prost(message, optional, tag = "2")]
761    pub condition: ::core::option::Option<super::expr::ExprNode>,
762    #[prost(uint32, repeated, tag = "3")]
763    pub outer_side_key: ::prost::alloc::vec::Vec<u32>,
764    #[prost(uint32, repeated, tag = "4")]
765    pub inner_side_key: ::prost::alloc::vec::Vec<u32>,
766    #[prost(uint32, tag = "5")]
767    pub lookup_prefix_len: u32,
768    #[prost(message, optional, tag = "6")]
769    pub inner_side_table_desc: ::core::option::Option<
770        super::plan_common::StorageTableDesc,
771    >,
772    #[prost(uint64, repeated, tag = "7")]
773    pub inner_side_vnode_mapping: ::prost::alloc::vec::Vec<u64>,
774    #[prost(int32, repeated, tag = "8")]
775    pub inner_side_column_ids: ::prost::alloc::vec::Vec<i32>,
776    #[prost(uint32, repeated, tag = "9")]
777    pub output_indices: ::prost::alloc::vec::Vec<u32>,
778    #[prost(message, repeated, tag = "10")]
779    pub worker_nodes: ::prost::alloc::vec::Vec<super::common::WorkerNode>,
780    /// Null safe means it treats `null = null` as true.
781    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
782    #[prost(bool, repeated, tag = "11")]
783    pub null_safe: ::prost::alloc::vec::Vec<bool>,
784    #[prost(message, optional, tag = "12")]
785    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
786    #[prost(message, optional, tag = "13")]
787    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
788}
789/// RFC: A new schedule way for distributed lookup join
790/// <https://github.com/risingwavelabs/rfcs/pull/6>
791#[derive(prost_helpers::AnyPB)]
792#[derive(Clone, PartialEq, ::prost::Message)]
793pub struct DistributedLookupJoinNode {
794    #[prost(enumeration = "super::plan_common::JoinType", tag = "1")]
795    pub join_type: i32,
796    #[prost(message, optional, tag = "2")]
797    pub condition: ::core::option::Option<super::expr::ExprNode>,
798    #[prost(uint32, repeated, tag = "3")]
799    pub outer_side_key: ::prost::alloc::vec::Vec<u32>,
800    #[prost(uint32, repeated, tag = "4")]
801    pub inner_side_key: ::prost::alloc::vec::Vec<u32>,
802    #[prost(uint32, tag = "5")]
803    pub lookup_prefix_len: u32,
804    #[prost(message, optional, tag = "6")]
805    pub inner_side_table_desc: ::core::option::Option<
806        super::plan_common::StorageTableDesc,
807    >,
808    #[prost(int32, repeated, tag = "7")]
809    pub inner_side_column_ids: ::prost::alloc::vec::Vec<i32>,
810    #[prost(uint32, repeated, tag = "8")]
811    pub output_indices: ::prost::alloc::vec::Vec<u32>,
812    /// Null safe means it treats `null = null` as true.
813    /// Each key pair can be null safe independently. (left_key, right_key, null_safe)
814    #[prost(bool, repeated, tag = "9")]
815    pub null_safe: ::prost::alloc::vec::Vec<bool>,
816    #[prost(message, optional, tag = "10")]
817    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
818    #[prost(message, optional, tag = "11")]
819    pub asof_desc: ::core::option::Option<super::plan_common::AsOfJoinDesc>,
820}
821#[derive(prost_helpers::AnyPB)]
822#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
823pub struct UnionNode {}
824#[derive(prost_helpers::AnyPB)]
825#[derive(Clone, PartialEq, ::prost::Message)]
826pub struct SortOverWindowNode {
827    #[prost(message, repeated, tag = "1")]
828    pub calls: ::prost::alloc::vec::Vec<super::expr::WindowFunction>,
829    #[prost(uint32, repeated, tag = "2")]
830    pub partition_by: ::prost::alloc::vec::Vec<u32>,
831    #[prost(message, repeated, tag = "3")]
832    pub order_by: ::prost::alloc::vec::Vec<super::common::ColumnOrder>,
833}
834#[derive(prost_helpers::AnyPB)]
835#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
836pub struct MaxOneRowNode {}
837#[derive(prost_helpers::AnyPB)]
838#[derive(Clone, PartialEq, ::prost::Message)]
839pub struct VectorIndexNearestNode {
840    #[prost(message, optional, tag = "1")]
841    pub reader_desc: ::core::option::Option<super::plan_common::VectorIndexReaderDesc>,
842    #[prost(uint32, tag = "2")]
843    pub vector_column_idx: u32,
844    #[prost(message, optional, tag = "8")]
845    pub query_epoch: ::core::option::Option<super::common::BatchQueryEpoch>,
846}
847#[derive(prost_helpers::AnyPB)]
848#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
849pub struct GetChannelDeltaStatsNode {
850    /// Optional timestamp to get channel stats at a specific time
851    #[prost(uint64, optional, tag = "1")]
852    pub at_time: ::core::option::Option<u64>,
853    /// Time offset in seconds for the query window
854    #[prost(uint64, optional, tag = "2")]
855    pub time_offset: ::core::option::Option<u64>,
856}
857#[derive(prost_helpers::AnyPB)]
858#[derive(Clone, PartialEq, ::prost::Message)]
859pub struct PlanNode {
860    #[prost(message, repeated, tag = "1")]
861    pub children: ::prost::alloc::vec::Vec<PlanNode>,
862    #[prost(string, tag = "24")]
863    pub identity: ::prost::alloc::string::String,
864    #[prost(
865        oneof = "plan_node::NodeBody",
866        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"
867    )]
868    pub node_body: ::core::option::Option<plan_node::NodeBody>,
869}
870/// Nested message and enum types in `PlanNode`.
871pub mod plan_node {
872    #[derive(prost_helpers::AnyPB)]
873    #[derive(::enum_as_inner::EnumAsInner, ::strum::Display, ::strum::EnumDiscriminants)]
874    #[strum_discriminants(derive(::strum::Display, Hash))]
875    #[derive(Clone, PartialEq, ::prost::Oneof)]
876    pub enum NodeBody {
877        #[prost(message, tag = "2")]
878        Insert(super::InsertNode),
879        #[prost(message, tag = "3")]
880        Delete(super::DeleteNode),
881        #[prost(message, tag = "4")]
882        Update(super::UpdateNode),
883        #[prost(message, tag = "5")]
884        Project(super::ProjectNode),
885        #[prost(message, tag = "7")]
886        HashAgg(super::HashAggNode),
887        #[prost(message, tag = "8")]
888        Filter(super::FilterNode),
889        #[prost(message, tag = "9")]
890        Exchange(super::ExchangeNode),
891        #[prost(message, tag = "10")]
892        Sort(super::SortNode),
893        #[prost(message, tag = "11")]
894        NestedLoopJoin(super::NestedLoopJoinNode),
895        #[prost(message, tag = "14")]
896        TopN(super::TopNNode),
897        #[prost(message, tag = "15")]
898        SortAgg(super::SortAggNode),
899        #[prost(message, tag = "16")]
900        RowSeqScan(super::RowSeqScanNode),
901        #[prost(message, tag = "17")]
902        Limit(super::LimitNode),
903        #[prost(message, tag = "18")]
904        Values(super::ValuesNode),
905        #[prost(message, tag = "19")]
906        HashJoin(super::HashJoinNode),
907        #[prost(message, tag = "21")]
908        MergeSortExchange(super::MergeSortExchangeNode),
909        #[prost(message, tag = "25")]
910        HopWindow(super::HopWindowNode),
911        #[prost(message, tag = "26")]
912        TableFunction(super::TableFunctionNode),
913        #[prost(message, tag = "27")]
914        SysRowSeqScan(super::SysRowSeqScanNode),
915        #[prost(message, tag = "28")]
916        Expand(super::ExpandNode),
917        #[prost(message, tag = "29")]
918        LocalLookupJoin(super::LocalLookupJoinNode),
919        #[prost(message, tag = "30")]
920        ProjectSet(super::ProjectSetNode),
921        #[prost(message, tag = "31")]
922        Union(super::UnionNode),
923        #[prost(message, tag = "32")]
924        GroupTopN(super::GroupTopNNode),
925        #[prost(message, tag = "33")]
926        DistributedLookupJoin(super::DistributedLookupJoinNode),
927        #[prost(message, tag = "34")]
928        Source(super::SourceNode),
929        #[prost(message, tag = "35")]
930        SortOverWindow(super::SortOverWindowNode),
931        #[prost(message, tag = "36")]
932        MaxOneRow(super::MaxOneRowNode),
933        #[prost(message, tag = "37")]
934        LogRowSeqScan(super::LogRowSeqScanNode),
935        #[prost(message, tag = "38")]
936        FileScan(super::FileScanNode),
937        #[prost(message, tag = "39")]
938        IcebergScan(super::IcebergScanNode),
939        #[prost(message, tag = "40")]
940        PostgresQuery(super::PostgresQueryNode),
941        #[prost(message, tag = "41")]
942        MysqlQuery(super::MySqlQueryNode),
943        #[prost(message, tag = "42")]
944        GcsFileScan(super::GcsFileScanNode),
945        #[prost(message, tag = "43")]
946        AzblobFileScan(super::AzblobFileScanNode),
947        #[prost(message, tag = "44")]
948        VectorIndexNearest(super::VectorIndexNearestNode),
949        #[prost(message, tag = "45")]
950        GetChannelDeltaStats(super::GetChannelDeltaStatsNode),
951        /// The following nodes are used for testing.
952        #[prost(bool, tag = "100")]
953        BlockExecutor(bool),
954        #[prost(bool, tag = "101")]
955        BusyLoopExecutor(bool),
956    }
957}
958/// ExchangeInfo determines how to distribute results to tasks of next stage.
959///
960/// Note that the fragment itself does not know the where are the receivers. Instead, it prepares results in
961/// N buffers and wait for parent operators (`Exchange` nodes) to pull data from a specified buffer
962#[derive(prost_helpers::AnyPB)]
963#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
964pub struct ExchangeInfo {
965    #[prost(enumeration = "exchange_info::DistributionMode", tag = "1")]
966    pub mode: i32,
967    #[prost(oneof = "exchange_info::Distribution", tags = "2, 3, 4")]
968    pub distribution: ::core::option::Option<exchange_info::Distribution>,
969}
970/// Nested message and enum types in `ExchangeInfo`.
971pub mod exchange_info {
972    #[derive(prost_helpers::AnyPB)]
973    #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]
974    pub struct BroadcastInfo {
975        #[prost(uint32, tag = "1")]
976        pub count: u32,
977    }
978    #[derive(prost_helpers::AnyPB)]
979    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
980    pub struct HashInfo {
981        #[prost(uint32, tag = "1")]
982        pub output_count: u32,
983        #[prost(uint32, repeated, tag = "3")]
984        pub key: ::prost::alloc::vec::Vec<u32>,
985    }
986    #[derive(prost_helpers::AnyPB)]
987    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
988    pub struct ConsistentHashInfo {
989        /// `vmap` maps virtual node to down stream task id
990        #[prost(uint32, repeated, tag = "1")]
991        pub vmap: ::prost::alloc::vec::Vec<u32>,
992        #[prost(uint32, repeated, tag = "2")]
993        pub key: ::prost::alloc::vec::Vec<u32>,
994    }
995    #[derive(prost_helpers::AnyPB)]
996    #[derive(
997        Clone,
998        Copy,
999        Debug,
1000        PartialEq,
1001        Eq,
1002        Hash,
1003        PartialOrd,
1004        Ord,
1005        ::prost::Enumeration
1006    )]
1007    #[repr(i32)]
1008    pub enum DistributionMode {
1009        /// No partitioning at all, used for root segment which aggregates query results
1010        Unspecified = 0,
1011        Single = 1,
1012        Broadcast = 2,
1013        Hash = 3,
1014        ConsistentHash = 4,
1015    }
1016    impl DistributionMode {
1017        /// String value of the enum field names used in the ProtoBuf definition.
1018        ///
1019        /// The values are not transformed in any way and thus are considered stable
1020        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1021        pub fn as_str_name(&self) -> &'static str {
1022            match self {
1023                Self::Unspecified => "UNSPECIFIED",
1024                Self::Single => "SINGLE",
1025                Self::Broadcast => "BROADCAST",
1026                Self::Hash => "HASH",
1027                Self::ConsistentHash => "CONSISTENT_HASH",
1028            }
1029        }
1030        /// Creates an enum from field names used in the ProtoBuf definition.
1031        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1032            match value {
1033                "UNSPECIFIED" => Some(Self::Unspecified),
1034                "SINGLE" => Some(Self::Single),
1035                "BROADCAST" => Some(Self::Broadcast),
1036                "HASH" => Some(Self::Hash),
1037                "CONSISTENT_HASH" => Some(Self::ConsistentHash),
1038                _ => None,
1039            }
1040        }
1041    }
1042    #[derive(prost_helpers::AnyPB)]
1043    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)]
1044    pub enum Distribution {
1045        #[prost(message, tag = "2")]
1046        BroadcastInfo(BroadcastInfo),
1047        #[prost(message, tag = "3")]
1048        HashInfo(HashInfo),
1049        #[prost(message, tag = "4")]
1050        ConsistentHashInfo(ConsistentHashInfo),
1051    }
1052}
1053#[derive(prost_helpers::AnyPB)]
1054#[derive(Clone, PartialEq, ::prost::Message)]
1055pub struct PlanFragment {
1056    #[prost(message, optional, tag = "1")]
1057    pub root: ::core::option::Option<PlanNode>,
1058    #[prost(message, optional, tag = "2")]
1059    pub exchange_info: ::core::option::Option<ExchangeInfo>,
1060}