datafusion_proto/generated/
prost.rs

1// This file is @generated by prost-build.
2/// logical plan
3/// LogicalPlan is a nested type
4#[derive(Clone, PartialEq, ::prost::Message)]
5pub struct LogicalPlanNode {
6    #[prost(
7        oneof = "logical_plan_node::LogicalPlanType",
8        tags = "1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33"
9    )]
10    pub logical_plan_type: ::core::option::Option<logical_plan_node::LogicalPlanType>,
11}
12/// Nested message and enum types in `LogicalPlanNode`.
13pub mod logical_plan_node {
14    #[derive(Clone, PartialEq, ::prost::Oneof)]
15    pub enum LogicalPlanType {
16        #[prost(message, tag = "1")]
17        ListingScan(super::ListingTableScanNode),
18        #[prost(message, tag = "3")]
19        Projection(::prost::alloc::boxed::Box<super::ProjectionNode>),
20        #[prost(message, tag = "4")]
21        Selection(::prost::alloc::boxed::Box<super::SelectionNode>),
22        #[prost(message, tag = "5")]
23        Limit(::prost::alloc::boxed::Box<super::LimitNode>),
24        #[prost(message, tag = "6")]
25        Aggregate(::prost::alloc::boxed::Box<super::AggregateNode>),
26        #[prost(message, tag = "7")]
27        Join(::prost::alloc::boxed::Box<super::JoinNode>),
28        #[prost(message, tag = "8")]
29        Sort(::prost::alloc::boxed::Box<super::SortNode>),
30        #[prost(message, tag = "9")]
31        Repartition(::prost::alloc::boxed::Box<super::RepartitionNode>),
32        #[prost(message, tag = "10")]
33        EmptyRelation(super::EmptyRelationNode),
34        #[prost(message, tag = "11")]
35        CreateExternalTable(super::CreateExternalTableNode),
36        #[prost(message, tag = "12")]
37        Explain(::prost::alloc::boxed::Box<super::ExplainNode>),
38        #[prost(message, tag = "13")]
39        Window(::prost::alloc::boxed::Box<super::WindowNode>),
40        #[prost(message, tag = "14")]
41        Analyze(::prost::alloc::boxed::Box<super::AnalyzeNode>),
42        #[prost(message, tag = "15")]
43        CrossJoin(::prost::alloc::boxed::Box<super::CrossJoinNode>),
44        #[prost(message, tag = "16")]
45        Values(super::ValuesNode),
46        #[prost(message, tag = "17")]
47        Extension(super::LogicalExtensionNode),
48        #[prost(message, tag = "18")]
49        CreateCatalogSchema(super::CreateCatalogSchemaNode),
50        #[prost(message, tag = "19")]
51        Union(super::UnionNode),
52        #[prost(message, tag = "20")]
53        CreateCatalog(super::CreateCatalogNode),
54        #[prost(message, tag = "21")]
55        SubqueryAlias(::prost::alloc::boxed::Box<super::SubqueryAliasNode>),
56        #[prost(message, tag = "22")]
57        CreateView(::prost::alloc::boxed::Box<super::CreateViewNode>),
58        #[prost(message, tag = "23")]
59        Distinct(::prost::alloc::boxed::Box<super::DistinctNode>),
60        #[prost(message, tag = "24")]
61        ViewScan(::prost::alloc::boxed::Box<super::ViewTableScanNode>),
62        #[prost(message, tag = "25")]
63        CustomScan(super::CustomTableScanNode),
64        #[prost(message, tag = "26")]
65        Prepare(::prost::alloc::boxed::Box<super::PrepareNode>),
66        #[prost(message, tag = "27")]
67        DropView(super::DropViewNode),
68        #[prost(message, tag = "28")]
69        DistinctOn(::prost::alloc::boxed::Box<super::DistinctOnNode>),
70        #[prost(message, tag = "29")]
71        CopyTo(::prost::alloc::boxed::Box<super::CopyToNode>),
72        #[prost(message, tag = "30")]
73        Unnest(::prost::alloc::boxed::Box<super::UnnestNode>),
74        #[prost(message, tag = "31")]
75        RecursiveQuery(::prost::alloc::boxed::Box<super::RecursiveQueryNode>),
76        #[prost(message, tag = "32")]
77        CteWorkTableScan(super::CteWorkTableScanNode),
78        #[prost(message, tag = "33")]
79        Dml(::prost::alloc::boxed::Box<super::DmlNode>),
80    }
81}
82#[derive(Clone, PartialEq, ::prost::Message)]
83pub struct LogicalExtensionNode {
84    #[prost(bytes = "vec", tag = "1")]
85    pub node: ::prost::alloc::vec::Vec<u8>,
86    #[prost(message, repeated, tag = "2")]
87    pub inputs: ::prost::alloc::vec::Vec<LogicalPlanNode>,
88}
89#[derive(Clone, PartialEq, ::prost::Message)]
90pub struct ProjectionColumns {
91    #[prost(string, repeated, tag = "1")]
92    pub columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
93}
94#[derive(Clone, PartialEq, ::prost::Message)]
95pub struct LogicalExprNodeCollection {
96    #[prost(message, repeated, tag = "1")]
97    pub logical_expr_nodes: ::prost::alloc::vec::Vec<LogicalExprNode>,
98}
99#[derive(Clone, PartialEq, ::prost::Message)]
100pub struct SortExprNodeCollection {
101    #[prost(message, repeated, tag = "1")]
102    pub sort_expr_nodes: ::prost::alloc::vec::Vec<SortExprNode>,
103}
104#[derive(Clone, PartialEq, ::prost::Message)]
105pub struct ListingTableScanNode {
106    #[prost(message, optional, tag = "14")]
107    pub table_name: ::core::option::Option<TableReference>,
108    #[prost(string, repeated, tag = "2")]
109    pub paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
110    #[prost(string, tag = "3")]
111    pub file_extension: ::prost::alloc::string::String,
112    #[prost(message, optional, tag = "4")]
113    pub projection: ::core::option::Option<ProjectionColumns>,
114    #[prost(message, optional, tag = "5")]
115    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
116    #[prost(message, repeated, tag = "6")]
117    pub filters: ::prost::alloc::vec::Vec<LogicalExprNode>,
118    #[prost(string, repeated, tag = "7")]
119    pub table_partition_cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
120    #[prost(bool, tag = "8")]
121    pub collect_stat: bool,
122    #[prost(uint32, tag = "9")]
123    pub target_partitions: u32,
124    #[prost(message, repeated, tag = "13")]
125    pub file_sort_order: ::prost::alloc::vec::Vec<SortExprNodeCollection>,
126    #[prost(oneof = "listing_table_scan_node::FileFormatType", tags = "10, 11, 12, 15")]
127    pub file_format_type: ::core::option::Option<
128        listing_table_scan_node::FileFormatType,
129    >,
130}
131/// Nested message and enum types in `ListingTableScanNode`.
132pub mod listing_table_scan_node {
133    #[derive(Clone, PartialEq, ::prost::Oneof)]
134    pub enum FileFormatType {
135        #[prost(message, tag = "10")]
136        Csv(super::super::datafusion_common::CsvFormat),
137        #[prost(message, tag = "11")]
138        Parquet(super::super::datafusion_common::ParquetFormat),
139        #[prost(message, tag = "12")]
140        Avro(super::super::datafusion_common::AvroFormat),
141        #[prost(message, tag = "15")]
142        Json(super::super::datafusion_common::NdJsonFormat),
143    }
144}
145#[derive(Clone, PartialEq, ::prost::Message)]
146pub struct ViewTableScanNode {
147    #[prost(message, optional, tag = "6")]
148    pub table_name: ::core::option::Option<TableReference>,
149    #[prost(message, optional, boxed, tag = "2")]
150    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
151    #[prost(message, optional, tag = "3")]
152    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
153    #[prost(message, optional, tag = "4")]
154    pub projection: ::core::option::Option<ProjectionColumns>,
155    #[prost(string, tag = "5")]
156    pub definition: ::prost::alloc::string::String,
157}
158/// Logical Plan to Scan a CustomTableProvider registered at runtime
159#[derive(Clone, PartialEq, ::prost::Message)]
160pub struct CustomTableScanNode {
161    #[prost(message, optional, tag = "6")]
162    pub table_name: ::core::option::Option<TableReference>,
163    #[prost(message, optional, tag = "2")]
164    pub projection: ::core::option::Option<ProjectionColumns>,
165    #[prost(message, optional, tag = "3")]
166    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
167    #[prost(message, repeated, tag = "4")]
168    pub filters: ::prost::alloc::vec::Vec<LogicalExprNode>,
169    #[prost(bytes = "vec", tag = "5")]
170    pub custom_table_data: ::prost::alloc::vec::Vec<u8>,
171}
172#[derive(Clone, PartialEq, ::prost::Message)]
173pub struct ProjectionNode {
174    #[prost(message, optional, boxed, tag = "1")]
175    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
176    #[prost(message, repeated, tag = "2")]
177    pub expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
178    #[prost(oneof = "projection_node::OptionalAlias", tags = "3")]
179    pub optional_alias: ::core::option::Option<projection_node::OptionalAlias>,
180}
181/// Nested message and enum types in `ProjectionNode`.
182pub mod projection_node {
183    #[derive(Clone, PartialEq, ::prost::Oneof)]
184    pub enum OptionalAlias {
185        #[prost(string, tag = "3")]
186        Alias(::prost::alloc::string::String),
187    }
188}
189#[derive(Clone, PartialEq, ::prost::Message)]
190pub struct SelectionNode {
191    #[prost(message, optional, boxed, tag = "1")]
192    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
193    #[prost(message, optional, tag = "2")]
194    pub expr: ::core::option::Option<LogicalExprNode>,
195}
196#[derive(Clone, PartialEq, ::prost::Message)]
197pub struct SortNode {
198    #[prost(message, optional, boxed, tag = "1")]
199    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
200    #[prost(message, repeated, tag = "2")]
201    pub expr: ::prost::alloc::vec::Vec<SortExprNode>,
202    /// Maximum number of highest/lowest rows to fetch; negative means no limit
203    #[prost(int64, tag = "3")]
204    pub fetch: i64,
205}
206#[derive(Clone, PartialEq, ::prost::Message)]
207pub struct RepartitionNode {
208    #[prost(message, optional, boxed, tag = "1")]
209    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
210    #[prost(oneof = "repartition_node::PartitionMethod", tags = "2, 3")]
211    pub partition_method: ::core::option::Option<repartition_node::PartitionMethod>,
212}
213/// Nested message and enum types in `RepartitionNode`.
214pub mod repartition_node {
215    #[derive(Clone, PartialEq, ::prost::Oneof)]
216    pub enum PartitionMethod {
217        #[prost(uint64, tag = "2")]
218        RoundRobin(u64),
219        #[prost(message, tag = "3")]
220        Hash(super::HashRepartition),
221    }
222}
223#[derive(Clone, PartialEq, ::prost::Message)]
224pub struct HashRepartition {
225    #[prost(message, repeated, tag = "1")]
226    pub hash_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
227    #[prost(uint64, tag = "2")]
228    pub partition_count: u64,
229}
230#[derive(Clone, Copy, PartialEq, ::prost::Message)]
231pub struct EmptyRelationNode {
232    #[prost(bool, tag = "1")]
233    pub produce_one_row: bool,
234}
235#[derive(Clone, PartialEq, ::prost::Message)]
236pub struct CreateExternalTableNode {
237    #[prost(message, optional, tag = "9")]
238    pub name: ::core::option::Option<TableReference>,
239    #[prost(string, tag = "2")]
240    pub location: ::prost::alloc::string::String,
241    #[prost(string, tag = "3")]
242    pub file_type: ::prost::alloc::string::String,
243    #[prost(message, optional, tag = "4")]
244    pub schema: ::core::option::Option<super::datafusion_common::DfSchema>,
245    #[prost(string, repeated, tag = "5")]
246    pub table_partition_cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
247    #[prost(bool, tag = "6")]
248    pub if_not_exists: bool,
249    #[prost(bool, tag = "14")]
250    pub temporary: bool,
251    #[prost(string, tag = "7")]
252    pub definition: ::prost::alloc::string::String,
253    #[prost(message, repeated, tag = "10")]
254    pub order_exprs: ::prost::alloc::vec::Vec<SortExprNodeCollection>,
255    #[prost(bool, tag = "11")]
256    pub unbounded: bool,
257    #[prost(map = "string, string", tag = "8")]
258    pub options: ::std::collections::HashMap<
259        ::prost::alloc::string::String,
260        ::prost::alloc::string::String,
261    >,
262    #[prost(message, optional, tag = "12")]
263    pub constraints: ::core::option::Option<super::datafusion_common::Constraints>,
264    #[prost(map = "string, message", tag = "13")]
265    pub column_defaults: ::std::collections::HashMap<
266        ::prost::alloc::string::String,
267        LogicalExprNode,
268    >,
269}
270#[derive(Clone, PartialEq, ::prost::Message)]
271pub struct PrepareNode {
272    #[prost(string, tag = "1")]
273    pub name: ::prost::alloc::string::String,
274    #[prost(message, repeated, tag = "2")]
275    pub data_types: ::prost::alloc::vec::Vec<super::datafusion_common::ArrowType>,
276    #[prost(message, optional, boxed, tag = "3")]
277    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
278}
279#[derive(Clone, PartialEq, ::prost::Message)]
280pub struct CreateCatalogSchemaNode {
281    #[prost(string, tag = "1")]
282    pub schema_name: ::prost::alloc::string::String,
283    #[prost(bool, tag = "2")]
284    pub if_not_exists: bool,
285    #[prost(message, optional, tag = "3")]
286    pub schema: ::core::option::Option<super::datafusion_common::DfSchema>,
287}
288#[derive(Clone, PartialEq, ::prost::Message)]
289pub struct CreateCatalogNode {
290    #[prost(string, tag = "1")]
291    pub catalog_name: ::prost::alloc::string::String,
292    #[prost(bool, tag = "2")]
293    pub if_not_exists: bool,
294    #[prost(message, optional, tag = "3")]
295    pub schema: ::core::option::Option<super::datafusion_common::DfSchema>,
296}
297#[derive(Clone, PartialEq, ::prost::Message)]
298pub struct DropViewNode {
299    #[prost(message, optional, tag = "1")]
300    pub name: ::core::option::Option<TableReference>,
301    #[prost(bool, tag = "2")]
302    pub if_exists: bool,
303    #[prost(message, optional, tag = "3")]
304    pub schema: ::core::option::Option<super::datafusion_common::DfSchema>,
305}
306#[derive(Clone, PartialEq, ::prost::Message)]
307pub struct CreateViewNode {
308    #[prost(message, optional, tag = "5")]
309    pub name: ::core::option::Option<TableReference>,
310    #[prost(message, optional, boxed, tag = "2")]
311    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
312    #[prost(bool, tag = "3")]
313    pub or_replace: bool,
314    #[prost(bool, tag = "6")]
315    pub temporary: bool,
316    #[prost(string, tag = "4")]
317    pub definition: ::prost::alloc::string::String,
318}
319/// a node containing data for defining values list. unlike in SQL where it's two dimensional, here
320/// the list is flattened, and with the field n_cols it can be parsed and partitioned into rows
321#[derive(Clone, PartialEq, ::prost::Message)]
322pub struct ValuesNode {
323    #[prost(uint64, tag = "1")]
324    pub n_cols: u64,
325    #[prost(message, repeated, tag = "2")]
326    pub values_list: ::prost::alloc::vec::Vec<LogicalExprNode>,
327}
328#[derive(Clone, PartialEq, ::prost::Message)]
329pub struct AnalyzeNode {
330    #[prost(message, optional, boxed, tag = "1")]
331    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
332    #[prost(bool, tag = "2")]
333    pub verbose: bool,
334}
335#[derive(Clone, PartialEq, ::prost::Message)]
336pub struct ExplainNode {
337    #[prost(message, optional, boxed, tag = "1")]
338    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
339    #[prost(bool, tag = "2")]
340    pub verbose: bool,
341}
342#[derive(Clone, PartialEq, ::prost::Message)]
343pub struct AggregateNode {
344    #[prost(message, optional, boxed, tag = "1")]
345    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
346    #[prost(message, repeated, tag = "2")]
347    pub group_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
348    #[prost(message, repeated, tag = "3")]
349    pub aggr_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
350}
351#[derive(Clone, PartialEq, ::prost::Message)]
352pub struct WindowNode {
353    #[prost(message, optional, boxed, tag = "1")]
354    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
355    #[prost(message, repeated, tag = "2")]
356    pub window_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
357}
358#[derive(Clone, PartialEq, ::prost::Message)]
359pub struct JoinNode {
360    #[prost(message, optional, boxed, tag = "1")]
361    pub left: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
362    #[prost(message, optional, boxed, tag = "2")]
363    pub right: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
364    #[prost(enumeration = "super::datafusion_common::JoinType", tag = "3")]
365    pub join_type: i32,
366    #[prost(enumeration = "super::datafusion_common::JoinConstraint", tag = "4")]
367    pub join_constraint: i32,
368    #[prost(message, repeated, tag = "5")]
369    pub left_join_key: ::prost::alloc::vec::Vec<LogicalExprNode>,
370    #[prost(message, repeated, tag = "6")]
371    pub right_join_key: ::prost::alloc::vec::Vec<LogicalExprNode>,
372    #[prost(bool, tag = "7")]
373    pub null_equals_null: bool,
374    #[prost(message, optional, tag = "8")]
375    pub filter: ::core::option::Option<LogicalExprNode>,
376}
377#[derive(Clone, PartialEq, ::prost::Message)]
378pub struct DistinctNode {
379    #[prost(message, optional, boxed, tag = "1")]
380    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
381}
382#[derive(Clone, PartialEq, ::prost::Message)]
383pub struct DistinctOnNode {
384    #[prost(message, repeated, tag = "1")]
385    pub on_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
386    #[prost(message, repeated, tag = "2")]
387    pub select_expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
388    #[prost(message, repeated, tag = "3")]
389    pub sort_expr: ::prost::alloc::vec::Vec<SortExprNode>,
390    #[prost(message, optional, boxed, tag = "4")]
391    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
392}
393#[derive(Clone, PartialEq, ::prost::Message)]
394pub struct CopyToNode {
395    #[prost(message, optional, boxed, tag = "1")]
396    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
397    #[prost(string, tag = "2")]
398    pub output_url: ::prost::alloc::string::String,
399    #[prost(bytes = "vec", tag = "3")]
400    pub file_type: ::prost::alloc::vec::Vec<u8>,
401    #[prost(string, repeated, tag = "7")]
402    pub partition_by: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
403}
404#[derive(Clone, PartialEq, ::prost::Message)]
405pub struct DmlNode {
406    #[prost(enumeration = "dml_node::Type", tag = "1")]
407    pub dml_type: i32,
408    #[prost(message, optional, boxed, tag = "2")]
409    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
410    #[prost(message, optional, tag = "3")]
411    pub table_name: ::core::option::Option<TableReference>,
412    #[prost(message, optional, boxed, tag = "5")]
413    pub target: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
414}
415/// Nested message and enum types in `DmlNode`.
416pub mod dml_node {
417    #[derive(
418        Clone,
419        Copy,
420        Debug,
421        PartialEq,
422        Eq,
423        Hash,
424        PartialOrd,
425        Ord,
426        ::prost::Enumeration
427    )]
428    #[repr(i32)]
429    pub enum Type {
430        Update = 0,
431        Delete = 1,
432        Ctas = 2,
433        InsertAppend = 3,
434        InsertOverwrite = 4,
435        InsertReplace = 5,
436    }
437    impl Type {
438        /// String value of the enum field names used in the ProtoBuf definition.
439        ///
440        /// The values are not transformed in any way and thus are considered stable
441        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
442        pub fn as_str_name(&self) -> &'static str {
443            match self {
444                Self::Update => "UPDATE",
445                Self::Delete => "DELETE",
446                Self::Ctas => "CTAS",
447                Self::InsertAppend => "INSERT_APPEND",
448                Self::InsertOverwrite => "INSERT_OVERWRITE",
449                Self::InsertReplace => "INSERT_REPLACE",
450            }
451        }
452        /// Creates an enum from field names used in the ProtoBuf definition.
453        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
454            match value {
455                "UPDATE" => Some(Self::Update),
456                "DELETE" => Some(Self::Delete),
457                "CTAS" => Some(Self::Ctas),
458                "INSERT_APPEND" => Some(Self::InsertAppend),
459                "INSERT_OVERWRITE" => Some(Self::InsertOverwrite),
460                "INSERT_REPLACE" => Some(Self::InsertReplace),
461                _ => None,
462            }
463        }
464    }
465}
466#[derive(Clone, PartialEq, ::prost::Message)]
467pub struct UnnestNode {
468    #[prost(message, optional, boxed, tag = "1")]
469    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
470    #[prost(message, repeated, tag = "2")]
471    pub exec_columns: ::prost::alloc::vec::Vec<super::datafusion_common::Column>,
472    #[prost(message, repeated, tag = "3")]
473    pub list_type_columns: ::prost::alloc::vec::Vec<ColumnUnnestListItem>,
474    #[prost(uint64, repeated, tag = "4")]
475    pub struct_type_columns: ::prost::alloc::vec::Vec<u64>,
476    #[prost(uint64, repeated, tag = "5")]
477    pub dependency_indices: ::prost::alloc::vec::Vec<u64>,
478    #[prost(message, optional, tag = "6")]
479    pub schema: ::core::option::Option<super::datafusion_common::DfSchema>,
480    #[prost(message, optional, tag = "7")]
481    pub options: ::core::option::Option<UnnestOptions>,
482}
483#[derive(Clone, PartialEq, ::prost::Message)]
484pub struct ColumnUnnestListItem {
485    #[prost(uint32, tag = "1")]
486    pub input_index: u32,
487    #[prost(message, optional, tag = "2")]
488    pub recursion: ::core::option::Option<ColumnUnnestListRecursion>,
489}
490#[derive(Clone, PartialEq, ::prost::Message)]
491pub struct ColumnUnnestListRecursions {
492    #[prost(message, repeated, tag = "2")]
493    pub recursions: ::prost::alloc::vec::Vec<ColumnUnnestListRecursion>,
494}
495#[derive(Clone, PartialEq, ::prost::Message)]
496pub struct ColumnUnnestListRecursion {
497    #[prost(message, optional, tag = "1")]
498    pub output_column: ::core::option::Option<super::datafusion_common::Column>,
499    #[prost(uint32, tag = "2")]
500    pub depth: u32,
501}
502#[derive(Clone, PartialEq, ::prost::Message)]
503pub struct UnnestOptions {
504    #[prost(bool, tag = "1")]
505    pub preserve_nulls: bool,
506    #[prost(message, repeated, tag = "2")]
507    pub recursions: ::prost::alloc::vec::Vec<RecursionUnnestOption>,
508}
509#[derive(Clone, PartialEq, ::prost::Message)]
510pub struct RecursionUnnestOption {
511    #[prost(message, optional, tag = "1")]
512    pub output_column: ::core::option::Option<super::datafusion_common::Column>,
513    #[prost(message, optional, tag = "2")]
514    pub input_column: ::core::option::Option<super::datafusion_common::Column>,
515    #[prost(uint32, tag = "3")]
516    pub depth: u32,
517}
518#[derive(Clone, PartialEq, ::prost::Message)]
519pub struct UnionNode {
520    #[prost(message, repeated, tag = "1")]
521    pub inputs: ::prost::alloc::vec::Vec<LogicalPlanNode>,
522}
523#[derive(Clone, PartialEq, ::prost::Message)]
524pub struct CrossJoinNode {
525    #[prost(message, optional, boxed, tag = "1")]
526    pub left: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
527    #[prost(message, optional, boxed, tag = "2")]
528    pub right: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
529}
530#[derive(Clone, PartialEq, ::prost::Message)]
531pub struct LimitNode {
532    #[prost(message, optional, boxed, tag = "1")]
533    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
534    /// The number of rows to skip before fetch; non-positive means don't skip any
535    #[prost(int64, tag = "2")]
536    pub skip: i64,
537    /// Maximum number of rows to fetch; negative means no limit
538    #[prost(int64, tag = "3")]
539    pub fetch: i64,
540}
541#[derive(Clone, PartialEq, ::prost::Message)]
542pub struct SelectionExecNode {
543    #[prost(message, optional, tag = "1")]
544    pub expr: ::core::option::Option<LogicalExprNode>,
545}
546#[derive(Clone, PartialEq, ::prost::Message)]
547pub struct SubqueryAliasNode {
548    #[prost(message, optional, boxed, tag = "1")]
549    pub input: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
550    #[prost(message, optional, tag = "3")]
551    pub alias: ::core::option::Option<TableReference>,
552}
553/// logical expressions
554#[derive(Clone, PartialEq, ::prost::Message)]
555pub struct LogicalExprNode {
556    #[prost(
557        oneof = "logical_expr_node::ExprType",
558        tags = "1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35"
559    )]
560    pub expr_type: ::core::option::Option<logical_expr_node::ExprType>,
561}
562/// Nested message and enum types in `LogicalExprNode`.
563pub mod logical_expr_node {
564    #[derive(Clone, PartialEq, ::prost::Oneof)]
565    pub enum ExprType {
566        /// column references
567        #[prost(message, tag = "1")]
568        Column(super::super::datafusion_common::Column),
569        /// alias
570        #[prost(message, tag = "2")]
571        Alias(::prost::alloc::boxed::Box<super::AliasNode>),
572        #[prost(message, tag = "3")]
573        Literal(super::super::datafusion_common::ScalarValue),
574        /// binary expressions
575        #[prost(message, tag = "4")]
576        BinaryExpr(super::BinaryExprNode),
577        /// null checks
578        #[prost(message, tag = "6")]
579        IsNullExpr(::prost::alloc::boxed::Box<super::IsNull>),
580        #[prost(message, tag = "7")]
581        IsNotNullExpr(::prost::alloc::boxed::Box<super::IsNotNull>),
582        #[prost(message, tag = "8")]
583        NotExpr(::prost::alloc::boxed::Box<super::Not>),
584        #[prost(message, tag = "9")]
585        Between(::prost::alloc::boxed::Box<super::BetweenNode>),
586        #[prost(message, tag = "10")]
587        Case(::prost::alloc::boxed::Box<super::CaseNode>),
588        #[prost(message, tag = "11")]
589        Cast(::prost::alloc::boxed::Box<super::CastNode>),
590        #[prost(message, tag = "13")]
591        Negative(::prost::alloc::boxed::Box<super::NegativeNode>),
592        #[prost(message, tag = "14")]
593        InList(::prost::alloc::boxed::Box<super::InListNode>),
594        #[prost(message, tag = "15")]
595        Wildcard(super::Wildcard),
596        /// was  ScalarFunctionNode scalar_function = 16;
597        #[prost(message, tag = "17")]
598        TryCast(::prost::alloc::boxed::Box<super::TryCastNode>),
599        /// window expressions
600        #[prost(message, tag = "18")]
601        WindowExpr(super::WindowExprNode),
602        /// AggregateUDF expressions
603        #[prost(message, tag = "19")]
604        AggregateUdfExpr(::prost::alloc::boxed::Box<super::AggregateUdfExprNode>),
605        /// Scalar UDF expressions
606        #[prost(message, tag = "20")]
607        ScalarUdfExpr(super::ScalarUdfExprNode),
608        #[prost(message, tag = "22")]
609        GroupingSet(super::GroupingSetNode),
610        #[prost(message, tag = "23")]
611        Cube(super::CubeNode),
612        #[prost(message, tag = "24")]
613        Rollup(super::RollupNode),
614        #[prost(message, tag = "25")]
615        IsTrue(::prost::alloc::boxed::Box<super::IsTrue>),
616        #[prost(message, tag = "26")]
617        IsFalse(::prost::alloc::boxed::Box<super::IsFalse>),
618        #[prost(message, tag = "27")]
619        IsUnknown(::prost::alloc::boxed::Box<super::IsUnknown>),
620        #[prost(message, tag = "28")]
621        IsNotTrue(::prost::alloc::boxed::Box<super::IsNotTrue>),
622        #[prost(message, tag = "29")]
623        IsNotFalse(::prost::alloc::boxed::Box<super::IsNotFalse>),
624        #[prost(message, tag = "30")]
625        IsNotUnknown(::prost::alloc::boxed::Box<super::IsNotUnknown>),
626        #[prost(message, tag = "31")]
627        Like(::prost::alloc::boxed::Box<super::LikeNode>),
628        #[prost(message, tag = "32")]
629        Ilike(::prost::alloc::boxed::Box<super::ILikeNode>),
630        #[prost(message, tag = "33")]
631        SimilarTo(::prost::alloc::boxed::Box<super::SimilarToNode>),
632        #[prost(message, tag = "34")]
633        Placeholder(super::PlaceholderNode),
634        #[prost(message, tag = "35")]
635        Unnest(super::Unnest),
636    }
637}
638#[derive(Clone, PartialEq, ::prost::Message)]
639pub struct Wildcard {
640    #[prost(message, optional, tag = "1")]
641    pub qualifier: ::core::option::Option<TableReference>,
642}
643#[derive(Clone, PartialEq, ::prost::Message)]
644pub struct PlaceholderNode {
645    #[prost(string, tag = "1")]
646    pub id: ::prost::alloc::string::String,
647    #[prost(message, optional, tag = "2")]
648    pub data_type: ::core::option::Option<super::datafusion_common::ArrowType>,
649}
650#[derive(Clone, PartialEq, ::prost::Message)]
651pub struct LogicalExprList {
652    #[prost(message, repeated, tag = "1")]
653    pub expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
654}
655#[derive(Clone, PartialEq, ::prost::Message)]
656pub struct GroupingSetNode {
657    #[prost(message, repeated, tag = "1")]
658    pub expr: ::prost::alloc::vec::Vec<LogicalExprList>,
659}
660#[derive(Clone, PartialEq, ::prost::Message)]
661pub struct CubeNode {
662    #[prost(message, repeated, tag = "1")]
663    pub expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
664}
665#[derive(Clone, PartialEq, ::prost::Message)]
666pub struct RollupNode {
667    #[prost(message, repeated, tag = "1")]
668    pub expr: ::prost::alloc::vec::Vec<LogicalExprNode>,
669}
670#[derive(Clone, PartialEq, ::prost::Message)]
671pub struct NamedStructField {
672    #[prost(message, optional, tag = "1")]
673    pub name: ::core::option::Option<super::datafusion_common::ScalarValue>,
674}
675#[derive(Clone, PartialEq, ::prost::Message)]
676pub struct ListIndex {
677    #[prost(message, optional, tag = "1")]
678    pub key: ::core::option::Option<LogicalExprNode>,
679}
680#[derive(Clone, PartialEq, ::prost::Message)]
681pub struct ListRange {
682    #[prost(message, optional, tag = "1")]
683    pub start: ::core::option::Option<LogicalExprNode>,
684    #[prost(message, optional, tag = "2")]
685    pub stop: ::core::option::Option<LogicalExprNode>,
686    #[prost(message, optional, tag = "3")]
687    pub stride: ::core::option::Option<LogicalExprNode>,
688}
689#[derive(Clone, PartialEq, ::prost::Message)]
690pub struct IsNull {
691    #[prost(message, optional, boxed, tag = "1")]
692    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
693}
694#[derive(Clone, PartialEq, ::prost::Message)]
695pub struct IsNotNull {
696    #[prost(message, optional, boxed, tag = "1")]
697    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
698}
699#[derive(Clone, PartialEq, ::prost::Message)]
700pub struct IsTrue {
701    #[prost(message, optional, boxed, tag = "1")]
702    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
703}
704#[derive(Clone, PartialEq, ::prost::Message)]
705pub struct IsFalse {
706    #[prost(message, optional, boxed, tag = "1")]
707    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
708}
709#[derive(Clone, PartialEq, ::prost::Message)]
710pub struct IsUnknown {
711    #[prost(message, optional, boxed, tag = "1")]
712    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
713}
714#[derive(Clone, PartialEq, ::prost::Message)]
715pub struct IsNotTrue {
716    #[prost(message, optional, boxed, tag = "1")]
717    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
718}
719#[derive(Clone, PartialEq, ::prost::Message)]
720pub struct IsNotFalse {
721    #[prost(message, optional, boxed, tag = "1")]
722    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
723}
724#[derive(Clone, PartialEq, ::prost::Message)]
725pub struct IsNotUnknown {
726    #[prost(message, optional, boxed, tag = "1")]
727    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
728}
729#[derive(Clone, PartialEq, ::prost::Message)]
730pub struct Not {
731    #[prost(message, optional, boxed, tag = "1")]
732    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
733}
734#[derive(Clone, PartialEq, ::prost::Message)]
735pub struct AliasNode {
736    #[prost(message, optional, boxed, tag = "1")]
737    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
738    #[prost(string, tag = "2")]
739    pub alias: ::prost::alloc::string::String,
740    #[prost(message, repeated, tag = "3")]
741    pub relation: ::prost::alloc::vec::Vec<TableReference>,
742    #[prost(map = "string, string", tag = "4")]
743    pub metadata: ::std::collections::HashMap<
744        ::prost::alloc::string::String,
745        ::prost::alloc::string::String,
746    >,
747}
748#[derive(Clone, PartialEq, ::prost::Message)]
749pub struct BinaryExprNode {
750    /// Represents the operands from the left inner most expression
751    /// to the right outer most expression where each of them are chained
752    /// with the operator 'op'.
753    #[prost(message, repeated, tag = "1")]
754    pub operands: ::prost::alloc::vec::Vec<LogicalExprNode>,
755    #[prost(string, tag = "3")]
756    pub op: ::prost::alloc::string::String,
757}
758#[derive(Clone, PartialEq, ::prost::Message)]
759pub struct NegativeNode {
760    #[prost(message, optional, boxed, tag = "1")]
761    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
762}
763#[derive(Clone, PartialEq, ::prost::Message)]
764pub struct Unnest {
765    #[prost(message, repeated, tag = "1")]
766    pub exprs: ::prost::alloc::vec::Vec<LogicalExprNode>,
767}
768#[derive(Clone, PartialEq, ::prost::Message)]
769pub struct InListNode {
770    #[prost(message, optional, boxed, tag = "1")]
771    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
772    #[prost(message, repeated, tag = "2")]
773    pub list: ::prost::alloc::vec::Vec<LogicalExprNode>,
774    #[prost(bool, tag = "3")]
775    pub negated: bool,
776}
777#[derive(Clone, PartialEq, ::prost::Message)]
778pub struct AggregateUdfExprNode {
779    #[prost(string, tag = "1")]
780    pub fun_name: ::prost::alloc::string::String,
781    #[prost(message, repeated, tag = "2")]
782    pub args: ::prost::alloc::vec::Vec<LogicalExprNode>,
783    #[prost(bool, tag = "5")]
784    pub distinct: bool,
785    #[prost(message, optional, boxed, tag = "3")]
786    pub filter: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
787    #[prost(message, repeated, tag = "4")]
788    pub order_by: ::prost::alloc::vec::Vec<SortExprNode>,
789    #[prost(bytes = "vec", optional, tag = "6")]
790    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
791}
792#[derive(Clone, PartialEq, ::prost::Message)]
793pub struct ScalarUdfExprNode {
794    #[prost(string, tag = "1")]
795    pub fun_name: ::prost::alloc::string::String,
796    #[prost(message, repeated, tag = "2")]
797    pub args: ::prost::alloc::vec::Vec<LogicalExprNode>,
798    #[prost(bytes = "vec", optional, tag = "3")]
799    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
800}
801#[derive(Clone, PartialEq, ::prost::Message)]
802pub struct WindowExprNode {
803    #[prost(message, repeated, tag = "4")]
804    pub exprs: ::prost::alloc::vec::Vec<LogicalExprNode>,
805    #[prost(message, repeated, tag = "5")]
806    pub partition_by: ::prost::alloc::vec::Vec<LogicalExprNode>,
807    #[prost(message, repeated, tag = "6")]
808    pub order_by: ::prost::alloc::vec::Vec<SortExprNode>,
809    /// repeated LogicalExprNode filter = 7;
810    #[prost(message, optional, tag = "8")]
811    pub window_frame: ::core::option::Option<WindowFrame>,
812    #[prost(bytes = "vec", optional, tag = "10")]
813    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
814    #[prost(oneof = "window_expr_node::WindowFunction", tags = "3, 9")]
815    pub window_function: ::core::option::Option<window_expr_node::WindowFunction>,
816}
817/// Nested message and enum types in `WindowExprNode`.
818pub mod window_expr_node {
819    #[derive(Clone, PartialEq, ::prost::Oneof)]
820    pub enum WindowFunction {
821        /// BuiltInWindowFunction built_in_function = 2;
822        #[prost(string, tag = "3")]
823        Udaf(::prost::alloc::string::String),
824        #[prost(string, tag = "9")]
825        Udwf(::prost::alloc::string::String),
826    }
827}
828#[derive(Clone, PartialEq, ::prost::Message)]
829pub struct BetweenNode {
830    #[prost(message, optional, boxed, tag = "1")]
831    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
832    #[prost(bool, tag = "2")]
833    pub negated: bool,
834    #[prost(message, optional, boxed, tag = "3")]
835    pub low: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
836    #[prost(message, optional, boxed, tag = "4")]
837    pub high: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
838}
839#[derive(Clone, PartialEq, ::prost::Message)]
840pub struct LikeNode {
841    #[prost(bool, tag = "1")]
842    pub negated: bool,
843    #[prost(message, optional, boxed, tag = "2")]
844    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
845    #[prost(message, optional, boxed, tag = "3")]
846    pub pattern: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
847    #[prost(string, tag = "4")]
848    pub escape_char: ::prost::alloc::string::String,
849}
850#[derive(Clone, PartialEq, ::prost::Message)]
851pub struct ILikeNode {
852    #[prost(bool, tag = "1")]
853    pub negated: bool,
854    #[prost(message, optional, boxed, tag = "2")]
855    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
856    #[prost(message, optional, boxed, tag = "3")]
857    pub pattern: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
858    #[prost(string, tag = "4")]
859    pub escape_char: ::prost::alloc::string::String,
860}
861#[derive(Clone, PartialEq, ::prost::Message)]
862pub struct SimilarToNode {
863    #[prost(bool, tag = "1")]
864    pub negated: bool,
865    #[prost(message, optional, boxed, tag = "2")]
866    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
867    #[prost(message, optional, boxed, tag = "3")]
868    pub pattern: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
869    #[prost(string, tag = "4")]
870    pub escape_char: ::prost::alloc::string::String,
871}
872#[derive(Clone, PartialEq, ::prost::Message)]
873pub struct CaseNode {
874    #[prost(message, optional, boxed, tag = "1")]
875    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
876    #[prost(message, repeated, tag = "2")]
877    pub when_then_expr: ::prost::alloc::vec::Vec<WhenThen>,
878    #[prost(message, optional, boxed, tag = "3")]
879    pub else_expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
880}
881#[derive(Clone, PartialEq, ::prost::Message)]
882pub struct WhenThen {
883    #[prost(message, optional, tag = "1")]
884    pub when_expr: ::core::option::Option<LogicalExprNode>,
885    #[prost(message, optional, tag = "2")]
886    pub then_expr: ::core::option::Option<LogicalExprNode>,
887}
888#[derive(Clone, PartialEq, ::prost::Message)]
889pub struct CastNode {
890    #[prost(message, optional, boxed, tag = "1")]
891    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
892    #[prost(message, optional, tag = "2")]
893    pub arrow_type: ::core::option::Option<super::datafusion_common::ArrowType>,
894}
895#[derive(Clone, PartialEq, ::prost::Message)]
896pub struct TryCastNode {
897    #[prost(message, optional, boxed, tag = "1")]
898    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<LogicalExprNode>>,
899    #[prost(message, optional, tag = "2")]
900    pub arrow_type: ::core::option::Option<super::datafusion_common::ArrowType>,
901}
902#[derive(Clone, PartialEq, ::prost::Message)]
903pub struct SortExprNode {
904    #[prost(message, optional, tag = "1")]
905    pub expr: ::core::option::Option<LogicalExprNode>,
906    #[prost(bool, tag = "2")]
907    pub asc: bool,
908    #[prost(bool, tag = "3")]
909    pub nulls_first: bool,
910}
911#[derive(Clone, PartialEq, ::prost::Message)]
912pub struct WindowFrame {
913    #[prost(enumeration = "WindowFrameUnits", tag = "1")]
914    pub window_frame_units: i32,
915    #[prost(message, optional, tag = "2")]
916    pub start_bound: ::core::option::Option<WindowFrameBound>,
917    /// "optional" keyword is stable in protoc 3.15 but prost is still on 3.14 (see <https://github.com/tokio-rs/prost/issues/430> and <https://github.com/tokio-rs/prost/pull/455>)
918    /// this syntax is ugly but is binary compatible with the "optional" keyword (see <https://stackoverflow.com/questions/42622015/how-to-define-an-optional-field-in-protobuf-3>)
919    #[prost(oneof = "window_frame::EndBound", tags = "3")]
920    pub end_bound: ::core::option::Option<window_frame::EndBound>,
921}
922/// Nested message and enum types in `WindowFrame`.
923pub mod window_frame {
924    /// "optional" keyword is stable in protoc 3.15 but prost is still on 3.14 (see <https://github.com/tokio-rs/prost/issues/430> and <https://github.com/tokio-rs/prost/pull/455>)
925    /// this syntax is ugly but is binary compatible with the "optional" keyword (see <https://stackoverflow.com/questions/42622015/how-to-define-an-optional-field-in-protobuf-3>)
926    #[derive(Clone, PartialEq, ::prost::Oneof)]
927    pub enum EndBound {
928        #[prost(message, tag = "3")]
929        Bound(super::WindowFrameBound),
930    }
931}
932#[derive(Clone, PartialEq, ::prost::Message)]
933pub struct WindowFrameBound {
934    #[prost(enumeration = "WindowFrameBoundType", tag = "1")]
935    pub window_frame_bound_type: i32,
936    #[prost(message, optional, tag = "2")]
937    pub bound_value: ::core::option::Option<super::datafusion_common::ScalarValue>,
938}
939#[derive(Clone, Copy, PartialEq, ::prost::Message)]
940pub struct FixedSizeBinary {
941    #[prost(int32, tag = "1")]
942    pub length: i32,
943}
944#[derive(Clone, PartialEq, ::prost::Message)]
945pub struct AnalyzedLogicalPlanType {
946    #[prost(string, tag = "1")]
947    pub analyzer_name: ::prost::alloc::string::String,
948}
949#[derive(Clone, PartialEq, ::prost::Message)]
950pub struct OptimizedLogicalPlanType {
951    #[prost(string, tag = "1")]
952    pub optimizer_name: ::prost::alloc::string::String,
953}
954#[derive(Clone, PartialEq, ::prost::Message)]
955pub struct OptimizedPhysicalPlanType {
956    #[prost(string, tag = "1")]
957    pub optimizer_name: ::prost::alloc::string::String,
958}
959#[derive(Clone, PartialEq, ::prost::Message)]
960pub struct PlanType {
961    #[prost(
962        oneof = "plan_type::PlanTypeEnum",
963        tags = "1, 7, 8, 2, 3, 4, 9, 11, 5, 6, 10, 12, 13"
964    )]
965    pub plan_type_enum: ::core::option::Option<plan_type::PlanTypeEnum>,
966}
967/// Nested message and enum types in `PlanType`.
968pub mod plan_type {
969    #[derive(Clone, PartialEq, ::prost::Oneof)]
970    pub enum PlanTypeEnum {
971        #[prost(message, tag = "1")]
972        InitialLogicalPlan(super::super::datafusion_common::EmptyMessage),
973        #[prost(message, tag = "7")]
974        AnalyzedLogicalPlan(super::AnalyzedLogicalPlanType),
975        #[prost(message, tag = "8")]
976        FinalAnalyzedLogicalPlan(super::super::datafusion_common::EmptyMessage),
977        #[prost(message, tag = "2")]
978        OptimizedLogicalPlan(super::OptimizedLogicalPlanType),
979        #[prost(message, tag = "3")]
980        FinalLogicalPlan(super::super::datafusion_common::EmptyMessage),
981        #[prost(message, tag = "4")]
982        InitialPhysicalPlan(super::super::datafusion_common::EmptyMessage),
983        #[prost(message, tag = "9")]
984        InitialPhysicalPlanWithStats(super::super::datafusion_common::EmptyMessage),
985        #[prost(message, tag = "11")]
986        InitialPhysicalPlanWithSchema(super::super::datafusion_common::EmptyMessage),
987        #[prost(message, tag = "5")]
988        OptimizedPhysicalPlan(super::OptimizedPhysicalPlanType),
989        #[prost(message, tag = "6")]
990        FinalPhysicalPlan(super::super::datafusion_common::EmptyMessage),
991        #[prost(message, tag = "10")]
992        FinalPhysicalPlanWithStats(super::super::datafusion_common::EmptyMessage),
993        #[prost(message, tag = "12")]
994        FinalPhysicalPlanWithSchema(super::super::datafusion_common::EmptyMessage),
995        #[prost(message, tag = "13")]
996        PhysicalPlanError(super::super::datafusion_common::EmptyMessage),
997    }
998}
999#[derive(Clone, PartialEq, ::prost::Message)]
1000pub struct StringifiedPlan {
1001    #[prost(message, optional, tag = "1")]
1002    pub plan_type: ::core::option::Option<PlanType>,
1003    #[prost(string, tag = "2")]
1004    pub plan: ::prost::alloc::string::String,
1005}
1006#[derive(Clone, PartialEq, ::prost::Message)]
1007pub struct BareTableReference {
1008    #[prost(string, tag = "1")]
1009    pub table: ::prost::alloc::string::String,
1010}
1011#[derive(Clone, PartialEq, ::prost::Message)]
1012pub struct PartialTableReference {
1013    #[prost(string, tag = "1")]
1014    pub schema: ::prost::alloc::string::String,
1015    #[prost(string, tag = "2")]
1016    pub table: ::prost::alloc::string::String,
1017}
1018#[derive(Clone, PartialEq, ::prost::Message)]
1019pub struct FullTableReference {
1020    #[prost(string, tag = "1")]
1021    pub catalog: ::prost::alloc::string::String,
1022    #[prost(string, tag = "2")]
1023    pub schema: ::prost::alloc::string::String,
1024    #[prost(string, tag = "3")]
1025    pub table: ::prost::alloc::string::String,
1026}
1027#[derive(Clone, PartialEq, ::prost::Message)]
1028pub struct TableReference {
1029    #[prost(oneof = "table_reference::TableReferenceEnum", tags = "1, 2, 3")]
1030    pub table_reference_enum: ::core::option::Option<
1031        table_reference::TableReferenceEnum,
1032    >,
1033}
1034/// Nested message and enum types in `TableReference`.
1035pub mod table_reference {
1036    #[derive(Clone, PartialEq, ::prost::Oneof)]
1037    pub enum TableReferenceEnum {
1038        #[prost(message, tag = "1")]
1039        Bare(super::BareTableReference),
1040        #[prost(message, tag = "2")]
1041        Partial(super::PartialTableReference),
1042        #[prost(message, tag = "3")]
1043        Full(super::FullTableReference),
1044    }
1045}
1046/// PhysicalPlanNode is a nested type
1047#[derive(Clone, PartialEq, ::prost::Message)]
1048pub struct PhysicalPlanNode {
1049    #[prost(
1050        oneof = "physical_plan_node::PhysicalPlanType",
1051        tags = "1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31"
1052    )]
1053    pub physical_plan_type: ::core::option::Option<physical_plan_node::PhysicalPlanType>,
1054}
1055/// Nested message and enum types in `PhysicalPlanNode`.
1056pub mod physical_plan_node {
1057    #[derive(Clone, PartialEq, ::prost::Oneof)]
1058    pub enum PhysicalPlanType {
1059        #[prost(message, tag = "1")]
1060        ParquetScan(super::ParquetScanExecNode),
1061        #[prost(message, tag = "2")]
1062        CsvScan(super::CsvScanExecNode),
1063        #[prost(message, tag = "3")]
1064        Empty(super::EmptyExecNode),
1065        #[prost(message, tag = "4")]
1066        Projection(::prost::alloc::boxed::Box<super::ProjectionExecNode>),
1067        #[prost(message, tag = "6")]
1068        GlobalLimit(::prost::alloc::boxed::Box<super::GlobalLimitExecNode>),
1069        #[prost(message, tag = "7")]
1070        LocalLimit(::prost::alloc::boxed::Box<super::LocalLimitExecNode>),
1071        #[prost(message, tag = "8")]
1072        Aggregate(::prost::alloc::boxed::Box<super::AggregateExecNode>),
1073        #[prost(message, tag = "9")]
1074        HashJoin(::prost::alloc::boxed::Box<super::HashJoinExecNode>),
1075        #[prost(message, tag = "10")]
1076        Sort(::prost::alloc::boxed::Box<super::SortExecNode>),
1077        #[prost(message, tag = "11")]
1078        CoalesceBatches(::prost::alloc::boxed::Box<super::CoalesceBatchesExecNode>),
1079        #[prost(message, tag = "12")]
1080        Filter(::prost::alloc::boxed::Box<super::FilterExecNode>),
1081        #[prost(message, tag = "13")]
1082        Merge(::prost::alloc::boxed::Box<super::CoalescePartitionsExecNode>),
1083        #[prost(message, tag = "14")]
1084        Repartition(::prost::alloc::boxed::Box<super::RepartitionExecNode>),
1085        #[prost(message, tag = "15")]
1086        Window(::prost::alloc::boxed::Box<super::WindowAggExecNode>),
1087        #[prost(message, tag = "16")]
1088        CrossJoin(::prost::alloc::boxed::Box<super::CrossJoinExecNode>),
1089        #[prost(message, tag = "17")]
1090        AvroScan(super::AvroScanExecNode),
1091        #[prost(message, tag = "18")]
1092        Extension(super::PhysicalExtensionNode),
1093        #[prost(message, tag = "19")]
1094        Union(super::UnionExecNode),
1095        #[prost(message, tag = "20")]
1096        Explain(super::ExplainExecNode),
1097        #[prost(message, tag = "21")]
1098        SortPreservingMerge(
1099            ::prost::alloc::boxed::Box<super::SortPreservingMergeExecNode>,
1100        ),
1101        #[prost(message, tag = "22")]
1102        NestedLoopJoin(::prost::alloc::boxed::Box<super::NestedLoopJoinExecNode>),
1103        #[prost(message, tag = "23")]
1104        Analyze(::prost::alloc::boxed::Box<super::AnalyzeExecNode>),
1105        #[prost(message, tag = "24")]
1106        JsonSink(::prost::alloc::boxed::Box<super::JsonSinkExecNode>),
1107        #[prost(message, tag = "25")]
1108        SymmetricHashJoin(::prost::alloc::boxed::Box<super::SymmetricHashJoinExecNode>),
1109        #[prost(message, tag = "26")]
1110        Interleave(super::InterleaveExecNode),
1111        #[prost(message, tag = "27")]
1112        PlaceholderRow(super::PlaceholderRowExecNode),
1113        #[prost(message, tag = "28")]
1114        CsvSink(::prost::alloc::boxed::Box<super::CsvSinkExecNode>),
1115        #[prost(message, tag = "29")]
1116        ParquetSink(::prost::alloc::boxed::Box<super::ParquetSinkExecNode>),
1117        #[prost(message, tag = "30")]
1118        Unnest(::prost::alloc::boxed::Box<super::UnnestExecNode>),
1119        #[prost(message, tag = "31")]
1120        JsonScan(super::JsonScanExecNode),
1121    }
1122}
1123#[derive(Clone, PartialEq, ::prost::Message)]
1124pub struct PartitionColumn {
1125    #[prost(string, tag = "1")]
1126    pub name: ::prost::alloc::string::String,
1127    #[prost(message, optional, tag = "2")]
1128    pub arrow_type: ::core::option::Option<super::datafusion_common::ArrowType>,
1129}
1130#[derive(Clone, PartialEq, ::prost::Message)]
1131pub struct FileSinkConfig {
1132    #[prost(string, tag = "1")]
1133    pub object_store_url: ::prost::alloc::string::String,
1134    #[prost(message, repeated, tag = "2")]
1135    pub file_groups: ::prost::alloc::vec::Vec<PartitionedFile>,
1136    #[prost(string, repeated, tag = "3")]
1137    pub table_paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1138    #[prost(message, optional, tag = "4")]
1139    pub output_schema: ::core::option::Option<super::datafusion_common::Schema>,
1140    #[prost(message, repeated, tag = "5")]
1141    pub table_partition_cols: ::prost::alloc::vec::Vec<PartitionColumn>,
1142    #[prost(bool, tag = "9")]
1143    pub keep_partition_by_columns: bool,
1144    #[prost(enumeration = "InsertOp", tag = "10")]
1145    pub insert_op: i32,
1146    #[prost(string, tag = "11")]
1147    pub file_extension: ::prost::alloc::string::String,
1148}
1149#[derive(Clone, PartialEq, ::prost::Message)]
1150pub struct JsonSink {
1151    #[prost(message, optional, tag = "1")]
1152    pub config: ::core::option::Option<FileSinkConfig>,
1153    #[prost(message, optional, tag = "2")]
1154    pub writer_options: ::core::option::Option<
1155        super::datafusion_common::JsonWriterOptions,
1156    >,
1157}
1158#[derive(Clone, PartialEq, ::prost::Message)]
1159pub struct JsonSinkExecNode {
1160    #[prost(message, optional, boxed, tag = "1")]
1161    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1162    #[prost(message, optional, tag = "2")]
1163    pub sink: ::core::option::Option<JsonSink>,
1164    #[prost(message, optional, tag = "3")]
1165    pub sink_schema: ::core::option::Option<super::datafusion_common::Schema>,
1166    #[prost(message, optional, tag = "4")]
1167    pub sort_order: ::core::option::Option<PhysicalSortExprNodeCollection>,
1168}
1169#[derive(Clone, PartialEq, ::prost::Message)]
1170pub struct CsvSink {
1171    #[prost(message, optional, tag = "1")]
1172    pub config: ::core::option::Option<FileSinkConfig>,
1173    #[prost(message, optional, tag = "2")]
1174    pub writer_options: ::core::option::Option<
1175        super::datafusion_common::CsvWriterOptions,
1176    >,
1177}
1178#[derive(Clone, PartialEq, ::prost::Message)]
1179pub struct CsvSinkExecNode {
1180    #[prost(message, optional, boxed, tag = "1")]
1181    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1182    #[prost(message, optional, tag = "2")]
1183    pub sink: ::core::option::Option<CsvSink>,
1184    #[prost(message, optional, tag = "3")]
1185    pub sink_schema: ::core::option::Option<super::datafusion_common::Schema>,
1186    #[prost(message, optional, tag = "4")]
1187    pub sort_order: ::core::option::Option<PhysicalSortExprNodeCollection>,
1188}
1189#[derive(Clone, PartialEq, ::prost::Message)]
1190pub struct ParquetSink {
1191    #[prost(message, optional, tag = "1")]
1192    pub config: ::core::option::Option<FileSinkConfig>,
1193    #[prost(message, optional, tag = "2")]
1194    pub parquet_options: ::core::option::Option<
1195        super::datafusion_common::TableParquetOptions,
1196    >,
1197}
1198#[derive(Clone, PartialEq, ::prost::Message)]
1199pub struct ParquetSinkExecNode {
1200    #[prost(message, optional, boxed, tag = "1")]
1201    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1202    #[prost(message, optional, tag = "2")]
1203    pub sink: ::core::option::Option<ParquetSink>,
1204    #[prost(message, optional, tag = "3")]
1205    pub sink_schema: ::core::option::Option<super::datafusion_common::Schema>,
1206    #[prost(message, optional, tag = "4")]
1207    pub sort_order: ::core::option::Option<PhysicalSortExprNodeCollection>,
1208}
1209#[derive(Clone, PartialEq, ::prost::Message)]
1210pub struct UnnestExecNode {
1211    #[prost(message, optional, boxed, tag = "1")]
1212    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1213    #[prost(message, optional, tag = "2")]
1214    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1215    #[prost(message, repeated, tag = "3")]
1216    pub list_type_columns: ::prost::alloc::vec::Vec<ListUnnest>,
1217    #[prost(uint64, repeated, tag = "4")]
1218    pub struct_type_columns: ::prost::alloc::vec::Vec<u64>,
1219    #[prost(message, optional, tag = "5")]
1220    pub options: ::core::option::Option<UnnestOptions>,
1221}
1222#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1223pub struct ListUnnest {
1224    #[prost(uint32, tag = "1")]
1225    pub index_in_input_schema: u32,
1226    #[prost(uint32, tag = "2")]
1227    pub depth: u32,
1228}
1229#[derive(Clone, PartialEq, ::prost::Message)]
1230pub struct PhysicalExtensionNode {
1231    #[prost(bytes = "vec", tag = "1")]
1232    pub node: ::prost::alloc::vec::Vec<u8>,
1233    #[prost(message, repeated, tag = "2")]
1234    pub inputs: ::prost::alloc::vec::Vec<PhysicalPlanNode>,
1235}
1236/// physical expressions
1237#[derive(Clone, PartialEq, ::prost::Message)]
1238pub struct PhysicalExprNode {
1239    #[prost(
1240        oneof = "physical_expr_node::ExprType",
1241        tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 19, 20"
1242    )]
1243    pub expr_type: ::core::option::Option<physical_expr_node::ExprType>,
1244}
1245/// Nested message and enum types in `PhysicalExprNode`.
1246pub mod physical_expr_node {
1247    #[derive(Clone, PartialEq, ::prost::Oneof)]
1248    pub enum ExprType {
1249        /// column references
1250        #[prost(message, tag = "1")]
1251        Column(super::PhysicalColumn),
1252        #[prost(message, tag = "2")]
1253        Literal(super::super::datafusion_common::ScalarValue),
1254        /// binary expressions
1255        #[prost(message, tag = "3")]
1256        BinaryExpr(::prost::alloc::boxed::Box<super::PhysicalBinaryExprNode>),
1257        /// aggregate expressions
1258        #[prost(message, tag = "4")]
1259        AggregateExpr(super::PhysicalAggregateExprNode),
1260        /// null checks
1261        #[prost(message, tag = "5")]
1262        IsNullExpr(::prost::alloc::boxed::Box<super::PhysicalIsNull>),
1263        #[prost(message, tag = "6")]
1264        IsNotNullExpr(::prost::alloc::boxed::Box<super::PhysicalIsNotNull>),
1265        #[prost(message, tag = "7")]
1266        NotExpr(::prost::alloc::boxed::Box<super::PhysicalNot>),
1267        #[prost(message, tag = "8")]
1268        Case(::prost::alloc::boxed::Box<super::PhysicalCaseNode>),
1269        #[prost(message, tag = "9")]
1270        Cast(::prost::alloc::boxed::Box<super::PhysicalCastNode>),
1271        #[prost(message, tag = "10")]
1272        Sort(::prost::alloc::boxed::Box<super::PhysicalSortExprNode>),
1273        #[prost(message, tag = "11")]
1274        Negative(::prost::alloc::boxed::Box<super::PhysicalNegativeNode>),
1275        #[prost(message, tag = "12")]
1276        InList(::prost::alloc::boxed::Box<super::PhysicalInListNode>),
1277        ///   was PhysicalScalarFunctionNode scalar_function = 13;
1278        #[prost(message, tag = "14")]
1279        TryCast(::prost::alloc::boxed::Box<super::PhysicalTryCastNode>),
1280        /// window expressions
1281        #[prost(message, tag = "15")]
1282        WindowExpr(super::PhysicalWindowExprNode),
1283        /// was PhysicalDateTimeIntervalExprNode date_time_interval_expr = 17;
1284        #[prost(message, tag = "16")]
1285        ScalarUdf(super::PhysicalScalarUdfNode),
1286        #[prost(message, tag = "18")]
1287        LikeExpr(::prost::alloc::boxed::Box<super::PhysicalLikeExprNode>),
1288        #[prost(message, tag = "19")]
1289        Extension(super::PhysicalExtensionExprNode),
1290        #[prost(message, tag = "20")]
1291        UnknownColumn(super::UnknownColumn),
1292    }
1293}
1294#[derive(Clone, PartialEq, ::prost::Message)]
1295pub struct PhysicalScalarUdfNode {
1296    #[prost(string, tag = "1")]
1297    pub name: ::prost::alloc::string::String,
1298    #[prost(message, repeated, tag = "2")]
1299    pub args: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1300    #[prost(bytes = "vec", optional, tag = "3")]
1301    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
1302    #[prost(message, optional, tag = "4")]
1303    pub return_type: ::core::option::Option<super::datafusion_common::ArrowType>,
1304    #[prost(bool, tag = "5")]
1305    pub nullable: bool,
1306}
1307#[derive(Clone, PartialEq, ::prost::Message)]
1308pub struct PhysicalAggregateExprNode {
1309    #[prost(message, repeated, tag = "2")]
1310    pub expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1311    #[prost(message, repeated, tag = "5")]
1312    pub ordering_req: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1313    #[prost(bool, tag = "3")]
1314    pub distinct: bool,
1315    #[prost(bool, tag = "6")]
1316    pub ignore_nulls: bool,
1317    #[prost(bytes = "vec", optional, tag = "7")]
1318    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
1319    #[prost(oneof = "physical_aggregate_expr_node::AggregateFunction", tags = "4")]
1320    pub aggregate_function: ::core::option::Option<
1321        physical_aggregate_expr_node::AggregateFunction,
1322    >,
1323}
1324/// Nested message and enum types in `PhysicalAggregateExprNode`.
1325pub mod physical_aggregate_expr_node {
1326    #[derive(Clone, PartialEq, ::prost::Oneof)]
1327    pub enum AggregateFunction {
1328        #[prost(string, tag = "4")]
1329        UserDefinedAggrFunction(::prost::alloc::string::String),
1330    }
1331}
1332#[derive(Clone, PartialEq, ::prost::Message)]
1333pub struct PhysicalWindowExprNode {
1334    #[prost(message, repeated, tag = "4")]
1335    pub args: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1336    #[prost(message, repeated, tag = "5")]
1337    pub partition_by: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1338    #[prost(message, repeated, tag = "6")]
1339    pub order_by: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1340    #[prost(message, optional, tag = "7")]
1341    pub window_frame: ::core::option::Option<WindowFrame>,
1342    #[prost(string, tag = "8")]
1343    pub name: ::prost::alloc::string::String,
1344    #[prost(bytes = "vec", optional, tag = "9")]
1345    pub fun_definition: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
1346    #[prost(oneof = "physical_window_expr_node::WindowFunction", tags = "3, 10")]
1347    pub window_function: ::core::option::Option<
1348        physical_window_expr_node::WindowFunction,
1349    >,
1350}
1351/// Nested message and enum types in `PhysicalWindowExprNode`.
1352pub mod physical_window_expr_node {
1353    #[derive(Clone, PartialEq, ::prost::Oneof)]
1354    pub enum WindowFunction {
1355        /// BuiltInWindowFunction built_in_function = 2;
1356        #[prost(string, tag = "3")]
1357        UserDefinedAggrFunction(::prost::alloc::string::String),
1358        #[prost(string, tag = "10")]
1359        UserDefinedWindowFunction(::prost::alloc::string::String),
1360    }
1361}
1362#[derive(Clone, PartialEq, ::prost::Message)]
1363pub struct PhysicalIsNull {
1364    #[prost(message, optional, boxed, tag = "1")]
1365    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1366}
1367#[derive(Clone, PartialEq, ::prost::Message)]
1368pub struct PhysicalIsNotNull {
1369    #[prost(message, optional, boxed, tag = "1")]
1370    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1371}
1372#[derive(Clone, PartialEq, ::prost::Message)]
1373pub struct PhysicalNot {
1374    #[prost(message, optional, boxed, tag = "1")]
1375    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1376}
1377#[derive(Clone, PartialEq, ::prost::Message)]
1378pub struct PhysicalAliasNode {
1379    #[prost(message, optional, tag = "1")]
1380    pub expr: ::core::option::Option<PhysicalExprNode>,
1381    #[prost(string, tag = "2")]
1382    pub alias: ::prost::alloc::string::String,
1383}
1384#[derive(Clone, PartialEq, ::prost::Message)]
1385pub struct PhysicalBinaryExprNode {
1386    #[prost(message, optional, boxed, tag = "1")]
1387    pub l: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1388    #[prost(message, optional, boxed, tag = "2")]
1389    pub r: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1390    #[prost(string, tag = "3")]
1391    pub op: ::prost::alloc::string::String,
1392}
1393#[derive(Clone, PartialEq, ::prost::Message)]
1394pub struct PhysicalDateTimeIntervalExprNode {
1395    #[prost(message, optional, tag = "1")]
1396    pub l: ::core::option::Option<PhysicalExprNode>,
1397    #[prost(message, optional, tag = "2")]
1398    pub r: ::core::option::Option<PhysicalExprNode>,
1399    #[prost(string, tag = "3")]
1400    pub op: ::prost::alloc::string::String,
1401}
1402#[derive(Clone, PartialEq, ::prost::Message)]
1403pub struct PhysicalLikeExprNode {
1404    #[prost(bool, tag = "1")]
1405    pub negated: bool,
1406    #[prost(bool, tag = "2")]
1407    pub case_insensitive: bool,
1408    #[prost(message, optional, boxed, tag = "3")]
1409    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1410    #[prost(message, optional, boxed, tag = "4")]
1411    pub pattern: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1412}
1413#[derive(Clone, PartialEq, ::prost::Message)]
1414pub struct PhysicalSortExprNode {
1415    #[prost(message, optional, boxed, tag = "1")]
1416    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1417    #[prost(bool, tag = "2")]
1418    pub asc: bool,
1419    #[prost(bool, tag = "3")]
1420    pub nulls_first: bool,
1421}
1422#[derive(Clone, PartialEq, ::prost::Message)]
1423pub struct PhysicalWhenThen {
1424    #[prost(message, optional, tag = "1")]
1425    pub when_expr: ::core::option::Option<PhysicalExprNode>,
1426    #[prost(message, optional, tag = "2")]
1427    pub then_expr: ::core::option::Option<PhysicalExprNode>,
1428}
1429#[derive(Clone, PartialEq, ::prost::Message)]
1430pub struct PhysicalInListNode {
1431    #[prost(message, optional, boxed, tag = "1")]
1432    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1433    #[prost(message, repeated, tag = "2")]
1434    pub list: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1435    #[prost(bool, tag = "3")]
1436    pub negated: bool,
1437}
1438#[derive(Clone, PartialEq, ::prost::Message)]
1439pub struct PhysicalCaseNode {
1440    #[prost(message, optional, boxed, tag = "1")]
1441    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1442    #[prost(message, repeated, tag = "2")]
1443    pub when_then_expr: ::prost::alloc::vec::Vec<PhysicalWhenThen>,
1444    #[prost(message, optional, boxed, tag = "3")]
1445    pub else_expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1446}
1447#[derive(Clone, PartialEq, ::prost::Message)]
1448pub struct PhysicalTryCastNode {
1449    #[prost(message, optional, boxed, tag = "1")]
1450    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1451    #[prost(message, optional, tag = "2")]
1452    pub arrow_type: ::core::option::Option<super::datafusion_common::ArrowType>,
1453}
1454#[derive(Clone, PartialEq, ::prost::Message)]
1455pub struct PhysicalCastNode {
1456    #[prost(message, optional, boxed, tag = "1")]
1457    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1458    #[prost(message, optional, tag = "2")]
1459    pub arrow_type: ::core::option::Option<super::datafusion_common::ArrowType>,
1460}
1461#[derive(Clone, PartialEq, ::prost::Message)]
1462pub struct PhysicalNegativeNode {
1463    #[prost(message, optional, boxed, tag = "1")]
1464    pub expr: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalExprNode>>,
1465}
1466#[derive(Clone, PartialEq, ::prost::Message)]
1467pub struct PhysicalExtensionExprNode {
1468    #[prost(bytes = "vec", tag = "1")]
1469    pub expr: ::prost::alloc::vec::Vec<u8>,
1470    #[prost(message, repeated, tag = "2")]
1471    pub inputs: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1472}
1473#[derive(Clone, PartialEq, ::prost::Message)]
1474pub struct FilterExecNode {
1475    #[prost(message, optional, boxed, tag = "1")]
1476    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1477    #[prost(message, optional, tag = "2")]
1478    pub expr: ::core::option::Option<PhysicalExprNode>,
1479    #[prost(uint32, tag = "3")]
1480    pub default_filter_selectivity: u32,
1481    #[prost(uint32, repeated, tag = "9")]
1482    pub projection: ::prost::alloc::vec::Vec<u32>,
1483}
1484#[derive(Clone, PartialEq, ::prost::Message)]
1485pub struct FileGroup {
1486    #[prost(message, repeated, tag = "1")]
1487    pub files: ::prost::alloc::vec::Vec<PartitionedFile>,
1488}
1489#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1490pub struct ScanLimit {
1491    /// wrap into a message to make it optional
1492    #[prost(uint32, tag = "1")]
1493    pub limit: u32,
1494}
1495#[derive(Clone, PartialEq, ::prost::Message)]
1496pub struct PhysicalSortExprNodeCollection {
1497    #[prost(message, repeated, tag = "1")]
1498    pub physical_sort_expr_nodes: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1499}
1500#[derive(Clone, PartialEq, ::prost::Message)]
1501pub struct FileScanExecConf {
1502    #[prost(message, repeated, tag = "1")]
1503    pub file_groups: ::prost::alloc::vec::Vec<FileGroup>,
1504    #[prost(message, optional, tag = "2")]
1505    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1506    #[prost(uint32, repeated, tag = "4")]
1507    pub projection: ::prost::alloc::vec::Vec<u32>,
1508    #[prost(message, optional, tag = "5")]
1509    pub limit: ::core::option::Option<ScanLimit>,
1510    #[prost(message, optional, tag = "6")]
1511    pub statistics: ::core::option::Option<super::datafusion_common::Statistics>,
1512    #[prost(string, repeated, tag = "7")]
1513    pub table_partition_cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1514    #[prost(string, tag = "8")]
1515    pub object_store_url: ::prost::alloc::string::String,
1516    #[prost(message, repeated, tag = "9")]
1517    pub output_ordering: ::prost::alloc::vec::Vec<PhysicalSortExprNodeCollection>,
1518    #[prost(message, optional, tag = "11")]
1519    pub constraints: ::core::option::Option<super::datafusion_common::Constraints>,
1520    #[prost(uint64, optional, tag = "12")]
1521    pub batch_size: ::core::option::Option<u64>,
1522}
1523#[derive(Clone, PartialEq, ::prost::Message)]
1524pub struct ParquetScanExecNode {
1525    #[prost(message, optional, tag = "1")]
1526    pub base_conf: ::core::option::Option<FileScanExecConf>,
1527    #[prost(message, optional, tag = "3")]
1528    pub predicate: ::core::option::Option<PhysicalExprNode>,
1529    #[prost(message, optional, tag = "4")]
1530    pub parquet_options: ::core::option::Option<
1531        super::datafusion_common::TableParquetOptions,
1532    >,
1533}
1534#[derive(Clone, PartialEq, ::prost::Message)]
1535pub struct CsvScanExecNode {
1536    #[prost(message, optional, tag = "1")]
1537    pub base_conf: ::core::option::Option<FileScanExecConf>,
1538    #[prost(bool, tag = "2")]
1539    pub has_header: bool,
1540    #[prost(string, tag = "3")]
1541    pub delimiter: ::prost::alloc::string::String,
1542    #[prost(string, tag = "4")]
1543    pub quote: ::prost::alloc::string::String,
1544    #[prost(bool, tag = "7")]
1545    pub newlines_in_values: bool,
1546    #[prost(oneof = "csv_scan_exec_node::OptionalEscape", tags = "5")]
1547    pub optional_escape: ::core::option::Option<csv_scan_exec_node::OptionalEscape>,
1548    #[prost(oneof = "csv_scan_exec_node::OptionalComment", tags = "6")]
1549    pub optional_comment: ::core::option::Option<csv_scan_exec_node::OptionalComment>,
1550}
1551/// Nested message and enum types in `CsvScanExecNode`.
1552pub mod csv_scan_exec_node {
1553    #[derive(Clone, PartialEq, ::prost::Oneof)]
1554    pub enum OptionalEscape {
1555        #[prost(string, tag = "5")]
1556        Escape(::prost::alloc::string::String),
1557    }
1558    #[derive(Clone, PartialEq, ::prost::Oneof)]
1559    pub enum OptionalComment {
1560        #[prost(string, tag = "6")]
1561        Comment(::prost::alloc::string::String),
1562    }
1563}
1564#[derive(Clone, PartialEq, ::prost::Message)]
1565pub struct JsonScanExecNode {
1566    #[prost(message, optional, tag = "1")]
1567    pub base_conf: ::core::option::Option<FileScanExecConf>,
1568}
1569#[derive(Clone, PartialEq, ::prost::Message)]
1570pub struct AvroScanExecNode {
1571    #[prost(message, optional, tag = "1")]
1572    pub base_conf: ::core::option::Option<FileScanExecConf>,
1573}
1574#[derive(Clone, PartialEq, ::prost::Message)]
1575pub struct HashJoinExecNode {
1576    #[prost(message, optional, boxed, tag = "1")]
1577    pub left: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1578    #[prost(message, optional, boxed, tag = "2")]
1579    pub right: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1580    #[prost(message, repeated, tag = "3")]
1581    pub on: ::prost::alloc::vec::Vec<JoinOn>,
1582    #[prost(enumeration = "super::datafusion_common::JoinType", tag = "4")]
1583    pub join_type: i32,
1584    #[prost(enumeration = "PartitionMode", tag = "6")]
1585    pub partition_mode: i32,
1586    #[prost(bool, tag = "7")]
1587    pub null_equals_null: bool,
1588    #[prost(message, optional, tag = "8")]
1589    pub filter: ::core::option::Option<JoinFilter>,
1590    #[prost(uint32, repeated, tag = "9")]
1591    pub projection: ::prost::alloc::vec::Vec<u32>,
1592}
1593#[derive(Clone, PartialEq, ::prost::Message)]
1594pub struct SymmetricHashJoinExecNode {
1595    #[prost(message, optional, boxed, tag = "1")]
1596    pub left: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1597    #[prost(message, optional, boxed, tag = "2")]
1598    pub right: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1599    #[prost(message, repeated, tag = "3")]
1600    pub on: ::prost::alloc::vec::Vec<JoinOn>,
1601    #[prost(enumeration = "super::datafusion_common::JoinType", tag = "4")]
1602    pub join_type: i32,
1603    #[prost(enumeration = "StreamPartitionMode", tag = "6")]
1604    pub partition_mode: i32,
1605    #[prost(bool, tag = "7")]
1606    pub null_equals_null: bool,
1607    #[prost(message, optional, tag = "8")]
1608    pub filter: ::core::option::Option<JoinFilter>,
1609    #[prost(message, repeated, tag = "9")]
1610    pub left_sort_exprs: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1611    #[prost(message, repeated, tag = "10")]
1612    pub right_sort_exprs: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1613}
1614#[derive(Clone, PartialEq, ::prost::Message)]
1615pub struct InterleaveExecNode {
1616    #[prost(message, repeated, tag = "1")]
1617    pub inputs: ::prost::alloc::vec::Vec<PhysicalPlanNode>,
1618}
1619#[derive(Clone, PartialEq, ::prost::Message)]
1620pub struct UnionExecNode {
1621    #[prost(message, repeated, tag = "1")]
1622    pub inputs: ::prost::alloc::vec::Vec<PhysicalPlanNode>,
1623}
1624#[derive(Clone, PartialEq, ::prost::Message)]
1625pub struct ExplainExecNode {
1626    #[prost(message, optional, tag = "1")]
1627    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1628    #[prost(message, repeated, tag = "2")]
1629    pub stringified_plans: ::prost::alloc::vec::Vec<StringifiedPlan>,
1630    #[prost(bool, tag = "3")]
1631    pub verbose: bool,
1632}
1633#[derive(Clone, PartialEq, ::prost::Message)]
1634pub struct AnalyzeExecNode {
1635    #[prost(bool, tag = "1")]
1636    pub verbose: bool,
1637    #[prost(bool, tag = "2")]
1638    pub show_statistics: bool,
1639    #[prost(message, optional, boxed, tag = "3")]
1640    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1641    #[prost(message, optional, tag = "4")]
1642    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1643}
1644#[derive(Clone, PartialEq, ::prost::Message)]
1645pub struct CrossJoinExecNode {
1646    #[prost(message, optional, boxed, tag = "1")]
1647    pub left: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1648    #[prost(message, optional, boxed, tag = "2")]
1649    pub right: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1650}
1651#[derive(Clone, PartialEq, ::prost::Message)]
1652pub struct PhysicalColumn {
1653    #[prost(string, tag = "1")]
1654    pub name: ::prost::alloc::string::String,
1655    #[prost(uint32, tag = "2")]
1656    pub index: u32,
1657}
1658#[derive(Clone, PartialEq, ::prost::Message)]
1659pub struct UnknownColumn {
1660    #[prost(string, tag = "1")]
1661    pub name: ::prost::alloc::string::String,
1662}
1663#[derive(Clone, PartialEq, ::prost::Message)]
1664pub struct JoinOn {
1665    #[prost(message, optional, tag = "1")]
1666    pub left: ::core::option::Option<PhysicalExprNode>,
1667    #[prost(message, optional, tag = "2")]
1668    pub right: ::core::option::Option<PhysicalExprNode>,
1669}
1670#[derive(Clone, PartialEq, ::prost::Message)]
1671pub struct EmptyExecNode {
1672    #[prost(message, optional, tag = "1")]
1673    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1674}
1675#[derive(Clone, PartialEq, ::prost::Message)]
1676pub struct PlaceholderRowExecNode {
1677    #[prost(message, optional, tag = "1")]
1678    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1679}
1680#[derive(Clone, PartialEq, ::prost::Message)]
1681pub struct ProjectionExecNode {
1682    #[prost(message, optional, boxed, tag = "1")]
1683    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1684    #[prost(message, repeated, tag = "2")]
1685    pub expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1686    #[prost(string, repeated, tag = "3")]
1687    pub expr_name: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1688}
1689#[derive(Clone, PartialEq, ::prost::Message)]
1690pub struct PartiallySortedInputOrderMode {
1691    #[prost(uint64, repeated, tag = "6")]
1692    pub columns: ::prost::alloc::vec::Vec<u64>,
1693}
1694#[derive(Clone, PartialEq, ::prost::Message)]
1695pub struct WindowAggExecNode {
1696    #[prost(message, optional, boxed, tag = "1")]
1697    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1698    #[prost(message, repeated, tag = "2")]
1699    pub window_expr: ::prost::alloc::vec::Vec<PhysicalWindowExprNode>,
1700    #[prost(message, repeated, tag = "5")]
1701    pub partition_keys: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1702    /// Set optional to `None` for `BoundedWindowAggExec`.
1703    #[prost(oneof = "window_agg_exec_node::InputOrderMode", tags = "7, 8, 9")]
1704    pub input_order_mode: ::core::option::Option<window_agg_exec_node::InputOrderMode>,
1705}
1706/// Nested message and enum types in `WindowAggExecNode`.
1707pub mod window_agg_exec_node {
1708    /// Set optional to `None` for `BoundedWindowAggExec`.
1709    #[derive(Clone, PartialEq, ::prost::Oneof)]
1710    pub enum InputOrderMode {
1711        #[prost(message, tag = "7")]
1712        Linear(super::super::datafusion_common::EmptyMessage),
1713        #[prost(message, tag = "8")]
1714        PartiallySorted(super::PartiallySortedInputOrderMode),
1715        #[prost(message, tag = "9")]
1716        Sorted(super::super::datafusion_common::EmptyMessage),
1717    }
1718}
1719#[derive(Clone, PartialEq, ::prost::Message)]
1720pub struct MaybeFilter {
1721    #[prost(message, optional, tag = "1")]
1722    pub expr: ::core::option::Option<PhysicalExprNode>,
1723}
1724#[derive(Clone, PartialEq, ::prost::Message)]
1725pub struct MaybePhysicalSortExprs {
1726    #[prost(message, repeated, tag = "1")]
1727    pub sort_expr: ::prost::alloc::vec::Vec<PhysicalSortExprNode>,
1728}
1729#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1730pub struct AggLimit {
1731    /// wrap into a message to make it optional
1732    #[prost(uint64, tag = "1")]
1733    pub limit: u64,
1734}
1735#[derive(Clone, PartialEq, ::prost::Message)]
1736pub struct AggregateExecNode {
1737    #[prost(message, repeated, tag = "1")]
1738    pub group_expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1739    #[prost(message, repeated, tag = "2")]
1740    pub aggr_expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1741    #[prost(enumeration = "AggregateMode", tag = "3")]
1742    pub mode: i32,
1743    #[prost(message, optional, boxed, tag = "4")]
1744    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1745    #[prost(string, repeated, tag = "5")]
1746    pub group_expr_name: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1747    #[prost(string, repeated, tag = "6")]
1748    pub aggr_expr_name: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1749    /// we need the input schema to the partial aggregate to pass to the final aggregate
1750    #[prost(message, optional, tag = "7")]
1751    pub input_schema: ::core::option::Option<super::datafusion_common::Schema>,
1752    #[prost(message, repeated, tag = "8")]
1753    pub null_expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1754    #[prost(bool, repeated, tag = "9")]
1755    pub groups: ::prost::alloc::vec::Vec<bool>,
1756    #[prost(message, repeated, tag = "10")]
1757    pub filter_expr: ::prost::alloc::vec::Vec<MaybeFilter>,
1758    #[prost(message, optional, tag = "11")]
1759    pub limit: ::core::option::Option<AggLimit>,
1760}
1761#[derive(Clone, PartialEq, ::prost::Message)]
1762pub struct GlobalLimitExecNode {
1763    #[prost(message, optional, boxed, tag = "1")]
1764    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1765    /// The number of rows to skip before fetch
1766    #[prost(uint32, tag = "2")]
1767    pub skip: u32,
1768    /// Maximum number of rows to fetch; negative means no limit
1769    #[prost(int64, tag = "3")]
1770    pub fetch: i64,
1771}
1772#[derive(Clone, PartialEq, ::prost::Message)]
1773pub struct LocalLimitExecNode {
1774    #[prost(message, optional, boxed, tag = "1")]
1775    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1776    #[prost(uint32, tag = "2")]
1777    pub fetch: u32,
1778}
1779#[derive(Clone, PartialEq, ::prost::Message)]
1780pub struct SortExecNode {
1781    #[prost(message, optional, boxed, tag = "1")]
1782    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1783    #[prost(message, repeated, tag = "2")]
1784    pub expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1785    /// Maximum number of highest/lowest rows to fetch; negative means no limit
1786    #[prost(int64, tag = "3")]
1787    pub fetch: i64,
1788    #[prost(bool, tag = "4")]
1789    pub preserve_partitioning: bool,
1790}
1791#[derive(Clone, PartialEq, ::prost::Message)]
1792pub struct SortPreservingMergeExecNode {
1793    #[prost(message, optional, boxed, tag = "1")]
1794    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1795    #[prost(message, repeated, tag = "2")]
1796    pub expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1797    /// Maximum number of highest/lowest rows to fetch; negative means no limit
1798    #[prost(int64, tag = "3")]
1799    pub fetch: i64,
1800}
1801#[derive(Clone, PartialEq, ::prost::Message)]
1802pub struct NestedLoopJoinExecNode {
1803    #[prost(message, optional, boxed, tag = "1")]
1804    pub left: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1805    #[prost(message, optional, boxed, tag = "2")]
1806    pub right: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1807    #[prost(enumeration = "super::datafusion_common::JoinType", tag = "3")]
1808    pub join_type: i32,
1809    #[prost(message, optional, tag = "4")]
1810    pub filter: ::core::option::Option<JoinFilter>,
1811    #[prost(uint32, repeated, tag = "5")]
1812    pub projection: ::prost::alloc::vec::Vec<u32>,
1813}
1814#[derive(Clone, PartialEq, ::prost::Message)]
1815pub struct CoalesceBatchesExecNode {
1816    #[prost(message, optional, boxed, tag = "1")]
1817    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1818    #[prost(uint32, tag = "2")]
1819    pub target_batch_size: u32,
1820    #[prost(uint32, optional, tag = "3")]
1821    pub fetch: ::core::option::Option<u32>,
1822}
1823#[derive(Clone, PartialEq, ::prost::Message)]
1824pub struct CoalescePartitionsExecNode {
1825    #[prost(message, optional, boxed, tag = "1")]
1826    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1827}
1828#[derive(Clone, PartialEq, ::prost::Message)]
1829pub struct PhysicalHashRepartition {
1830    #[prost(message, repeated, tag = "1")]
1831    pub hash_expr: ::prost::alloc::vec::Vec<PhysicalExprNode>,
1832    #[prost(uint64, tag = "2")]
1833    pub partition_count: u64,
1834}
1835#[derive(Clone, PartialEq, ::prost::Message)]
1836pub struct RepartitionExecNode {
1837    #[prost(message, optional, boxed, tag = "1")]
1838    pub input: ::core::option::Option<::prost::alloc::boxed::Box<PhysicalPlanNode>>,
1839    /// oneof partition_method {
1840    ///    uint64 round_robin = 2;
1841    ///    PhysicalHashRepartition hash = 3;
1842    ///    uint64 unknown = 4;
1843    /// }
1844    #[prost(message, optional, tag = "5")]
1845    pub partitioning: ::core::option::Option<Partitioning>,
1846}
1847#[derive(Clone, PartialEq, ::prost::Message)]
1848pub struct Partitioning {
1849    #[prost(oneof = "partitioning::PartitionMethod", tags = "1, 2, 3")]
1850    pub partition_method: ::core::option::Option<partitioning::PartitionMethod>,
1851}
1852/// Nested message and enum types in `Partitioning`.
1853pub mod partitioning {
1854    #[derive(Clone, PartialEq, ::prost::Oneof)]
1855    pub enum PartitionMethod {
1856        #[prost(uint64, tag = "1")]
1857        RoundRobin(u64),
1858        #[prost(message, tag = "2")]
1859        Hash(super::PhysicalHashRepartition),
1860        #[prost(uint64, tag = "3")]
1861        Unknown(u64),
1862    }
1863}
1864#[derive(Clone, PartialEq, ::prost::Message)]
1865pub struct JoinFilter {
1866    #[prost(message, optional, tag = "1")]
1867    pub expression: ::core::option::Option<PhysicalExprNode>,
1868    #[prost(message, repeated, tag = "2")]
1869    pub column_indices: ::prost::alloc::vec::Vec<ColumnIndex>,
1870    #[prost(message, optional, tag = "3")]
1871    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1872}
1873#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1874pub struct ColumnIndex {
1875    #[prost(uint32, tag = "1")]
1876    pub index: u32,
1877    #[prost(enumeration = "super::datafusion_common::JoinSide", tag = "2")]
1878    pub side: i32,
1879}
1880#[derive(Clone, PartialEq, ::prost::Message)]
1881pub struct PartitionedFile {
1882    #[prost(string, tag = "1")]
1883    pub path: ::prost::alloc::string::String,
1884    #[prost(uint64, tag = "2")]
1885    pub size: u64,
1886    #[prost(uint64, tag = "3")]
1887    pub last_modified_ns: u64,
1888    #[prost(message, repeated, tag = "4")]
1889    pub partition_values: ::prost::alloc::vec::Vec<
1890        super::datafusion_common::ScalarValue,
1891    >,
1892    #[prost(message, optional, tag = "5")]
1893    pub range: ::core::option::Option<FileRange>,
1894    #[prost(message, optional, tag = "6")]
1895    pub statistics: ::core::option::Option<super::datafusion_common::Statistics>,
1896}
1897#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1898pub struct FileRange {
1899    #[prost(int64, tag = "1")]
1900    pub start: i64,
1901    #[prost(int64, tag = "2")]
1902    pub end: i64,
1903}
1904#[derive(Clone, PartialEq, ::prost::Message)]
1905pub struct PartitionStats {
1906    #[prost(int64, tag = "1")]
1907    pub num_rows: i64,
1908    #[prost(int64, tag = "2")]
1909    pub num_batches: i64,
1910    #[prost(int64, tag = "3")]
1911    pub num_bytes: i64,
1912    #[prost(message, repeated, tag = "4")]
1913    pub column_stats: ::prost::alloc::vec::Vec<super::datafusion_common::ColumnStats>,
1914}
1915#[derive(Clone, PartialEq, ::prost::Message)]
1916pub struct RecursiveQueryNode {
1917    #[prost(string, tag = "1")]
1918    pub name: ::prost::alloc::string::String,
1919    #[prost(message, optional, boxed, tag = "2")]
1920    pub static_term: ::core::option::Option<::prost::alloc::boxed::Box<LogicalPlanNode>>,
1921    #[prost(message, optional, boxed, tag = "3")]
1922    pub recursive_term: ::core::option::Option<
1923        ::prost::alloc::boxed::Box<LogicalPlanNode>,
1924    >,
1925    #[prost(bool, tag = "4")]
1926    pub is_distinct: bool,
1927}
1928#[derive(Clone, PartialEq, ::prost::Message)]
1929pub struct CteWorkTableScanNode {
1930    #[prost(string, tag = "1")]
1931    pub name: ::prost::alloc::string::String,
1932    #[prost(message, optional, tag = "2")]
1933    pub schema: ::core::option::Option<super::datafusion_common::Schema>,
1934}
1935#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
1936#[repr(i32)]
1937pub enum WindowFrameUnits {
1938    Rows = 0,
1939    Range = 1,
1940    Groups = 2,
1941}
1942impl WindowFrameUnits {
1943    /// String value of the enum field names used in the ProtoBuf definition.
1944    ///
1945    /// The values are not transformed in any way and thus are considered stable
1946    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1947    pub fn as_str_name(&self) -> &'static str {
1948        match self {
1949            Self::Rows => "ROWS",
1950            Self::Range => "RANGE",
1951            Self::Groups => "GROUPS",
1952        }
1953    }
1954    /// Creates an enum from field names used in the ProtoBuf definition.
1955    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1956        match value {
1957            "ROWS" => Some(Self::Rows),
1958            "RANGE" => Some(Self::Range),
1959            "GROUPS" => Some(Self::Groups),
1960            _ => None,
1961        }
1962    }
1963}
1964#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
1965#[repr(i32)]
1966pub enum WindowFrameBoundType {
1967    CurrentRow = 0,
1968    Preceding = 1,
1969    Following = 2,
1970}
1971impl WindowFrameBoundType {
1972    /// String value of the enum field names used in the ProtoBuf definition.
1973    ///
1974    /// The values are not transformed in any way and thus are considered stable
1975    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1976    pub fn as_str_name(&self) -> &'static str {
1977        match self {
1978            Self::CurrentRow => "CURRENT_ROW",
1979            Self::Preceding => "PRECEDING",
1980            Self::Following => "FOLLOWING",
1981        }
1982    }
1983    /// Creates an enum from field names used in the ProtoBuf definition.
1984    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1985        match value {
1986            "CURRENT_ROW" => Some(Self::CurrentRow),
1987            "PRECEDING" => Some(Self::Preceding),
1988            "FOLLOWING" => Some(Self::Following),
1989            _ => None,
1990        }
1991    }
1992}
1993#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
1994#[repr(i32)]
1995pub enum DateUnit {
1996    Day = 0,
1997    DateMillisecond = 1,
1998}
1999impl DateUnit {
2000    /// String value of the enum field names used in the ProtoBuf definition.
2001    ///
2002    /// The values are not transformed in any way and thus are considered stable
2003    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2004    pub fn as_str_name(&self) -> &'static str {
2005        match self {
2006            Self::Day => "Day",
2007            Self::DateMillisecond => "DateMillisecond",
2008        }
2009    }
2010    /// Creates an enum from field names used in the ProtoBuf definition.
2011    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2012        match value {
2013            "Day" => Some(Self::Day),
2014            "DateMillisecond" => Some(Self::DateMillisecond),
2015            _ => None,
2016        }
2017    }
2018}
2019#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2020#[repr(i32)]
2021pub enum InsertOp {
2022    Append = 0,
2023    Overwrite = 1,
2024    Replace = 2,
2025}
2026impl InsertOp {
2027    /// String value of the enum field names used in the ProtoBuf definition.
2028    ///
2029    /// The values are not transformed in any way and thus are considered stable
2030    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2031    pub fn as_str_name(&self) -> &'static str {
2032        match self {
2033            Self::Append => "Append",
2034            Self::Overwrite => "Overwrite",
2035            Self::Replace => "Replace",
2036        }
2037    }
2038    /// Creates an enum from field names used in the ProtoBuf definition.
2039    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2040        match value {
2041            "Append" => Some(Self::Append),
2042            "Overwrite" => Some(Self::Overwrite),
2043            "Replace" => Some(Self::Replace),
2044            _ => None,
2045        }
2046    }
2047}
2048#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2049#[repr(i32)]
2050pub enum PartitionMode {
2051    CollectLeft = 0,
2052    Partitioned = 1,
2053    Auto = 2,
2054}
2055impl PartitionMode {
2056    /// String value of the enum field names used in the ProtoBuf definition.
2057    ///
2058    /// The values are not transformed in any way and thus are considered stable
2059    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2060    pub fn as_str_name(&self) -> &'static str {
2061        match self {
2062            Self::CollectLeft => "COLLECT_LEFT",
2063            Self::Partitioned => "PARTITIONED",
2064            Self::Auto => "AUTO",
2065        }
2066    }
2067    /// Creates an enum from field names used in the ProtoBuf definition.
2068    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2069        match value {
2070            "COLLECT_LEFT" => Some(Self::CollectLeft),
2071            "PARTITIONED" => Some(Self::Partitioned),
2072            "AUTO" => Some(Self::Auto),
2073            _ => None,
2074        }
2075    }
2076}
2077#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2078#[repr(i32)]
2079pub enum StreamPartitionMode {
2080    SinglePartition = 0,
2081    PartitionedExec = 1,
2082}
2083impl StreamPartitionMode {
2084    /// String value of the enum field names used in the ProtoBuf definition.
2085    ///
2086    /// The values are not transformed in any way and thus are considered stable
2087    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2088    pub fn as_str_name(&self) -> &'static str {
2089        match self {
2090            Self::SinglePartition => "SINGLE_PARTITION",
2091            Self::PartitionedExec => "PARTITIONED_EXEC",
2092        }
2093    }
2094    /// Creates an enum from field names used in the ProtoBuf definition.
2095    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2096        match value {
2097            "SINGLE_PARTITION" => Some(Self::SinglePartition),
2098            "PARTITIONED_EXEC" => Some(Self::PartitionedExec),
2099            _ => None,
2100        }
2101    }
2102}
2103#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2104#[repr(i32)]
2105pub enum AggregateMode {
2106    Partial = 0,
2107    Final = 1,
2108    FinalPartitioned = 2,
2109    Single = 3,
2110    SinglePartitioned = 4,
2111}
2112impl AggregateMode {
2113    /// String value of the enum field names used in the ProtoBuf definition.
2114    ///
2115    /// The values are not transformed in any way and thus are considered stable
2116    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2117    pub fn as_str_name(&self) -> &'static str {
2118        match self {
2119            Self::Partial => "PARTIAL",
2120            Self::Final => "FINAL",
2121            Self::FinalPartitioned => "FINAL_PARTITIONED",
2122            Self::Single => "SINGLE",
2123            Self::SinglePartitioned => "SINGLE_PARTITIONED",
2124        }
2125    }
2126    /// Creates an enum from field names used in the ProtoBuf definition.
2127    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2128        match value {
2129            "PARTIAL" => Some(Self::Partial),
2130            "FINAL" => Some(Self::Final),
2131            "FINAL_PARTITIONED" => Some(Self::FinalPartitioned),
2132            "SINGLE" => Some(Self::Single),
2133            "SINGLE_PARTITIONED" => Some(Self::SinglePartitioned),
2134            _ => None,
2135        }
2136    }
2137}