diff --git a/.github/workflows/r.yml b/.github/workflows/r.yml
index ece279e..ff54240 100644
--- a/.github/workflows/r.yml
+++ b/.github/workflows/r.yml
@@ -35,7 +35,31 @@ jobs:
       run: |
         sudo apt-get update -y -qq && sudo apt-get install -y -qq ninja-build libcurl4-openssl-dev
         mkdir -p $HOME/.R
-        (cd duckdb/tools/rpkg && R -f dependencies.R)
+        (cd scripts && R -f dependencies.R)
+
+    - uses: actions/checkout@v3
+      with:
+        path: ${{ env.DUCKDB_SRC }}
+
+    - uses: actions/checkout@v3
+      with:
+        repository: ${{ env.DUCKDB_R_REPO }}
+        path: ${{ env.DUCKDB_R_SRC }}
+
+      # needed so we can run git commit in vendor.sh
+    - name: setup github and create parallel builds
+      shell: bash
+      run: |
+        git config --global user.email "duck@duck.com"
+        git config --global user.name "mr. duck"
+        mkdir -p ~/.R
+        echo 'MAKEFLAGS = -j2' >> ~/.R/Makevars
+
+     # error is from git_dev_version() but does not affect this workflow
+    - name: update duckdb-r src code with PR code
+      shell: bash
+      working-directory: ${{ env.DUCKDB_R_SRC }}
+      run:  (cd duckdb-r && ./vendor.sh duckdb)
 
     - name: Build Extension
       run: |
@@ -43,10 +67,8 @@ jobs:
 
     - name: Build DuckDB (R)
       run: |
-        cd duckdb/tools/rpkg
-        ./configure
-        R CMD build .
-        R CMD INSTALL -d duckdb_*.tar.gz
+        cd duckdb-r
+        R CMD INSTALL .
 
     - name: Test R
       run: |
diff --git a/.gitmodules b/.gitmodules
index b6b484a..ac278dd 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
 [submodule "duckdb"]
 	path = duckdb
 	url = https://github.com/duckdb/duckdb
+[submodule "duckdb-r"]
+	path = duckdb-r
+	url = https://github.com/duckdb/duckdb-r
diff --git a/duckdb-r b/duckdb-r
new file mode 160000
index 0000000..38463c6
--- /dev/null
+++ b/duckdb-r
@@ -0,0 +1 @@
+Subproject commit 38463c6fe1c2654a58f796219b8b7ea83b1dcd5d
diff --git a/scripts/dependencies.R b/scripts/dependencies.R
new file mode 100644
index 0000000..6663252
--- /dev/null
+++ b/scripts/dependencies.R
@@ -0,0 +1,12 @@
+local({
+  pkg <- c("DBI", "callr", "DBItest", "dbplyr", "testthat", "bit64", "cpp11", "arrow", "covr", "pkgbuild", "remotes")
+
+  if (.Platform$OS.type == "unix") {
+    options(HTTPUserAgent = sprintf("R/4.1.0 R (4.1.0 %s)", paste(R.version$platform, R.version$arch, R.version$os)))
+    install.packages(pkg, repos = "https://packagemanager.rstudio.com/all/__linux__/focal/latest")
+    # https://github.com/r-lib/covr/pull/499
+    remotes::install_github("r-lib/covr")
+  } else {
+    install.packages(pkg, repos = "https://cloud.r-project.org", pkgType = "binary")
+  }
+})
diff --git a/scripts/update_substrait.py b/scripts/update_substrait.py
index 2061161..e0bbaa3 100644
--- a/scripts/update_substrait.py
+++ b/scripts/update_substrait.py
@@ -5,7 +5,7 @@
 import shutil
 from os import walk
 
-GITHUB_TAG = "335a4dc74ccb3ef88769878d36c35e511e47ef70" # V0.24
+GITHUB_TAG = "9e39067e49f453f1df998c3c4a821e53dd7a1e8f" # V0.35
 # Change to substrait folder
 sub_folder  = os.path.join(os.path.dirname(os.path.realpath(__file__)),'..','third_party','substrait')
 os.chdir(sub_folder)
@@ -35,6 +35,7 @@
 
 proto_sub_extensions = next(walk(substrait_extensions_proto_folder), (None, None, []))[2]
 
+# /usr/local/bin/protoc
 print("Protoc version" + os.popen('protoc --version').read())
 
 for proto in proto_sub_list:
diff --git a/third_party/substrait/substrait/algebra.pb.cc b/third_party/substrait/substrait/algebra.pb.cc
index 904d65d..a1dcfe2 100644
--- a/third_party/substrait/substrait/algebra.pb.cc
+++ b/third_party/substrait/substrait/algebra.pb.cc
@@ -328,6 +328,46 @@ struct AggregateRelDefaultTypeInternal {
   };
 };
 PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT AggregateRelDefaultTypeInternal _AggregateRel_default_instance_;
+constexpr ConsistentPartitionWindowRel_WindowRelFunction::ConsistentPartitionWindowRel_WindowRelFunction(
+  ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
+  : arguments_()
+  , options_()
+  , upper_bound_(nullptr)
+  , lower_bound_(nullptr)
+  , output_type_(nullptr)
+  , function_reference_(0u)
+  , phase_(0)
+
+  , invocation_(0)
+
+  , bounds_type_(0)
+{}
+struct ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal {
+  constexpr ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal()
+    : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {}
+  ~ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal() {}
+  union {
+    ConsistentPartitionWindowRel_WindowRelFunction _instance;
+  };
+};
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal _ConsistentPartitionWindowRel_WindowRelFunction_default_instance_;
+constexpr ConsistentPartitionWindowRel::ConsistentPartitionWindowRel(
+  ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
+  : window_functions_()
+  , partition_expressions_()
+  , sorts_()
+  , common_(nullptr)
+  , input_(nullptr)
+  , advanced_extension_(nullptr){}
+struct ConsistentPartitionWindowRelDefaultTypeInternal {
+  constexpr ConsistentPartitionWindowRelDefaultTypeInternal()
+    : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {}
+  ~ConsistentPartitionWindowRelDefaultTypeInternal() {}
+  union {
+    ConsistentPartitionWindowRel _instance;
+  };
+};
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ConsistentPartitionWindowRelDefaultTypeInternal _ConsistentPartitionWindowRel_default_instance_;
 constexpr SortRel::SortRel(
   ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
   : sorts_()
@@ -506,6 +546,44 @@ struct ExchangeRelDefaultTypeInternal {
   };
 };
 PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ExchangeRelDefaultTypeInternal _ExchangeRel_default_instance_;
+constexpr ExpandRel_ExpandField::ExpandRel_ExpandField(
+  ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
+  : _oneof_case_{}{}
+struct ExpandRel_ExpandFieldDefaultTypeInternal {
+  constexpr ExpandRel_ExpandFieldDefaultTypeInternal()
+    : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {}
+  ~ExpandRel_ExpandFieldDefaultTypeInternal() {}
+  union {
+    ExpandRel_ExpandField _instance;
+  };
+};
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ExpandRel_ExpandFieldDefaultTypeInternal _ExpandRel_ExpandField_default_instance_;
+constexpr ExpandRel_SwitchingField::ExpandRel_SwitchingField(
+  ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
+  : duplicates_(){}
+struct ExpandRel_SwitchingFieldDefaultTypeInternal {
+  constexpr ExpandRel_SwitchingFieldDefaultTypeInternal()
+    : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {}
+  ~ExpandRel_SwitchingFieldDefaultTypeInternal() {}
+  union {
+    ExpandRel_SwitchingField _instance;
+  };
+};
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ExpandRel_SwitchingFieldDefaultTypeInternal _ExpandRel_SwitchingField_default_instance_;
+constexpr ExpandRel::ExpandRel(
+  ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
+  : fields_()
+  , common_(nullptr)
+  , input_(nullptr){}
+struct ExpandRelDefaultTypeInternal {
+  constexpr ExpandRelDefaultTypeInternal()
+    : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {}
+  ~ExpandRelDefaultTypeInternal() {}
+  union {
+    ExpandRel _instance;
+  };
+};
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ExpandRelDefaultTypeInternal _ExpandRel_default_instance_;
 constexpr RelRoot::RelRoot(
   ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized)
   : names_()
@@ -963,6 +1041,8 @@ constexpr Expression_WindowFunction::Expression_WindowFunction(
   , phase_(0)
 
   , invocation_(0)
+
+  , bounds_type_(0)
 {}
 struct Expression_WindowFunctionDefaultTypeInternal {
   constexpr Expression_WindowFunctionDefaultTypeInternal()
@@ -1469,8 +1549,8 @@ struct AggregateFunctionDefaultTypeInternal {
 };
 PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT AggregateFunctionDefaultTypeInternal _AggregateFunction_default_instance_;
 }  // namespace substrait
-static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_substrait_2falgebra_2eproto[108];
-static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_substrait_2falgebra_2eproto[15];
+static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_substrait_2falgebra_2eproto[113];
+static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_substrait_2falgebra_2eproto[16];
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_substrait_2falgebra_2eproto = nullptr;
 
 const uint32_t TableStruct_substrait_2falgebra_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
@@ -1685,6 +1765,33 @@ const uint32_t TableStruct_substrait_2falgebra_2eproto::offsets[] PROTOBUF_SECTI
   PROTOBUF_FIELD_OFFSET(::substrait::AggregateRel, measures_),
   PROTOBUF_FIELD_OFFSET(::substrait::AggregateRel, advanced_extension_),
   ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  ~0u,  // no _inlined_string_donated_
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, function_reference_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, arguments_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, options_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, output_type_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, phase_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, invocation_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, lower_bound_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, upper_bound_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel_WindowRelFunction, bounds_type_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  ~0u,  // no _inlined_string_donated_
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, common_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, input_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, window_functions_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, partition_expressions_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, sorts_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ConsistentPartitionWindowRel, advanced_extension_),
+  ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::substrait::SortRel, _internal_metadata_),
   ~0u,  // no _extensions_
   ~0u,  // no _oneof_case_
@@ -1803,6 +1910,31 @@ const uint32_t TableStruct_substrait_2falgebra_2eproto::offsets[] PROTOBUF_SECTI
   PROTOBUF_FIELD_OFFSET(::substrait::ExchangeRel, advanced_extension_),
   PROTOBUF_FIELD_OFFSET(::substrait::ExchangeRel, exchange_kind_),
   ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel_ExpandField, _internal_metadata_),
+  ~0u,  // no _extensions_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel_ExpandField, _oneof_case_[0]),
+  ~0u,  // no _weak_field_map_
+  ~0u,  // no _inlined_string_donated_
+  ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
+  ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel_ExpandField, field_type_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel_SwitchingField, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  ~0u,  // no _inlined_string_donated_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel_SwitchingField, duplicates_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  ~0u,  // no _inlined_string_donated_
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel, common_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel, input_),
+  PROTOBUF_FIELD_OFFSET(::substrait::ExpandRel, fields_),
+  ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::substrait::RelRoot, _internal_metadata_),
   ~0u,  // no _extensions_
   ~0u,  // no _oneof_case_
@@ -1830,6 +1962,9 @@ const uint32_t TableStruct_substrait_2falgebra_2eproto::offsets[] PROTOBUF_SECTI
   ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
   ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
   ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
+  ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
+  ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
+  ::PROTOBUF_NAMESPACE_ID::internal::kInvalidFieldOffsetTag,
   PROTOBUF_FIELD_OFFSET(::substrait::Rel, rel_type_),
   ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::substrait::NamedObjectWrite, _internal_metadata_),
@@ -2145,6 +2280,7 @@ const uint32_t TableStruct_substrait_2falgebra_2eproto::offsets[] PROTOBUF_SECTI
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, sorts_),
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, invocation_),
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, partitions_),
+  PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, bounds_type_),
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, lower_bound_),
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, upper_bound_),
   PROTOBUF_FIELD_OFFSET(::substrait::Expression_WindowFunction, args_),
@@ -2508,91 +2644,96 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOB
   { 184, -1, -1, sizeof(::substrait::AggregateRel_Grouping)},
   { 191, -1, -1, sizeof(::substrait::AggregateRel_Measure)},
   { 199, -1, -1, sizeof(::substrait::AggregateRel)},
-  { 210, -1, -1, sizeof(::substrait::SortRel)},
-  { 220, -1, -1, sizeof(::substrait::FilterRel)},
-  { 230, -1, -1, sizeof(::substrait::SetRel)},
-  { 240, -1, -1, sizeof(::substrait::ExtensionSingleRel)},
-  { 249, -1, -1, sizeof(::substrait::ExtensionLeafRel)},
-  { 257, -1, -1, sizeof(::substrait::ExtensionMultiRel)},
-  { 266, -1, -1, sizeof(::substrait::ExchangeRel_ScatterFields)},
-  { 273, -1, -1, sizeof(::substrait::ExchangeRel_SingleBucketExpression)},
-  { 280, -1, -1, sizeof(::substrait::ExchangeRel_MultiBucketExpression)},
-  { 288, -1, -1, sizeof(::substrait::ExchangeRel_Broadcast)},
-  { 294, -1, -1, sizeof(::substrait::ExchangeRel_RoundRobin)},
-  { 301, -1, -1, sizeof(::substrait::ExchangeRel_ExchangeTarget)},
-  { 311, -1, -1, sizeof(::substrait::ExchangeRel)},
-  { 328, -1, -1, sizeof(::substrait::RelRoot)},
-  { 336, -1, -1, sizeof(::substrait::Rel)},
-  { 357, -1, -1, sizeof(::substrait::NamedObjectWrite)},
-  { 365, -1, -1, sizeof(::substrait::ExtensionObject)},
-  { 372, -1, -1, sizeof(::substrait::DdlRel)},
-  { 386, -1, -1, sizeof(::substrait::WriteRel)},
-  { 399, -1, -1, sizeof(::substrait::HashJoinRel)},
-  { 413, -1, -1, sizeof(::substrait::MergeJoinRel)},
-  { 427, -1, -1, sizeof(::substrait::FunctionArgument)},
-  { 437, -1, -1, sizeof(::substrait::FunctionOption)},
-  { 445, -1, -1, sizeof(::substrait::Expression_Enum_Empty)},
-  { 451, -1, -1, sizeof(::substrait::Expression_Enum)},
-  { 460, -1, -1, sizeof(::substrait::Expression_Literal_VarChar)},
-  { 468, -1, -1, sizeof(::substrait::Expression_Literal_Decimal)},
-  { 477, -1, -1, sizeof(::substrait::Expression_Literal_Map_KeyValue)},
-  { 485, -1, -1, sizeof(::substrait::Expression_Literal_Map)},
-  { 492, -1, -1, sizeof(::substrait::Expression_Literal_IntervalYearToMonth)},
-  { 500, -1, -1, sizeof(::substrait::Expression_Literal_IntervalDayToSecond)},
-  { 509, -1, -1, sizeof(::substrait::Expression_Literal_Struct)},
-  { 516, -1, -1, sizeof(::substrait::Expression_Literal_List)},
-  { 523, -1, -1, sizeof(::substrait::Expression_Literal_UserDefined)},
-  { 532, -1, -1, sizeof(::substrait::Expression_Literal)},
-  { 568, -1, -1, sizeof(::substrait::Expression_Nested_Map_KeyValue)},
-  { 576, -1, -1, sizeof(::substrait::Expression_Nested_Map)},
-  { 583, -1, -1, sizeof(::substrait::Expression_Nested_Struct)},
-  { 590, -1, -1, sizeof(::substrait::Expression_Nested_List)},
-  { 597, -1, -1, sizeof(::substrait::Expression_Nested)},
-  { 609, -1, -1, sizeof(::substrait::Expression_ScalarFunction)},
-  { 620, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Preceding)},
-  { 627, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Following)},
-  { 634, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_CurrentRow)},
-  { 640, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Unbounded)},
-  { 646, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound)},
-  { 657, -1, -1, sizeof(::substrait::Expression_WindowFunction)},
-  { 674, -1, -1, sizeof(::substrait::Expression_IfThen_IfClause)},
-  { 682, -1, -1, sizeof(::substrait::Expression_IfThen)},
-  { 690, -1, -1, sizeof(::substrait::Expression_Cast)},
-  { 699, -1, -1, sizeof(::substrait::Expression_SwitchExpression_IfValue)},
-  { 707, -1, -1, sizeof(::substrait::Expression_SwitchExpression)},
-  { 716, -1, -1, sizeof(::substrait::Expression_SingularOrList)},
-  { 724, -1, -1, sizeof(::substrait::Expression_MultiOrList_Record)},
-  { 731, -1, -1, sizeof(::substrait::Expression_MultiOrList)},
-  { 739, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction_PythonPickleFunction)},
-  { 747, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction_WebAssemblyFunction)},
-  { 755, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction)},
-  { 766, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_MapKey)},
-  { 774, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_StructField)},
-  { 782, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_ListElement)},
-  { 790, -1, -1, sizeof(::substrait::Expression_ReferenceSegment)},
-  { 800, -1, -1, sizeof(::substrait::Expression_MaskExpression_Select)},
-  { 810, -1, -1, sizeof(::substrait::Expression_MaskExpression_StructSelect)},
-  { 817, -1, -1, sizeof(::substrait::Expression_MaskExpression_StructItem)},
-  { 825, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem_ListElement)},
-  { 832, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice)},
-  { 840, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem)},
-  { 849, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect)},
-  { 857, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect_MapKey)},
-  { 864, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect_MapKeyExpression)},
-  { 871, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect)},
-  { 881, -1, -1, sizeof(::substrait::Expression_MaskExpression)},
-  { 889, -1, -1, sizeof(::substrait::Expression_FieldReference_RootReference)},
-  { 895, -1, -1, sizeof(::substrait::Expression_FieldReference_OuterReference)},
-  { 902, -1, -1, sizeof(::substrait::Expression_FieldReference)},
-  { 915, -1, -1, sizeof(::substrait::Expression_Subquery_Scalar)},
-  { 922, -1, -1, sizeof(::substrait::Expression_Subquery_InPredicate)},
-  { 930, -1, -1, sizeof(::substrait::Expression_Subquery_SetPredicate)},
-  { 938, -1, -1, sizeof(::substrait::Expression_Subquery_SetComparison)},
-  { 948, -1, -1, sizeof(::substrait::Expression_Subquery)},
-  { 959, -1, -1, sizeof(::substrait::Expression)},
-  { 978, -1, -1, sizeof(::substrait::SortField)},
-  { 988, -1, -1, sizeof(::substrait::AggregateFunction_ReferenceRel)},
-  { 995, -1, -1, sizeof(::substrait::AggregateFunction)},
+  { 210, -1, -1, sizeof(::substrait::ConsistentPartitionWindowRel_WindowRelFunction)},
+  { 225, -1, -1, sizeof(::substrait::ConsistentPartitionWindowRel)},
+  { 237, -1, -1, sizeof(::substrait::SortRel)},
+  { 247, -1, -1, sizeof(::substrait::FilterRel)},
+  { 257, -1, -1, sizeof(::substrait::SetRel)},
+  { 267, -1, -1, sizeof(::substrait::ExtensionSingleRel)},
+  { 276, -1, -1, sizeof(::substrait::ExtensionLeafRel)},
+  { 284, -1, -1, sizeof(::substrait::ExtensionMultiRel)},
+  { 293, -1, -1, sizeof(::substrait::ExchangeRel_ScatterFields)},
+  { 300, -1, -1, sizeof(::substrait::ExchangeRel_SingleBucketExpression)},
+  { 307, -1, -1, sizeof(::substrait::ExchangeRel_MultiBucketExpression)},
+  { 315, -1, -1, sizeof(::substrait::ExchangeRel_Broadcast)},
+  { 321, -1, -1, sizeof(::substrait::ExchangeRel_RoundRobin)},
+  { 328, -1, -1, sizeof(::substrait::ExchangeRel_ExchangeTarget)},
+  { 338, -1, -1, sizeof(::substrait::ExchangeRel)},
+  { 355, -1, -1, sizeof(::substrait::ExpandRel_ExpandField)},
+  { 364, -1, -1, sizeof(::substrait::ExpandRel_SwitchingField)},
+  { 371, -1, -1, sizeof(::substrait::ExpandRel)},
+  { 380, -1, -1, sizeof(::substrait::RelRoot)},
+  { 388, -1, -1, sizeof(::substrait::Rel)},
+  { 412, -1, -1, sizeof(::substrait::NamedObjectWrite)},
+  { 420, -1, -1, sizeof(::substrait::ExtensionObject)},
+  { 427, -1, -1, sizeof(::substrait::DdlRel)},
+  { 441, -1, -1, sizeof(::substrait::WriteRel)},
+  { 454, -1, -1, sizeof(::substrait::HashJoinRel)},
+  { 468, -1, -1, sizeof(::substrait::MergeJoinRel)},
+  { 482, -1, -1, sizeof(::substrait::FunctionArgument)},
+  { 492, -1, -1, sizeof(::substrait::FunctionOption)},
+  { 500, -1, -1, sizeof(::substrait::Expression_Enum_Empty)},
+  { 506, -1, -1, sizeof(::substrait::Expression_Enum)},
+  { 515, -1, -1, sizeof(::substrait::Expression_Literal_VarChar)},
+  { 523, -1, -1, sizeof(::substrait::Expression_Literal_Decimal)},
+  { 532, -1, -1, sizeof(::substrait::Expression_Literal_Map_KeyValue)},
+  { 540, -1, -1, sizeof(::substrait::Expression_Literal_Map)},
+  { 547, -1, -1, sizeof(::substrait::Expression_Literal_IntervalYearToMonth)},
+  { 555, -1, -1, sizeof(::substrait::Expression_Literal_IntervalDayToSecond)},
+  { 564, -1, -1, sizeof(::substrait::Expression_Literal_Struct)},
+  { 571, -1, -1, sizeof(::substrait::Expression_Literal_List)},
+  { 578, -1, -1, sizeof(::substrait::Expression_Literal_UserDefined)},
+  { 587, -1, -1, sizeof(::substrait::Expression_Literal)},
+  { 623, -1, -1, sizeof(::substrait::Expression_Nested_Map_KeyValue)},
+  { 631, -1, -1, sizeof(::substrait::Expression_Nested_Map)},
+  { 638, -1, -1, sizeof(::substrait::Expression_Nested_Struct)},
+  { 645, -1, -1, sizeof(::substrait::Expression_Nested_List)},
+  { 652, -1, -1, sizeof(::substrait::Expression_Nested)},
+  { 664, -1, -1, sizeof(::substrait::Expression_ScalarFunction)},
+  { 675, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Preceding)},
+  { 682, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Following)},
+  { 689, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_CurrentRow)},
+  { 695, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound_Unbounded)},
+  { 701, -1, -1, sizeof(::substrait::Expression_WindowFunction_Bound)},
+  { 712, -1, -1, sizeof(::substrait::Expression_WindowFunction)},
+  { 730, -1, -1, sizeof(::substrait::Expression_IfThen_IfClause)},
+  { 738, -1, -1, sizeof(::substrait::Expression_IfThen)},
+  { 746, -1, -1, sizeof(::substrait::Expression_Cast)},
+  { 755, -1, -1, sizeof(::substrait::Expression_SwitchExpression_IfValue)},
+  { 763, -1, -1, sizeof(::substrait::Expression_SwitchExpression)},
+  { 772, -1, -1, sizeof(::substrait::Expression_SingularOrList)},
+  { 780, -1, -1, sizeof(::substrait::Expression_MultiOrList_Record)},
+  { 787, -1, -1, sizeof(::substrait::Expression_MultiOrList)},
+  { 795, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction_PythonPickleFunction)},
+  { 803, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction_WebAssemblyFunction)},
+  { 811, -1, -1, sizeof(::substrait::Expression_EmbeddedFunction)},
+  { 822, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_MapKey)},
+  { 830, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_StructField)},
+  { 838, -1, -1, sizeof(::substrait::Expression_ReferenceSegment_ListElement)},
+  { 846, -1, -1, sizeof(::substrait::Expression_ReferenceSegment)},
+  { 856, -1, -1, sizeof(::substrait::Expression_MaskExpression_Select)},
+  { 866, -1, -1, sizeof(::substrait::Expression_MaskExpression_StructSelect)},
+  { 873, -1, -1, sizeof(::substrait::Expression_MaskExpression_StructItem)},
+  { 881, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem_ListElement)},
+  { 888, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice)},
+  { 896, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect_ListSelectItem)},
+  { 905, -1, -1, sizeof(::substrait::Expression_MaskExpression_ListSelect)},
+  { 913, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect_MapKey)},
+  { 920, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect_MapKeyExpression)},
+  { 927, -1, -1, sizeof(::substrait::Expression_MaskExpression_MapSelect)},
+  { 937, -1, -1, sizeof(::substrait::Expression_MaskExpression)},
+  { 945, -1, -1, sizeof(::substrait::Expression_FieldReference_RootReference)},
+  { 951, -1, -1, sizeof(::substrait::Expression_FieldReference_OuterReference)},
+  { 958, -1, -1, sizeof(::substrait::Expression_FieldReference)},
+  { 971, -1, -1, sizeof(::substrait::Expression_Subquery_Scalar)},
+  { 978, -1, -1, sizeof(::substrait::Expression_Subquery_InPredicate)},
+  { 986, -1, -1, sizeof(::substrait::Expression_Subquery_SetPredicate)},
+  { 994, -1, -1, sizeof(::substrait::Expression_Subquery_SetComparison)},
+  { 1004, -1, -1, sizeof(::substrait::Expression_Subquery)},
+  { 1015, -1, -1, sizeof(::substrait::Expression)},
+  { 1034, -1, -1, sizeof(::substrait::SortField)},
+  { 1044, -1, -1, sizeof(::substrait::AggregateFunction_ReferenceRel)},
+  { 1051, -1, -1, sizeof(::substrait::AggregateFunction)},
 };
 
 static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = {
@@ -2619,6 +2760,8 @@ static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] =
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_AggregateRel_Grouping_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_AggregateRel_Measure_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_AggregateRel_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ConsistentPartitionWindowRel_WindowRelFunction_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ConsistentPartitionWindowRel_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_SortRel_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_FilterRel_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_SetRel_default_instance_),
@@ -2632,6 +2775,9 @@ static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] =
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExchangeRel_RoundRobin_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExchangeRel_ExchangeTarget_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExchangeRel_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExpandRel_ExpandField_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExpandRel_SwitchingField_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_ExpandRel_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_RelRoot_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_Rel_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::substrait::_NamedObjectWrite_default_instance_),
@@ -2802,398 +2948,436 @@ const char descriptor_table_protodef_substrait_2falgebra_2eproto[] PROTOBUF_SECT
   "ing_expressions\030\001 \003(\0132\025.substrait.Expres"
   "sion\032_\n\007Measure\022-\n\007measure\030\001 \001(\0132\034.subst"
   "rait.AggregateFunction\022%\n\006filter\030\002 \001(\0132\025"
-  ".substrait.Expression\"\270\001\n\007SortRel\022$\n\006com"
-  "mon\030\001 \001(\0132\024.substrait.RelCommon\022\035\n\005input"
-  "\030\002 \001(\0132\016.substrait.Rel\022#\n\005sorts\030\003 \003(\0132\024."
+  ".substrait.Expression\"\310\006\n\034ConsistentPart"
+  "itionWindowRel\022$\n\006common\030\001 \001(\0132\024.substra"
+  "it.RelCommon\022\035\n\005input\030\002 \001(\0132\016.substrait."
+  "Rel\022S\n\020window_functions\030\003 \003(\01329.substrai"
+  "t.ConsistentPartitionWindowRel.WindowRel"
+  "Function\0224\n\025partition_expressions\030\004 \003(\0132"
+  "\025.substrait.Expression\022#\n\005sorts\030\005 \003(\0132\024."
   "substrait.SortField\022C\n\022advanced_extensio"
   "n\030\n \001(\0132\'.substrait.extensions.AdvancedE"
-  "xtension\"\277\001\n\tFilterRel\022$\n\006common\030\001 \001(\0132\024"
-  ".substrait.RelCommon\022\035\n\005input\030\002 \001(\0132\016.su"
-  "bstrait.Rel\022(\n\tcondition\030\003 \001(\0132\025.substra"
-  "it.Expression\022C\n\022advanced_extension\030\n \001("
-  "\0132\'.substrait.extensions.AdvancedExtensi"
-  "on\"\203\003\n\006SetRel\022$\n\006common\030\001 \001(\0132\024.substrai"
-  "t.RelCommon\022\036\n\006inputs\030\002 \003(\0132\016.substrait."
-  "Rel\022#\n\002op\030\003 \001(\0162\027.substrait.SetRel.SetOp"
-  "\022C\n\022advanced_extension\030\n \001(\0132\'.substrait"
-  ".extensions.AdvancedExtension\"\310\001\n\005SetOp\022"
-  "\026\n\022SET_OP_UNSPECIFIED\020\000\022\030\n\024SET_OP_MINUS_"
-  "PRIMARY\020\001\022\031\n\025SET_OP_MINUS_MULTISET\020\002\022\037\n\033"
-  "SET_OP_INTERSECTION_PRIMARY\020\003\022 \n\034SET_OP_"
-  "INTERSECTION_MULTISET\020\004\022\031\n\025SET_OP_UNION_"
-  "DISTINCT\020\005\022\024\n\020SET_OP_UNION_ALL\020\006\"\177\n\022Exte"
-  "nsionSingleRel\022$\n\006common\030\001 \001(\0132\024.substra"
-  "it.RelCommon\022\035\n\005input\030\002 \001(\0132\016.substrait."
-  "Rel\022$\n\006detail\030\003 \001(\0132\024.google.protobuf.An"
-  "y\"^\n\020ExtensionLeafRel\022$\n\006common\030\001 \001(\0132\024."
-  "substrait.RelCommon\022$\n\006detail\030\002 \001(\0132\024.go"
-  "ogle.protobuf.Any\"\177\n\021ExtensionMultiRel\022$"
-  "\n\006common\030\001 \001(\0132\024.substrait.RelCommon\022\036\n\006"
-  "inputs\030\002 \003(\0132\016.substrait.Rel\022$\n\006detail\030\003"
-  " \001(\0132\024.google.protobuf.Any\"\303\007\n\013ExchangeR"
-  "el\022$\n\006common\030\001 \001(\0132\024.substrait.RelCommon"
-  "\022\035\n\005input\030\002 \001(\0132\016.substrait.Rel\022\027\n\017parti"
-  "tion_count\030\003 \001(\005\0226\n\007targets\030\004 \003(\0132%.subs"
-  "trait.ExchangeRel.ExchangeTarget\022A\n\021scat"
-  "ter_by_fields\030\005 \001(\0132$.substrait.Exchange"
-  "Rel.ScatterFieldsH\000\022F\n\rsingle_target\030\006 \001"
-  "(\0132-.substrait.ExchangeRel.SingleBucketE"
-  "xpressionH\000\022D\n\014multi_target\030\007 \001(\0132,.subs"
-  "trait.ExchangeRel.MultiBucketExpressionH"
-  "\000\0228\n\013round_robin\030\010 \001(\0132!.substrait.Excha"
-  "ngeRel.RoundRobinH\000\0225\n\tbroadcast\030\t \001(\0132 "
-  ".substrait.ExchangeRel.BroadcastH\000\022C\n\022ad"
-  "vanced_extension\030\n \001(\0132\'.substrait.exten"
-  "sions.AdvancedExtension\032E\n\rScatterFields"
-  "\0224\n\006fields\030\001 \003(\0132$.substrait.Expression."
-  "FieldReference\032C\n\026SingleBucketExpression"
-  "\022)\n\nexpression\030\001 \001(\0132\025.substrait.Express"
-  "ion\032`\n\025MultiBucketExpression\022)\n\nexpressi"
-  "on\030\001 \001(\0132\025.substrait.Expression\022\034\n\024const"
-  "rained_to_count\030\002 \001(\010\032\013\n\tBroadcast\032\033\n\nRo"
-  "undRobin\022\r\n\005exact\030\001 \001(\010\032n\n\016ExchangeTarge"
-  "t\022\024\n\014partition_id\030\001 \003(\005\022\r\n\003uri\030\002 \001(\tH\000\022("
-  "\n\010extended\030\003 \001(\0132\024.google.protobuf.AnyH\000"
-  "B\r\n\013target_typeB\017\n\rexchange_kind\"7\n\007RelR"
-  "oot\022\035\n\005input\030\001 \001(\0132\016.substrait.Rel\022\r\n\005na"
-  "mes\030\002 \003(\t\"\362\004\n\003Rel\022\"\n\004read\030\001 \001(\0132\022.substr"
-  "ait.ReadRelH\000\022&\n\006filter\030\002 \001(\0132\024.substrai"
-  "t.FilterRelH\000\022$\n\005fetch\030\003 \001(\0132\023.substrait"
-  ".FetchRelH\000\022,\n\taggregate\030\004 \001(\0132\027.substra"
-  "it.AggregateRelH\000\022\"\n\004sort\030\005 \001(\0132\022.substr"
-  "ait.SortRelH\000\022\"\n\004join\030\006 \001(\0132\022.substrait."
-  "JoinRelH\000\022(\n\007project\030\007 \001(\0132\025.substrait.P"
-  "rojectRelH\000\022 \n\003set\030\010 \001(\0132\021.substrait.Set"
-  "RelH\000\0229\n\020extension_single\030\t \001(\0132\035.substr"
-  "ait.ExtensionSingleRelH\000\0227\n\017extension_mu"
-  "lti\030\n \001(\0132\034.substrait.ExtensionMultiRelH"
-  "\000\0225\n\016extension_leaf\030\013 \001(\0132\033.substrait.Ex"
-  "tensionLeafRelH\000\022$\n\005cross\030\014 \001(\0132\023.substr"
-  "ait.CrossRelH\000\022+\n\thash_join\030\r \001(\0132\026.subs"
-  "trait.HashJoinRelH\000\022-\n\nmerge_join\030\016 \001(\0132"
-  "\027.substrait.MergeJoinRelH\000B\n\n\010rel_type\"f"
-  "\n\020NamedObjectWrite\022\r\n\005names\030\001 \003(\t\022C\n\022adv"
-  "anced_extension\030\n \001(\0132\'.substrait.extens"
-  "ions.AdvancedExtension\"7\n\017ExtensionObjec"
-  "t\022$\n\006detail\030\001 \001(\0132\024.google.protobuf.Any\""
-  "\316\004\n\006DdlRel\0223\n\014named_object\030\001 \001(\0132\033.subst"
-  "rait.NamedObjectWriteH\000\0226\n\020extension_obj"
-  "ect\030\002 \001(\0132\032.substrait.ExtensionObjectH\000\022"
-  ",\n\014table_schema\030\003 \001(\0132\026.substrait.NamedS"
-  "truct\022<\n\016table_defaults\030\004 \001(\0132$.substrai"
-  "t.Expression.Literal.Struct\022+\n\006object\030\005 "
-  "\001(\0162\033.substrait.DdlRel.DdlObject\022#\n\002op\030\006"
-  " \001(\0162\027.substrait.DdlRel.DdlOp\022\'\n\017view_de"
-  "finition\030\007 \001(\0132\016.substrait.Rel\"R\n\tDdlObj"
-  "ect\022\032\n\026DDL_OBJECT_UNSPECIFIED\020\000\022\024\n\020DDL_O"
-  "BJECT_TABLE\020\001\022\023\n\017DDL_OBJECT_VIEW\020\002\"\215\001\n\005D"
-  "dlOp\022\026\n\022DDL_OP_UNSPECIFIED\020\000\022\021\n\rDDL_OP_C"
-  "REATE\020\001\022\034\n\030DDL_OP_CREATE_OR_REPLACE\020\002\022\020\n"
-  "\014DDL_OP_ALTER\020\003\022\017\n\013DDL_OP_DROP\020\004\022\030\n\024DDL_"
-  "OP_DROP_IF_EXIST\020\005B\014\n\nwrite_type\"\207\004\n\010Wri"
-  "teRel\0222\n\013named_table\030\001 \001(\0132\033.substrait.N"
-  "amedObjectWriteH\000\0225\n\017extension_table\030\002 \001"
-  "(\0132\032.substrait.ExtensionObjectH\000\022,\n\014tabl"
-  "e_schema\030\003 \001(\0132\026.substrait.NamedStruct\022\'"
-  "\n\002op\030\004 \001(\0162\033.substrait.WriteRel.WriteOp\022"
-  "\035\n\005input\030\005 \001(\0132\016.substrait.Rel\022.\n\006output"
-  "\030\006 \001(\0162\036.substrait.WriteRel.OutputMode\"u"
-  "\n\007WriteOp\022\030\n\024WRITE_OP_UNSPECIFIED\020\000\022\023\n\017W"
-  "RITE_OP_INSERT\020\001\022\023\n\017WRITE_OP_DELETE\020\002\022\023\n"
-  "\017WRITE_OP_UPDATE\020\003\022\021\n\rWRITE_OP_CTAS\020\004\"e\n"
-  "\nOutputMode\022\033\n\027OUTPUT_MODE_UNSPECIFIED\020\000"
-  "\022\031\n\025OUTPUT_MODE_NO_OUTPUT\020\001\022\037\n\033OUTPUT_MO"
-  "DE_MODIFIED_TUPLES\020\002B\014\n\nwrite_type\"\351\004\n\013H"
-  "ashJoinRel\022$\n\006common\030\001 \001(\0132\024.substrait.R"
-  "elCommon\022\034\n\004left\030\002 \001(\0132\016.substrait.Rel\022\035"
-  "\n\005right\030\003 \001(\0132\016.substrait.Rel\0227\n\tleft_ke"
-  "ys\030\004 \003(\0132$.substrait.Expression.FieldRef"
-  "erence\0228\n\nright_keys\030\005 \003(\0132$.substrait.E"
-  "xpression.FieldReference\022/\n\020post_join_fi"
-  "lter\030\006 \001(\0132\025.substrait.Expression\022-\n\004typ"
-  "e\030\007 \001(\0162\037.substrait.HashJoinRel.JoinType"
-  "\022C\n\022advanced_extension\030\n \001(\0132\'.substrait"
-  ".extensions.AdvancedExtension\"\336\001\n\010JoinTy"
-  "pe\022\031\n\025JOIN_TYPE_UNSPECIFIED\020\000\022\023\n\017JOIN_TY"
-  "PE_INNER\020\001\022\023\n\017JOIN_TYPE_OUTER\020\002\022\022\n\016JOIN_"
-  "TYPE_LEFT\020\003\022\023\n\017JOIN_TYPE_RIGHT\020\004\022\027\n\023JOIN"
-  "_TYPE_LEFT_SEMI\020\005\022\030\n\024JOIN_TYPE_RIGHT_SEM"
-  "I\020\006\022\027\n\023JOIN_TYPE_LEFT_ANTI\020\007\022\030\n\024JOIN_TYP"
-  "E_RIGHT_ANTI\020\010\"\353\004\n\014MergeJoinRel\022$\n\006commo"
-  "n\030\001 \001(\0132\024.substrait.RelCommon\022\034\n\004left\030\002 "
-  "\001(\0132\016.substrait.Rel\022\035\n\005right\030\003 \001(\0132\016.sub"
-  "strait.Rel\0227\n\tleft_keys\030\004 \003(\0132$.substrai"
-  "t.Expression.FieldReference\0228\n\nright_key"
-  "s\030\005 \003(\0132$.substrait.Expression.FieldRefe"
-  "rence\022/\n\020post_join_filter\030\006 \001(\0132\025.substr"
-  "ait.Expression\022.\n\004type\030\007 \001(\0162 .substrait"
-  ".MergeJoinRel.JoinType\022C\n\022advanced_exten"
+  "xtension\032\355\003\n\021WindowRelFunction\022\032\n\022functi"
+  "on_reference\030\001 \001(\r\022.\n\targuments\030\t \003(\0132\033."
+  "substrait.FunctionArgument\022*\n\007options\030\013 "
+  "\003(\0132\031.substrait.FunctionOption\022$\n\013output"
+  "_type\030\007 \001(\0132\017.substrait.Type\022*\n\005phase\030\006 "
+  "\001(\0162\033.substrait.AggregationPhase\022F\n\ninvo"
+  "cation\030\n \001(\01622.substrait.AggregateFuncti"
+  "on.AggregationInvocation\022\?\n\013lower_bound\030"
+  "\005 \001(\0132*.substrait.Expression.WindowFunct"
+  "ion.Bound\022\?\n\013upper_bound\030\004 \001(\0132*.substra"
+  "it.Expression.WindowFunction.Bound\022D\n\013bo"
+  "unds_type\030\014 \001(\0162/.substrait.Expression.W"
+  "indowFunction.BoundsType\"\270\001\n\007SortRel\022$\n\006"
+  "common\030\001 \001(\0132\024.substrait.RelCommon\022\035\n\005in"
+  "put\030\002 \001(\0132\016.substrait.Rel\022#\n\005sorts\030\003 \003(\013"
+  "2\024.substrait.SortField\022C\n\022advanced_exten"
   "sion\030\n \001(\0132\'.substrait.extensions.Advanc"
-  "edExtension\"\336\001\n\010JoinType\022\031\n\025JOIN_TYPE_UN"
-  "SPECIFIED\020\000\022\023\n\017JOIN_TYPE_INNER\020\001\022\023\n\017JOIN"
-  "_TYPE_OUTER\020\002\022\022\n\016JOIN_TYPE_LEFT\020\003\022\023\n\017JOI"
-  "N_TYPE_RIGHT\020\004\022\027\n\023JOIN_TYPE_LEFT_SEMI\020\005\022"
-  "\030\n\024JOIN_TYPE_RIGHT_SEMI\020\006\022\027\n\023JOIN_TYPE_L"
-  "EFT_ANTI\020\007\022\030\n\024JOIN_TYPE_RIGHT_ANTI\020\010\"w\n\020"
-  "FunctionArgument\022\016\n\004enum\030\001 \001(\tH\000\022\037\n\004type"
-  "\030\002 \001(\0132\017.substrait.TypeH\000\022&\n\005value\030\003 \001(\013"
-  "2\025.substrait.ExpressionH\000B\n\n\010arg_type\"2\n"
-  "\016FunctionOption\022\014\n\004name\030\001 \001(\t\022\022\n\nprefere"
-  "nce\030\002 \003(\t\"\320E\n\nExpression\0220\n\007literal\030\001 \001("
-  "\0132\035.substrait.Expression.LiteralH\000\0229\n\tse"
-  "lection\030\002 \001(\0132$.substrait.Expression.Fie"
-  "ldReferenceH\000\022\?\n\017scalar_function\030\003 \001(\0132$"
-  ".substrait.Expression.ScalarFunctionH\000\022\?"
-  "\n\017window_function\030\005 \001(\0132$.substrait.Expr"
-  "ession.WindowFunctionH\000\022/\n\007if_then\030\006 \001(\013"
-  "2\034.substrait.Expression.IfThenH\000\022C\n\021swit"
-  "ch_expression\030\007 \001(\0132&.substrait.Expressi"
-  "on.SwitchExpressionH\000\022@\n\020singular_or_lis"
-  "t\030\010 \001(\0132$.substrait.Expression.SingularO"
-  "rListH\000\022:\n\rmulti_or_list\030\t \001(\0132!.substra"
-  "it.Expression.MultiOrListH\000\022*\n\004cast\030\013 \001("
-  "\0132\032.substrait.Expression.CastH\000\0222\n\010subqu"
-  "ery\030\014 \001(\0132\036.substrait.Expression.Subquer"
-  "yH\000\022.\n\006nested\030\r \001(\0132\034.substrait.Expressi"
-  "on.NestedH\000\022.\n\004enum\030\n \001(\0132\032.substrait.Ex"
-  "pression.EnumB\002\030\001H\000\032r\n\004Enum\022\023\n\tspecified"
-  "\030\001 \001(\tH\000\0227\n\013unspecified\030\002 \001(\0132 .substrai"
-  "t.Expression.Enum.EmptyH\000\032\013\n\005Empty:\002\030\001:\002"
-  "\030\001B\013\n\tenum_kind\032\347\014\n\007Literal\022\021\n\007boolean\030\001"
-  " \001(\010H\000\022\014\n\002i8\030\002 \001(\005H\000\022\r\n\003i16\030\003 \001(\005H\000\022\r\n\003i"
-  "32\030\005 \001(\005H\000\022\r\n\003i64\030\007 \001(\003H\000\022\016\n\004fp32\030\n \001(\002H"
-  "\000\022\016\n\004fp64\030\013 \001(\001H\000\022\020\n\006string\030\014 \001(\tH\000\022\020\n\006b"
-  "inary\030\r \001(\014H\000\022\023\n\ttimestamp\030\016 \001(\003H\000\022\016\n\004da"
-  "te\030\020 \001(\005H\000\022\016\n\004time\030\021 \001(\003H\000\022S\n\026interval_y"
-  "ear_to_month\030\023 \001(\01321.substrait.Expressio"
-  "n.Literal.IntervalYearToMonthH\000\022S\n\026inter"
-  "val_day_to_second\030\024 \001(\01321.substrait.Expr"
-  "ession.Literal.IntervalDayToSecondH\000\022\024\n\n"
-  "fixed_char\030\025 \001(\tH\000\0229\n\010var_char\030\026 \001(\0132%.s"
-  "ubstrait.Expression.Literal.VarCharH\000\022\026\n"
-  "\014fixed_binary\030\027 \001(\014H\000\0228\n\007decimal\030\030 \001(\0132%"
-  ".substrait.Expression.Literal.DecimalH\000\022"
-  "6\n\006struct\030\031 \001(\0132$.substrait.Expression.L"
-  "iteral.StructH\000\0220\n\003map\030\032 \001(\0132!.substrait"
-  ".Expression.Literal.MapH\000\022\026\n\014timestamp_t"
-  "z\030\033 \001(\003H\000\022\016\n\004uuid\030\034 \001(\014H\000\022\037\n\004null\030\035 \001(\0132"
-  "\017.substrait.TypeH\000\0222\n\004list\030\036 \001(\0132\".subst"
-  "rait.Expression.Literal.ListH\000\022*\n\nempty_"
-  "list\030\037 \001(\0132\024.substrait.Type.ListH\000\022(\n\tem"
-  "pty_map\030  \001(\0132\023.substrait.Type.MapH\000\022A\n\014"
-  "user_defined\030! \001(\0132).substrait.Expressio"
-  "n.Literal.UserDefinedH\000\022\020\n\010nullable\0302 \001("
-  "\010\022 \n\030type_variation_reference\0303 \001(\r\032(\n\007V"
-  "arChar\022\r\n\005value\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\032:\n"
-  "\007Decimal\022\r\n\005value\030\001 \001(\014\022\021\n\tprecision\030\002 \001"
-  "(\005\022\r\n\005scale\030\003 \001(\005\032\253\001\n\003Map\022>\n\nkey_values\030"
-  "\001 \003(\0132*.substrait.Expression.Literal.Map"
-  ".KeyValue\032d\n\010KeyValue\022*\n\003key\030\001 \001(\0132\035.sub"
-  "strait.Expression.Literal\022,\n\005value\030\002 \001(\013"
-  "2\035.substrait.Expression.Literal\0324\n\023Inter"
-  "valYearToMonth\022\r\n\005years\030\001 \001(\005\022\016\n\006months\030"
-  "\002 \001(\005\032J\n\023IntervalDayToSecond\022\014\n\004days\030\001 \001"
-  "(\005\022\017\n\007seconds\030\002 \001(\005\022\024\n\014microseconds\030\003 \001("
-  "\005\0327\n\006Struct\022-\n\006fields\030\001 \003(\0132\035.substrait."
-  "Expression.Literal\0325\n\004List\022-\n\006values\030\001 \003"
-  "(\0132\035.substrait.Expression.Literal\032~\n\013Use"
-  "rDefined\022\026\n\016type_reference\030\001 \001(\r\0222\n\017type"
-  "_parameters\030\003 \003(\0132\031.substrait.Type.Param"
-  "eter\022#\n\005value\030\002 \001(\0132\024.google.protobuf.An"
-  "yB\016\n\014literal_type\032\343\003\n\006Nested\022\020\n\010nullable"
-  "\030\001 \001(\010\022 \n\030type_variation_reference\030\002 \001(\r"
-  "\0225\n\006struct\030\003 \001(\0132#.substrait.Expression."
-  "Nested.StructH\000\0221\n\004list\030\004 \001(\0132!.substrai"
-  "t.Expression.Nested.ListH\000\022/\n\003map\030\005 \001(\0132"
-  " .substrait.Expression.Nested.MapH\000\032\232\001\n\003"
-  "Map\022=\n\nkey_values\030\001 \003(\0132).substrait.Expr"
-  "ession.Nested.Map.KeyValue\032T\n\010KeyValue\022\""
-  "\n\003key\030\001 \001(\0132\025.substrait.Expression\022$\n\005va"
-  "lue\030\002 \001(\0132\025.substrait.Expression\032/\n\006Stru"
-  "ct\022%\n\006fields\030\001 \003(\0132\025.substrait.Expressio"
-  "n\032-\n\004List\022%\n\006values\030\001 \003(\0132\025.substrait.Ex"
-  "pressionB\r\n\013nested_type\032\327\001\n\016ScalarFuncti"
-  "on\022\032\n\022function_reference\030\001 \001(\r\022.\n\targume"
-  "nts\030\004 \003(\0132\033.substrait.FunctionArgument\022*"
-  "\n\007options\030\005 \003(\0132\031.substrait.FunctionOpti"
-  "on\022$\n\013output_type\030\003 \001(\0132\017.substrait.Type"
-  "\022\'\n\004args\030\002 \003(\0132\025.substrait.ExpressionB\002\030"
-  "\001\032\263\007\n\016WindowFunction\022\032\n\022function_referen"
-  "ce\030\001 \001(\r\022.\n\targuments\030\t \003(\0132\033.substrait."
-  "FunctionArgument\022*\n\007options\030\013 \003(\0132\031.subs"
-  "trait.FunctionOption\022$\n\013output_type\030\007 \001("
-  "\0132\017.substrait.Type\022*\n\005phase\030\006 \001(\0162\033.subs"
-  "trait.AggregationPhase\022#\n\005sorts\030\003 \003(\0132\024."
-  "substrait.SortField\022F\n\ninvocation\030\n \001(\0162"
-  "2.substrait.AggregateFunction.Aggregatio"
-  "nInvocation\022)\n\npartitions\030\002 \003(\0132\025.substr"
-  "ait.Expression\022\?\n\013lower_bound\030\005 \001(\0132*.su"
-  "bstrait.Expression.WindowFunction.Bound\022"
-  "\?\n\013upper_bound\030\004 \001(\0132*.substrait.Express"
-  "ion.WindowFunction.Bound\022\'\n\004args\030\010 \003(\0132\025"
-  ".substrait.ExpressionB\002\030\001\032\223\003\n\005Bound\022I\n\tp"
-  "receding\030\001 \001(\01324.substrait.Expression.Wi"
-  "ndowFunction.Bound.PrecedingH\000\022I\n\tfollow"
-  "ing\030\002 \001(\01324.substrait.Expression.WindowF"
-  "unction.Bound.FollowingH\000\022L\n\013current_row"
-  "\030\003 \001(\01325.substrait.Expression.WindowFunc"
-  "tion.Bound.CurrentRowH\000\022I\n\tunbounded\030\004 \001"
-  "(\01324.substrait.Expression.WindowFunction"
-  ".Bound.UnboundedH\000\032\033\n\tPreceding\022\016\n\006offse"
-  "t\030\001 \001(\003\032\033\n\tFollowing\022\016\n\006offset\030\001 \001(\003\032\014\n\n"
-  "CurrentRow\032\013\n\tUnboundedB\006\n\004kind\032\265\001\n\006IfTh"
-  "en\0222\n\003ifs\030\001 \003(\0132%.substrait.Expression.I"
-  "fThen.IfClause\022#\n\004else\030\002 \001(\0132\025.substrait"
-  ".Expression\032R\n\010IfClause\022!\n\002if\030\001 \001(\0132\025.su"
-  "bstrait.Expression\022#\n\004then\030\002 \001(\0132\025.subst"
-  "rait.Expression\032\216\002\n\004Cast\022\035\n\004type\030\001 \001(\0132\017"
-  ".substrait.Type\022$\n\005input\030\002 \001(\0132\025.substra"
-  "it.Expression\022D\n\020failure_behavior\030\003 \001(\0162"
-  "*.substrait.Expression.Cast.FailureBehav"
-  "ior\"{\n\017FailureBehavior\022 \n\034FAILURE_BEHAVI"
-  "OR_UNSPECIFIED\020\000\022 \n\034FAILURE_BEHAVIOR_RET"
-  "URN_NULL\020\001\022$\n FAILURE_BEHAVIOR_THROW_EXC"
-  "EPTION\020\002\032\365\001\n\020SwitchExpression\022$\n\005match\030\003"
-  " \001(\0132\025.substrait.Expression\022;\n\003ifs\030\001 \003(\013"
-  "2..substrait.Expression.SwitchExpression"
-  ".IfValue\022#\n\004else\030\002 \001(\0132\025.substrait.Expre"
-  "ssion\032Y\n\007IfValue\022)\n\002if\030\001 \001(\0132\035.substrait"
-  ".Expression.Literal\022#\n\004then\030\002 \001(\0132\025.subs"
-  "trait.Expression\032^\n\016SingularOrList\022$\n\005va"
-  "lue\030\001 \001(\0132\025.substrait.Expression\022&\n\007opti"
-  "ons\030\002 \003(\0132\025.substrait.Expression\032\237\001\n\013Mul"
-  "tiOrList\022$\n\005value\030\001 \003(\0132\025.substrait.Expr"
-  "ession\0229\n\007options\030\002 \003(\0132(.substrait.Expr"
-  "ession.MultiOrList.Record\032/\n\006Record\022%\n\006f"
-  "ields\030\001 \003(\0132\025.substrait.Expression\032\243\003\n\020E"
-  "mbeddedFunction\022(\n\targuments\030\001 \003(\0132\025.sub"
-  "strait.Expression\022$\n\013output_type\030\002 \001(\0132\017"
-  ".substrait.Type\022]\n\026python_pickle_functio"
-  "n\030\003 \001(\0132;.substrait.Expression.EmbeddedF"
-  "unction.PythonPickleFunctionH\000\022[\n\025web_as"
-  "sembly_function\030\004 \001(\0132:.substrait.Expres"
-  "sion.EmbeddedFunction.WebAssemblyFunctio"
-  "nH\000\032>\n\024PythonPickleFunction\022\020\n\010function\030"
-  "\001 \001(\014\022\024\n\014prerequisite\030\002 \003(\t\032;\n\023WebAssemb"
-  "lyFunction\022\016\n\006script\030\001 \001(\014\022\024\n\014prerequisi"
-  "te\030\002 \003(\tB\006\n\004kind\032\232\004\n\020ReferenceSegment\022@\n"
-  "\007map_key\030\001 \001(\0132-.substrait.Expression.Re"
-  "ferenceSegment.MapKeyH\000\022J\n\014struct_field\030"
-  "\002 \001(\01322.substrait.Expression.ReferenceSe"
-  "gment.StructFieldH\000\022J\n\014list_element\030\003 \001("
-  "\01322.substrait.Expression.ReferenceSegmen"
-  "t.ListElementH\000\032o\n\006MapKey\022.\n\007map_key\030\001 \001"
-  "(\0132\035.substrait.Expression.Literal\0225\n\005chi"
-  "ld\030\002 \001(\0132&.substrait.Expression.Referenc"
-  "eSegment\032S\n\013StructField\022\r\n\005field\030\001 \001(\005\0225"
-  "\n\005child\030\002 \001(\0132&.substrait.Expression.Ref"
-  "erenceSegment\032T\n\013ListElement\022\016\n\006offset\030\001"
-  " \001(\005\0225\n\005child\030\002 \001(\0132&.substrait.Expressi"
-  "on.ReferenceSegmentB\020\n\016reference_type\032\360\t"
-  "\n\016MaskExpression\022A\n\006select\030\001 \001(\01321.subst"
-  "rait.Expression.MaskExpression.StructSel"
-  "ect\022 \n\030maintain_singular_struct\030\002 \001(\010\032\325\001"
-  "\n\006Select\022C\n\006struct\030\001 \001(\01321.substrait.Exp"
-  "ression.MaskExpression.StructSelectH\000\022\?\n"
-  "\004list\030\002 \001(\0132/.substrait.Expression.MaskE"
-  "xpression.ListSelectH\000\022=\n\003map\030\003 \001(\0132..su"
-  "bstrait.Expression.MaskExpression.MapSel"
-  "ectH\000B\006\n\004type\032U\n\014StructSelect\022E\n\014struct_"
-  "items\030\001 \003(\0132/.substrait.Expression.MaskE"
-  "xpression.StructItem\032W\n\nStructItem\022\r\n\005fi"
-  "eld\030\001 \001(\005\022:\n\005child\030\002 \001(\0132+.substrait.Exp"
-  "ression.MaskExpression.Select\032\264\003\n\nListSe"
-  "lect\022Q\n\tselection\030\001 \003(\0132>.substrait.Expr"
+  "edExtension\"\277\001\n\tFilterRel\022$\n\006common\030\001 \001("
+  "\0132\024.substrait.RelCommon\022\035\n\005input\030\002 \001(\0132\016"
+  ".substrait.Rel\022(\n\tcondition\030\003 \001(\0132\025.subs"
+  "trait.Expression\022C\n\022advanced_extension\030\n"
+  " \001(\0132\'.substrait.extensions.AdvancedExte"
+  "nsion\"\203\003\n\006SetRel\022$\n\006common\030\001 \001(\0132\024.subst"
+  "rait.RelCommon\022\036\n\006inputs\030\002 \003(\0132\016.substra"
+  "it.Rel\022#\n\002op\030\003 \001(\0162\027.substrait.SetRel.Se"
+  "tOp\022C\n\022advanced_extension\030\n \001(\0132\'.substr"
+  "ait.extensions.AdvancedExtension\"\310\001\n\005Set"
+  "Op\022\026\n\022SET_OP_UNSPECIFIED\020\000\022\030\n\024SET_OP_MIN"
+  "US_PRIMARY\020\001\022\031\n\025SET_OP_MINUS_MULTISET\020\002\022"
+  "\037\n\033SET_OP_INTERSECTION_PRIMARY\020\003\022 \n\034SET_"
+  "OP_INTERSECTION_MULTISET\020\004\022\031\n\025SET_OP_UNI"
+  "ON_DISTINCT\020\005\022\024\n\020SET_OP_UNION_ALL\020\006\"\177\n\022E"
+  "xtensionSingleRel\022$\n\006common\030\001 \001(\0132\024.subs"
+  "trait.RelCommon\022\035\n\005input\030\002 \001(\0132\016.substra"
+  "it.Rel\022$\n\006detail\030\003 \001(\0132\024.google.protobuf"
+  ".Any\"^\n\020ExtensionLeafRel\022$\n\006common\030\001 \001(\013"
+  "2\024.substrait.RelCommon\022$\n\006detail\030\002 \001(\0132\024"
+  ".google.protobuf.Any\"\177\n\021ExtensionMultiRe"
+  "l\022$\n\006common\030\001 \001(\0132\024.substrait.RelCommon\022"
+  "\036\n\006inputs\030\002 \003(\0132\016.substrait.Rel\022$\n\006detai"
+  "l\030\003 \001(\0132\024.google.protobuf.Any\"\303\007\n\013Exchan"
+  "geRel\022$\n\006common\030\001 \001(\0132\024.substrait.RelCom"
+  "mon\022\035\n\005input\030\002 \001(\0132\016.substrait.Rel\022\027\n\017pa"
+  "rtition_count\030\003 \001(\005\0226\n\007targets\030\004 \003(\0132%.s"
+  "ubstrait.ExchangeRel.ExchangeTarget\022A\n\021s"
+  "catter_by_fields\030\005 \001(\0132$.substrait.Excha"
+  "ngeRel.ScatterFieldsH\000\022F\n\rsingle_target\030"
+  "\006 \001(\0132-.substrait.ExchangeRel.SingleBuck"
+  "etExpressionH\000\022D\n\014multi_target\030\007 \001(\0132,.s"
+  "ubstrait.ExchangeRel.MultiBucketExpressi"
+  "onH\000\0228\n\013round_robin\030\010 \001(\0132!.substrait.Ex"
+  "changeRel.RoundRobinH\000\0225\n\tbroadcast\030\t \001("
+  "\0132 .substrait.ExchangeRel.BroadcastH\000\022C\n"
+  "\022advanced_extension\030\n \001(\0132\'.substrait.ex"
+  "tensions.AdvancedExtension\032E\n\rScatterFie"
+  "lds\0224\n\006fields\030\001 \003(\0132$.substrait.Expressi"
+  "on.FieldReference\032C\n\026SingleBucketExpress"
+  "ion\022)\n\nexpression\030\001 \001(\0132\025.substrait.Expr"
+  "ession\032`\n\025MultiBucketExpression\022)\n\nexpre"
+  "ssion\030\001 \001(\0132\025.substrait.Expression\022\034\n\024co"
+  "nstrained_to_count\030\002 \001(\010\032\013\n\tBroadcast\032\033\n"
+  "\nRoundRobin\022\r\n\005exact\030\001 \001(\010\032n\n\016ExchangeTa"
+  "rget\022\024\n\014partition_id\030\001 \003(\005\022\r\n\003uri\030\002 \001(\tH"
+  "\000\022(\n\010extended\030\003 \001(\0132\024.google.protobuf.An"
+  "yH\000B\r\n\013target_typeB\017\n\rexchange_kind\"\320\002\n\t"
+  "ExpandRel\022$\n\006common\030\001 \001(\0132\024.substrait.Re"
+  "lCommon\022\035\n\005input\030\002 \001(\0132\016.substrait.Rel\0220"
+  "\n\006fields\030\004 \003(\0132 .substrait.ExpandRel.Exp"
+  "andField\032\216\001\n\013ExpandField\022>\n\017switching_fi"
+  "eld\030\002 \001(\0132#.substrait.ExpandRel.Switchin"
+  "gFieldH\000\0221\n\020consistent_field\030\003 \001(\0132\025.sub"
+  "strait.ExpressionH\000B\014\n\nfield_type\032;\n\016Swi"
+  "tchingField\022)\n\nduplicates\030\001 \003(\0132\025.substr"
+  "ait.Expression\"7\n\007RelRoot\022\035\n\005input\030\001 \001(\013"
+  "2\016.substrait.Rel\022\r\n\005names\030\002 \003(\t\"\201\006\n\003Rel\022"
+  "\"\n\004read\030\001 \001(\0132\022.substrait.ReadRelH\000\022&\n\006f"
+  "ilter\030\002 \001(\0132\024.substrait.FilterRelH\000\022$\n\005f"
+  "etch\030\003 \001(\0132\023.substrait.FetchRelH\000\022,\n\tagg"
+  "regate\030\004 \001(\0132\027.substrait.AggregateRelH\000\022"
+  "\"\n\004sort\030\005 \001(\0132\022.substrait.SortRelH\000\022\"\n\004j"
+  "oin\030\006 \001(\0132\022.substrait.JoinRelH\000\022(\n\007proje"
+  "ct\030\007 \001(\0132\025.substrait.ProjectRelH\000\022 \n\003set"
+  "\030\010 \001(\0132\021.substrait.SetRelH\000\0229\n\020extension"
+  "_single\030\t \001(\0132\035.substrait.ExtensionSingl"
+  "eRelH\000\0227\n\017extension_multi\030\n \001(\0132\034.substr"
+  "ait.ExtensionMultiRelH\000\0225\n\016extension_lea"
+  "f\030\013 \001(\0132\033.substrait.ExtensionLeafRelH\000\022$"
+  "\n\005cross\030\014 \001(\0132\023.substrait.CrossRelH\000\022+\n\t"
+  "hash_join\030\r \001(\0132\026.substrait.HashJoinRelH"
+  "\000\022-\n\nmerge_join\030\016 \001(\0132\027.substrait.MergeJ"
+  "oinRelH\000\0229\n\006window\030\021 \001(\0132\'.substrait.Con"
+  "sistentPartitionWindowRelH\000\022*\n\010exchange\030"
+  "\017 \001(\0132\026.substrait.ExchangeRelH\000\022&\n\006expan"
+  "d\030\020 \001(\0132\024.substrait.ExpandRelH\000B\n\n\010rel_t"
+  "ype\"f\n\020NamedObjectWrite\022\r\n\005names\030\001 \003(\t\022C"
+  "\n\022advanced_extension\030\n \001(\0132\'.substrait.e"
+  "xtensions.AdvancedExtension\"7\n\017Extension"
+  "Object\022$\n\006detail\030\001 \001(\0132\024.google.protobuf"
+  ".Any\"\316\004\n\006DdlRel\0223\n\014named_object\030\001 \001(\0132\033."
+  "substrait.NamedObjectWriteH\000\0226\n\020extensio"
+  "n_object\030\002 \001(\0132\032.substrait.ExtensionObje"
+  "ctH\000\022,\n\014table_schema\030\003 \001(\0132\026.substrait.N"
+  "amedStruct\022<\n\016table_defaults\030\004 \001(\0132$.sub"
+  "strait.Expression.Literal.Struct\022+\n\006obje"
+  "ct\030\005 \001(\0162\033.substrait.DdlRel.DdlObject\022#\n"
+  "\002op\030\006 \001(\0162\027.substrait.DdlRel.DdlOp\022\'\n\017vi"
+  "ew_definition\030\007 \001(\0132\016.substrait.Rel\"R\n\tD"
+  "dlObject\022\032\n\026DDL_OBJECT_UNSPECIFIED\020\000\022\024\n\020"
+  "DDL_OBJECT_TABLE\020\001\022\023\n\017DDL_OBJECT_VIEW\020\002\""
+  "\215\001\n\005DdlOp\022\026\n\022DDL_OP_UNSPECIFIED\020\000\022\021\n\rDDL"
+  "_OP_CREATE\020\001\022\034\n\030DDL_OP_CREATE_OR_REPLACE"
+  "\020\002\022\020\n\014DDL_OP_ALTER\020\003\022\017\n\013DDL_OP_DROP\020\004\022\030\n"
+  "\024DDL_OP_DROP_IF_EXIST\020\005B\014\n\nwrite_type\"\207\004"
+  "\n\010WriteRel\0222\n\013named_table\030\001 \001(\0132\033.substr"
+  "ait.NamedObjectWriteH\000\0225\n\017extension_tabl"
+  "e\030\002 \001(\0132\032.substrait.ExtensionObjectH\000\022,\n"
+  "\014table_schema\030\003 \001(\0132\026.substrait.NamedStr"
+  "uct\022\'\n\002op\030\004 \001(\0162\033.substrait.WriteRel.Wri"
+  "teOp\022\035\n\005input\030\005 \001(\0132\016.substrait.Rel\022.\n\006o"
+  "utput\030\006 \001(\0162\036.substrait.WriteRel.OutputM"
+  "ode\"u\n\007WriteOp\022\030\n\024WRITE_OP_UNSPECIFIED\020\000"
+  "\022\023\n\017WRITE_OP_INSERT\020\001\022\023\n\017WRITE_OP_DELETE"
+  "\020\002\022\023\n\017WRITE_OP_UPDATE\020\003\022\021\n\rWRITE_OP_CTAS"
+  "\020\004\"e\n\nOutputMode\022\033\n\027OUTPUT_MODE_UNSPECIF"
+  "IED\020\000\022\031\n\025OUTPUT_MODE_NO_OUTPUT\020\001\022\037\n\033OUTP"
+  "UT_MODE_MODIFIED_TUPLES\020\002B\014\n\nwrite_type\""
+  "\351\004\n\013HashJoinRel\022$\n\006common\030\001 \001(\0132\024.substr"
+  "ait.RelCommon\022\034\n\004left\030\002 \001(\0132\016.substrait."
+  "Rel\022\035\n\005right\030\003 \001(\0132\016.substrait.Rel\0227\n\tle"
+  "ft_keys\030\004 \003(\0132$.substrait.Expression.Fie"
+  "ldReference\0228\n\nright_keys\030\005 \003(\0132$.substr"
+  "ait.Expression.FieldReference\022/\n\020post_jo"
+  "in_filter\030\006 \001(\0132\025.substrait.Expression\022-"
+  "\n\004type\030\007 \001(\0162\037.substrait.HashJoinRel.Joi"
+  "nType\022C\n\022advanced_extension\030\n \001(\0132\'.subs"
+  "trait.extensions.AdvancedExtension\"\336\001\n\010J"
+  "oinType\022\031\n\025JOIN_TYPE_UNSPECIFIED\020\000\022\023\n\017JO"
+  "IN_TYPE_INNER\020\001\022\023\n\017JOIN_TYPE_OUTER\020\002\022\022\n\016"
+  "JOIN_TYPE_LEFT\020\003\022\023\n\017JOIN_TYPE_RIGHT\020\004\022\027\n"
+  "\023JOIN_TYPE_LEFT_SEMI\020\005\022\030\n\024JOIN_TYPE_RIGH"
+  "T_SEMI\020\006\022\027\n\023JOIN_TYPE_LEFT_ANTI\020\007\022\030\n\024JOI"
+  "N_TYPE_RIGHT_ANTI\020\010\"\353\004\n\014MergeJoinRel\022$\n\006"
+  "common\030\001 \001(\0132\024.substrait.RelCommon\022\034\n\004le"
+  "ft\030\002 \001(\0132\016.substrait.Rel\022\035\n\005right\030\003 \001(\0132"
+  "\016.substrait.Rel\0227\n\tleft_keys\030\004 \003(\0132$.sub"
+  "strait.Expression.FieldReference\0228\n\nrigh"
+  "t_keys\030\005 \003(\0132$.substrait.Expression.Fiel"
+  "dReference\022/\n\020post_join_filter\030\006 \001(\0132\025.s"
+  "ubstrait.Expression\022.\n\004type\030\007 \001(\0162 .subs"
+  "trait.MergeJoinRel.JoinType\022C\n\022advanced_"
+  "extension\030\n \001(\0132\'.substrait.extensions.A"
+  "dvancedExtension\"\336\001\n\010JoinType\022\031\n\025JOIN_TY"
+  "PE_UNSPECIFIED\020\000\022\023\n\017JOIN_TYPE_INNER\020\001\022\023\n"
+  "\017JOIN_TYPE_OUTER\020\002\022\022\n\016JOIN_TYPE_LEFT\020\003\022\023"
+  "\n\017JOIN_TYPE_RIGHT\020\004\022\027\n\023JOIN_TYPE_LEFT_SE"
+  "MI\020\005\022\030\n\024JOIN_TYPE_RIGHT_SEMI\020\006\022\027\n\023JOIN_T"
+  "YPE_LEFT_ANTI\020\007\022\030\n\024JOIN_TYPE_RIGHT_ANTI\020"
+  "\010\"w\n\020FunctionArgument\022\016\n\004enum\030\001 \001(\tH\000\022\037\n"
+  "\004type\030\002 \001(\0132\017.substrait.TypeH\000\022&\n\005value\030"
+  "\003 \001(\0132\025.substrait.ExpressionH\000B\n\n\010arg_ty"
+  "pe\"2\n\016FunctionOption\022\014\n\004name\030\001 \001(\t\022\022\n\npr"
+  "eference\030\002 \003(\t\"\356F\n\nExpression\0220\n\007literal"
+  "\030\001 \001(\0132\035.substrait.Expression.LiteralH\000\022"
+  "9\n\tselection\030\002 \001(\0132$.substrait.Expressio"
+  "n.FieldReferenceH\000\022\?\n\017scalar_function\030\003 "
+  "\001(\0132$.substrait.Expression.ScalarFunctio"
+  "nH\000\022\?\n\017window_function\030\005 \001(\0132$.substrait"
+  ".Expression.WindowFunctionH\000\022/\n\007if_then\030"
+  "\006 \001(\0132\034.substrait.Expression.IfThenH\000\022C\n"
+  "\021switch_expression\030\007 \001(\0132&.substrait.Exp"
+  "ression.SwitchExpressionH\000\022@\n\020singular_o"
+  "r_list\030\010 \001(\0132$.substrait.Expression.Sing"
+  "ularOrListH\000\022:\n\rmulti_or_list\030\t \001(\0132!.su"
+  "bstrait.Expression.MultiOrListH\000\022*\n\004cast"
+  "\030\013 \001(\0132\032.substrait.Expression.CastH\000\0222\n\010"
+  "subquery\030\014 \001(\0132\036.substrait.Expression.Su"
+  "bqueryH\000\022.\n\006nested\030\r \001(\0132\034.substrait.Exp"
+  "ression.NestedH\000\022.\n\004enum\030\n \001(\0132\032.substra"
+  "it.Expression.EnumB\002\030\001H\000\032r\n\004Enum\022\023\n\tspec"
+  "ified\030\001 \001(\tH\000\0227\n\013unspecified\030\002 \001(\0132 .sub"
+  "strait.Expression.Enum.EmptyH\000\032\013\n\005Empty:"
+  "\002\030\001:\002\030\001B\013\n\tenum_kind\032\347\014\n\007Literal\022\021\n\007bool"
+  "ean\030\001 \001(\010H\000\022\014\n\002i8\030\002 \001(\005H\000\022\r\n\003i16\030\003 \001(\005H\000"
+  "\022\r\n\003i32\030\005 \001(\005H\000\022\r\n\003i64\030\007 \001(\003H\000\022\016\n\004fp32\030\n"
+  " \001(\002H\000\022\016\n\004fp64\030\013 \001(\001H\000\022\020\n\006string\030\014 \001(\tH\000"
+  "\022\020\n\006binary\030\r \001(\014H\000\022\023\n\ttimestamp\030\016 \001(\003H\000\022"
+  "\016\n\004date\030\020 \001(\005H\000\022\016\n\004time\030\021 \001(\003H\000\022S\n\026inter"
+  "val_year_to_month\030\023 \001(\01321.substrait.Expr"
+  "ession.Literal.IntervalYearToMonthH\000\022S\n\026"
+  "interval_day_to_second\030\024 \001(\01321.substrait"
+  ".Expression.Literal.IntervalDayToSecondH"
+  "\000\022\024\n\nfixed_char\030\025 \001(\tH\000\0229\n\010var_char\030\026 \001("
+  "\0132%.substrait.Expression.Literal.VarChar"
+  "H\000\022\026\n\014fixed_binary\030\027 \001(\014H\000\0228\n\007decimal\030\030 "
+  "\001(\0132%.substrait.Expression.Literal.Decim"
+  "alH\000\0226\n\006struct\030\031 \001(\0132$.substrait.Express"
+  "ion.Literal.StructH\000\0220\n\003map\030\032 \001(\0132!.subs"
+  "trait.Expression.Literal.MapH\000\022\026\n\014timest"
+  "amp_tz\030\033 \001(\003H\000\022\016\n\004uuid\030\034 \001(\014H\000\022\037\n\004null\030\035"
+  " \001(\0132\017.substrait.TypeH\000\0222\n\004list\030\036 \001(\0132\"."
+  "substrait.Expression.Literal.ListH\000\022*\n\ne"
+  "mpty_list\030\037 \001(\0132\024.substrait.Type.ListH\000\022"
+  "(\n\tempty_map\030  \001(\0132\023.substrait.Type.MapH"
+  "\000\022A\n\014user_defined\030! \001(\0132).substrait.Expr"
+  "ession.Literal.UserDefinedH\000\022\020\n\010nullable"
+  "\0302 \001(\010\022 \n\030type_variation_reference\0303 \001(\r"
+  "\032(\n\007VarChar\022\r\n\005value\030\001 \001(\t\022\016\n\006length\030\002 \001"
+  "(\r\032:\n\007Decimal\022\r\n\005value\030\001 \001(\014\022\021\n\tprecisio"
+  "n\030\002 \001(\005\022\r\n\005scale\030\003 \001(\005\032\253\001\n\003Map\022>\n\nkey_va"
+  "lues\030\001 \003(\0132*.substrait.Expression.Litera"
+  "l.Map.KeyValue\032d\n\010KeyValue\022*\n\003key\030\001 \001(\0132"
+  "\035.substrait.Expression.Literal\022,\n\005value\030"
+  "\002 \001(\0132\035.substrait.Expression.Literal\0324\n\023"
+  "IntervalYearToMonth\022\r\n\005years\030\001 \001(\005\022\016\n\006mo"
+  "nths\030\002 \001(\005\032J\n\023IntervalDayToSecond\022\014\n\004day"
+  "s\030\001 \001(\005\022\017\n\007seconds\030\002 \001(\005\022\024\n\014microseconds"
+  "\030\003 \001(\005\0327\n\006Struct\022-\n\006fields\030\001 \003(\0132\035.subst"
+  "rait.Expression.Literal\0325\n\004List\022-\n\006value"
+  "s\030\001 \003(\0132\035.substrait.Expression.Literal\032~"
+  "\n\013UserDefined\022\026\n\016type_reference\030\001 \001(\r\0222\n"
+  "\017type_parameters\030\003 \003(\0132\031.substrait.Type."
+  "Parameter\022#\n\005value\030\002 \001(\0132\024.google.protob"
+  "uf.AnyB\016\n\014literal_type\032\343\003\n\006Nested\022\020\n\010nul"
+  "lable\030\001 \001(\010\022 \n\030type_variation_reference\030"
+  "\002 \001(\r\0225\n\006struct\030\003 \001(\0132#.substrait.Expres"
+  "sion.Nested.StructH\000\0221\n\004list\030\004 \001(\0132!.sub"
+  "strait.Expression.Nested.ListH\000\022/\n\003map\030\005"
+  " \001(\0132 .substrait.Expression.Nested.MapH\000"
+  "\032\232\001\n\003Map\022=\n\nkey_values\030\001 \003(\0132).substrait"
+  ".Expression.Nested.Map.KeyValue\032T\n\010KeyVa"
+  "lue\022\"\n\003key\030\001 \001(\0132\025.substrait.Expression\022"
+  "$\n\005value\030\002 \001(\0132\025.substrait.Expression\032/\n"
+  "\006Struct\022%\n\006fields\030\001 \003(\0132\025.substrait.Expr"
+  "ession\032-\n\004List\022%\n\006values\030\001 \003(\0132\025.substra"
+  "it.ExpressionB\r\n\013nested_type\032\327\001\n\016ScalarF"
+  "unction\022\032\n\022function_reference\030\001 \001(\r\022.\n\ta"
+  "rguments\030\004 \003(\0132\033.substrait.FunctionArgum"
+  "ent\022*\n\007options\030\005 \003(\0132\031.substrait.Functio"
+  "nOption\022$\n\013output_type\030\003 \001(\0132\017.substrait"
+  ".Type\022\'\n\004args\030\002 \003(\0132\025.substrait.Expressi"
+  "onB\002\030\001\032\321\010\n\016WindowFunction\022\032\n\022function_re"
+  "ference\030\001 \001(\r\022.\n\targuments\030\t \003(\0132\033.subst"
+  "rait.FunctionArgument\022*\n\007options\030\013 \003(\0132\031"
+  ".substrait.FunctionOption\022$\n\013output_type"
+  "\030\007 \001(\0132\017.substrait.Type\022*\n\005phase\030\006 \001(\0162\033"
+  ".substrait.AggregationPhase\022#\n\005sorts\030\003 \003"
+  "(\0132\024.substrait.SortField\022F\n\ninvocation\030\n"
+  " \001(\01622.substrait.AggregateFunction.Aggre"
+  "gationInvocation\022)\n\npartitions\030\002 \003(\0132\025.s"
+  "ubstrait.Expression\022D\n\013bounds_type\030\014 \001(\016"
+  "2/.substrait.Expression.WindowFunction.B"
+  "oundsType\022\?\n\013lower_bound\030\005 \001(\0132*.substra"
+  "it.Expression.WindowFunction.Bound\022\?\n\013up"
+  "per_bound\030\004 \001(\0132*.substrait.Expression.W"
+  "indowFunction.Bound\022\'\n\004args\030\010 \003(\0132\025.subs"
+  "trait.ExpressionB\002\030\001\032\223\003\n\005Bound\022I\n\tpreced"
+  "ing\030\001 \001(\01324.substrait.Expression.WindowF"
+  "unction.Bound.PrecedingH\000\022I\n\tfollowing\030\002"
+  " \001(\01324.substrait.Expression.WindowFuncti"
+  "on.Bound.FollowingH\000\022L\n\013current_row\030\003 \001("
+  "\01325.substrait.Expression.WindowFunction."
+  "Bound.CurrentRowH\000\022I\n\tunbounded\030\004 \001(\01324."
+  "substrait.Expression.WindowFunction.Boun"
+  "d.UnboundedH\000\032\033\n\tPreceding\022\016\n\006offset\030\001 \001"
+  "(\003\032\033\n\tFollowing\022\016\n\006offset\030\001 \001(\003\032\014\n\nCurre"
+  "ntRow\032\013\n\tUnboundedB\006\n\004kind\"V\n\nBoundsType"
+  "\022\033\n\027BOUNDS_TYPE_UNSPECIFIED\020\000\022\024\n\020BOUNDS_"
+  "TYPE_ROWS\020\001\022\025\n\021BOUNDS_TYPE_RANGE\020\002\032\265\001\n\006I"
+  "fThen\0222\n\003ifs\030\001 \003(\0132%.substrait.Expressio"
+  "n.IfThen.IfClause\022#\n\004else\030\002 \001(\0132\025.substr"
+  "ait.Expression\032R\n\010IfClause\022!\n\002if\030\001 \001(\0132\025"
+  ".substrait.Expression\022#\n\004then\030\002 \001(\0132\025.su"
+  "bstrait.Expression\032\216\002\n\004Cast\022\035\n\004type\030\001 \001("
+  "\0132\017.substrait.Type\022$\n\005input\030\002 \001(\0132\025.subs"
+  "trait.Expression\022D\n\020failure_behavior\030\003 \001"
+  "(\0162*.substrait.Expression.Cast.FailureBe"
+  "havior\"{\n\017FailureBehavior\022 \n\034FAILURE_BEH"
+  "AVIOR_UNSPECIFIED\020\000\022 \n\034FAILURE_BEHAVIOR_"
+  "RETURN_NULL\020\001\022$\n FAILURE_BEHAVIOR_THROW_"
+  "EXCEPTION\020\002\032\365\001\n\020SwitchExpression\022$\n\005matc"
+  "h\030\003 \001(\0132\025.substrait.Expression\022;\n\003ifs\030\001 "
+  "\003(\0132..substrait.Expression.SwitchExpress"
+  "ion.IfValue\022#\n\004else\030\002 \001(\0132\025.substrait.Ex"
+  "pression\032Y\n\007IfValue\022)\n\002if\030\001 \001(\0132\035.substr"
+  "ait.Expression.Literal\022#\n\004then\030\002 \001(\0132\025.s"
+  "ubstrait.Expression\032^\n\016SingularOrList\022$\n"
+  "\005value\030\001 \001(\0132\025.substrait.Expression\022&\n\007o"
+  "ptions\030\002 \003(\0132\025.substrait.Expression\032\237\001\n\013"
+  "MultiOrList\022$\n\005value\030\001 \003(\0132\025.substrait.E"
+  "xpression\0229\n\007options\030\002 \003(\0132(.substrait.E"
+  "xpression.MultiOrList.Record\032/\n\006Record\022%"
+  "\n\006fields\030\001 \003(\0132\025.substrait.Expression\032\243\003"
+  "\n\020EmbeddedFunction\022(\n\targuments\030\001 \003(\0132\025."
+  "substrait.Expression\022$\n\013output_type\030\002 \001("
+  "\0132\017.substrait.Type\022]\n\026python_pickle_func"
+  "tion\030\003 \001(\0132;.substrait.Expression.Embedd"
+  "edFunction.PythonPickleFunctionH\000\022[\n\025web"
+  "_assembly_function\030\004 \001(\0132:.substrait.Exp"
+  "ression.EmbeddedFunction.WebAssemblyFunc"
+  "tionH\000\032>\n\024PythonPickleFunction\022\020\n\010functi"
+  "on\030\001 \001(\014\022\024\n\014prerequisite\030\002 \003(\t\032;\n\023WebAss"
+  "emblyFunction\022\016\n\006script\030\001 \001(\014\022\024\n\014prerequ"
+  "isite\030\002 \003(\tB\006\n\004kind\032\232\004\n\020ReferenceSegment"
+  "\022@\n\007map_key\030\001 \001(\0132-.substrait.Expression"
+  ".ReferenceSegment.MapKeyH\000\022J\n\014struct_fie"
+  "ld\030\002 \001(\01322.substrait.Expression.Referenc"
+  "eSegment.StructFieldH\000\022J\n\014list_element\030\003"
+  " \001(\01322.substrait.Expression.ReferenceSeg"
+  "ment.ListElementH\000\032o\n\006MapKey\022.\n\007map_key\030"
+  "\001 \001(\0132\035.substrait.Expression.Literal\0225\n\005"
+  "child\030\002 \001(\0132&.substrait.Expression.Refer"
+  "enceSegment\032S\n\013StructField\022\r\n\005field\030\001 \001("
+  "\005\0225\n\005child\030\002 \001(\0132&.substrait.Expression."
+  "ReferenceSegment\032T\n\013ListElement\022\016\n\006offse"
+  "t\030\001 \001(\005\0225\n\005child\030\002 \001(\0132&.substrait.Expre"
+  "ssion.ReferenceSegmentB\020\n\016reference_type"
+  "\032\360\t\n\016MaskExpression\022A\n\006select\030\001 \001(\01321.su"
+  "bstrait.Expression.MaskExpression.Struct"
+  "Select\022 \n\030maintain_singular_struct\030\002 \001(\010"
+  "\032\325\001\n\006Select\022C\n\006struct\030\001 \001(\01321.substrait."
+  "Expression.MaskExpression.StructSelectH\000"
+  "\022\?\n\004list\030\002 \001(\0132/.substrait.Expression.Ma"
+  "skExpression.ListSelectH\000\022=\n\003map\030\003 \001(\0132."
+  ".substrait.Expression.MaskExpression.Map"
+  "SelectH\000B\006\n\004type\032U\n\014StructSelect\022E\n\014stru"
+  "ct_items\030\001 \003(\0132/.substrait.Expression.Ma"
+  "skExpression.StructItem\032W\n\nStructItem\022\r\n"
+  "\005field\030\001 \001(\005\022:\n\005child\030\002 \001(\0132+.substrait."
+  "Expression.MaskExpression.Select\032\264\003\n\nLis"
+  "tSelect\022Q\n\tselection\030\001 \003(\0132>.substrait.E"
+  "xpression.MaskExpression.ListSelect.List"
+  "SelectItem\022:\n\005child\030\002 \001(\0132+.substrait.Ex"
+  "pression.MaskExpression.Select\032\226\002\n\016ListS"
+  "electItem\022Z\n\004item\030\001 \001(\0132J.substrait.Expr"
   "ession.MaskExpression.ListSelect.ListSel"
-  "ectItem\022:\n\005child\030\002 \001(\0132+.substrait.Expre"
-  "ssion.MaskExpression.Select\032\226\002\n\016ListSele"
-  "ctItem\022Z\n\004item\030\001 \001(\0132J.substrait.Express"
-  "ion.MaskExpression.ListSelect.ListSelect"
-  "Item.ListElementH\000\022Y\n\005slice\030\002 \001(\0132H.subs"
-  "trait.Expression.MaskExpression.ListSele"
-  "ct.ListSelectItem.ListSliceH\000\032\034\n\013ListEle"
-  "ment\022\r\n\005field\030\001 \001(\005\032\'\n\tListSlice\022\r\n\005star"
-  "t\030\001 \001(\005\022\013\n\003end\030\002 \001(\005B\006\n\004type\032\271\002\n\tMapSele"
-  "ct\022D\n\003key\030\001 \001(\01325.substrait.Expression.M"
-  "askExpression.MapSelect.MapKeyH\000\022U\n\nexpr"
-  "ession\030\002 \001(\0132\?.substrait.Expression.Mask"
-  "Expression.MapSelect.MapKeyExpressionH\000\022"
-  ":\n\005child\030\003 \001(\0132+.substrait.Expression.Ma"
-  "skExpression.Select\032\031\n\006MapKey\022\017\n\007map_key"
-  "\030\001 \001(\t\032.\n\020MapKeyExpression\022\032\n\022map_key_ex"
-  "pression\030\001 \001(\tB\010\n\006select\032\266\003\n\016FieldRefere"
-  "nce\022B\n\020direct_reference\030\001 \001(\0132&.substrai"
-  "t.Expression.ReferenceSegmentH\000\022@\n\020maske"
-  "d_reference\030\002 \001(\0132$.substrait.Expression"
-  ".MaskExpressionH\000\022+\n\nexpression\030\003 \001(\0132\025."
-  "substrait.ExpressionH\001\022L\n\016root_reference"
-  "\030\004 \001(\01322.substrait.Expression.FieldRefer"
-  "ence.RootReferenceH\001\022N\n\017outer_reference\030"
-  "\005 \001(\01323.substrait.Expression.FieldRefere"
-  "nce.OuterReferenceH\001\032\017\n\rRootReference\032#\n"
-  "\016OuterReference\022\021\n\tsteps_out\030\001 \001(\rB\020\n\016re"
-  "ference_typeB\013\n\troot_type\032\214\t\n\010Subquery\0227"
-  "\n\006scalar\030\001 \001(\0132%.substrait.Expression.Su"
-  "bquery.ScalarH\000\022B\n\014in_predicate\030\002 \001(\0132*."
-  "substrait.Expression.Subquery.InPredicat"
-  "eH\000\022D\n\rset_predicate\030\003 \001(\0132+.substrait.E"
-  "xpression.Subquery.SetPredicateH\000\022F\n\016set"
-  "_comparison\030\004 \001(\0132,.substrait.Expression"
-  ".Subquery.SetComparisonH\000\032\'\n\006Scalar\022\035\n\005i"
-  "nput\030\001 \001(\0132\016.substrait.Rel\032W\n\013InPredicat"
-  "e\022&\n\007needles\030\001 \003(\0132\025.substrait.Expressio"
-  "n\022 \n\010haystack\030\002 \001(\0132\016.substrait.Rel\032\334\001\n\014"
-  "SetPredicate\022M\n\014predicate_op\030\001 \001(\01627.sub"
-  "strait.Expression.Subquery.SetPredicate."
-  "PredicateOp\022\036\n\006tuples\030\002 \001(\0132\016.substrait."
-  "Rel\"]\n\013PredicateOp\022\034\n\030PREDICATE_OP_UNSPE"
-  "CIFIED\020\000\022\027\n\023PREDICATE_OP_EXISTS\020\001\022\027\n\023PRE"
-  "DICATE_OP_UNIQUE\020\002\032\202\004\n\rSetComparison\022N\n\014"
-  "reduction_op\030\001 \001(\01628.substrait.Expressio"
-  "n.Subquery.SetComparison.ReductionOp\022P\n\r"
-  "comparison_op\030\002 \001(\01629.substrait.Expressi"
-  "on.Subquery.SetComparison.ComparisonOp\022#"
-  "\n\004left\030\003 \001(\0132\025.substrait.Expression\022\035\n\005r"
-  "ight\030\004 \001(\0132\016.substrait.Rel\"\261\001\n\014Compariso"
-  "nOp\022\035\n\031COMPARISON_OP_UNSPECIFIED\020\000\022\024\n\020CO"
-  "MPARISON_OP_EQ\020\001\022\024\n\020COMPARISON_OP_NE\020\002\022\024"
-  "\n\020COMPARISON_OP_LT\020\003\022\024\n\020COMPARISON_OP_GT"
-  "\020\004\022\024\n\020COMPARISON_OP_LE\020\005\022\024\n\020COMPARISON_O"
-  "P_GE\020\006\"W\n\013ReductionOp\022\034\n\030REDUCTION_OP_UN"
-  "SPECIFIED\020\000\022\024\n\020REDUCTION_OP_ANY\020\001\022\024\n\020RED"
-  "UCTION_OP_ALL\020\002B\017\n\rsubquery_typeB\n\n\010rex_"
-  "type\"\377\002\n\tSortField\022#\n\004expr\030\001 \001(\0132\025.subst"
-  "rait.Expression\0227\n\tdirection\030\002 \001(\0162\".sub"
-  "strait.SortField.SortDirectionH\000\022\'\n\035comp"
-  "arison_function_reference\030\003 \001(\rH\000\"\335\001\n\rSo"
-  "rtDirection\022\036\n\032SORT_DIRECTION_UNSPECIFIE"
-  "D\020\000\022\"\n\036SORT_DIRECTION_ASC_NULLS_FIRST\020\001\022"
-  "!\n\035SORT_DIRECTION_ASC_NULLS_LAST\020\002\022#\n\037SO"
-  "RT_DIRECTION_DESC_NULLS_FIRST\020\003\022\"\n\036SORT_"
-  "DIRECTION_DESC_NULLS_LAST\020\004\022\034\n\030SORT_DIRE"
-  "CTION_CLUSTERED\020\005B\013\n\tsort_kind\"\243\004\n\021Aggre"
-  "gateFunction\022\032\n\022function_reference\030\001 \001(\r"
-  "\022.\n\targuments\030\007 \003(\0132\033.substrait.Function"
-  "Argument\022*\n\007options\030\010 \003(\0132\031.substrait.Fu"
-  "nctionOption\022$\n\013output_type\030\005 \001(\0132\017.subs"
-  "trait.Type\022*\n\005phase\030\004 \001(\0162\033.substrait.Ag"
-  "gregationPhase\022#\n\005sorts\030\003 \003(\0132\024.substrai"
-  "t.SortField\022F\n\ninvocation\030\006 \001(\01622.substr"
-  "ait.AggregateFunction.AggregationInvocat"
-  "ion\022\'\n\004args\030\002 \003(\0132\025.substrait.Expression"
-  "B\002\030\001\032\'\n\014ReferenceRel\022\027\n\017subtree_ordinal\030"
-  "\001 \001(\005\"\204\001\n\025AggregationInvocation\022&\n\"AGGRE"
-  "GATION_INVOCATION_UNSPECIFIED\020\000\022\036\n\032AGGRE"
-  "GATION_INVOCATION_ALL\020\001\022#\n\037AGGREGATION_I"
-  "NVOCATION_DISTINCT\020\002*\357\001\n\020AggregationPhas"
-  "e\022!\n\035AGGREGATION_PHASE_UNSPECIFIED\020\000\022-\n)"
-  "AGGREGATION_PHASE_INITIAL_TO_INTERMEDIAT"
-  "E\020\001\0222\n.AGGREGATION_PHASE_INTERMEDIATE_TO"
-  "_INTERMEDIATE\020\002\022\'\n#AGGREGATION_PHASE_INI"
-  "TIAL_TO_RESULT\020\003\022,\n(AGGREGATION_PHASE_IN"
-  "TERMEDIATE_TO_RESULT\020\004BW\n\022io.substrait.p"
-  "rotoP\001Z*github.com/substrait-io/substrai"
-  "t-go/proto\252\002\022Substrait.Protobufb\006proto3"
+  "ectItem.ListElementH\000\022Y\n\005slice\030\002 \001(\0132H.s"
+  "ubstrait.Expression.MaskExpression.ListS"
+  "elect.ListSelectItem.ListSliceH\000\032\034\n\013List"
+  "Element\022\r\n\005field\030\001 \001(\005\032\'\n\tListSlice\022\r\n\005s"
+  "tart\030\001 \001(\005\022\013\n\003end\030\002 \001(\005B\006\n\004type\032\271\002\n\tMapS"
+  "elect\022D\n\003key\030\001 \001(\01325.substrait.Expressio"
+  "n.MaskExpression.MapSelect.MapKeyH\000\022U\n\ne"
+  "xpression\030\002 \001(\0132\?.substrait.Expression.M"
+  "askExpression.MapSelect.MapKeyExpression"
+  "H\000\022:\n\005child\030\003 \001(\0132+.substrait.Expression"
+  ".MaskExpression.Select\032\031\n\006MapKey\022\017\n\007map_"
+  "key\030\001 \001(\t\032.\n\020MapKeyExpression\022\032\n\022map_key"
+  "_expression\030\001 \001(\tB\010\n\006select\032\266\003\n\016FieldRef"
+  "erence\022B\n\020direct_reference\030\001 \001(\0132&.subst"
+  "rait.Expression.ReferenceSegmentH\000\022@\n\020ma"
+  "sked_reference\030\002 \001(\0132$.substrait.Express"
+  "ion.MaskExpressionH\000\022+\n\nexpression\030\003 \001(\013"
+  "2\025.substrait.ExpressionH\001\022L\n\016root_refere"
+  "nce\030\004 \001(\01322.substrait.Expression.FieldRe"
+  "ference.RootReferenceH\001\022N\n\017outer_referen"
+  "ce\030\005 \001(\01323.substrait.Expression.FieldRef"
+  "erence.OuterReferenceH\001\032\017\n\rRootReference"
+  "\032#\n\016OuterReference\022\021\n\tsteps_out\030\001 \001(\rB\020\n"
+  "\016reference_typeB\013\n\troot_type\032\214\t\n\010Subquer"
+  "y\0227\n\006scalar\030\001 \001(\0132%.substrait.Expression"
+  ".Subquery.ScalarH\000\022B\n\014in_predicate\030\002 \001(\013"
+  "2*.substrait.Expression.Subquery.InPredi"
+  "cateH\000\022D\n\rset_predicate\030\003 \001(\0132+.substrai"
+  "t.Expression.Subquery.SetPredicateH\000\022F\n\016"
+  "set_comparison\030\004 \001(\0132,.substrait.Express"
+  "ion.Subquery.SetComparisonH\000\032\'\n\006Scalar\022\035"
+  "\n\005input\030\001 \001(\0132\016.substrait.Rel\032W\n\013InPredi"
+  "cate\022&\n\007needles\030\001 \003(\0132\025.substrait.Expres"
+  "sion\022 \n\010haystack\030\002 \001(\0132\016.substrait.Rel\032\334"
+  "\001\n\014SetPredicate\022M\n\014predicate_op\030\001 \001(\01627."
+  "substrait.Expression.Subquery.SetPredica"
+  "te.PredicateOp\022\036\n\006tuples\030\002 \001(\0132\016.substra"
+  "it.Rel\"]\n\013PredicateOp\022\034\n\030PREDICATE_OP_UN"
+  "SPECIFIED\020\000\022\027\n\023PREDICATE_OP_EXISTS\020\001\022\027\n\023"
+  "PREDICATE_OP_UNIQUE\020\002\032\202\004\n\rSetComparison\022"
+  "N\n\014reduction_op\030\001 \001(\01628.substrait.Expres"
+  "sion.Subquery.SetComparison.ReductionOp\022"
+  "P\n\rcomparison_op\030\002 \001(\01629.substrait.Expre"
+  "ssion.Subquery.SetComparison.ComparisonO"
+  "p\022#\n\004left\030\003 \001(\0132\025.substrait.Expression\022\035"
+  "\n\005right\030\004 \001(\0132\016.substrait.Rel\"\261\001\n\014Compar"
+  "isonOp\022\035\n\031COMPARISON_OP_UNSPECIFIED\020\000\022\024\n"
+  "\020COMPARISON_OP_EQ\020\001\022\024\n\020COMPARISON_OP_NE\020"
+  "\002\022\024\n\020COMPARISON_OP_LT\020\003\022\024\n\020COMPARISON_OP"
+  "_GT\020\004\022\024\n\020COMPARISON_OP_LE\020\005\022\024\n\020COMPARISO"
+  "N_OP_GE\020\006\"W\n\013ReductionOp\022\034\n\030REDUCTION_OP"
+  "_UNSPECIFIED\020\000\022\024\n\020REDUCTION_OP_ANY\020\001\022\024\n\020"
+  "REDUCTION_OP_ALL\020\002B\017\n\rsubquery_typeB\n\n\010r"
+  "ex_type\"\377\002\n\tSortField\022#\n\004expr\030\001 \001(\0132\025.su"
+  "bstrait.Expression\0227\n\tdirection\030\002 \001(\0162\"."
+  "substrait.SortField.SortDirectionH\000\022\'\n\035c"
+  "omparison_function_reference\030\003 \001(\rH\000\"\335\001\n"
+  "\rSortDirection\022\036\n\032SORT_DIRECTION_UNSPECI"
+  "FIED\020\000\022\"\n\036SORT_DIRECTION_ASC_NULLS_FIRST"
+  "\020\001\022!\n\035SORT_DIRECTION_ASC_NULLS_LAST\020\002\022#\n"
+  "\037SORT_DIRECTION_DESC_NULLS_FIRST\020\003\022\"\n\036SO"
+  "RT_DIRECTION_DESC_NULLS_LAST\020\004\022\034\n\030SORT_D"
+  "IRECTION_CLUSTERED\020\005B\013\n\tsort_kind\"\243\004\n\021Ag"
+  "gregateFunction\022\032\n\022function_reference\030\001 "
+  "\001(\r\022.\n\targuments\030\007 \003(\0132\033.substrait.Funct"
+  "ionArgument\022*\n\007options\030\010 \003(\0132\031.substrait"
+  ".FunctionOption\022$\n\013output_type\030\005 \001(\0132\017.s"
+  "ubstrait.Type\022*\n\005phase\030\004 \001(\0162\033.substrait"
+  ".AggregationPhase\022#\n\005sorts\030\003 \003(\0132\024.subst"
+  "rait.SortField\022F\n\ninvocation\030\006 \001(\01622.sub"
+  "strait.AggregateFunction.AggregationInvo"
+  "cation\022\'\n\004args\030\002 \003(\0132\025.substrait.Express"
+  "ionB\002\030\001\032\'\n\014ReferenceRel\022\027\n\017subtree_ordin"
+  "al\030\001 \001(\005\"\204\001\n\025AggregationInvocation\022&\n\"AG"
+  "GREGATION_INVOCATION_UNSPECIFIED\020\000\022\036\n\032AG"
+  "GREGATION_INVOCATION_ALL\020\001\022#\n\037AGGREGATIO"
+  "N_INVOCATION_DISTINCT\020\002*\357\001\n\020AggregationP"
+  "hase\022!\n\035AGGREGATION_PHASE_UNSPECIFIED\020\000\022"
+  "-\n)AGGREGATION_PHASE_INITIAL_TO_INTERMED"
+  "IATE\020\001\0222\n.AGGREGATION_PHASE_INTERMEDIATE"
+  "_TO_INTERMEDIATE\020\002\022\'\n#AGGREGATION_PHASE_"
+  "INITIAL_TO_RESULT\020\003\022,\n(AGGREGATION_PHASE"
+  "_INTERMEDIATE_TO_RESULT\020\004BW\n\022io.substrai"
+  "t.protoP\001Z*github.com/substrait-io/subst"
+  "rait-go/proto\252\002\022Substrait.Protobufb\006prot"
+  "o3"
   ;
 static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_substrait_2falgebra_2eproto_deps[3] = {
   &::descriptor_table_google_2fprotobuf_2fany_2eproto,
@@ -3202,8 +3386,8 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor
 };
 static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_substrait_2falgebra_2eproto_once;
 const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_substrait_2falgebra_2eproto = {
-  false, false, 19479, descriptor_table_protodef_substrait_2falgebra_2eproto, "substrait/algebra.proto", 
-  &descriptor_table_substrait_2falgebra_2eproto_once, descriptor_table_substrait_2falgebra_2eproto_deps, 3, 108,
+  false, false, 20962, descriptor_table_protodef_substrait_2falgebra_2eproto, "substrait/algebra.proto", 
+  &descriptor_table_substrait_2falgebra_2eproto_once, descriptor_table_substrait_2falgebra_2eproto_deps, 3, 113,
   schemas, file_default_instances, TableStruct_substrait_2falgebra_2eproto::offsets,
   file_level_metadata_substrait_2falgebra_2eproto, file_level_enum_descriptors_substrait_2falgebra_2eproto, file_level_service_descriptors_substrait_2falgebra_2eproto,
 };
@@ -3450,10 +3634,33 @@ constexpr MergeJoinRel_JoinType MergeJoinRel::JoinType_MIN;
 constexpr MergeJoinRel_JoinType MergeJoinRel::JoinType_MAX;
 constexpr int MergeJoinRel::JoinType_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
-const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_Cast_FailureBehavior_descriptor() {
+const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_WindowFunction_BoundsType_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
   return file_level_enum_descriptors_substrait_2falgebra_2eproto[8];
 }
+bool Expression_WindowFunction_BoundsType_IsValid(int value) {
+  switch (value) {
+    case 0:
+    case 1:
+    case 2:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction::BOUNDS_TYPE_UNSPECIFIED;
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction::BOUNDS_TYPE_ROWS;
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction::BOUNDS_TYPE_RANGE;
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction::BoundsType_MIN;
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction::BoundsType_MAX;
+constexpr int Expression_WindowFunction::BoundsType_ARRAYSIZE;
+#endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
+const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_Cast_FailureBehavior_descriptor() {
+  ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[9];
+}
 bool Expression_Cast_FailureBehavior_IsValid(int value) {
   switch (value) {
     case 0:
@@ -3475,7 +3682,7 @@ constexpr int Expression_Cast::FailureBehavior_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_Subquery_SetPredicate_PredicateOp_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[9];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[10];
 }
 bool Expression_Subquery_SetPredicate_PredicateOp_IsValid(int value) {
   switch (value) {
@@ -3498,7 +3705,7 @@ constexpr int Expression_Subquery_SetPredicate::PredicateOp_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_Subquery_SetComparison_ComparisonOp_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[10];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[11];
 }
 bool Expression_Subquery_SetComparison_ComparisonOp_IsValid(int value) {
   switch (value) {
@@ -3529,7 +3736,7 @@ constexpr int Expression_Subquery_SetComparison::ComparisonOp_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_Subquery_SetComparison_ReductionOp_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[11];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[12];
 }
 bool Expression_Subquery_SetComparison_ReductionOp_IsValid(int value) {
   switch (value) {
@@ -3552,7 +3759,7 @@ constexpr int Expression_Subquery_SetComparison::ReductionOp_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* SortField_SortDirection_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[12];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[13];
 }
 bool SortField_SortDirection_IsValid(int value) {
   switch (value) {
@@ -3581,7 +3788,7 @@ constexpr int SortField::SortDirection_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* AggregateFunction_AggregationInvocation_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[13];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[14];
 }
 bool AggregateFunction_AggregationInvocation_IsValid(int value) {
   switch (value) {
@@ -3604,7 +3811,7 @@ constexpr int AggregateFunction::AggregationInvocation_ARRAYSIZE;
 #endif  // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* AggregationPhase_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_substrait_2falgebra_2eproto);
-  return file_level_enum_descriptors_substrait_2falgebra_2eproto[14];
+  return file_level_enum_descriptors_substrait_2falgebra_2eproto[15];
 }
 bool AggregationPhase_IsValid(int value) {
   switch (value) {
@@ -9699,156 +9906,213 @@ ::PROTOBUF_NAMESPACE_ID::Metadata AggregateRel::GetMetadata() const {
 
 // ===================================================================
 
-class SortRel::_Internal {
+class ConsistentPartitionWindowRel_WindowRelFunction::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const SortRel* msg);
-  static const ::substrait::Rel& input(const SortRel* msg);
-  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const SortRel* msg);
+  static const ::substrait::Type& output_type(const ConsistentPartitionWindowRel_WindowRelFunction* msg);
+  static const ::substrait::Expression_WindowFunction_Bound& lower_bound(const ConsistentPartitionWindowRel_WindowRelFunction* msg);
+  static const ::substrait::Expression_WindowFunction_Bound& upper_bound(const ConsistentPartitionWindowRel_WindowRelFunction* msg);
 };
 
-const ::substrait::RelCommon&
-SortRel::_Internal::common(const SortRel* msg) {
-  return *msg->common_;
+const ::substrait::Type&
+ConsistentPartitionWindowRel_WindowRelFunction::_Internal::output_type(const ConsistentPartitionWindowRel_WindowRelFunction* msg) {
+  return *msg->output_type_;
 }
-const ::substrait::Rel&
-SortRel::_Internal::input(const SortRel* msg) {
-  return *msg->input_;
+const ::substrait::Expression_WindowFunction_Bound&
+ConsistentPartitionWindowRel_WindowRelFunction::_Internal::lower_bound(const ConsistentPartitionWindowRel_WindowRelFunction* msg) {
+  return *msg->lower_bound_;
 }
-const ::substrait::extensions::AdvancedExtension&
-SortRel::_Internal::advanced_extension(const SortRel* msg) {
-  return *msg->advanced_extension_;
+const ::substrait::Expression_WindowFunction_Bound&
+ConsistentPartitionWindowRel_WindowRelFunction::_Internal::upper_bound(const ConsistentPartitionWindowRel_WindowRelFunction* msg) {
+  return *msg->upper_bound_;
 }
-void SortRel::clear_advanced_extension() {
-  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
-    delete advanced_extension_;
+void ConsistentPartitionWindowRel_WindowRelFunction::clear_output_type() {
+  if (GetArenaForAllocation() == nullptr && output_type_ != nullptr) {
+    delete output_type_;
   }
-  advanced_extension_ = nullptr;
+  output_type_ = nullptr;
 }
-SortRel::SortRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+ConsistentPartitionWindowRel_WindowRelFunction::ConsistentPartitionWindowRel_WindowRelFunction(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
   : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
-  sorts_(arena) {
+  arguments_(arena),
+  options_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.SortRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
 }
-SortRel::SortRel(const SortRel& from)
+ConsistentPartitionWindowRel_WindowRelFunction::ConsistentPartitionWindowRel_WindowRelFunction(const ConsistentPartitionWindowRel_WindowRelFunction& from)
   : ::PROTOBUF_NAMESPACE_ID::Message(),
-      sorts_(from.sorts_) {
+      arguments_(from.arguments_),
+      options_(from.options_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
-  if (from._internal_has_common()) {
-    common_ = new ::substrait::RelCommon(*from.common_);
+  if (from._internal_has_upper_bound()) {
+    upper_bound_ = new ::substrait::Expression_WindowFunction_Bound(*from.upper_bound_);
   } else {
-    common_ = nullptr;
+    upper_bound_ = nullptr;
   }
-  if (from._internal_has_input()) {
-    input_ = new ::substrait::Rel(*from.input_);
+  if (from._internal_has_lower_bound()) {
+    lower_bound_ = new ::substrait::Expression_WindowFunction_Bound(*from.lower_bound_);
   } else {
-    input_ = nullptr;
+    lower_bound_ = nullptr;
   }
-  if (from._internal_has_advanced_extension()) {
-    advanced_extension_ = new ::substrait::extensions::AdvancedExtension(*from.advanced_extension_);
+  if (from._internal_has_output_type()) {
+    output_type_ = new ::substrait::Type(*from.output_type_);
   } else {
-    advanced_extension_ = nullptr;
+    output_type_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.SortRel)
+  ::memcpy(&function_reference_, &from.function_reference_,
+    static_cast<size_t>(reinterpret_cast<char*>(&bounds_type_) -
+    reinterpret_cast<char*>(&function_reference_)) + sizeof(bounds_type_));
+  // @@protoc_insertion_point(copy_constructor:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
 }
 
-inline void SortRel::SharedCtor() {
+inline void ConsistentPartitionWindowRel_WindowRelFunction::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
-    reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&advanced_extension_) -
-    reinterpret_cast<char*>(&common_)) + sizeof(advanced_extension_));
+    reinterpret_cast<char*>(&upper_bound_) - reinterpret_cast<char*>(this)),
+    0, static_cast<size_t>(reinterpret_cast<char*>(&bounds_type_) -
+    reinterpret_cast<char*>(&upper_bound_)) + sizeof(bounds_type_));
 }
 
-SortRel::~SortRel() {
-  // @@protoc_insertion_point(destructor:substrait.SortRel)
+ConsistentPartitionWindowRel_WindowRelFunction::~ConsistentPartitionWindowRel_WindowRelFunction() {
+  // @@protoc_insertion_point(destructor:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void SortRel::SharedDtor() {
+inline void ConsistentPartitionWindowRel_WindowRelFunction::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
-  if (this != internal_default_instance()) delete common_;
-  if (this != internal_default_instance()) delete input_;
-  if (this != internal_default_instance()) delete advanced_extension_;
+  if (this != internal_default_instance()) delete upper_bound_;
+  if (this != internal_default_instance()) delete lower_bound_;
+  if (this != internal_default_instance()) delete output_type_;
 }
 
-void SortRel::ArenaDtor(void* object) {
-  SortRel* _this = reinterpret_cast< SortRel* >(object);
+void ConsistentPartitionWindowRel_WindowRelFunction::ArenaDtor(void* object) {
+  ConsistentPartitionWindowRel_WindowRelFunction* _this = reinterpret_cast< ConsistentPartitionWindowRel_WindowRelFunction* >(object);
   (void)_this;
 }
-void SortRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ConsistentPartitionWindowRel_WindowRelFunction::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void SortRel::SetCachedSize(int size) const {
+void ConsistentPartitionWindowRel_WindowRelFunction::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void SortRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.SortRel)
+void ConsistentPartitionWindowRel_WindowRelFunction::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  sorts_.Clear();
-  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
-    delete common_;
+  arguments_.Clear();
+  options_.Clear();
+  if (GetArenaForAllocation() == nullptr && upper_bound_ != nullptr) {
+    delete upper_bound_;
   }
-  common_ = nullptr;
-  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
-    delete input_;
+  upper_bound_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && lower_bound_ != nullptr) {
+    delete lower_bound_;
   }
-  input_ = nullptr;
-  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
-    delete advanced_extension_;
+  lower_bound_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && output_type_ != nullptr) {
+    delete output_type_;
   }
-  advanced_extension_ = nullptr;
+  output_type_ = nullptr;
+  ::memset(&function_reference_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&bounds_type_) -
+      reinterpret_cast<char*>(&function_reference_)) + sizeof(bounds_type_));
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* SortRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ConsistentPartitionWindowRel_WindowRelFunction::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
     switch (tag >> 3) {
-      // .substrait.RelCommon common = 1;
+      // uint32 function_reference = 1;
       case 1:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
-          ptr = ctx->ParseMessage(_internal_mutable_common(), ptr);
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 8)) {
+          function_reference_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
           CHK_(ptr);
         } else
           goto handle_unusual;
         continue;
-      // .substrait.Rel input = 2;
-      case 2:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
-          ptr = ctx->ParseMessage(_internal_mutable_input(), ptr);
+      // .substrait.Expression.WindowFunction.Bound upper_bound = 4;
+      case 4:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 34)) {
+          ptr = ctx->ParseMessage(_internal_mutable_upper_bound(), ptr);
           CHK_(ptr);
         } else
           goto handle_unusual;
         continue;
-      // repeated .substrait.SortField sorts = 3;
-      case 3:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
+      // .substrait.Expression.WindowFunction.Bound lower_bound = 5;
+      case 5:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 42)) {
+          ptr = ctx->ParseMessage(_internal_mutable_lower_bound(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.AggregationPhase phase = 6;
+      case 6:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 48)) {
+          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+          _internal_set_phase(static_cast<::substrait::AggregationPhase>(val));
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.Type output_type = 7;
+      case 7:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 58)) {
+          ptr = ctx->ParseMessage(_internal_mutable_output_type(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.FunctionArgument arguments = 9;
+      case 9:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 74)) {
           ptr -= 1;
           do {
             ptr += 1;
-            ptr = ctx->ParseMessage(_internal_add_sorts(), ptr);
+            ptr = ctx->ParseMessage(_internal_add_arguments(), ptr);
             CHK_(ptr);
             if (!ctx->DataAvailable(ptr)) break;
-          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr));
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<74>(ptr));
         } else
           goto handle_unusual;
         continue;
-      // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+      // .substrait.AggregateFunction.AggregationInvocation invocation = 10;
       case 10:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 82)) {
-          ptr = ctx->ParseMessage(_internal_mutable_advanced_extension(), ptr);
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 80)) {
+          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+          _internal_set_invocation(static_cast<::substrait::AggregateFunction_AggregationInvocation>(val));
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.FunctionOption options = 11;
+      case 11:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 90)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_options(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<90>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+      case 12:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 96)) {
+          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
           CHK_(ptr);
+          _internal_set_bounds_type(static_cast<::substrait::Expression_WindowFunction_BoundsType>(val));
         } else
           goto handle_unusual;
         continue;
@@ -9875,147 +10139,226 @@ const char* SortRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::in
 #undef CHK_
 }
 
-uint8_t* SortRel::_InternalSerialize(
+uint8_t* ConsistentPartitionWindowRel_WindowRelFunction::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.SortRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  // .substrait.RelCommon common = 1;
-  if (this->_internal_has_common()) {
+  // uint32 function_reference = 1;
+  if (this->_internal_function_reference() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(1, this->_internal_function_reference(), target);
+  }
+
+  // .substrait.Expression.WindowFunction.Bound upper_bound = 4;
+  if (this->_internal_has_upper_bound()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
       InternalWriteMessage(
-        1, _Internal::common(this), target, stream);
+        4, _Internal::upper_bound(this), target, stream);
   }
 
-  // .substrait.Rel input = 2;
-  if (this->_internal_has_input()) {
+  // .substrait.Expression.WindowFunction.Bound lower_bound = 5;
+  if (this->_internal_has_lower_bound()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
       InternalWriteMessage(
-        2, _Internal::input(this), target, stream);
+        5, _Internal::lower_bound(this), target, stream);
   }
 
-  // repeated .substrait.SortField sorts = 3;
+  // .substrait.AggregationPhase phase = 6;
+  if (this->_internal_phase() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
+      6, this->_internal_phase(), target);
+  }
+
+  // .substrait.Type output_type = 7;
+  if (this->_internal_has_output_type()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        7, _Internal::output_type(this), target, stream);
+  }
+
+  // repeated .substrait.FunctionArgument arguments = 9;
   for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->_internal_sorts_size()); i < n; i++) {
+      n = static_cast<unsigned int>(this->_internal_arguments_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(3, this->_internal_sorts(i), target, stream);
+      InternalWriteMessage(9, this->_internal_arguments(i), target, stream);
   }
 
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  if (this->_internal_has_advanced_extension()) {
+  // .substrait.AggregateFunction.AggregationInvocation invocation = 10;
+  if (this->_internal_invocation() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
+      10, this->_internal_invocation(), target);
+  }
+
+  // repeated .substrait.FunctionOption options = 11;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_options_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        10, _Internal::advanced_extension(this), target, stream);
+      InternalWriteMessage(11, this->_internal_options(i), target, stream);
+  }
+
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  if (this->_internal_bounds_type() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
+      12, this->_internal_bounds_type(), target);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.SortRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   return target;
 }
 
-size_t SortRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.SortRel)
+size_t ConsistentPartitionWindowRel_WindowRelFunction::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // repeated .substrait.SortField sorts = 3;
-  total_size += 1UL * this->_internal_sorts_size();
-  for (const auto& msg : this->sorts_) {
+  // repeated .substrait.FunctionArgument arguments = 9;
+  total_size += 1UL * this->_internal_arguments_size();
+  for (const auto& msg : this->arguments_) {
     total_size +=
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
   }
 
-  // .substrait.RelCommon common = 1;
-  if (this->_internal_has_common()) {
+  // repeated .substrait.FunctionOption options = 11;
+  total_size += 1UL * this->_internal_options_size();
+  for (const auto& msg : this->options_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  // .substrait.Expression.WindowFunction.Bound upper_bound = 4;
+  if (this->_internal_has_upper_bound()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *common_);
+        *upper_bound_);
   }
 
-  // .substrait.Rel input = 2;
-  if (this->_internal_has_input()) {
+  // .substrait.Expression.WindowFunction.Bound lower_bound = 5;
+  if (this->_internal_has_lower_bound()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *input_);
+        *lower_bound_);
   }
 
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  if (this->_internal_has_advanced_extension()) {
+  // .substrait.Type output_type = 7;
+  if (this->_internal_has_output_type()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *advanced_extension_);
+        *output_type_);
+  }
+
+  // uint32 function_reference = 1;
+  if (this->_internal_function_reference() != 0) {
+    total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32SizePlusOne(this->_internal_function_reference());
+  }
+
+  // .substrait.AggregationPhase phase = 6;
+  if (this->_internal_phase() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_phase());
+  }
+
+  // .substrait.AggregateFunction.AggregationInvocation invocation = 10;
+  if (this->_internal_invocation() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_invocation());
+  }
+
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  if (this->_internal_bounds_type() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_bounds_type());
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SortRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ConsistentPartitionWindowRel_WindowRelFunction::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    SortRel::MergeImpl
+    ConsistentPartitionWindowRel_WindowRelFunction::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SortRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ConsistentPartitionWindowRel_WindowRelFunction::GetClassData() const { return &_class_data_; }
 
-void SortRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ConsistentPartitionWindowRel_WindowRelFunction::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<SortRel *>(to)->MergeFrom(
-      static_cast<const SortRel &>(from));
+  static_cast<ConsistentPartitionWindowRel_WindowRelFunction *>(to)->MergeFrom(
+      static_cast<const ConsistentPartitionWindowRel_WindowRelFunction &>(from));
 }
 
 
-void SortRel::MergeFrom(const SortRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.SortRel)
+void ConsistentPartitionWindowRel_WindowRelFunction::MergeFrom(const ConsistentPartitionWindowRel_WindowRelFunction& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  sorts_.MergeFrom(from.sorts_);
-  if (from._internal_has_common()) {
-    _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
+  arguments_.MergeFrom(from.arguments_);
+  options_.MergeFrom(from.options_);
+  if (from._internal_has_upper_bound()) {
+    _internal_mutable_upper_bound()->::substrait::Expression_WindowFunction_Bound::MergeFrom(from._internal_upper_bound());
   }
-  if (from._internal_has_input()) {
-    _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
+  if (from._internal_has_lower_bound()) {
+    _internal_mutable_lower_bound()->::substrait::Expression_WindowFunction_Bound::MergeFrom(from._internal_lower_bound());
   }
-  if (from._internal_has_advanced_extension()) {
-    _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
+  if (from._internal_has_output_type()) {
+    _internal_mutable_output_type()->::substrait::Type::MergeFrom(from._internal_output_type());
+  }
+  if (from._internal_function_reference() != 0) {
+    _internal_set_function_reference(from._internal_function_reference());
+  }
+  if (from._internal_phase() != 0) {
+    _internal_set_phase(from._internal_phase());
+  }
+  if (from._internal_invocation() != 0) {
+    _internal_set_invocation(from._internal_invocation());
+  }
+  if (from._internal_bounds_type() != 0) {
+    _internal_set_bounds_type(from._internal_bounds_type());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void SortRel::CopyFrom(const SortRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.SortRel)
+void ConsistentPartitionWindowRel_WindowRelFunction::CopyFrom(const ConsistentPartitionWindowRel_WindowRelFunction& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool SortRel::IsInitialized() const {
+bool ConsistentPartitionWindowRel_WindowRelFunction::IsInitialized() const {
   return true;
 }
 
-void SortRel::InternalSwap(SortRel* other) {
+void ConsistentPartitionWindowRel_WindowRelFunction::InternalSwap(ConsistentPartitionWindowRel_WindowRelFunction* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  sorts_.InternalSwap(&other->sorts_);
+  arguments_.InternalSwap(&other->arguments_);
+  options_.InternalSwap(&other->options_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(SortRel, advanced_extension_)
-      + sizeof(SortRel::advanced_extension_)
-      - PROTOBUF_FIELD_OFFSET(SortRel, common_)>(
-          reinterpret_cast<char*>(&common_),
-          reinterpret_cast<char*>(&other->common_));
+      PROTOBUF_FIELD_OFFSET(ConsistentPartitionWindowRel_WindowRelFunction, bounds_type_)
+      + sizeof(ConsistentPartitionWindowRel_WindowRelFunction::bounds_type_)
+      - PROTOBUF_FIELD_OFFSET(ConsistentPartitionWindowRel_WindowRelFunction, upper_bound_)>(
+          reinterpret_cast<char*>(&upper_bound_),
+          reinterpret_cast<char*>(&other->upper_bound_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata SortRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ConsistentPartitionWindowRel_WindowRelFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[23]);
@@ -10023,47 +10366,48 @@ ::PROTOBUF_NAMESPACE_ID::Metadata SortRel::GetMetadata() const {
 
 // ===================================================================
 
-class FilterRel::_Internal {
+class ConsistentPartitionWindowRel::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const FilterRel* msg);
-  static const ::substrait::Rel& input(const FilterRel* msg);
-  static const ::substrait::Expression& condition(const FilterRel* msg);
-  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const FilterRel* msg);
+  static const ::substrait::RelCommon& common(const ConsistentPartitionWindowRel* msg);
+  static const ::substrait::Rel& input(const ConsistentPartitionWindowRel* msg);
+  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const ConsistentPartitionWindowRel* msg);
 };
 
 const ::substrait::RelCommon&
-FilterRel::_Internal::common(const FilterRel* msg) {
+ConsistentPartitionWindowRel::_Internal::common(const ConsistentPartitionWindowRel* msg) {
   return *msg->common_;
 }
 const ::substrait::Rel&
-FilterRel::_Internal::input(const FilterRel* msg) {
+ConsistentPartitionWindowRel::_Internal::input(const ConsistentPartitionWindowRel* msg) {
   return *msg->input_;
 }
-const ::substrait::Expression&
-FilterRel::_Internal::condition(const FilterRel* msg) {
-  return *msg->condition_;
-}
 const ::substrait::extensions::AdvancedExtension&
-FilterRel::_Internal::advanced_extension(const FilterRel* msg) {
+ConsistentPartitionWindowRel::_Internal::advanced_extension(const ConsistentPartitionWindowRel* msg) {
   return *msg->advanced_extension_;
 }
-void FilterRel::clear_advanced_extension() {
+void ConsistentPartitionWindowRel::clear_advanced_extension() {
   if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
     delete advanced_extension_;
   }
   advanced_extension_ = nullptr;
 }
-FilterRel::FilterRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+ConsistentPartitionWindowRel::ConsistentPartitionWindowRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  window_functions_(arena),
+  partition_expressions_(arena),
+  sorts_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.FilterRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.ConsistentPartitionWindowRel)
 }
-FilterRel::FilterRel(const FilterRel& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
+ConsistentPartitionWindowRel::ConsistentPartitionWindowRel(const ConsistentPartitionWindowRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      window_functions_(from.window_functions_),
+      partition_expressions_(from.partition_expressions_),
+      sorts_(from.sorts_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   if (from._internal_has_common()) {
     common_ = new ::substrait::RelCommon(*from.common_);
@@ -10075,57 +10419,54 @@ FilterRel::FilterRel(const FilterRel& from)
   } else {
     input_ = nullptr;
   }
-  if (from._internal_has_condition()) {
-    condition_ = new ::substrait::Expression(*from.condition_);
-  } else {
-    condition_ = nullptr;
-  }
   if (from._internal_has_advanced_extension()) {
     advanced_extension_ = new ::substrait::extensions::AdvancedExtension(*from.advanced_extension_);
   } else {
     advanced_extension_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.FilterRel)
+  // @@protoc_insertion_point(copy_constructor:substrait.ConsistentPartitionWindowRel)
 }
 
-inline void FilterRel::SharedCtor() {
+inline void ConsistentPartitionWindowRel::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
     0, static_cast<size_t>(reinterpret_cast<char*>(&advanced_extension_) -
     reinterpret_cast<char*>(&common_)) + sizeof(advanced_extension_));
 }
 
-FilterRel::~FilterRel() {
-  // @@protoc_insertion_point(destructor:substrait.FilterRel)
+ConsistentPartitionWindowRel::~ConsistentPartitionWindowRel() {
+  // @@protoc_insertion_point(destructor:substrait.ConsistentPartitionWindowRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void FilterRel::SharedDtor() {
+inline void ConsistentPartitionWindowRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
   if (this != internal_default_instance()) delete common_;
   if (this != internal_default_instance()) delete input_;
-  if (this != internal_default_instance()) delete condition_;
   if (this != internal_default_instance()) delete advanced_extension_;
 }
 
-void FilterRel::ArenaDtor(void* object) {
-  FilterRel* _this = reinterpret_cast< FilterRel* >(object);
+void ConsistentPartitionWindowRel::ArenaDtor(void* object) {
+  ConsistentPartitionWindowRel* _this = reinterpret_cast< ConsistentPartitionWindowRel* >(object);
   (void)_this;
 }
-void FilterRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ConsistentPartitionWindowRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void FilterRel::SetCachedSize(int size) const {
+void ConsistentPartitionWindowRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void FilterRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.FilterRel)
+void ConsistentPartitionWindowRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ConsistentPartitionWindowRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
+  window_functions_.Clear();
+  partition_expressions_.Clear();
+  sorts_.Clear();
   if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
     delete common_;
   }
@@ -10134,10 +10475,6 @@ void FilterRel::Clear() {
     delete input_;
   }
   input_ = nullptr;
-  if (GetArenaForAllocation() == nullptr && condition_ != nullptr) {
-    delete condition_;
-  }
-  condition_ = nullptr;
   if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
     delete advanced_extension_;
   }
@@ -10145,7 +10482,7 @@ void FilterRel::Clear() {
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* FilterRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ConsistentPartitionWindowRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
@@ -10167,11 +10504,42 @@ const char* FilterRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::
         } else
           goto handle_unusual;
         continue;
-      // .substrait.Expression condition = 3;
+      // repeated .substrait.ConsistentPartitionWindowRel.WindowRelFunction window_functions = 3;
       case 3:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
-          ptr = ctx->ParseMessage(_internal_mutable_condition(), ptr);
-          CHK_(ptr);
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_window_functions(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.Expression partition_expressions = 4;
+      case 4:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 34)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_partition_expressions(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<34>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.SortField sorts = 5;
+      case 5:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 42)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_sorts(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<42>(ptr));
         } else
           goto handle_unusual;
         continue;
@@ -10206,9 +10574,9 @@ const char* FilterRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::
 #undef CHK_
 }
 
-uint8_t* FilterRel::_InternalSerialize(
+uint8_t* ConsistentPartitionWindowRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.FilterRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ConsistentPartitionWindowRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -10228,12 +10596,28 @@ uint8_t* FilterRel::_InternalSerialize(
         2, _Internal::input(this), target, stream);
   }
 
-  // .substrait.Expression condition = 3;
-  if (this->_internal_has_condition()) {
+  // repeated .substrait.ConsistentPartitionWindowRel.WindowRelFunction window_functions = 3;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_window_functions_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        3, _Internal::condition(this), target, stream);
+      InternalWriteMessage(3, this->_internal_window_functions(i), target, stream);
+  }
+
+  // repeated .substrait.Expression partition_expressions = 4;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_partition_expressions_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(4, this->_internal_partition_expressions(i), target, stream);
+  }
+
+  // repeated .substrait.SortField sorts = 5;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_sorts_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(5, this->_internal_sorts(i), target, stream);
   }
 
   // .substrait.extensions.AdvancedExtension advanced_extension = 10;
@@ -10248,18 +10632,39 @@ uint8_t* FilterRel::_InternalSerialize(
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.FilterRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ConsistentPartitionWindowRel)
   return target;
 }
 
-size_t FilterRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.FilterRel)
+size_t ConsistentPartitionWindowRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ConsistentPartitionWindowRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
+  // repeated .substrait.ConsistentPartitionWindowRel.WindowRelFunction window_functions = 3;
+  total_size += 1UL * this->_internal_window_functions_size();
+  for (const auto& msg : this->window_functions_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  // repeated .substrait.Expression partition_expressions = 4;
+  total_size += 1UL * this->_internal_partition_expressions_size();
+  for (const auto& msg : this->partition_expressions_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  // repeated .substrait.SortField sorts = 5;
+  total_size += 1UL * this->_internal_sorts_size();
+  for (const auto& msg : this->sorts_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
   // .substrait.RelCommon common = 1;
   if (this->_internal_has_common()) {
     total_size += 1 +
@@ -10274,13 +10679,6 @@ size_t FilterRel::ByteSizeLong() const {
         *input_);
   }
 
-  // .substrait.Expression condition = 3;
-  if (this->_internal_has_condition()) {
-    total_size += 1 +
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *condition_);
-  }
-
   // .substrait.extensions.AdvancedExtension advanced_extension = 10;
   if (this->_internal_has_advanced_extension()) {
     total_size += 1 +
@@ -10291,63 +10689,66 @@ size_t FilterRel::ByteSizeLong() const {
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData FilterRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ConsistentPartitionWindowRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    FilterRel::MergeImpl
+    ConsistentPartitionWindowRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*FilterRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ConsistentPartitionWindowRel::GetClassData() const { return &_class_data_; }
 
-void FilterRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ConsistentPartitionWindowRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<FilterRel *>(to)->MergeFrom(
-      static_cast<const FilterRel &>(from));
+  static_cast<ConsistentPartitionWindowRel *>(to)->MergeFrom(
+      static_cast<const ConsistentPartitionWindowRel &>(from));
 }
 
 
-void FilterRel::MergeFrom(const FilterRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.FilterRel)
+void ConsistentPartitionWindowRel::MergeFrom(const ConsistentPartitionWindowRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ConsistentPartitionWindowRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
+  window_functions_.MergeFrom(from.window_functions_);
+  partition_expressions_.MergeFrom(from.partition_expressions_);
+  sorts_.MergeFrom(from.sorts_);
   if (from._internal_has_common()) {
     _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
   }
   if (from._internal_has_input()) {
     _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
   }
-  if (from._internal_has_condition()) {
-    _internal_mutable_condition()->::substrait::Expression::MergeFrom(from._internal_condition());
-  }
   if (from._internal_has_advanced_extension()) {
     _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void FilterRel::CopyFrom(const FilterRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.FilterRel)
+void ConsistentPartitionWindowRel::CopyFrom(const ConsistentPartitionWindowRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ConsistentPartitionWindowRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool FilterRel::IsInitialized() const {
+bool ConsistentPartitionWindowRel::IsInitialized() const {
   return true;
 }
 
-void FilterRel::InternalSwap(FilterRel* other) {
+void ConsistentPartitionWindowRel::InternalSwap(ConsistentPartitionWindowRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  window_functions_.InternalSwap(&other->window_functions_);
+  partition_expressions_.InternalSwap(&other->partition_expressions_);
+  sorts_.InternalSwap(&other->sorts_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(FilterRel, advanced_extension_)
-      + sizeof(FilterRel::advanced_extension_)
-      - PROTOBUF_FIELD_OFFSET(FilterRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(ConsistentPartitionWindowRel, advanced_extension_)
+      + sizeof(ConsistentPartitionWindowRel::advanced_extension_)
+      - PROTOBUF_FIELD_OFFSET(ConsistentPartitionWindowRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata FilterRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ConsistentPartitionWindowRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[24]);
@@ -10355,104 +10756,117 @@ ::PROTOBUF_NAMESPACE_ID::Metadata FilterRel::GetMetadata() const {
 
 // ===================================================================
 
-class SetRel::_Internal {
+class SortRel::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const SetRel* msg);
-  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const SetRel* msg);
+  static const ::substrait::RelCommon& common(const SortRel* msg);
+  static const ::substrait::Rel& input(const SortRel* msg);
+  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const SortRel* msg);
 };
 
 const ::substrait::RelCommon&
-SetRel::_Internal::common(const SetRel* msg) {
+SortRel::_Internal::common(const SortRel* msg) {
   return *msg->common_;
 }
+const ::substrait::Rel&
+SortRel::_Internal::input(const SortRel* msg) {
+  return *msg->input_;
+}
 const ::substrait::extensions::AdvancedExtension&
-SetRel::_Internal::advanced_extension(const SetRel* msg) {
+SortRel::_Internal::advanced_extension(const SortRel* msg) {
   return *msg->advanced_extension_;
 }
-void SetRel::clear_advanced_extension() {
+void SortRel::clear_advanced_extension() {
   if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
     delete advanced_extension_;
   }
   advanced_extension_ = nullptr;
 }
-SetRel::SetRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+SortRel::SortRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
   : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
-  inputs_(arena) {
+  sorts_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.SetRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.SortRel)
 }
-SetRel::SetRel(const SetRel& from)
+SortRel::SortRel(const SortRel& from)
   : ::PROTOBUF_NAMESPACE_ID::Message(),
-      inputs_(from.inputs_) {
+      sorts_(from.sorts_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   if (from._internal_has_common()) {
     common_ = new ::substrait::RelCommon(*from.common_);
   } else {
     common_ = nullptr;
   }
+  if (from._internal_has_input()) {
+    input_ = new ::substrait::Rel(*from.input_);
+  } else {
+    input_ = nullptr;
+  }
   if (from._internal_has_advanced_extension()) {
     advanced_extension_ = new ::substrait::extensions::AdvancedExtension(*from.advanced_extension_);
   } else {
     advanced_extension_ = nullptr;
   }
-  op_ = from.op_;
-  // @@protoc_insertion_point(copy_constructor:substrait.SetRel)
+  // @@protoc_insertion_point(copy_constructor:substrait.SortRel)
 }
 
-inline void SetRel::SharedCtor() {
+inline void SortRel::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&op_) -
-    reinterpret_cast<char*>(&common_)) + sizeof(op_));
+    0, static_cast<size_t>(reinterpret_cast<char*>(&advanced_extension_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(advanced_extension_));
 }
 
-SetRel::~SetRel() {
-  // @@protoc_insertion_point(destructor:substrait.SetRel)
+SortRel::~SortRel() {
+  // @@protoc_insertion_point(destructor:substrait.SortRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void SetRel::SharedDtor() {
+inline void SortRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
   if (this != internal_default_instance()) delete common_;
+  if (this != internal_default_instance()) delete input_;
   if (this != internal_default_instance()) delete advanced_extension_;
 }
 
-void SetRel::ArenaDtor(void* object) {
-  SetRel* _this = reinterpret_cast< SetRel* >(object);
+void SortRel::ArenaDtor(void* object) {
+  SortRel* _this = reinterpret_cast< SortRel* >(object);
   (void)_this;
 }
-void SetRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void SortRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void SetRel::SetCachedSize(int size) const {
+void SortRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void SetRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.SetRel)
+void SortRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.SortRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  inputs_.Clear();
+  sorts_.Clear();
   if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
     delete common_;
   }
   common_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
+    delete input_;
+  }
+  input_ = nullptr;
   if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
     delete advanced_extension_;
   }
   advanced_extension_ = nullptr;
-  op_ = 0;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* SetRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* SortRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
@@ -10466,25 +10880,24 @@ const char* SetRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::int
         } else
           goto handle_unusual;
         continue;
-      // repeated .substrait.Rel inputs = 2;
+      // .substrait.Rel input = 2;
       case 2:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
+          ptr = ctx->ParseMessage(_internal_mutable_input(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.SortField sorts = 3;
+      case 3:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
           ptr -= 1;
           do {
             ptr += 1;
-            ptr = ctx->ParseMessage(_internal_add_inputs(), ptr);
+            ptr = ctx->ParseMessage(_internal_add_sorts(), ptr);
             CHK_(ptr);
             if (!ctx->DataAvailable(ptr)) break;
-          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr));
-        } else
-          goto handle_unusual;
-        continue;
-      // .substrait.SetRel.SetOp op = 3;
-      case 3:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 24)) {
-          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
-          CHK_(ptr);
-          _internal_set_op(static_cast<::substrait::SetRel_SetOp>(val));
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr));
         } else
           goto handle_unusual;
         continue;
@@ -10519,9 +10932,9 @@ const char* SetRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::int
 #undef CHK_
 }
 
-uint8_t* SetRel::_InternalSerialize(
+uint8_t* SortRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.SetRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.SortRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -10533,19 +10946,20 @@ uint8_t* SetRel::_InternalSerialize(
         1, _Internal::common(this), target, stream);
   }
 
-  // repeated .substrait.Rel inputs = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->_internal_inputs_size()); i < n; i++) {
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(2, this->_internal_inputs(i), target, stream);
+      InternalWriteMessage(
+        2, _Internal::input(this), target, stream);
   }
 
-  // .substrait.SetRel.SetOp op = 3;
-  if (this->_internal_op() != 0) {
+  // repeated .substrait.SortField sorts = 3;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_sorts_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
-      3, this->_internal_op(), target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(3, this->_internal_sorts(i), target, stream);
   }
 
   // .substrait.extensions.AdvancedExtension advanced_extension = 10;
@@ -10560,21 +10974,21 @@ uint8_t* SetRel::_InternalSerialize(
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.SetRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.SortRel)
   return target;
 }
 
-size_t SetRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.SetRel)
+size_t SortRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.SortRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // repeated .substrait.Rel inputs = 2;
-  total_size += 1UL * this->_internal_inputs_size();
-  for (const auto& msg : this->inputs_) {
+  // repeated .substrait.SortField sorts = 3;
+  total_size += 1UL * this->_internal_sorts_size();
+  for (const auto& msg : this->sorts_) {
     total_size +=
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
   }
@@ -10586,78 +11000,79 @@ size_t SetRel::ByteSizeLong() const {
         *common_);
   }
 
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  if (this->_internal_has_advanced_extension()) {
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *advanced_extension_);
+        *input_);
   }
 
-  // .substrait.SetRel.SetOp op = 3;
-  if (this->_internal_op() != 0) {
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
     total_size += 1 +
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_op());
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *advanced_extension_);
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SetRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SortRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    SetRel::MergeImpl
+    SortRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SetRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SortRel::GetClassData() const { return &_class_data_; }
 
-void SetRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void SortRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<SetRel *>(to)->MergeFrom(
-      static_cast<const SetRel &>(from));
+  static_cast<SortRel *>(to)->MergeFrom(
+      static_cast<const SortRel &>(from));
 }
 
 
-void SetRel::MergeFrom(const SetRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.SetRel)
+void SortRel::MergeFrom(const SortRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.SortRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  inputs_.MergeFrom(from.inputs_);
+  sorts_.MergeFrom(from.sorts_);
   if (from._internal_has_common()) {
     _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
   }
+  if (from._internal_has_input()) {
+    _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
+  }
   if (from._internal_has_advanced_extension()) {
     _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
   }
-  if (from._internal_op() != 0) {
-    _internal_set_op(from._internal_op());
-  }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void SetRel::CopyFrom(const SetRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.SetRel)
+void SortRel::CopyFrom(const SortRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.SortRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool SetRel::IsInitialized() const {
+bool SortRel::IsInitialized() const {
   return true;
 }
 
-void SetRel::InternalSwap(SetRel* other) {
+void SortRel::InternalSwap(SortRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  inputs_.InternalSwap(&other->inputs_);
+  sorts_.InternalSwap(&other->sorts_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(SetRel, op_)
-      + sizeof(SetRel::op_)
-      - PROTOBUF_FIELD_OFFSET(SetRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(SortRel, advanced_extension_)
+      + sizeof(SortRel::advanced_extension_)
+      - PROTOBUF_FIELD_OFFSET(SortRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata SetRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata SortRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[25]);
@@ -10665,41 +11080,46 @@ ::PROTOBUF_NAMESPACE_ID::Metadata SetRel::GetMetadata() const {
 
 // ===================================================================
 
-class ExtensionSingleRel::_Internal {
+class FilterRel::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const ExtensionSingleRel* msg);
-  static const ::substrait::Rel& input(const ExtensionSingleRel* msg);
-  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionSingleRel* msg);
+  static const ::substrait::RelCommon& common(const FilterRel* msg);
+  static const ::substrait::Rel& input(const FilterRel* msg);
+  static const ::substrait::Expression& condition(const FilterRel* msg);
+  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const FilterRel* msg);
 };
 
 const ::substrait::RelCommon&
-ExtensionSingleRel::_Internal::common(const ExtensionSingleRel* msg) {
+FilterRel::_Internal::common(const FilterRel* msg) {
   return *msg->common_;
 }
 const ::substrait::Rel&
-ExtensionSingleRel::_Internal::input(const ExtensionSingleRel* msg) {
+FilterRel::_Internal::input(const FilterRel* msg) {
   return *msg->input_;
 }
-const ::PROTOBUF_NAMESPACE_ID::Any&
-ExtensionSingleRel::_Internal::detail(const ExtensionSingleRel* msg) {
-  return *msg->detail_;
+const ::substrait::Expression&
+FilterRel::_Internal::condition(const FilterRel* msg) {
+  return *msg->condition_;
 }
-void ExtensionSingleRel::clear_detail() {
-  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
-    delete detail_;
-  }
-  detail_ = nullptr;
+const ::substrait::extensions::AdvancedExtension&
+FilterRel::_Internal::advanced_extension(const FilterRel* msg) {
+  return *msg->advanced_extension_;
 }
-ExtensionSingleRel::ExtensionSingleRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
-                         bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+void FilterRel::clear_advanced_extension() {
+  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
+    delete advanced_extension_;
+  }
+  advanced_extension_ = nullptr;
+}
+FilterRel::FilterRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionSingleRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.FilterRel)
 }
-ExtensionSingleRel::ExtensionSingleRel(const ExtensionSingleRel& from)
+FilterRel::FilterRel(const FilterRel& from)
   : ::PROTOBUF_NAMESPACE_ID::Message() {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   if (from._internal_has_common()) {
@@ -10712,47 +11132,53 @@ ExtensionSingleRel::ExtensionSingleRel(const ExtensionSingleRel& from)
   } else {
     input_ = nullptr;
   }
-  if (from._internal_has_detail()) {
-    detail_ = new ::PROTOBUF_NAMESPACE_ID::Any(*from.detail_);
+  if (from._internal_has_condition()) {
+    condition_ = new ::substrait::Expression(*from.condition_);
   } else {
-    detail_ = nullptr;
+    condition_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionSingleRel)
+  if (from._internal_has_advanced_extension()) {
+    advanced_extension_ = new ::substrait::extensions::AdvancedExtension(*from.advanced_extension_);
+  } else {
+    advanced_extension_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.FilterRel)
 }
 
-inline void ExtensionSingleRel::SharedCtor() {
+inline void FilterRel::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&detail_) -
-    reinterpret_cast<char*>(&common_)) + sizeof(detail_));
+    0, static_cast<size_t>(reinterpret_cast<char*>(&advanced_extension_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(advanced_extension_));
 }
 
-ExtensionSingleRel::~ExtensionSingleRel() {
-  // @@protoc_insertion_point(destructor:substrait.ExtensionSingleRel)
+FilterRel::~FilterRel() {
+  // @@protoc_insertion_point(destructor:substrait.FilterRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExtensionSingleRel::SharedDtor() {
+inline void FilterRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
   if (this != internal_default_instance()) delete common_;
   if (this != internal_default_instance()) delete input_;
-  if (this != internal_default_instance()) delete detail_;
+  if (this != internal_default_instance()) delete condition_;
+  if (this != internal_default_instance()) delete advanced_extension_;
 }
 
-void ExtensionSingleRel::ArenaDtor(void* object) {
-  ExtensionSingleRel* _this = reinterpret_cast< ExtensionSingleRel* >(object);
+void FilterRel::ArenaDtor(void* object) {
+  FilterRel* _this = reinterpret_cast< FilterRel* >(object);
   (void)_this;
 }
-void ExtensionSingleRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void FilterRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExtensionSingleRel::SetCachedSize(int size) const {
+void FilterRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExtensionSingleRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExtensionSingleRel)
+void FilterRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.FilterRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
@@ -10765,14 +11191,18 @@ void ExtensionSingleRel::Clear() {
     delete input_;
   }
   input_ = nullptr;
-  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
-    delete detail_;
+  if (GetArenaForAllocation() == nullptr && condition_ != nullptr) {
+    delete condition_;
   }
-  detail_ = nullptr;
+  condition_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
+    delete advanced_extension_;
+  }
+  advanced_extension_ = nullptr;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExtensionSingleRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* FilterRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
@@ -10794,10 +11224,18 @@ const char* ExtensionSingleRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMES
         } else
           goto handle_unusual;
         continue;
-      // .google.protobuf.Any detail = 3;
+      // .substrait.Expression condition = 3;
       case 3:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
-          ptr = ctx->ParseMessage(_internal_mutable_detail(), ptr);
+          ptr = ctx->ParseMessage(_internal_mutable_condition(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+      case 10:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 82)) {
+          ptr = ctx->ParseMessage(_internal_mutable_advanced_extension(), ptr);
           CHK_(ptr);
         } else
           goto handle_unusual;
@@ -10825,9 +11263,9 @@ const char* ExtensionSingleRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMES
 #undef CHK_
 }
 
-uint8_t* ExtensionSingleRel::_InternalSerialize(
+uint8_t* FilterRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionSingleRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.FilterRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -10847,24 +11285,32 @@ uint8_t* ExtensionSingleRel::_InternalSerialize(
         2, _Internal::input(this), target, stream);
   }
 
-  // .google.protobuf.Any detail = 3;
-  if (this->_internal_has_detail()) {
+  // .substrait.Expression condition = 3;
+  if (this->_internal_has_condition()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
       InternalWriteMessage(
-        3, _Internal::detail(this), target, stream);
+        3, _Internal::condition(this), target, stream);
+  }
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        10, _Internal::advanced_extension(this), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionSingleRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.FilterRel)
   return target;
 }
 
-size_t ExtensionSingleRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionSingleRel)
+size_t FilterRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.FilterRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
@@ -10885,31 +11331,38 @@ size_t ExtensionSingleRel::ByteSizeLong() const {
         *input_);
   }
 
-  // .google.protobuf.Any detail = 3;
-  if (this->_internal_has_detail()) {
+  // .substrait.Expression condition = 3;
+  if (this->_internal_has_condition()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *detail_);
+        *condition_);
+  }
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *advanced_extension_);
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionSingleRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData FilterRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExtensionSingleRel::MergeImpl
+    FilterRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionSingleRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*FilterRel::GetClassData() const { return &_class_data_; }
 
-void ExtensionSingleRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void FilterRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExtensionSingleRel *>(to)->MergeFrom(
-      static_cast<const ExtensionSingleRel &>(from));
+  static_cast<FilterRel *>(to)->MergeFrom(
+      static_cast<const FilterRel &>(from));
 }
 
 
-void ExtensionSingleRel::MergeFrom(const ExtensionSingleRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionSingleRel)
+void FilterRel::MergeFrom(const FilterRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.FilterRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
@@ -10920,35 +11373,38 @@ void ExtensionSingleRel::MergeFrom(const ExtensionSingleRel& from) {
   if (from._internal_has_input()) {
     _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
   }
-  if (from._internal_has_detail()) {
-    _internal_mutable_detail()->::PROTOBUF_NAMESPACE_ID::Any::MergeFrom(from._internal_detail());
+  if (from._internal_has_condition()) {
+    _internal_mutable_condition()->::substrait::Expression::MergeFrom(from._internal_condition());
+  }
+  if (from._internal_has_advanced_extension()) {
+    _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExtensionSingleRel::CopyFrom(const ExtensionSingleRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionSingleRel)
+void FilterRel::CopyFrom(const FilterRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.FilterRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExtensionSingleRel::IsInitialized() const {
+bool FilterRel::IsInitialized() const {
   return true;
 }
 
-void ExtensionSingleRel::InternalSwap(ExtensionSingleRel* other) {
+void FilterRel::InternalSwap(FilterRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(ExtensionSingleRel, detail_)
-      + sizeof(ExtensionSingleRel::detail_)
-      - PROTOBUF_FIELD_OFFSET(ExtensionSingleRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(FilterRel, advanced_extension_)
+      + sizeof(FilterRel::advanced_extension_)
+      - PROTOBUF_FIELD_OFFSET(FilterRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExtensionSingleRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata FilterRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[26]);
@@ -10956,99 +11412,104 @@ ::PROTOBUF_NAMESPACE_ID::Metadata ExtensionSingleRel::GetMetadata() const {
 
 // ===================================================================
 
-class ExtensionLeafRel::_Internal {
+class SetRel::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const ExtensionLeafRel* msg);
-  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionLeafRel* msg);
+  static const ::substrait::RelCommon& common(const SetRel* msg);
+  static const ::substrait::extensions::AdvancedExtension& advanced_extension(const SetRel* msg);
 };
 
 const ::substrait::RelCommon&
-ExtensionLeafRel::_Internal::common(const ExtensionLeafRel* msg) {
+SetRel::_Internal::common(const SetRel* msg) {
   return *msg->common_;
 }
-const ::PROTOBUF_NAMESPACE_ID::Any&
-ExtensionLeafRel::_Internal::detail(const ExtensionLeafRel* msg) {
-  return *msg->detail_;
+const ::substrait::extensions::AdvancedExtension&
+SetRel::_Internal::advanced_extension(const SetRel* msg) {
+  return *msg->advanced_extension_;
 }
-void ExtensionLeafRel::clear_detail() {
-  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
-    delete detail_;
+void SetRel::clear_advanced_extension() {
+  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
+    delete advanced_extension_;
   }
-  detail_ = nullptr;
+  advanced_extension_ = nullptr;
 }
-ExtensionLeafRel::ExtensionLeafRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+SetRel::SetRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  inputs_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionLeafRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.SetRel)
 }
-ExtensionLeafRel::ExtensionLeafRel(const ExtensionLeafRel& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
+SetRel::SetRel(const SetRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      inputs_(from.inputs_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   if (from._internal_has_common()) {
     common_ = new ::substrait::RelCommon(*from.common_);
   } else {
     common_ = nullptr;
   }
-  if (from._internal_has_detail()) {
-    detail_ = new ::PROTOBUF_NAMESPACE_ID::Any(*from.detail_);
+  if (from._internal_has_advanced_extension()) {
+    advanced_extension_ = new ::substrait::extensions::AdvancedExtension(*from.advanced_extension_);
   } else {
-    detail_ = nullptr;
+    advanced_extension_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionLeafRel)
+  op_ = from.op_;
+  // @@protoc_insertion_point(copy_constructor:substrait.SetRel)
 }
 
-inline void ExtensionLeafRel::SharedCtor() {
+inline void SetRel::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&detail_) -
-    reinterpret_cast<char*>(&common_)) + sizeof(detail_));
+    0, static_cast<size_t>(reinterpret_cast<char*>(&op_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(op_));
 }
 
-ExtensionLeafRel::~ExtensionLeafRel() {
-  // @@protoc_insertion_point(destructor:substrait.ExtensionLeafRel)
+SetRel::~SetRel() {
+  // @@protoc_insertion_point(destructor:substrait.SetRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExtensionLeafRel::SharedDtor() {
+inline void SetRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
   if (this != internal_default_instance()) delete common_;
-  if (this != internal_default_instance()) delete detail_;
+  if (this != internal_default_instance()) delete advanced_extension_;
 }
 
-void ExtensionLeafRel::ArenaDtor(void* object) {
-  ExtensionLeafRel* _this = reinterpret_cast< ExtensionLeafRel* >(object);
+void SetRel::ArenaDtor(void* object) {
+  SetRel* _this = reinterpret_cast< SetRel* >(object);
   (void)_this;
 }
-void ExtensionLeafRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void SetRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExtensionLeafRel::SetCachedSize(int size) const {
+void SetRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExtensionLeafRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExtensionLeafRel)
+void SetRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.SetRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
+  inputs_.Clear();
   if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
     delete common_;
   }
   common_ = nullptr;
-  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
-    delete detail_;
+  if (GetArenaForAllocation() == nullptr && advanced_extension_ != nullptr) {
+    delete advanced_extension_;
   }
-  detail_ = nullptr;
+  advanced_extension_ = nullptr;
+  op_ = 0;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExtensionLeafRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* SetRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
@@ -11062,10 +11523,32 @@ const char* ExtensionLeafRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPA
         } else
           goto handle_unusual;
         continue;
-      // .google.protobuf.Any detail = 2;
+      // repeated .substrait.Rel inputs = 2;
       case 2:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
-          ptr = ctx->ParseMessage(_internal_mutable_detail(), ptr);
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_inputs(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.SetRel.SetOp op = 3;
+      case 3:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 24)) {
+          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+          _internal_set_op(static_cast<::substrait::SetRel_SetOp>(val));
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+      case 10:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 82)) {
+          ptr = ctx->ParseMessage(_internal_mutable_advanced_extension(), ptr);
           CHK_(ptr);
         } else
           goto handle_unusual;
@@ -11093,9 +11576,9 @@ const char* ExtensionLeafRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPA
 #undef CHK_
 }
 
-uint8_t* ExtensionLeafRel::_InternalSerialize(
+uint8_t* SetRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionLeafRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.SetRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -11107,30 +11590,52 @@ uint8_t* ExtensionLeafRel::_InternalSerialize(
         1, _Internal::common(this), target, stream);
   }
 
-  // .google.protobuf.Any detail = 2;
-  if (this->_internal_has_detail()) {
+  // repeated .substrait.Rel inputs = 2;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_inputs_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(2, this->_internal_inputs(i), target, stream);
+  }
+
+  // .substrait.SetRel.SetOp op = 3;
+  if (this->_internal_op() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
+      3, this->_internal_op(), target);
+  }
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
       InternalWriteMessage(
-        2, _Internal::detail(this), target, stream);
+        10, _Internal::advanced_extension(this), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionLeafRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.SetRel)
   return target;
 }
 
-size_t ExtensionLeafRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionLeafRel)
+size_t SetRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.SetRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
+  // repeated .substrait.Rel inputs = 2;
+  total_size += 1UL * this->_internal_inputs_size();
+  for (const auto& msg : this->inputs_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
   // .substrait.RelCommon common = 1;
   if (this->_internal_has_common()) {
     total_size += 1 +
@@ -11138,67 +11643,78 @@ size_t ExtensionLeafRel::ByteSizeLong() const {
         *common_);
   }
 
-  // .google.protobuf.Any detail = 2;
-  if (this->_internal_has_detail()) {
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *detail_);
+        *advanced_extension_);
+  }
+
+  // .substrait.SetRel.SetOp op = 3;
+  if (this->_internal_op() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_op());
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionLeafRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SetRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExtensionLeafRel::MergeImpl
+    SetRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionLeafRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SetRel::GetClassData() const { return &_class_data_; }
 
-void ExtensionLeafRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void SetRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExtensionLeafRel *>(to)->MergeFrom(
-      static_cast<const ExtensionLeafRel &>(from));
+  static_cast<SetRel *>(to)->MergeFrom(
+      static_cast<const SetRel &>(from));
 }
 
 
-void ExtensionLeafRel::MergeFrom(const ExtensionLeafRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionLeafRel)
+void SetRel::MergeFrom(const SetRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.SetRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
+  inputs_.MergeFrom(from.inputs_);
   if (from._internal_has_common()) {
     _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
   }
-  if (from._internal_has_detail()) {
-    _internal_mutable_detail()->::PROTOBUF_NAMESPACE_ID::Any::MergeFrom(from._internal_detail());
+  if (from._internal_has_advanced_extension()) {
+    _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
+  }
+  if (from._internal_op() != 0) {
+    _internal_set_op(from._internal_op());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExtensionLeafRel::CopyFrom(const ExtensionLeafRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionLeafRel)
+void SetRel::CopyFrom(const SetRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.SetRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExtensionLeafRel::IsInitialized() const {
+bool SetRel::IsInitialized() const {
   return true;
 }
 
-void ExtensionLeafRel::InternalSwap(ExtensionLeafRel* other) {
+void SetRel::InternalSwap(SetRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  inputs_.InternalSwap(&other->inputs_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(ExtensionLeafRel, detail_)
-      + sizeof(ExtensionLeafRel::detail_)
-      - PROTOBUF_FIELD_OFFSET(ExtensionLeafRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(SetRel, op_)
+      + sizeof(SetRel::op_)
+      - PROTOBUF_FIELD_OFFSET(SetRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExtensionLeafRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata SetRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[27]);
@@ -11206,94 +11722,106 @@ ::PROTOBUF_NAMESPACE_ID::Metadata ExtensionLeafRel::GetMetadata() const {
 
 // ===================================================================
 
-class ExtensionMultiRel::_Internal {
+class ExtensionSingleRel::_Internal {
  public:
-  static const ::substrait::RelCommon& common(const ExtensionMultiRel* msg);
-  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionMultiRel* msg);
+  static const ::substrait::RelCommon& common(const ExtensionSingleRel* msg);
+  static const ::substrait::Rel& input(const ExtensionSingleRel* msg);
+  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionSingleRel* msg);
 };
 
 const ::substrait::RelCommon&
-ExtensionMultiRel::_Internal::common(const ExtensionMultiRel* msg) {
+ExtensionSingleRel::_Internal::common(const ExtensionSingleRel* msg) {
   return *msg->common_;
 }
+const ::substrait::Rel&
+ExtensionSingleRel::_Internal::input(const ExtensionSingleRel* msg) {
+  return *msg->input_;
+}
 const ::PROTOBUF_NAMESPACE_ID::Any&
-ExtensionMultiRel::_Internal::detail(const ExtensionMultiRel* msg) {
+ExtensionSingleRel::_Internal::detail(const ExtensionSingleRel* msg) {
   return *msg->detail_;
 }
-void ExtensionMultiRel::clear_detail() {
+void ExtensionSingleRel::clear_detail() {
   if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
     delete detail_;
   }
   detail_ = nullptr;
 }
-ExtensionMultiRel::ExtensionMultiRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+ExtensionSingleRel::ExtensionSingleRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
-  inputs_(arena) {
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionMultiRel)
+  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionSingleRel)
 }
-ExtensionMultiRel::ExtensionMultiRel(const ExtensionMultiRel& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message(),
-      inputs_(from.inputs_) {
+ExtensionSingleRel::ExtensionSingleRel(const ExtensionSingleRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
   if (from._internal_has_common()) {
     common_ = new ::substrait::RelCommon(*from.common_);
   } else {
     common_ = nullptr;
   }
+  if (from._internal_has_input()) {
+    input_ = new ::substrait::Rel(*from.input_);
+  } else {
+    input_ = nullptr;
+  }
   if (from._internal_has_detail()) {
     detail_ = new ::PROTOBUF_NAMESPACE_ID::Any(*from.detail_);
   } else {
     detail_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionMultiRel)
+  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionSingleRel)
 }
 
-inline void ExtensionMultiRel::SharedCtor() {
+inline void ExtensionSingleRel::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
     0, static_cast<size_t>(reinterpret_cast<char*>(&detail_) -
     reinterpret_cast<char*>(&common_)) + sizeof(detail_));
 }
 
-ExtensionMultiRel::~ExtensionMultiRel() {
-  // @@protoc_insertion_point(destructor:substrait.ExtensionMultiRel)
+ExtensionSingleRel::~ExtensionSingleRel() {
+  // @@protoc_insertion_point(destructor:substrait.ExtensionSingleRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExtensionMultiRel::SharedDtor() {
+inline void ExtensionSingleRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
   if (this != internal_default_instance()) delete common_;
+  if (this != internal_default_instance()) delete input_;
   if (this != internal_default_instance()) delete detail_;
 }
 
-void ExtensionMultiRel::ArenaDtor(void* object) {
-  ExtensionMultiRel* _this = reinterpret_cast< ExtensionMultiRel* >(object);
+void ExtensionSingleRel::ArenaDtor(void* object) {
+  ExtensionSingleRel* _this = reinterpret_cast< ExtensionSingleRel* >(object);
   (void)_this;
 }
-void ExtensionMultiRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ExtensionSingleRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExtensionMultiRel::SetCachedSize(int size) const {
+void ExtensionSingleRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExtensionMultiRel::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExtensionMultiRel)
+void ExtensionSingleRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExtensionSingleRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  inputs_.Clear();
   if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
     delete common_;
   }
   common_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
+    delete input_;
+  }
+  input_ = nullptr;
   if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
     delete detail_;
   }
@@ -11301,7 +11829,7 @@ void ExtensionMultiRel::Clear() {
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExtensionMultiRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ExtensionSingleRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
@@ -11315,16 +11843,11 @@ const char* ExtensionMultiRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESP
         } else
           goto handle_unusual;
         continue;
-      // repeated .substrait.Rel inputs = 2;
+      // .substrait.Rel input = 2;
       case 2:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
-          ptr -= 1;
-          do {
-            ptr += 1;
-            ptr = ctx->ParseMessage(_internal_add_inputs(), ptr);
-            CHK_(ptr);
-            if (!ctx->DataAvailable(ptr)) break;
-          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr));
+          ptr = ctx->ParseMessage(_internal_mutable_input(), ptr);
+          CHK_(ptr);
         } else
           goto handle_unusual;
         continue;
@@ -11359,9 +11882,9 @@ const char* ExtensionMultiRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESP
 #undef CHK_
 }
 
-uint8_t* ExtensionMultiRel::_InternalSerialize(
+uint8_t* ExtensionSingleRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionMultiRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionSingleRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -11373,12 +11896,12 @@ uint8_t* ExtensionMultiRel::_InternalSerialize(
         1, _Internal::common(this), target, stream);
   }
 
-  // repeated .substrait.Rel inputs = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->_internal_inputs_size()); i < n; i++) {
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(2, this->_internal_inputs(i), target, stream);
+      InternalWriteMessage(
+        2, _Internal::input(this), target, stream);
   }
 
   // .google.protobuf.Any detail = 3;
@@ -11393,25 +11916,18 @@ uint8_t* ExtensionMultiRel::_InternalSerialize(
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionMultiRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionSingleRel)
   return target;
 }
 
-size_t ExtensionMultiRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionMultiRel)
+size_t ExtensionSingleRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionSingleRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // repeated .substrait.Rel inputs = 2;
-  total_size += 1UL * this->_internal_inputs_size();
-  for (const auto& msg : this->inputs_) {
-    total_size +=
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
-  }
-
   // .substrait.RelCommon common = 1;
   if (this->_internal_has_common()) {
     total_size += 1 +
@@ -11419,6 +11935,13 @@ size_t ExtensionMultiRel::ByteSizeLong() const {
         *common_);
   }
 
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *input_);
+  }
+
   // .google.protobuf.Any detail = 3;
   if (this->_internal_has_detail()) {
     total_size += 1 +
@@ -11429,59 +11952,60 @@ size_t ExtensionMultiRel::ByteSizeLong() const {
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionMultiRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionSingleRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExtensionMultiRel::MergeImpl
+    ExtensionSingleRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionMultiRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionSingleRel::GetClassData() const { return &_class_data_; }
 
-void ExtensionMultiRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ExtensionSingleRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExtensionMultiRel *>(to)->MergeFrom(
-      static_cast<const ExtensionMultiRel &>(from));
+  static_cast<ExtensionSingleRel *>(to)->MergeFrom(
+      static_cast<const ExtensionSingleRel &>(from));
 }
 
 
-void ExtensionMultiRel::MergeFrom(const ExtensionMultiRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionMultiRel)
+void ExtensionSingleRel::MergeFrom(const ExtensionSingleRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionSingleRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  inputs_.MergeFrom(from.inputs_);
   if (from._internal_has_common()) {
     _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
   }
+  if (from._internal_has_input()) {
+    _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
+  }
   if (from._internal_has_detail()) {
     _internal_mutable_detail()->::PROTOBUF_NAMESPACE_ID::Any::MergeFrom(from._internal_detail());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExtensionMultiRel::CopyFrom(const ExtensionMultiRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionMultiRel)
+void ExtensionSingleRel::CopyFrom(const ExtensionSingleRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionSingleRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExtensionMultiRel::IsInitialized() const {
+bool ExtensionSingleRel::IsInitialized() const {
   return true;
 }
 
-void ExtensionMultiRel::InternalSwap(ExtensionMultiRel* other) {
+void ExtensionSingleRel::InternalSwap(ExtensionSingleRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  inputs_.InternalSwap(&other->inputs_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(ExtensionMultiRel, detail_)
-      + sizeof(ExtensionMultiRel::detail_)
-      - PROTOBUF_FIELD_OFFSET(ExtensionMultiRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(ExtensionSingleRel, detail_)
+      + sizeof(ExtensionSingleRel::detail_)
+      - PROTOBUF_FIELD_OFFSET(ExtensionSingleRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExtensionMultiRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ExtensionSingleRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[28]);
@@ -11489,77 +12013,117 @@ ::PROTOBUF_NAMESPACE_ID::Metadata ExtensionMultiRel::GetMetadata() const {
 
 // ===================================================================
 
-class ExchangeRel_ScatterFields::_Internal {
+class ExtensionLeafRel::_Internal {
  public:
+  static const ::substrait::RelCommon& common(const ExtensionLeafRel* msg);
+  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionLeafRel* msg);
 };
 
-ExchangeRel_ScatterFields::ExchangeRel_ScatterFields(::PROTOBUF_NAMESPACE_ID::Arena* arena,
-                         bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
-  fields_(arena) {
-  SharedCtor();
-  if (!is_message_owned) {
-    RegisterArenaDtor(arena);
-  }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.ScatterFields)
+const ::substrait::RelCommon&
+ExtensionLeafRel::_Internal::common(const ExtensionLeafRel* msg) {
+  return *msg->common_;
 }
-ExchangeRel_ScatterFields::ExchangeRel_ScatterFields(const ExchangeRel_ScatterFields& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message(),
-      fields_(from.fields_) {
+const ::PROTOBUF_NAMESPACE_ID::Any&
+ExtensionLeafRel::_Internal::detail(const ExtensionLeafRel* msg) {
+  return *msg->detail_;
+}
+void ExtensionLeafRel::clear_detail() {
+  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
+    delete detail_;
+  }
+  detail_ = nullptr;
+}
+ExtensionLeafRel::ExtensionLeafRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionLeafRel)
+}
+ExtensionLeafRel::ExtensionLeafRel(const ExtensionLeafRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
-  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.ScatterFields)
+  if (from._internal_has_common()) {
+    common_ = new ::substrait::RelCommon(*from.common_);
+  } else {
+    common_ = nullptr;
+  }
+  if (from._internal_has_detail()) {
+    detail_ = new ::PROTOBUF_NAMESPACE_ID::Any(*from.detail_);
+  } else {
+    detail_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionLeafRel)
 }
 
-inline void ExchangeRel_ScatterFields::SharedCtor() {
+inline void ExtensionLeafRel::SharedCtor() {
+::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
+    reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
+    0, static_cast<size_t>(reinterpret_cast<char*>(&detail_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(detail_));
 }
 
-ExchangeRel_ScatterFields::~ExchangeRel_ScatterFields() {
-  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.ScatterFields)
+ExtensionLeafRel::~ExtensionLeafRel() {
+  // @@protoc_insertion_point(destructor:substrait.ExtensionLeafRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExchangeRel_ScatterFields::SharedDtor() {
+inline void ExtensionLeafRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+  if (this != internal_default_instance()) delete common_;
+  if (this != internal_default_instance()) delete detail_;
 }
 
-void ExchangeRel_ScatterFields::ArenaDtor(void* object) {
-  ExchangeRel_ScatterFields* _this = reinterpret_cast< ExchangeRel_ScatterFields* >(object);
+void ExtensionLeafRel::ArenaDtor(void* object) {
+  ExtensionLeafRel* _this = reinterpret_cast< ExtensionLeafRel* >(object);
   (void)_this;
 }
-void ExchangeRel_ScatterFields::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ExtensionLeafRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExchangeRel_ScatterFields::SetCachedSize(int size) const {
+void ExtensionLeafRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExchangeRel_ScatterFields::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.ScatterFields)
+void ExtensionLeafRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExtensionLeafRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  fields_.Clear();
+  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
+    delete common_;
+  }
+  common_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
+    delete detail_;
+  }
+  detail_ = nullptr;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExchangeRel_ScatterFields::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ExtensionLeafRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
     switch (tag >> 3) {
-      // repeated .substrait.Expression.FieldReference fields = 1;
+      // .substrait.RelCommon common = 1;
       case 1:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
-          ptr -= 1;
-          do {
-            ptr += 1;
-            ptr = ctx->ParseMessage(_internal_add_fields(), ptr);
-            CHK_(ptr);
-            if (!ctx->DataAvailable(ptr)) break;
-          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr));
+          ptr = ctx->ParseMessage(_internal_mutable_common(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .google.protobuf.Any detail = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
+          ptr = ctx->ParseMessage(_internal_mutable_detail(), ptr);
+          CHK_(ptr);
         } else
           goto handle_unusual;
         continue;
@@ -11586,87 +12150,112 @@ const char* ExchangeRel_ScatterFields::_InternalParse(const char* ptr, ::PROTOBU
 #undef CHK_
 }
 
-uint8_t* ExchangeRel_ScatterFields::_InternalSerialize(
+uint8_t* ExtensionLeafRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.ScatterFields)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionLeafRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  // repeated .substrait.Expression.FieldReference fields = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->_internal_fields_size()); i < n; i++) {
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(1, this->_internal_fields(i), target, stream);
+      InternalWriteMessage(
+        1, _Internal::common(this), target, stream);
+  }
+
+  // .google.protobuf.Any detail = 2;
+  if (this->_internal_has_detail()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        2, _Internal::detail(this), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.ScatterFields)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionLeafRel)
   return target;
 }
 
-size_t ExchangeRel_ScatterFields::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.ScatterFields)
+size_t ExtensionLeafRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionLeafRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // repeated .substrait.Expression.FieldReference fields = 1;
-  total_size += 1UL * this->_internal_fields_size();
-  for (const auto& msg : this->fields_) {
-    total_size +=
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *common_);
+  }
+
+  // .google.protobuf.Any detail = 2;
+  if (this->_internal_has_detail()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *detail_);
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_ScatterFields::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionLeafRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExchangeRel_ScatterFields::MergeImpl
+    ExtensionLeafRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_ScatterFields::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionLeafRel::GetClassData() const { return &_class_data_; }
 
-void ExchangeRel_ScatterFields::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ExtensionLeafRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExchangeRel_ScatterFields *>(to)->MergeFrom(
-      static_cast<const ExchangeRel_ScatterFields &>(from));
+  static_cast<ExtensionLeafRel *>(to)->MergeFrom(
+      static_cast<const ExtensionLeafRel &>(from));
 }
 
 
-void ExchangeRel_ScatterFields::MergeFrom(const ExchangeRel_ScatterFields& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.ScatterFields)
+void ExtensionLeafRel::MergeFrom(const ExtensionLeafRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionLeafRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  fields_.MergeFrom(from.fields_);
+  if (from._internal_has_common()) {
+    _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
+  }
+  if (from._internal_has_detail()) {
+    _internal_mutable_detail()->::PROTOBUF_NAMESPACE_ID::Any::MergeFrom(from._internal_detail());
+  }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExchangeRel_ScatterFields::CopyFrom(const ExchangeRel_ScatterFields& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel.ScatterFields)
+void ExtensionLeafRel::CopyFrom(const ExtensionLeafRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionLeafRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExchangeRel_ScatterFields::IsInitialized() const {
+bool ExtensionLeafRel::IsInitialized() const {
   return true;
 }
 
-void ExchangeRel_ScatterFields::InternalSwap(ExchangeRel_ScatterFields* other) {
+void ExtensionLeafRel::InternalSwap(ExtensionLeafRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  fields_.InternalSwap(&other->fields_);
+  ::PROTOBUF_NAMESPACE_ID::internal::memswap<
+      PROTOBUF_FIELD_OFFSET(ExtensionLeafRel, detail_)
+      + sizeof(ExtensionLeafRel::detail_)
+      - PROTOBUF_FIELD_OFFSET(ExtensionLeafRel, common_)>(
+          reinterpret_cast<char*>(&common_),
+          reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_ScatterFields::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ExtensionLeafRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[29]);
@@ -11674,84 +12263,132 @@ ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_ScatterFields::GetMetadata() const
 
 // ===================================================================
 
-class ExchangeRel_SingleBucketExpression::_Internal {
+class ExtensionMultiRel::_Internal {
  public:
-  static const ::substrait::Expression& expression(const ExchangeRel_SingleBucketExpression* msg);
+  static const ::substrait::RelCommon& common(const ExtensionMultiRel* msg);
+  static const ::PROTOBUF_NAMESPACE_ID::Any& detail(const ExtensionMultiRel* msg);
 };
 
-const ::substrait::Expression&
-ExchangeRel_SingleBucketExpression::_Internal::expression(const ExchangeRel_SingleBucketExpression* msg) {
-  return *msg->expression_;
+const ::substrait::RelCommon&
+ExtensionMultiRel::_Internal::common(const ExtensionMultiRel* msg) {
+  return *msg->common_;
 }
-ExchangeRel_SingleBucketExpression::ExchangeRel_SingleBucketExpression(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+const ::PROTOBUF_NAMESPACE_ID::Any&
+ExtensionMultiRel::_Internal::detail(const ExtensionMultiRel* msg) {
+  return *msg->detail_;
+}
+void ExtensionMultiRel::clear_detail() {
+  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
+    delete detail_;
+  }
+  detail_ = nullptr;
+}
+ExtensionMultiRel::ExtensionMultiRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  inputs_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.SingleBucketExpression)
+  // @@protoc_insertion_point(arena_constructor:substrait.ExtensionMultiRel)
 }
-ExchangeRel_SingleBucketExpression::ExchangeRel_SingleBucketExpression(const ExchangeRel_SingleBucketExpression& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
+ExtensionMultiRel::ExtensionMultiRel(const ExtensionMultiRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      inputs_(from.inputs_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
-  if (from._internal_has_expression()) {
-    expression_ = new ::substrait::Expression(*from.expression_);
+  if (from._internal_has_common()) {
+    common_ = new ::substrait::RelCommon(*from.common_);
   } else {
-    expression_ = nullptr;
+    common_ = nullptr;
   }
-  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.SingleBucketExpression)
+  if (from._internal_has_detail()) {
+    detail_ = new ::PROTOBUF_NAMESPACE_ID::Any(*from.detail_);
+  } else {
+    detail_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.ExtensionMultiRel)
 }
 
-inline void ExchangeRel_SingleBucketExpression::SharedCtor() {
-expression_ = nullptr;
+inline void ExtensionMultiRel::SharedCtor() {
+::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
+    reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
+    0, static_cast<size_t>(reinterpret_cast<char*>(&detail_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(detail_));
 }
 
-ExchangeRel_SingleBucketExpression::~ExchangeRel_SingleBucketExpression() {
-  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.SingleBucketExpression)
+ExtensionMultiRel::~ExtensionMultiRel() {
+  // @@protoc_insertion_point(destructor:substrait.ExtensionMultiRel)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExchangeRel_SingleBucketExpression::SharedDtor() {
+inline void ExtensionMultiRel::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
-  if (this != internal_default_instance()) delete expression_;
+  if (this != internal_default_instance()) delete common_;
+  if (this != internal_default_instance()) delete detail_;
 }
 
-void ExchangeRel_SingleBucketExpression::ArenaDtor(void* object) {
-  ExchangeRel_SingleBucketExpression* _this = reinterpret_cast< ExchangeRel_SingleBucketExpression* >(object);
+void ExtensionMultiRel::ArenaDtor(void* object) {
+  ExtensionMultiRel* _this = reinterpret_cast< ExtensionMultiRel* >(object);
   (void)_this;
 }
-void ExchangeRel_SingleBucketExpression::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ExtensionMultiRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExchangeRel_SingleBucketExpression::SetCachedSize(int size) const {
+void ExtensionMultiRel::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExchangeRel_SingleBucketExpression::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.SingleBucketExpression)
+void ExtensionMultiRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExtensionMultiRel)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  if (GetArenaForAllocation() == nullptr && expression_ != nullptr) {
-    delete expression_;
+  inputs_.Clear();
+  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
+    delete common_;
   }
-  expression_ = nullptr;
+  common_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && detail_ != nullptr) {
+    delete detail_;
+  }
+  detail_ = nullptr;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExchangeRel_SingleBucketExpression::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ExtensionMultiRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
     switch (tag >> 3) {
-      // .substrait.Expression expression = 1;
+      // .substrait.RelCommon common = 1;
       case 1:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
-          ptr = ctx->ParseMessage(_internal_mutable_expression(), ptr);
+          ptr = ctx->ParseMessage(_internal_mutable_common(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.Rel inputs = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_inputs(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      // .google.protobuf.Any detail = 3;
+      case 3:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
+          ptr = ctx->ParseMessage(_internal_mutable_detail(), ptr);
           CHK_(ptr);
         } else
           goto handle_unusual;
@@ -11779,89 +12416,129 @@ const char* ExchangeRel_SingleBucketExpression::_InternalParse(const char* ptr,
 #undef CHK_
 }
 
-uint8_t* ExchangeRel_SingleBucketExpression::_InternalSerialize(
+uint8_t* ExtensionMultiRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.SingleBucketExpression)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExtensionMultiRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  // .substrait.Expression expression = 1;
-  if (this->_internal_has_expression()) {
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
       InternalWriteMessage(
-        1, _Internal::expression(this), target, stream);
+        1, _Internal::common(this), target, stream);
+  }
+
+  // repeated .substrait.Rel inputs = 2;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_inputs_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(2, this->_internal_inputs(i), target, stream);
+  }
+
+  // .google.protobuf.Any detail = 3;
+  if (this->_internal_has_detail()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        3, _Internal::detail(this), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.SingleBucketExpression)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExtensionMultiRel)
   return target;
 }
 
-size_t ExchangeRel_SingleBucketExpression::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.SingleBucketExpression)
+size_t ExtensionMultiRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExtensionMultiRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // .substrait.Expression expression = 1;
-  if (this->_internal_has_expression()) {
+  // repeated .substrait.Rel inputs = 2;
+  total_size += 1UL * this->_internal_inputs_size();
+  for (const auto& msg : this->inputs_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
     total_size += 1 +
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *expression_);
+        *common_);
+  }
+
+  // .google.protobuf.Any detail = 3;
+  if (this->_internal_has_detail()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *detail_);
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_SingleBucketExpression::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExtensionMultiRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExchangeRel_SingleBucketExpression::MergeImpl
+    ExtensionMultiRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_SingleBucketExpression::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExtensionMultiRel::GetClassData() const { return &_class_data_; }
 
-void ExchangeRel_SingleBucketExpression::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ExtensionMultiRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExchangeRel_SingleBucketExpression *>(to)->MergeFrom(
-      static_cast<const ExchangeRel_SingleBucketExpression &>(from));
+  static_cast<ExtensionMultiRel *>(to)->MergeFrom(
+      static_cast<const ExtensionMultiRel &>(from));
 }
 
 
-void ExchangeRel_SingleBucketExpression::MergeFrom(const ExchangeRel_SingleBucketExpression& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.SingleBucketExpression)
+void ExtensionMultiRel::MergeFrom(const ExtensionMultiRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExtensionMultiRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  if (from._internal_has_expression()) {
-    _internal_mutable_expression()->::substrait::Expression::MergeFrom(from._internal_expression());
+  inputs_.MergeFrom(from.inputs_);
+  if (from._internal_has_common()) {
+    _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
+  }
+  if (from._internal_has_detail()) {
+    _internal_mutable_detail()->::PROTOBUF_NAMESPACE_ID::Any::MergeFrom(from._internal_detail());
   }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExchangeRel_SingleBucketExpression::CopyFrom(const ExchangeRel_SingleBucketExpression& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel.SingleBucketExpression)
+void ExtensionMultiRel::CopyFrom(const ExtensionMultiRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExtensionMultiRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExchangeRel_SingleBucketExpression::IsInitialized() const {
+bool ExtensionMultiRel::IsInitialized() const {
   return true;
 }
 
-void ExchangeRel_SingleBucketExpression::InternalSwap(ExchangeRel_SingleBucketExpression* other) {
+void ExtensionMultiRel::InternalSwap(ExtensionMultiRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  swap(expression_, other->expression_);
+  inputs_.InternalSwap(&other->inputs_);
+  ::PROTOBUF_NAMESPACE_ID::internal::memswap<
+      PROTOBUF_FIELD_OFFSET(ExtensionMultiRel, detail_)
+      + sizeof(ExtensionMultiRel::detail_)
+      - PROTOBUF_FIELD_OFFSET(ExtensionMultiRel, common_)>(
+          reinterpret_cast<char*>(&common_),
+          reinterpret_cast<char*>(&other->common_));
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_SingleBucketExpression::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ExtensionMultiRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
       file_level_metadata_substrait_2falgebra_2eproto[30]);
@@ -11869,98 +12546,77 @@ ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_SingleBucketExpression::GetMetadat
 
 // ===================================================================
 
-class ExchangeRel_MultiBucketExpression::_Internal {
+class ExchangeRel_ScatterFields::_Internal {
  public:
-  static const ::substrait::Expression& expression(const ExchangeRel_MultiBucketExpression* msg);
 };
 
-const ::substrait::Expression&
-ExchangeRel_MultiBucketExpression::_Internal::expression(const ExchangeRel_MultiBucketExpression* msg) {
-  return *msg->expression_;
-}
-ExchangeRel_MultiBucketExpression::ExchangeRel_MultiBucketExpression(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+ExchangeRel_ScatterFields::ExchangeRel_ScatterFields(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  fields_(arena) {
   SharedCtor();
   if (!is_message_owned) {
     RegisterArenaDtor(arena);
   }
-  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.MultiBucketExpression)
+  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.ScatterFields)
 }
-ExchangeRel_MultiBucketExpression::ExchangeRel_MultiBucketExpression(const ExchangeRel_MultiBucketExpression& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
+ExchangeRel_ScatterFields::ExchangeRel_ScatterFields(const ExchangeRel_ScatterFields& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      fields_(from.fields_) {
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
-  if (from._internal_has_expression()) {
-    expression_ = new ::substrait::Expression(*from.expression_);
-  } else {
-    expression_ = nullptr;
-  }
-  constrained_to_count_ = from.constrained_to_count_;
-  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.MultiBucketExpression)
+  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.ScatterFields)
 }
 
-inline void ExchangeRel_MultiBucketExpression::SharedCtor() {
-::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
-    reinterpret_cast<char*>(&expression_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&constrained_to_count_) -
-    reinterpret_cast<char*>(&expression_)) + sizeof(constrained_to_count_));
+inline void ExchangeRel_ScatterFields::SharedCtor() {
 }
 
-ExchangeRel_MultiBucketExpression::~ExchangeRel_MultiBucketExpression() {
-  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.MultiBucketExpression)
+ExchangeRel_ScatterFields::~ExchangeRel_ScatterFields() {
+  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.ScatterFields)
   if (GetArenaForAllocation() != nullptr) return;
   SharedDtor();
   _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-inline void ExchangeRel_MultiBucketExpression::SharedDtor() {
+inline void ExchangeRel_ScatterFields::SharedDtor() {
   GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
-  if (this != internal_default_instance()) delete expression_;
 }
 
-void ExchangeRel_MultiBucketExpression::ArenaDtor(void* object) {
-  ExchangeRel_MultiBucketExpression* _this = reinterpret_cast< ExchangeRel_MultiBucketExpression* >(object);
+void ExchangeRel_ScatterFields::ArenaDtor(void* object) {
+  ExchangeRel_ScatterFields* _this = reinterpret_cast< ExchangeRel_ScatterFields* >(object);
   (void)_this;
 }
-void ExchangeRel_MultiBucketExpression::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+void ExchangeRel_ScatterFields::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
 }
-void ExchangeRel_MultiBucketExpression::SetCachedSize(int size) const {
+void ExchangeRel_ScatterFields::SetCachedSize(int size) const {
   _cached_size_.Set(size);
 }
 
-void ExchangeRel_MultiBucketExpression::Clear() {
-// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.MultiBucketExpression)
+void ExchangeRel_ScatterFields::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.ScatterFields)
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  if (GetArenaForAllocation() == nullptr && expression_ != nullptr) {
-    delete expression_;
-  }
-  expression_ = nullptr;
-  constrained_to_count_ = false;
+  fields_.Clear();
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
-const char* ExchangeRel_MultiBucketExpression::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+const char* ExchangeRel_ScatterFields::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
 #define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     uint32_t tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
     switch (tag >> 3) {
-      // .substrait.Expression expression = 1;
+      // repeated .substrait.Expression.FieldReference fields = 1;
       case 1:
         if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
-          ptr = ctx->ParseMessage(_internal_mutable_expression(), ptr);
-          CHK_(ptr);
-        } else
-          goto handle_unusual;
-        continue;
-      // bool constrained_to_count = 2;
-      case 2:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 16)) {
-          constrained_to_count_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
-          CHK_(ptr);
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_fields(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr));
         } else
           goto handle_unusual;
         continue;
@@ -11987,72 +12643,473 @@ const char* ExchangeRel_MultiBucketExpression::_InternalParse(const char* ptr, :
 #undef CHK_
 }
 
-uint8_t* ExchangeRel_MultiBucketExpression::_InternalSerialize(
+uint8_t* ExchangeRel_ScatterFields::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.MultiBucketExpression)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.ScatterFields)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  // .substrait.Expression expression = 1;
-  if (this->_internal_has_expression()) {
+  // repeated .substrait.Expression.FieldReference fields = 1;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_fields_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        1, _Internal::expression(this), target, stream);
-  }
-
-  // bool constrained_to_count = 2;
-  if (this->_internal_constrained_to_count() != 0) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteBoolToArray(2, this->_internal_constrained_to_count(), target);
+      InternalWriteMessage(1, this->_internal_fields(i), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.MultiBucketExpression)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.ScatterFields)
   return target;
 }
 
-size_t ExchangeRel_MultiBucketExpression::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.MultiBucketExpression)
+size_t ExchangeRel_ScatterFields::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.ScatterFields)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // .substrait.Expression expression = 1;
-  if (this->_internal_has_expression()) {
-    total_size += 1 +
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *expression_);
-  }
-
-  // bool constrained_to_count = 2;
-  if (this->_internal_constrained_to_count() != 0) {
-    total_size += 1 + 1;
+  // repeated .substrait.Expression.FieldReference fields = 1;
+  total_size += 1UL * this->_internal_fields_size();
+  for (const auto& msg : this->fields_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_MultiBucketExpression::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_ScatterFields::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExchangeRel_MultiBucketExpression::MergeImpl
+    ExchangeRel_ScatterFields::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_MultiBucketExpression::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_ScatterFields::GetClassData() const { return &_class_data_; }
 
-void ExchangeRel_MultiBucketExpression::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ExchangeRel_ScatterFields::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExchangeRel_MultiBucketExpression *>(to)->MergeFrom(
-      static_cast<const ExchangeRel_MultiBucketExpression &>(from));
+  static_cast<ExchangeRel_ScatterFields *>(to)->MergeFrom(
+      static_cast<const ExchangeRel_ScatterFields &>(from));
 }
 
 
-void ExchangeRel_MultiBucketExpression::MergeFrom(const ExchangeRel_MultiBucketExpression& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.MultiBucketExpression)
+void ExchangeRel_ScatterFields::MergeFrom(const ExchangeRel_ScatterFields& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.ScatterFields)
+  GOOGLE_DCHECK_NE(&from, this);
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  fields_.MergeFrom(from.fields_);
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+}
+
+void ExchangeRel_ScatterFields::CopyFrom(const ExchangeRel_ScatterFields& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel.ScatterFields)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ExchangeRel_ScatterFields::IsInitialized() const {
+  return true;
+}
+
+void ExchangeRel_ScatterFields::InternalSwap(ExchangeRel_ScatterFields* other) {
+  using std::swap;
+  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  fields_.InternalSwap(&other->fields_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_ScatterFields::GetMetadata() const {
+  return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
+      &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
+      file_level_metadata_substrait_2falgebra_2eproto[31]);
+}
+
+// ===================================================================
+
+class ExchangeRel_SingleBucketExpression::_Internal {
+ public:
+  static const ::substrait::Expression& expression(const ExchangeRel_SingleBucketExpression* msg);
+};
+
+const ::substrait::Expression&
+ExchangeRel_SingleBucketExpression::_Internal::expression(const ExchangeRel_SingleBucketExpression* msg) {
+  return *msg->expression_;
+}
+ExchangeRel_SingleBucketExpression::ExchangeRel_SingleBucketExpression(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.SingleBucketExpression)
+}
+ExchangeRel_SingleBucketExpression::ExchangeRel_SingleBucketExpression(const ExchangeRel_SingleBucketExpression& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  if (from._internal_has_expression()) {
+    expression_ = new ::substrait::Expression(*from.expression_);
+  } else {
+    expression_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.SingleBucketExpression)
+}
+
+inline void ExchangeRel_SingleBucketExpression::SharedCtor() {
+expression_ = nullptr;
+}
+
+ExchangeRel_SingleBucketExpression::~ExchangeRel_SingleBucketExpression() {
+  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.SingleBucketExpression)
+  if (GetArenaForAllocation() != nullptr) return;
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+inline void ExchangeRel_SingleBucketExpression::SharedDtor() {
+  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+  if (this != internal_default_instance()) delete expression_;
+}
+
+void ExchangeRel_SingleBucketExpression::ArenaDtor(void* object) {
+  ExchangeRel_SingleBucketExpression* _this = reinterpret_cast< ExchangeRel_SingleBucketExpression* >(object);
+  (void)_this;
+}
+void ExchangeRel_SingleBucketExpression::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void ExchangeRel_SingleBucketExpression::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+
+void ExchangeRel_SingleBucketExpression::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.SingleBucketExpression)
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  if (GetArenaForAllocation() == nullptr && expression_ != nullptr) {
+    delete expression_;
+  }
+  expression_ = nullptr;
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* ExchangeRel_SingleBucketExpression::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    uint32_t tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    switch (tag >> 3) {
+      // .substrait.Expression expression = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
+          ptr = ctx->ParseMessage(_internal_mutable_expression(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      default:
+        goto handle_unusual;
+    }  // switch
+  handle_unusual:
+    if ((tag == 0) || ((tag & 7) == 4)) {
+      CHK_(ptr);
+      ctx->SetLastTag(tag);
+      goto message_done;
+    }
+    ptr = UnknownFieldParse(
+        tag,
+        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+        ptr, ctx);
+    CHK_(ptr != nullptr);
+  }  // while
+message_done:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto message_done;
+#undef CHK_
+}
+
+uint8_t* ExchangeRel_SingleBucketExpression::_InternalSerialize(
+    uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.SingleBucketExpression)
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .substrait.Expression expression = 1;
+  if (this->_internal_has_expression()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        1, _Internal::expression(this), target, stream);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.SingleBucketExpression)
+  return target;
+}
+
+size_t ExchangeRel_SingleBucketExpression::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.SingleBucketExpression)
+  size_t total_size = 0;
+
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .substrait.Expression expression = 1;
+  if (this->_internal_has_expression()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *expression_);
+  }
+
+  return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
+}
+
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_SingleBucketExpression::_class_data_ = {
+    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
+    ExchangeRel_SingleBucketExpression::MergeImpl
+};
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_SingleBucketExpression::GetClassData() const { return &_class_data_; }
+
+void ExchangeRel_SingleBucketExpression::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+                      const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+  static_cast<ExchangeRel_SingleBucketExpression *>(to)->MergeFrom(
+      static_cast<const ExchangeRel_SingleBucketExpression &>(from));
+}
+
+
+void ExchangeRel_SingleBucketExpression::MergeFrom(const ExchangeRel_SingleBucketExpression& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.SingleBucketExpression)
+  GOOGLE_DCHECK_NE(&from, this);
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from._internal_has_expression()) {
+    _internal_mutable_expression()->::substrait::Expression::MergeFrom(from._internal_expression());
+  }
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+}
+
+void ExchangeRel_SingleBucketExpression::CopyFrom(const ExchangeRel_SingleBucketExpression& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel.SingleBucketExpression)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ExchangeRel_SingleBucketExpression::IsInitialized() const {
+  return true;
+}
+
+void ExchangeRel_SingleBucketExpression::InternalSwap(ExchangeRel_SingleBucketExpression* other) {
+  using std::swap;
+  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  swap(expression_, other->expression_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_SingleBucketExpression::GetMetadata() const {
+  return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
+      &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
+      file_level_metadata_substrait_2falgebra_2eproto[32]);
+}
+
+// ===================================================================
+
+class ExchangeRel_MultiBucketExpression::_Internal {
+ public:
+  static const ::substrait::Expression& expression(const ExchangeRel_MultiBucketExpression* msg);
+};
+
+const ::substrait::Expression&
+ExchangeRel_MultiBucketExpression::_Internal::expression(const ExchangeRel_MultiBucketExpression* msg) {
+  return *msg->expression_;
+}
+ExchangeRel_MultiBucketExpression::ExchangeRel_MultiBucketExpression(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExchangeRel.MultiBucketExpression)
+}
+ExchangeRel_MultiBucketExpression::ExchangeRel_MultiBucketExpression(const ExchangeRel_MultiBucketExpression& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  if (from._internal_has_expression()) {
+    expression_ = new ::substrait::Expression(*from.expression_);
+  } else {
+    expression_ = nullptr;
+  }
+  constrained_to_count_ = from.constrained_to_count_;
+  // @@protoc_insertion_point(copy_constructor:substrait.ExchangeRel.MultiBucketExpression)
+}
+
+inline void ExchangeRel_MultiBucketExpression::SharedCtor() {
+::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
+    reinterpret_cast<char*>(&expression_) - reinterpret_cast<char*>(this)),
+    0, static_cast<size_t>(reinterpret_cast<char*>(&constrained_to_count_) -
+    reinterpret_cast<char*>(&expression_)) + sizeof(constrained_to_count_));
+}
+
+ExchangeRel_MultiBucketExpression::~ExchangeRel_MultiBucketExpression() {
+  // @@protoc_insertion_point(destructor:substrait.ExchangeRel.MultiBucketExpression)
+  if (GetArenaForAllocation() != nullptr) return;
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+inline void ExchangeRel_MultiBucketExpression::SharedDtor() {
+  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+  if (this != internal_default_instance()) delete expression_;
+}
+
+void ExchangeRel_MultiBucketExpression::ArenaDtor(void* object) {
+  ExchangeRel_MultiBucketExpression* _this = reinterpret_cast< ExchangeRel_MultiBucketExpression* >(object);
+  (void)_this;
+}
+void ExchangeRel_MultiBucketExpression::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void ExchangeRel_MultiBucketExpression::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+
+void ExchangeRel_MultiBucketExpression::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExchangeRel.MultiBucketExpression)
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  if (GetArenaForAllocation() == nullptr && expression_ != nullptr) {
+    delete expression_;
+  }
+  expression_ = nullptr;
+  constrained_to_count_ = false;
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* ExchangeRel_MultiBucketExpression::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    uint32_t tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    switch (tag >> 3) {
+      // .substrait.Expression expression = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
+          ptr = ctx->ParseMessage(_internal_mutable_expression(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // bool constrained_to_count = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 16)) {
+          constrained_to_count_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      default:
+        goto handle_unusual;
+    }  // switch
+  handle_unusual:
+    if ((tag == 0) || ((tag & 7) == 4)) {
+      CHK_(ptr);
+      ctx->SetLastTag(tag);
+      goto message_done;
+    }
+    ptr = UnknownFieldParse(
+        tag,
+        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+        ptr, ctx);
+    CHK_(ptr != nullptr);
+  }  // while
+message_done:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto message_done;
+#undef CHK_
+}
+
+uint8_t* ExchangeRel_MultiBucketExpression::_InternalSerialize(
+    uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel.MultiBucketExpression)
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .substrait.Expression expression = 1;
+  if (this->_internal_has_expression()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        1, _Internal::expression(this), target, stream);
+  }
+
+  // bool constrained_to_count = 2;
+  if (this->_internal_constrained_to_count() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteBoolToArray(2, this->_internal_constrained_to_count(), target);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel.MultiBucketExpression)
+  return target;
+}
+
+size_t ExchangeRel_MultiBucketExpression::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel.MultiBucketExpression)
+  size_t total_size = 0;
+
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .substrait.Expression expression = 1;
+  if (this->_internal_has_expression()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *expression_);
+  }
+
+  // bool constrained_to_count = 2;
+  if (this->_internal_constrained_to_count() != 0) {
+    total_size += 1 + 1;
+  }
+
+  return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
+}
+
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel_MultiBucketExpression::_class_data_ = {
+    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
+    ExchangeRel_MultiBucketExpression::MergeImpl
+};
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_MultiBucketExpression::GetClassData() const { return &_class_data_; }
+
+void ExchangeRel_MultiBucketExpression::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+                      const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+  static_cast<ExchangeRel_MultiBucketExpression *>(to)->MergeFrom(
+      static_cast<const ExchangeRel_MultiBucketExpression &>(from));
+}
+
+
+void ExchangeRel_MultiBucketExpression::MergeFrom(const ExchangeRel_MultiBucketExpression& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel.MultiBucketExpression)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
@@ -12091,7 +13148,7 @@ void ExchangeRel_MultiBucketExpression::InternalSwap(ExchangeRel_MultiBucketExpr
 ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_MultiBucketExpression::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[31]);
+      file_level_metadata_substrait_2falgebra_2eproto[33]);
 }
 
 // ===================================================================
@@ -12130,7 +13187,7 @@ const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel_Broadcast::GetClas
 ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_Broadcast::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[32]);
+      file_level_metadata_substrait_2falgebra_2eproto[34]);
 }
 
 // ===================================================================
@@ -12308,7 +13365,7 @@ void ExchangeRel_RoundRobin::InternalSwap(ExchangeRel_RoundRobin* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_RoundRobin::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[33]);
+      file_level_metadata_substrait_2falgebra_2eproto[35]);
 }
 
 // ===================================================================
@@ -12640,7 +13697,7 @@ void ExchangeRel_ExchangeTarget::InternalSwap(ExchangeRel_ExchangeTarget* other)
 ::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel_ExchangeTarget::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[34]);
+      file_level_metadata_substrait_2falgebra_2eproto[36]);
 }
 
 // ===================================================================
@@ -13043,9 +14100,910 @@ const char* ExchangeRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID
 #undef CHK_
 }
 
-uint8_t* ExchangeRel::_InternalSerialize(
+uint8_t* ExchangeRel::_InternalSerialize(
+    uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel)
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        1, _Internal::common(this), target, stream);
+  }
+
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        2, _Internal::input(this), target, stream);
+  }
+
+  // int32 partition_count = 3;
+  if (this->_internal_partition_count() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->_internal_partition_count(), target);
+  }
+
+  // repeated .substrait.ExchangeRel.ExchangeTarget targets = 4;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_targets_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(4, this->_internal_targets(i), target, stream);
+  }
+
+  // .substrait.ExchangeRel.ScatterFields scatter_by_fields = 5;
+  if (_internal_has_scatter_by_fields()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        5, _Internal::scatter_by_fields(this), target, stream);
+  }
+
+  // .substrait.ExchangeRel.SingleBucketExpression single_target = 6;
+  if (_internal_has_single_target()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        6, _Internal::single_target(this), target, stream);
+  }
+
+  // .substrait.ExchangeRel.MultiBucketExpression multi_target = 7;
+  if (_internal_has_multi_target()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        7, _Internal::multi_target(this), target, stream);
+  }
+
+  // .substrait.ExchangeRel.RoundRobin round_robin = 8;
+  if (_internal_has_round_robin()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        8, _Internal::round_robin(this), target, stream);
+  }
+
+  // .substrait.ExchangeRel.Broadcast broadcast = 9;
+  if (_internal_has_broadcast()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        9, _Internal::broadcast(this), target, stream);
+  }
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        10, _Internal::advanced_extension(this), target, stream);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel)
+  return target;
+}
+
+size_t ExchangeRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel)
+  size_t total_size = 0;
+
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // repeated .substrait.ExchangeRel.ExchangeTarget targets = 4;
+  total_size += 1UL * this->_internal_targets_size();
+  for (const auto& msg : this->targets_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  // .substrait.RelCommon common = 1;
+  if (this->_internal_has_common()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *common_);
+  }
+
+  // .substrait.Rel input = 2;
+  if (this->_internal_has_input()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *input_);
+  }
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  if (this->_internal_has_advanced_extension()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *advanced_extension_);
+  }
+
+  // int32 partition_count = 3;
+  if (this->_internal_partition_count() != 0) {
+    total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32SizePlusOne(this->_internal_partition_count());
+  }
+
+  switch (exchange_kind_case()) {
+    // .substrait.ExchangeRel.ScatterFields scatter_by_fields = 5;
+    case kScatterByFields: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *exchange_kind_.scatter_by_fields_);
+      break;
+    }
+    // .substrait.ExchangeRel.SingleBucketExpression single_target = 6;
+    case kSingleTarget: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *exchange_kind_.single_target_);
+      break;
+    }
+    // .substrait.ExchangeRel.MultiBucketExpression multi_target = 7;
+    case kMultiTarget: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *exchange_kind_.multi_target_);
+      break;
+    }
+    // .substrait.ExchangeRel.RoundRobin round_robin = 8;
+    case kRoundRobin: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *exchange_kind_.round_robin_);
+      break;
+    }
+    // .substrait.ExchangeRel.Broadcast broadcast = 9;
+    case kBroadcast: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *exchange_kind_.broadcast_);
+      break;
+    }
+    case EXCHANGE_KIND_NOT_SET: {
+      break;
+    }
+  }
+  return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
+}
+
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel::_class_data_ = {
+    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
+    ExchangeRel::MergeImpl
+};
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel::GetClassData() const { return &_class_data_; }
+
+void ExchangeRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+                      const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+  static_cast<ExchangeRel *>(to)->MergeFrom(
+      static_cast<const ExchangeRel &>(from));
+}
+
+
+void ExchangeRel::MergeFrom(const ExchangeRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel)
+  GOOGLE_DCHECK_NE(&from, this);
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  targets_.MergeFrom(from.targets_);
+  if (from._internal_has_common()) {
+    _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
+  }
+  if (from._internal_has_input()) {
+    _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
+  }
+  if (from._internal_has_advanced_extension()) {
+    _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
+  }
+  if (from._internal_partition_count() != 0) {
+    _internal_set_partition_count(from._internal_partition_count());
+  }
+  switch (from.exchange_kind_case()) {
+    case kScatterByFields: {
+      _internal_mutable_scatter_by_fields()->::substrait::ExchangeRel_ScatterFields::MergeFrom(from._internal_scatter_by_fields());
+      break;
+    }
+    case kSingleTarget: {
+      _internal_mutable_single_target()->::substrait::ExchangeRel_SingleBucketExpression::MergeFrom(from._internal_single_target());
+      break;
+    }
+    case kMultiTarget: {
+      _internal_mutable_multi_target()->::substrait::ExchangeRel_MultiBucketExpression::MergeFrom(from._internal_multi_target());
+      break;
+    }
+    case kRoundRobin: {
+      _internal_mutable_round_robin()->::substrait::ExchangeRel_RoundRobin::MergeFrom(from._internal_round_robin());
+      break;
+    }
+    case kBroadcast: {
+      _internal_mutable_broadcast()->::substrait::ExchangeRel_Broadcast::MergeFrom(from._internal_broadcast());
+      break;
+    }
+    case EXCHANGE_KIND_NOT_SET: {
+      break;
+    }
+  }
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+}
+
+void ExchangeRel::CopyFrom(const ExchangeRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ExchangeRel::IsInitialized() const {
+  return true;
+}
+
+void ExchangeRel::InternalSwap(ExchangeRel* other) {
+  using std::swap;
+  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  targets_.InternalSwap(&other->targets_);
+  ::PROTOBUF_NAMESPACE_ID::internal::memswap<
+      PROTOBUF_FIELD_OFFSET(ExchangeRel, partition_count_)
+      + sizeof(ExchangeRel::partition_count_)
+      - PROTOBUF_FIELD_OFFSET(ExchangeRel, common_)>(
+          reinterpret_cast<char*>(&common_),
+          reinterpret_cast<char*>(&other->common_));
+  swap(exchange_kind_, other->exchange_kind_);
+  swap(_oneof_case_[0], other->_oneof_case_[0]);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel::GetMetadata() const {
+  return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
+      &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
+      file_level_metadata_substrait_2falgebra_2eproto[37]);
+}
+
+// ===================================================================
+
+class ExpandRel_ExpandField::_Internal {
+ public:
+  static const ::substrait::ExpandRel_SwitchingField& switching_field(const ExpandRel_ExpandField* msg);
+  static const ::substrait::Expression& consistent_field(const ExpandRel_ExpandField* msg);
+};
+
+const ::substrait::ExpandRel_SwitchingField&
+ExpandRel_ExpandField::_Internal::switching_field(const ExpandRel_ExpandField* msg) {
+  return *msg->field_type_.switching_field_;
+}
+const ::substrait::Expression&
+ExpandRel_ExpandField::_Internal::consistent_field(const ExpandRel_ExpandField* msg) {
+  return *msg->field_type_.consistent_field_;
+}
+void ExpandRel_ExpandField::set_allocated_switching_field(::substrait::ExpandRel_SwitchingField* switching_field) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  clear_field_type();
+  if (switching_field) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::ExpandRel_SwitchingField>::GetOwningArena(switching_field);
+    if (message_arena != submessage_arena) {
+      switching_field = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, switching_field, submessage_arena);
+    }
+    set_has_switching_field();
+    field_type_.switching_field_ = switching_field;
+  }
+  // @@protoc_insertion_point(field_set_allocated:substrait.ExpandRel.ExpandField.switching_field)
+}
+void ExpandRel_ExpandField::set_allocated_consistent_field(::substrait::Expression* consistent_field) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  clear_field_type();
+  if (consistent_field) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::Expression>::GetOwningArena(consistent_field);
+    if (message_arena != submessage_arena) {
+      consistent_field = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, consistent_field, submessage_arena);
+    }
+    set_has_consistent_field();
+    field_type_.consistent_field_ = consistent_field;
+  }
+  // @@protoc_insertion_point(field_set_allocated:substrait.ExpandRel.ExpandField.consistent_field)
+}
+ExpandRel_ExpandField::ExpandRel_ExpandField(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExpandRel.ExpandField)
+}
+ExpandRel_ExpandField::ExpandRel_ExpandField(const ExpandRel_ExpandField& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  clear_has_field_type();
+  switch (from.field_type_case()) {
+    case kSwitchingField: {
+      _internal_mutable_switching_field()->::substrait::ExpandRel_SwitchingField::MergeFrom(from._internal_switching_field());
+      break;
+    }
+    case kConsistentField: {
+      _internal_mutable_consistent_field()->::substrait::Expression::MergeFrom(from._internal_consistent_field());
+      break;
+    }
+    case FIELD_TYPE_NOT_SET: {
+      break;
+    }
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.ExpandRel.ExpandField)
+}
+
+inline void ExpandRel_ExpandField::SharedCtor() {
+clear_has_field_type();
+}
+
+ExpandRel_ExpandField::~ExpandRel_ExpandField() {
+  // @@protoc_insertion_point(destructor:substrait.ExpandRel.ExpandField)
+  if (GetArenaForAllocation() != nullptr) return;
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+inline void ExpandRel_ExpandField::SharedDtor() {
+  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+  if (has_field_type()) {
+    clear_field_type();
+  }
+}
+
+void ExpandRel_ExpandField::ArenaDtor(void* object) {
+  ExpandRel_ExpandField* _this = reinterpret_cast< ExpandRel_ExpandField* >(object);
+  (void)_this;
+}
+void ExpandRel_ExpandField::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void ExpandRel_ExpandField::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+
+void ExpandRel_ExpandField::clear_field_type() {
+// @@protoc_insertion_point(one_of_clear_start:substrait.ExpandRel.ExpandField)
+  switch (field_type_case()) {
+    case kSwitchingField: {
+      if (GetArenaForAllocation() == nullptr) {
+        delete field_type_.switching_field_;
+      }
+      break;
+    }
+    case kConsistentField: {
+      if (GetArenaForAllocation() == nullptr) {
+        delete field_type_.consistent_field_;
+      }
+      break;
+    }
+    case FIELD_TYPE_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[0] = FIELD_TYPE_NOT_SET;
+}
+
+
+void ExpandRel_ExpandField::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExpandRel.ExpandField)
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  clear_field_type();
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* ExpandRel_ExpandField::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    uint32_t tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    switch (tag >> 3) {
+      // .substrait.ExpandRel.SwitchingField switching_field = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
+          ptr = ctx->ParseMessage(_internal_mutable_switching_field(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.Expression consistent_field = 3;
+      case 3:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 26)) {
+          ptr = ctx->ParseMessage(_internal_mutable_consistent_field(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      default:
+        goto handle_unusual;
+    }  // switch
+  handle_unusual:
+    if ((tag == 0) || ((tag & 7) == 4)) {
+      CHK_(ptr);
+      ctx->SetLastTag(tag);
+      goto message_done;
+    }
+    ptr = UnknownFieldParse(
+        tag,
+        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+        ptr, ctx);
+    CHK_(ptr != nullptr);
+  }  // while
+message_done:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto message_done;
+#undef CHK_
+}
+
+uint8_t* ExpandRel_ExpandField::_InternalSerialize(
+    uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExpandRel.ExpandField)
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .substrait.ExpandRel.SwitchingField switching_field = 2;
+  if (_internal_has_switching_field()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        2, _Internal::switching_field(this), target, stream);
+  }
+
+  // .substrait.Expression consistent_field = 3;
+  if (_internal_has_consistent_field()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        3, _Internal::consistent_field(this), target, stream);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExpandRel.ExpandField)
+  return target;
+}
+
+size_t ExpandRel_ExpandField::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExpandRel.ExpandField)
+  size_t total_size = 0;
+
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  switch (field_type_case()) {
+    // .substrait.ExpandRel.SwitchingField switching_field = 2;
+    case kSwitchingField: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *field_type_.switching_field_);
+      break;
+    }
+    // .substrait.Expression consistent_field = 3;
+    case kConsistentField: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *field_type_.consistent_field_);
+      break;
+    }
+    case FIELD_TYPE_NOT_SET: {
+      break;
+    }
+  }
+  return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
+}
+
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExpandRel_ExpandField::_class_data_ = {
+    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
+    ExpandRel_ExpandField::MergeImpl
+};
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExpandRel_ExpandField::GetClassData() const { return &_class_data_; }
+
+void ExpandRel_ExpandField::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+                      const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+  static_cast<ExpandRel_ExpandField *>(to)->MergeFrom(
+      static_cast<const ExpandRel_ExpandField &>(from));
+}
+
+
+void ExpandRel_ExpandField::MergeFrom(const ExpandRel_ExpandField& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExpandRel.ExpandField)
+  GOOGLE_DCHECK_NE(&from, this);
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  switch (from.field_type_case()) {
+    case kSwitchingField: {
+      _internal_mutable_switching_field()->::substrait::ExpandRel_SwitchingField::MergeFrom(from._internal_switching_field());
+      break;
+    }
+    case kConsistentField: {
+      _internal_mutable_consistent_field()->::substrait::Expression::MergeFrom(from._internal_consistent_field());
+      break;
+    }
+    case FIELD_TYPE_NOT_SET: {
+      break;
+    }
+  }
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+}
+
+void ExpandRel_ExpandField::CopyFrom(const ExpandRel_ExpandField& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExpandRel.ExpandField)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ExpandRel_ExpandField::IsInitialized() const {
+  return true;
+}
+
+void ExpandRel_ExpandField::InternalSwap(ExpandRel_ExpandField* other) {
+  using std::swap;
+  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  swap(field_type_, other->field_type_);
+  swap(_oneof_case_[0], other->_oneof_case_[0]);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata ExpandRel_ExpandField::GetMetadata() const {
+  return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
+      &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
+      file_level_metadata_substrait_2falgebra_2eproto[38]);
+}
+
+// ===================================================================
+
+class ExpandRel_SwitchingField::_Internal {
+ public:
+};
+
+ExpandRel_SwitchingField::ExpandRel_SwitchingField(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  duplicates_(arena) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExpandRel.SwitchingField)
+}
+ExpandRel_SwitchingField::ExpandRel_SwitchingField(const ExpandRel_SwitchingField& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      duplicates_(from.duplicates_) {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  // @@protoc_insertion_point(copy_constructor:substrait.ExpandRel.SwitchingField)
+}
+
+inline void ExpandRel_SwitchingField::SharedCtor() {
+}
+
+ExpandRel_SwitchingField::~ExpandRel_SwitchingField() {
+  // @@protoc_insertion_point(destructor:substrait.ExpandRel.SwitchingField)
+  if (GetArenaForAllocation() != nullptr) return;
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+inline void ExpandRel_SwitchingField::SharedDtor() {
+  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+}
+
+void ExpandRel_SwitchingField::ArenaDtor(void* object) {
+  ExpandRel_SwitchingField* _this = reinterpret_cast< ExpandRel_SwitchingField* >(object);
+  (void)_this;
+}
+void ExpandRel_SwitchingField::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void ExpandRel_SwitchingField::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+
+void ExpandRel_SwitchingField::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExpandRel.SwitchingField)
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  duplicates_.Clear();
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* ExpandRel_SwitchingField::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    uint32_t tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    switch (tag >> 3) {
+      // repeated .substrait.Expression duplicates = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_duplicates(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      default:
+        goto handle_unusual;
+    }  // switch
+  handle_unusual:
+    if ((tag == 0) || ((tag & 7) == 4)) {
+      CHK_(ptr);
+      ctx->SetLastTag(tag);
+      goto message_done;
+    }
+    ptr = UnknownFieldParse(
+        tag,
+        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+        ptr, ctx);
+    CHK_(ptr != nullptr);
+  }  // while
+message_done:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto message_done;
+#undef CHK_
+}
+
+uint8_t* ExpandRel_SwitchingField::_InternalSerialize(
+    uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExpandRel.SwitchingField)
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // repeated .substrait.Expression duplicates = 1;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_duplicates_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(1, this->_internal_duplicates(i), target, stream);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExpandRel.SwitchingField)
+  return target;
+}
+
+size_t ExpandRel_SwitchingField::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExpandRel.SwitchingField)
+  size_t total_size = 0;
+
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // repeated .substrait.Expression duplicates = 1;
+  total_size += 1UL * this->_internal_duplicates_size();
+  for (const auto& msg : this->duplicates_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
+}
+
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExpandRel_SwitchingField::_class_data_ = {
+    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
+    ExpandRel_SwitchingField::MergeImpl
+};
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExpandRel_SwitchingField::GetClassData() const { return &_class_data_; }
+
+void ExpandRel_SwitchingField::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+                      const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+  static_cast<ExpandRel_SwitchingField *>(to)->MergeFrom(
+      static_cast<const ExpandRel_SwitchingField &>(from));
+}
+
+
+void ExpandRel_SwitchingField::MergeFrom(const ExpandRel_SwitchingField& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExpandRel.SwitchingField)
+  GOOGLE_DCHECK_NE(&from, this);
+  uint32_t cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  duplicates_.MergeFrom(from.duplicates_);
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+}
+
+void ExpandRel_SwitchingField::CopyFrom(const ExpandRel_SwitchingField& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExpandRel.SwitchingField)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ExpandRel_SwitchingField::IsInitialized() const {
+  return true;
+}
+
+void ExpandRel_SwitchingField::InternalSwap(ExpandRel_SwitchingField* other) {
+  using std::swap;
+  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
+  duplicates_.InternalSwap(&other->duplicates_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata ExpandRel_SwitchingField::GetMetadata() const {
+  return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
+      &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
+      file_level_metadata_substrait_2falgebra_2eproto[39]);
+}
+
+// ===================================================================
+
+class ExpandRel::_Internal {
+ public:
+  static const ::substrait::RelCommon& common(const ExpandRel* msg);
+  static const ::substrait::Rel& input(const ExpandRel* msg);
+};
+
+const ::substrait::RelCommon&
+ExpandRel::_Internal::common(const ExpandRel* msg) {
+  return *msg->common_;
+}
+const ::substrait::Rel&
+ExpandRel::_Internal::input(const ExpandRel* msg) {
+  return *msg->input_;
+}
+ExpandRel::ExpandRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                         bool is_message_owned)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned),
+  fields_(arena) {
+  SharedCtor();
+  if (!is_message_owned) {
+    RegisterArenaDtor(arena);
+  }
+  // @@protoc_insertion_point(arena_constructor:substrait.ExpandRel)
+}
+ExpandRel::ExpandRel(const ExpandRel& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      fields_(from.fields_) {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  if (from._internal_has_common()) {
+    common_ = new ::substrait::RelCommon(*from.common_);
+  } else {
+    common_ = nullptr;
+  }
+  if (from._internal_has_input()) {
+    input_ = new ::substrait::Rel(*from.input_);
+  } else {
+    input_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:substrait.ExpandRel)
+}
+
+inline void ExpandRel::SharedCtor() {
+::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
+    reinterpret_cast<char*>(&common_) - reinterpret_cast<char*>(this)),
+    0, static_cast<size_t>(reinterpret_cast<char*>(&input_) -
+    reinterpret_cast<char*>(&common_)) + sizeof(input_));
+}
+
+ExpandRel::~ExpandRel() {
+  // @@protoc_insertion_point(destructor:substrait.ExpandRel)
+  if (GetArenaForAllocation() != nullptr) return;
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+inline void ExpandRel::SharedDtor() {
+  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
+  if (this != internal_default_instance()) delete common_;
+  if (this != internal_default_instance()) delete input_;
+}
+
+void ExpandRel::ArenaDtor(void* object) {
+  ExpandRel* _this = reinterpret_cast< ExpandRel* >(object);
+  (void)_this;
+}
+void ExpandRel::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void ExpandRel::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+
+void ExpandRel::Clear() {
+// @@protoc_insertion_point(message_clear_start:substrait.ExpandRel)
+  uint32_t cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  fields_.Clear();
+  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
+    delete common_;
+  }
+  common_ = nullptr;
+  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
+    delete input_;
+  }
+  input_ = nullptr;
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* ExpandRel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    uint32_t tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    switch (tag >> 3) {
+      // .substrait.RelCommon common = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 10)) {
+          ptr = ctx->ParseMessage(_internal_mutable_common(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.Rel input = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 18)) {
+          ptr = ctx->ParseMessage(_internal_mutable_input(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // repeated .substrait.ExpandRel.ExpandField fields = 4;
+      case 4:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 34)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_fields(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<34>(ptr));
+        } else
+          goto handle_unusual;
+        continue;
+      default:
+        goto handle_unusual;
+    }  // switch
+  handle_unusual:
+    if ((tag == 0) || ((tag & 7) == 4)) {
+      CHK_(ptr);
+      ctx->SetLastTag(tag);
+      goto message_done;
+    }
+    ptr = UnknownFieldParse(
+        tag,
+        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+        ptr, ctx);
+    CHK_(ptr != nullptr);
+  }  // while
+message_done:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto message_done;
+#undef CHK_
+}
+
+uint8_t* ExpandRel::_InternalSerialize(
     uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
-  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExchangeRel)
+  // @@protoc_insertion_point(serialize_to_array_start:substrait.ExpandRel)
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
@@ -13065,87 +15023,33 @@ uint8_t* ExchangeRel::_InternalSerialize(
         2, _Internal::input(this), target, stream);
   }
 
-  // int32 partition_count = 3;
-  if (this->_internal_partition_count() != 0) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->_internal_partition_count(), target);
-  }
-
-  // repeated .substrait.ExchangeRel.ExchangeTarget targets = 4;
+  // repeated .substrait.ExpandRel.ExpandField fields = 4;
   for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->_internal_targets_size()); i < n; i++) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(4, this->_internal_targets(i), target, stream);
-  }
-
-  // .substrait.ExchangeRel.ScatterFields scatter_by_fields = 5;
-  if (_internal_has_scatter_by_fields()) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        5, _Internal::scatter_by_fields(this), target, stream);
-  }
-
-  // .substrait.ExchangeRel.SingleBucketExpression single_target = 6;
-  if (_internal_has_single_target()) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        6, _Internal::single_target(this), target, stream);
-  }
-
-  // .substrait.ExchangeRel.MultiBucketExpression multi_target = 7;
-  if (_internal_has_multi_target()) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        7, _Internal::multi_target(this), target, stream);
-  }
-
-  // .substrait.ExchangeRel.RoundRobin round_robin = 8;
-  if (_internal_has_round_robin()) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        8, _Internal::round_robin(this), target, stream);
-  }
-
-  // .substrait.ExchangeRel.Broadcast broadcast = 9;
-  if (_internal_has_broadcast()) {
-    target = stream->EnsureSpace(target);
-    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        9, _Internal::broadcast(this), target, stream);
-  }
-
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  if (this->_internal_has_advanced_extension()) {
+      n = static_cast<unsigned int>(this->_internal_fields_size()); i < n; i++) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
-      InternalWriteMessage(
-        10, _Internal::advanced_extension(this), target, stream);
+      InternalWriteMessage(4, this->_internal_fields(i), target, stream);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
   }
-  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExchangeRel)
+  // @@protoc_insertion_point(serialize_to_array_end:substrait.ExpandRel)
   return target;
 }
 
-size_t ExchangeRel::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:substrait.ExchangeRel)
+size_t ExpandRel::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:substrait.ExpandRel)
   size_t total_size = 0;
 
   uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
-  // repeated .substrait.ExchangeRel.ExchangeTarget targets = 4;
-  total_size += 1UL * this->_internal_targets_size();
-  for (const auto& msg : this->targets_) {
+  // repeated .substrait.ExpandRel.ExpandField fields = 4;
+  total_size += 1UL * this->_internal_fields_size();
+  for (const auto& msg : this->fields_) {
     total_size +=
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
   }
@@ -13164,150 +15068,65 @@ size_t ExchangeRel::ByteSizeLong() const {
         *input_);
   }
 
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  if (this->_internal_has_advanced_extension()) {
-    total_size += 1 +
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-        *advanced_extension_);
-  }
-
-  // int32 partition_count = 3;
-  if (this->_internal_partition_count() != 0) {
-    total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32SizePlusOne(this->_internal_partition_count());
-  }
-
-  switch (exchange_kind_case()) {
-    // .substrait.ExchangeRel.ScatterFields scatter_by_fields = 5;
-    case kScatterByFields: {
-      total_size += 1 +
-        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-          *exchange_kind_.scatter_by_fields_);
-      break;
-    }
-    // .substrait.ExchangeRel.SingleBucketExpression single_target = 6;
-    case kSingleTarget: {
-      total_size += 1 +
-        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-          *exchange_kind_.single_target_);
-      break;
-    }
-    // .substrait.ExchangeRel.MultiBucketExpression multi_target = 7;
-    case kMultiTarget: {
-      total_size += 1 +
-        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-          *exchange_kind_.multi_target_);
-      break;
-    }
-    // .substrait.ExchangeRel.RoundRobin round_robin = 8;
-    case kRoundRobin: {
-      total_size += 1 +
-        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-          *exchange_kind_.round_robin_);
-      break;
-    }
-    // .substrait.ExchangeRel.Broadcast broadcast = 9;
-    case kBroadcast: {
-      total_size += 1 +
-        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
-          *exchange_kind_.broadcast_);
-      break;
-    }
-    case EXCHANGE_KIND_NOT_SET: {
-      break;
-    }
-  }
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExchangeRel::_class_data_ = {
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ExpandRel::_class_data_ = {
     ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck,
-    ExchangeRel::MergeImpl
+    ExpandRel::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExchangeRel::GetClassData() const { return &_class_data_; }
+const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ExpandRel::GetClassData() const { return &_class_data_; }
 
-void ExchangeRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
+void ExpandRel::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to,
                       const ::PROTOBUF_NAMESPACE_ID::Message& from) {
-  static_cast<ExchangeRel *>(to)->MergeFrom(
-      static_cast<const ExchangeRel &>(from));
+  static_cast<ExpandRel *>(to)->MergeFrom(
+      static_cast<const ExpandRel &>(from));
 }
 
 
-void ExchangeRel::MergeFrom(const ExchangeRel& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExchangeRel)
+void ExpandRel::MergeFrom(const ExpandRel& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:substrait.ExpandRel)
   GOOGLE_DCHECK_NE(&from, this);
   uint32_t cached_has_bits = 0;
   (void) cached_has_bits;
 
-  targets_.MergeFrom(from.targets_);
+  fields_.MergeFrom(from.fields_);
   if (from._internal_has_common()) {
     _internal_mutable_common()->::substrait::RelCommon::MergeFrom(from._internal_common());
   }
   if (from._internal_has_input()) {
     _internal_mutable_input()->::substrait::Rel::MergeFrom(from._internal_input());
   }
-  if (from._internal_has_advanced_extension()) {
-    _internal_mutable_advanced_extension()->::substrait::extensions::AdvancedExtension::MergeFrom(from._internal_advanced_extension());
-  }
-  if (from._internal_partition_count() != 0) {
-    _internal_set_partition_count(from._internal_partition_count());
-  }
-  switch (from.exchange_kind_case()) {
-    case kScatterByFields: {
-      _internal_mutable_scatter_by_fields()->::substrait::ExchangeRel_ScatterFields::MergeFrom(from._internal_scatter_by_fields());
-      break;
-    }
-    case kSingleTarget: {
-      _internal_mutable_single_target()->::substrait::ExchangeRel_SingleBucketExpression::MergeFrom(from._internal_single_target());
-      break;
-    }
-    case kMultiTarget: {
-      _internal_mutable_multi_target()->::substrait::ExchangeRel_MultiBucketExpression::MergeFrom(from._internal_multi_target());
-      break;
-    }
-    case kRoundRobin: {
-      _internal_mutable_round_robin()->::substrait::ExchangeRel_RoundRobin::MergeFrom(from._internal_round_robin());
-      break;
-    }
-    case kBroadcast: {
-      _internal_mutable_broadcast()->::substrait::ExchangeRel_Broadcast::MergeFrom(from._internal_broadcast());
-      break;
-    }
-    case EXCHANGE_KIND_NOT_SET: {
-      break;
-    }
-  }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
-void ExchangeRel::CopyFrom(const ExchangeRel& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExchangeRel)
+void ExpandRel::CopyFrom(const ExpandRel& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:substrait.ExpandRel)
   if (&from == this) return;
   Clear();
   MergeFrom(from);
 }
 
-bool ExchangeRel::IsInitialized() const {
+bool ExpandRel::IsInitialized() const {
   return true;
 }
 
-void ExchangeRel::InternalSwap(ExchangeRel* other) {
+void ExpandRel::InternalSwap(ExpandRel* other) {
   using std::swap;
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
-  targets_.InternalSwap(&other->targets_);
+  fields_.InternalSwap(&other->fields_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(ExchangeRel, partition_count_)
-      + sizeof(ExchangeRel::partition_count_)
-      - PROTOBUF_FIELD_OFFSET(ExchangeRel, common_)>(
+      PROTOBUF_FIELD_OFFSET(ExpandRel, input_)
+      + sizeof(ExpandRel::input_)
+      - PROTOBUF_FIELD_OFFSET(ExpandRel, common_)>(
           reinterpret_cast<char*>(&common_),
           reinterpret_cast<char*>(&other->common_));
-  swap(exchange_kind_, other->exchange_kind_);
-  swap(_oneof_case_[0], other->_oneof_case_[0]);
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata ExchangeRel::GetMetadata() const {
+::PROTOBUF_NAMESPACE_ID::Metadata ExpandRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[35]);
+      file_level_metadata_substrait_2falgebra_2eproto[40]);
 }
 
 // ===================================================================
@@ -13540,7 +15359,7 @@ void RelRoot::InternalSwap(RelRoot* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata RelRoot::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[36]);
+      file_level_metadata_substrait_2falgebra_2eproto[41]);
 }
 
 // ===================================================================
@@ -13561,6 +15380,9 @@ class Rel::_Internal {
   static const ::substrait::CrossRel& cross(const Rel* msg);
   static const ::substrait::HashJoinRel& hash_join(const Rel* msg);
   static const ::substrait::MergeJoinRel& merge_join(const Rel* msg);
+  static const ::substrait::ConsistentPartitionWindowRel& window(const Rel* msg);
+  static const ::substrait::ExchangeRel& exchange(const Rel* msg);
+  static const ::substrait::ExpandRel& expand(const Rel* msg);
 };
 
 const ::substrait::ReadRel&
@@ -13619,6 +15441,18 @@ const ::substrait::MergeJoinRel&
 Rel::_Internal::merge_join(const Rel* msg) {
   return *msg->rel_type_.merge_join_;
 }
+const ::substrait::ConsistentPartitionWindowRel&
+Rel::_Internal::window(const Rel* msg) {
+  return *msg->rel_type_.window_;
+}
+const ::substrait::ExchangeRel&
+Rel::_Internal::exchange(const Rel* msg) {
+  return *msg->rel_type_.exchange_;
+}
+const ::substrait::ExpandRel&
+Rel::_Internal::expand(const Rel* msg) {
+  return *msg->rel_type_.expand_;
+}
 void Rel::set_allocated_read(::substrait::ReadRel* read) {
   ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
   clear_rel_type();
@@ -13829,6 +15663,51 @@ void Rel::set_allocated_merge_join(::substrait::MergeJoinRel* merge_join) {
   }
   // @@protoc_insertion_point(field_set_allocated:substrait.Rel.merge_join)
 }
+void Rel::set_allocated_window(::substrait::ConsistentPartitionWindowRel* window) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  clear_rel_type();
+  if (window) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::ConsistentPartitionWindowRel>::GetOwningArena(window);
+    if (message_arena != submessage_arena) {
+      window = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, window, submessage_arena);
+    }
+    set_has_window();
+    rel_type_.window_ = window;
+  }
+  // @@protoc_insertion_point(field_set_allocated:substrait.Rel.window)
+}
+void Rel::set_allocated_exchange(::substrait::ExchangeRel* exchange) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  clear_rel_type();
+  if (exchange) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::ExchangeRel>::GetOwningArena(exchange);
+    if (message_arena != submessage_arena) {
+      exchange = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, exchange, submessage_arena);
+    }
+    set_has_exchange();
+    rel_type_.exchange_ = exchange;
+  }
+  // @@protoc_insertion_point(field_set_allocated:substrait.Rel.exchange)
+}
+void Rel::set_allocated_expand(::substrait::ExpandRel* expand) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  clear_rel_type();
+  if (expand) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::ExpandRel>::GetOwningArena(expand);
+    if (message_arena != submessage_arena) {
+      expand = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, expand, submessage_arena);
+    }
+    set_has_expand();
+    rel_type_.expand_ = expand;
+  }
+  // @@protoc_insertion_point(field_set_allocated:substrait.Rel.expand)
+}
 Rel::Rel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                          bool is_message_owned)
   : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
@@ -13899,6 +15778,18 @@ Rel::Rel(const Rel& from)
       _internal_mutable_merge_join()->::substrait::MergeJoinRel::MergeFrom(from._internal_merge_join());
       break;
     }
+    case kWindow: {
+      _internal_mutable_window()->::substrait::ConsistentPartitionWindowRel::MergeFrom(from._internal_window());
+      break;
+    }
+    case kExchange: {
+      _internal_mutable_exchange()->::substrait::ExchangeRel::MergeFrom(from._internal_exchange());
+      break;
+    }
+    case kExpand: {
+      _internal_mutable_expand()->::substrait::ExpandRel::MergeFrom(from._internal_expand());
+      break;
+    }
     case REL_TYPE_NOT_SET: {
       break;
     }
@@ -14021,6 +15912,24 @@ void Rel::clear_rel_type() {
       }
       break;
     }
+    case kWindow: {
+      if (GetArenaForAllocation() == nullptr) {
+        delete rel_type_.window_;
+      }
+      break;
+    }
+    case kExchange: {
+      if (GetArenaForAllocation() == nullptr) {
+        delete rel_type_.exchange_;
+      }
+      break;
+    }
+    case kExpand: {
+      if (GetArenaForAllocation() == nullptr) {
+        delete rel_type_.expand_;
+      }
+      break;
+    }
     case REL_TYPE_NOT_SET: {
       break;
     }
@@ -14157,6 +16066,30 @@ const char* Rel::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::intern
         } else
           goto handle_unusual;
         continue;
+      // .substrait.ExchangeRel exchange = 15;
+      case 15:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 122)) {
+          ptr = ctx->ParseMessage(_internal_mutable_exchange(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.ExpandRel expand = 16;
+      case 16:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 130)) {
+          ptr = ctx->ParseMessage(_internal_mutable_expand(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
+      // .substrait.ConsistentPartitionWindowRel window = 17;
+      case 17:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 138)) {
+          ptr = ctx->ParseMessage(_internal_mutable_window(), ptr);
+          CHK_(ptr);
+        } else
+          goto handle_unusual;
+        continue;
       default:
         goto handle_unusual;
     }  // switch
@@ -14298,6 +16231,30 @@ uint8_t* Rel::_InternalSerialize(
         14, _Internal::merge_join(this), target, stream);
   }
 
+  // .substrait.ExchangeRel exchange = 15;
+  if (_internal_has_exchange()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        15, _Internal::exchange(this), target, stream);
+  }
+
+  // .substrait.ExpandRel expand = 16;
+  if (_internal_has_expand()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        16, _Internal::expand(this), target, stream);
+  }
+
+  // .substrait.ConsistentPartitionWindowRel window = 17;
+  if (_internal_has_window()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        17, _Internal::window(this), target, stream);
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -14413,6 +16370,27 @@ size_t Rel::ByteSizeLong() const {
           *rel_type_.merge_join_);
       break;
     }
+    // .substrait.ConsistentPartitionWindowRel window = 17;
+    case kWindow: {
+      total_size += 2 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *rel_type_.window_);
+      break;
+    }
+    // .substrait.ExchangeRel exchange = 15;
+    case kExchange: {
+      total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *rel_type_.exchange_);
+      break;
+    }
+    // .substrait.ExpandRel expand = 16;
+    case kExpand: {
+      total_size += 2 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+          *rel_type_.expand_);
+      break;
+    }
     case REL_TYPE_NOT_SET: {
       break;
     }
@@ -14496,6 +16474,18 @@ void Rel::MergeFrom(const Rel& from) {
       _internal_mutable_merge_join()->::substrait::MergeJoinRel::MergeFrom(from._internal_merge_join());
       break;
     }
+    case kWindow: {
+      _internal_mutable_window()->::substrait::ConsistentPartitionWindowRel::MergeFrom(from._internal_window());
+      break;
+    }
+    case kExchange: {
+      _internal_mutable_exchange()->::substrait::ExchangeRel::MergeFrom(from._internal_exchange());
+      break;
+    }
+    case kExpand: {
+      _internal_mutable_expand()->::substrait::ExpandRel::MergeFrom(from._internal_expand());
+      break;
+    }
     case REL_TYPE_NOT_SET: {
       break;
     }
@@ -14524,7 +16514,7 @@ void Rel::InternalSwap(Rel* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Rel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[37]);
+      file_level_metadata_substrait_2falgebra_2eproto[42]);
 }
 
 // ===================================================================
@@ -14763,7 +16753,7 @@ void NamedObjectWrite::InternalSwap(NamedObjectWrite* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata NamedObjectWrite::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[38]);
+      file_level_metadata_substrait_2falgebra_2eproto[43]);
 }
 
 // ===================================================================
@@ -14964,7 +16954,7 @@ void ExtensionObject::InternalSwap(ExtensionObject* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata ExtensionObject::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[39]);
+      file_level_metadata_substrait_2falgebra_2eproto[44]);
 }
 
 // ===================================================================
@@ -15459,7 +17449,7 @@ void DdlRel::InternalSwap(DdlRel* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata DdlRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[40]);
+      file_level_metadata_substrait_2falgebra_2eproto[45]);
 }
 
 // ===================================================================
@@ -15913,7 +17903,7 @@ void WriteRel::InternalSwap(WriteRel* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata WriteRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[41]);
+      file_level_metadata_substrait_2falgebra_2eproto[46]);
 }
 
 // ===================================================================
@@ -16379,7 +18369,7 @@ void HashJoinRel::InternalSwap(HashJoinRel* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata HashJoinRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[42]);
+      file_level_metadata_substrait_2falgebra_2eproto[47]);
 }
 
 // ===================================================================
@@ -16845,7 +18835,7 @@ void MergeJoinRel::InternalSwap(MergeJoinRel* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata MergeJoinRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[43]);
+      file_level_metadata_substrait_2falgebra_2eproto[48]);
 }
 
 // ===================================================================
@@ -17194,7 +19184,7 @@ void FunctionArgument::InternalSwap(FunctionArgument* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata FunctionArgument::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[44]);
+      file_level_metadata_substrait_2falgebra_2eproto[49]);
 }
 
 // ===================================================================
@@ -17435,7 +19425,7 @@ void FunctionOption::InternalSwap(FunctionOption* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata FunctionOption::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[45]);
+      file_level_metadata_substrait_2falgebra_2eproto[50]);
 }
 
 // ===================================================================
@@ -17474,7 +19464,7 @@ const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Expression_Enum_Empty::GetClas
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Enum_Empty::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[46]);
+      file_level_metadata_substrait_2falgebra_2eproto[51]);
 }
 
 // ===================================================================
@@ -17756,7 +19746,7 @@ void Expression_Enum::InternalSwap(Expression_Enum* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Enum::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[47]);
+      file_level_metadata_substrait_2falgebra_2eproto[52]);
 }
 
 // ===================================================================
@@ -17985,7 +19975,7 @@ void Expression_Literal_VarChar::InternalSwap(Expression_Literal_VarChar* other)
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_VarChar::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[48]);
+      file_level_metadata_substrait_2falgebra_2eproto[53]);
 }
 
 // ===================================================================
@@ -18243,7 +20233,7 @@ void Expression_Literal_Decimal::InternalSwap(Expression_Literal_Decimal* other)
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_Decimal::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[49]);
+      file_level_metadata_substrait_2falgebra_2eproto[54]);
 }
 
 // ===================================================================
@@ -18487,7 +20477,7 @@ void Expression_Literal_Map_KeyValue::InternalSwap(Expression_Literal_Map_KeyVal
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_Map_KeyValue::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[50]);
+      file_level_metadata_substrait_2falgebra_2eproto[55]);
 }
 
 // ===================================================================
@@ -18672,7 +20662,7 @@ void Expression_Literal_Map::InternalSwap(Expression_Literal_Map* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_Map::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[51]);
+      file_level_metadata_substrait_2falgebra_2eproto[56]);
 }
 
 // ===================================================================
@@ -18884,7 +20874,7 @@ void Expression_Literal_IntervalYearToMonth::InternalSwap(Expression_Literal_Int
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_IntervalYearToMonth::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[52]);
+      file_level_metadata_substrait_2falgebra_2eproto[57]);
 }
 
 // ===================================================================
@@ -19118,7 +21108,7 @@ void Expression_Literal_IntervalDayToSecond::InternalSwap(Expression_Literal_Int
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_IntervalDayToSecond::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[53]);
+      file_level_metadata_substrait_2falgebra_2eproto[58]);
 }
 
 // ===================================================================
@@ -19303,7 +21293,7 @@ void Expression_Literal_Struct::InternalSwap(Expression_Literal_Struct* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_Struct::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[54]);
+      file_level_metadata_substrait_2falgebra_2eproto[59]);
 }
 
 // ===================================================================
@@ -19488,7 +21478,7 @@ void Expression_Literal_List::InternalSwap(Expression_Literal_List* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_List::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[55]);
+      file_level_metadata_substrait_2falgebra_2eproto[60]);
 }
 
 // ===================================================================
@@ -19757,7 +21747,7 @@ void Expression_Literal_UserDefined::InternalSwap(Expression_Literal_UserDefined
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal_UserDefined::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[56]);
+      file_level_metadata_substrait_2falgebra_2eproto[61]);
 }
 
 // ===================================================================
@@ -21189,7 +23179,7 @@ void Expression_Literal::InternalSwap(Expression_Literal* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Literal::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[57]);
+      file_level_metadata_substrait_2falgebra_2eproto[62]);
 }
 
 // ===================================================================
@@ -21433,7 +23423,7 @@ void Expression_Nested_Map_KeyValue::InternalSwap(Expression_Nested_Map_KeyValue
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Nested_Map_KeyValue::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[58]);
+      file_level_metadata_substrait_2falgebra_2eproto[63]);
 }
 
 // ===================================================================
@@ -21618,7 +23608,7 @@ void Expression_Nested_Map::InternalSwap(Expression_Nested_Map* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Nested_Map::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[59]);
+      file_level_metadata_substrait_2falgebra_2eproto[64]);
 }
 
 // ===================================================================
@@ -21803,7 +23793,7 @@ void Expression_Nested_Struct::InternalSwap(Expression_Nested_Struct* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Nested_Struct::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[60]);
+      file_level_metadata_substrait_2falgebra_2eproto[65]);
 }
 
 // ===================================================================
@@ -21988,7 +23978,7 @@ void Expression_Nested_List::InternalSwap(Expression_Nested_List* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Nested_List::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[61]);
+      file_level_metadata_substrait_2falgebra_2eproto[66]);
 }
 
 // ===================================================================
@@ -22405,7 +24395,7 @@ void Expression_Nested::InternalSwap(Expression_Nested* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Nested::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[62]);
+      file_level_metadata_substrait_2falgebra_2eproto[67]);
 }
 
 // ===================================================================
@@ -22737,7 +24727,7 @@ void Expression_ScalarFunction::InternalSwap(Expression_ScalarFunction* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_ScalarFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[63]);
+      file_level_metadata_substrait_2falgebra_2eproto[68]);
 }
 
 // ===================================================================
@@ -22915,7 +24905,7 @@ void Expression_WindowFunction_Bound_Preceding::InternalSwap(Expression_WindowFu
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction_Bound_Preceding::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[64]);
+      file_level_metadata_substrait_2falgebra_2eproto[69]);
 }
 
 // ===================================================================
@@ -23093,7 +25083,7 @@ void Expression_WindowFunction_Bound_Following::InternalSwap(Expression_WindowFu
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction_Bound_Following::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[65]);
+      file_level_metadata_substrait_2falgebra_2eproto[70]);
 }
 
 // ===================================================================
@@ -23132,7 +25122,7 @@ const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Expression_WindowFunction_Boun
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction_Bound_CurrentRow::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[66]);
+      file_level_metadata_substrait_2falgebra_2eproto[71]);
 }
 
 // ===================================================================
@@ -23171,7 +25161,7 @@ const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Expression_WindowFunction_Boun
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction_Bound_Unbounded::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[67]);
+      file_level_metadata_substrait_2falgebra_2eproto[72]);
 }
 
 // ===================================================================
@@ -23585,7 +25575,7 @@ void Expression_WindowFunction_Bound::InternalSwap(Expression_WindowFunction_Bou
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction_Bound::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[68]);
+      file_level_metadata_substrait_2falgebra_2eproto[73]);
 }
 
 // ===================================================================
@@ -23653,16 +25643,16 @@ Expression_WindowFunction::Expression_WindowFunction(const Expression_WindowFunc
     output_type_ = nullptr;
   }
   ::memcpy(&function_reference_, &from.function_reference_,
-    static_cast<size_t>(reinterpret_cast<char*>(&invocation_) -
-    reinterpret_cast<char*>(&function_reference_)) + sizeof(invocation_));
+    static_cast<size_t>(reinterpret_cast<char*>(&bounds_type_) -
+    reinterpret_cast<char*>(&function_reference_)) + sizeof(bounds_type_));
   // @@protoc_insertion_point(copy_constructor:substrait.Expression.WindowFunction)
 }
 
 inline void Expression_WindowFunction::SharedCtor() {
 ::memset(reinterpret_cast<char*>(this) + static_cast<size_t>(
     reinterpret_cast<char*>(&upper_bound_) - reinterpret_cast<char*>(this)),
-    0, static_cast<size_t>(reinterpret_cast<char*>(&invocation_) -
-    reinterpret_cast<char*>(&upper_bound_)) + sizeof(invocation_));
+    0, static_cast<size_t>(reinterpret_cast<char*>(&bounds_type_) -
+    reinterpret_cast<char*>(&upper_bound_)) + sizeof(bounds_type_));
 }
 
 Expression_WindowFunction::~Expression_WindowFunction() {
@@ -23713,8 +25703,8 @@ void Expression_WindowFunction::Clear() {
   }
   output_type_ = nullptr;
   ::memset(&function_reference_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&invocation_) -
-      reinterpret_cast<char*>(&function_reference_)) + sizeof(invocation_));
+      reinterpret_cast<char*>(&bounds_type_) -
+      reinterpret_cast<char*>(&function_reference_)) + sizeof(bounds_type_));
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
 
@@ -23839,6 +25829,15 @@ const char* Expression_WindowFunction::_InternalParse(const char* ptr, ::PROTOBU
         } else
           goto handle_unusual;
         continue;
+      // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+      case 12:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 96)) {
+          uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+          _internal_set_bounds_type(static_cast<::substrait::Expression_WindowFunction_BoundsType>(val));
+        } else
+          goto handle_unusual;
+        continue;
       default:
         goto handle_unusual;
     }  // switch
@@ -23952,6 +25951,13 @@ uint8_t* Expression_WindowFunction::_InternalSerialize(
       InternalWriteMessage(11, this->_internal_options(i), target, stream);
   }
 
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  if (this->_internal_bounds_type() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray(
+      12, this->_internal_bounds_type(), target);
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -24041,6 +26047,12 @@ size_t Expression_WindowFunction::ByteSizeLong() const {
       ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_invocation());
   }
 
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  if (this->_internal_bounds_type() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_bounds_type());
+  }
+
   return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_);
 }
 
@@ -24086,6 +26098,9 @@ void Expression_WindowFunction::MergeFrom(const Expression_WindowFunction& from)
   if (from._internal_invocation() != 0) {
     _internal_set_invocation(from._internal_invocation());
   }
+  if (from._internal_bounds_type() != 0) {
+    _internal_set_bounds_type(from._internal_bounds_type());
+  }
   _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
 }
 
@@ -24109,8 +26124,8 @@ void Expression_WindowFunction::InternalSwap(Expression_WindowFunction* other) {
   arguments_.InternalSwap(&other->arguments_);
   options_.InternalSwap(&other->options_);
   ::PROTOBUF_NAMESPACE_ID::internal::memswap<
-      PROTOBUF_FIELD_OFFSET(Expression_WindowFunction, invocation_)
-      + sizeof(Expression_WindowFunction::invocation_)
+      PROTOBUF_FIELD_OFFSET(Expression_WindowFunction, bounds_type_)
+      + sizeof(Expression_WindowFunction::bounds_type_)
       - PROTOBUF_FIELD_OFFSET(Expression_WindowFunction, upper_bound_)>(
           reinterpret_cast<char*>(&upper_bound_),
           reinterpret_cast<char*>(&other->upper_bound_));
@@ -24119,7 +26134,7 @@ void Expression_WindowFunction::InternalSwap(Expression_WindowFunction* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_WindowFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[69]);
+      file_level_metadata_substrait_2falgebra_2eproto[74]);
 }
 
 // ===================================================================
@@ -24363,7 +26378,7 @@ void Expression_IfThen_IfClause::InternalSwap(Expression_IfThen_IfClause* other)
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_IfThen_IfClause::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[70]);
+      file_level_metadata_substrait_2falgebra_2eproto[75]);
 }
 
 // ===================================================================
@@ -24591,7 +26606,7 @@ void Expression_IfThen::InternalSwap(Expression_IfThen* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_IfThen::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[71]);
+      file_level_metadata_substrait_2falgebra_2eproto[76]);
 }
 
 // ===================================================================
@@ -24868,7 +26883,7 @@ void Expression_Cast::InternalSwap(Expression_Cast* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Cast::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[72]);
+      file_level_metadata_substrait_2falgebra_2eproto[77]);
 }
 
 // ===================================================================
@@ -25112,7 +27127,7 @@ void Expression_SwitchExpression_IfValue::InternalSwap(Expression_SwitchExpressi
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_SwitchExpression_IfValue::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[73]);
+      file_level_metadata_substrait_2falgebra_2eproto[78]);
 }
 
 // ===================================================================
@@ -25389,7 +27404,7 @@ void Expression_SwitchExpression::InternalSwap(Expression_SwitchExpression* othe
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_SwitchExpression::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[74]);
+      file_level_metadata_substrait_2falgebra_2eproto[79]);
 }
 
 // ===================================================================
@@ -25617,7 +27632,7 @@ void Expression_SingularOrList::InternalSwap(Expression_SingularOrList* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_SingularOrList::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[75]);
+      file_level_metadata_substrait_2falgebra_2eproto[80]);
 }
 
 // ===================================================================
@@ -25802,7 +27817,7 @@ void Expression_MultiOrList_Record::InternalSwap(Expression_MultiOrList_Record*
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MultiOrList_Record::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[76]);
+      file_level_metadata_substrait_2falgebra_2eproto[81]);
 }
 
 // ===================================================================
@@ -26020,7 +28035,7 @@ void Expression_MultiOrList::InternalSwap(Expression_MultiOrList* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MultiOrList::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[77]);
+      file_level_metadata_substrait_2falgebra_2eproto[82]);
 }
 
 // ===================================================================
@@ -26256,7 +28271,7 @@ void Expression_EmbeddedFunction_PythonPickleFunction::InternalSwap(Expression_E
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_EmbeddedFunction_PythonPickleFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[78]);
+      file_level_metadata_substrait_2falgebra_2eproto[83]);
 }
 
 // ===================================================================
@@ -26492,7 +28507,7 @@ void Expression_EmbeddedFunction_WebAssemblyFunction::InternalSwap(Expression_Em
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_EmbeddedFunction_WebAssemblyFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[79]);
+      file_level_metadata_substrait_2falgebra_2eproto[84]);
 }
 
 // ===================================================================
@@ -26874,7 +28889,7 @@ void Expression_EmbeddedFunction::InternalSwap(Expression_EmbeddedFunction* othe
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_EmbeddedFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[80]);
+      file_level_metadata_substrait_2falgebra_2eproto[85]);
 }
 
 // ===================================================================
@@ -27118,7 +29133,7 @@ void Expression_ReferenceSegment_MapKey::InternalSwap(Expression_ReferenceSegmen
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_ReferenceSegment_MapKey::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[81]);
+      file_level_metadata_substrait_2falgebra_2eproto[86]);
 }
 
 // ===================================================================
@@ -27345,7 +29360,7 @@ void Expression_ReferenceSegment_StructField::InternalSwap(Expression_ReferenceS
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_ReferenceSegment_StructField::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[82]);
+      file_level_metadata_substrait_2falgebra_2eproto[87]);
 }
 
 // ===================================================================
@@ -27572,7 +29587,7 @@ void Expression_ReferenceSegment_ListElement::InternalSwap(Expression_ReferenceS
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_ReferenceSegment_ListElement::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[83]);
+      file_level_metadata_substrait_2falgebra_2eproto[88]);
 }
 
 // ===================================================================
@@ -27929,7 +29944,7 @@ void Expression_ReferenceSegment::InternalSwap(Expression_ReferenceSegment* othe
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_ReferenceSegment::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[84]);
+      file_level_metadata_substrait_2falgebra_2eproto[89]);
 }
 
 // ===================================================================
@@ -28286,7 +30301,7 @@ void Expression_MaskExpression_Select::InternalSwap(Expression_MaskExpression_Se
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_Select::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[85]);
+      file_level_metadata_substrait_2falgebra_2eproto[90]);
 }
 
 // ===================================================================
@@ -28471,7 +30486,7 @@ void Expression_MaskExpression_StructSelect::InternalSwap(Expression_MaskExpress
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_StructSelect::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[86]);
+      file_level_metadata_substrait_2falgebra_2eproto[91]);
 }
 
 // ===================================================================
@@ -28698,7 +30713,7 @@ void Expression_MaskExpression_StructItem::InternalSwap(Expression_MaskExpressio
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_StructItem::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[87]);
+      file_level_metadata_substrait_2falgebra_2eproto[92]);
 }
 
 // ===================================================================
@@ -28876,7 +30891,7 @@ void Expression_MaskExpression_ListSelect_ListSelectItem_ListElement::InternalSw
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_ListSelect_ListSelectItem_ListElement::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[88]);
+      file_level_metadata_substrait_2falgebra_2eproto[93]);
 }
 
 // ===================================================================
@@ -29088,7 +31103,7 @@ void Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice::InternalSwap
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[89]);
+      file_level_metadata_substrait_2falgebra_2eproto[94]);
 }
 
 // ===================================================================
@@ -29388,7 +31403,7 @@ void Expression_MaskExpression_ListSelect_ListSelectItem::InternalSwap(Expressio
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_ListSelect_ListSelectItem::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[90]);
+      file_level_metadata_substrait_2falgebra_2eproto[95]);
 }
 
 // ===================================================================
@@ -29616,7 +31631,7 @@ void Expression_MaskExpression_ListSelect::InternalSwap(Expression_MaskExpressio
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_ListSelect::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[91]);
+      file_level_metadata_substrait_2falgebra_2eproto[96]);
 }
 
 // ===================================================================
@@ -29819,7 +31834,7 @@ void Expression_MaskExpression_MapSelect_MapKey::InternalSwap(Expression_MaskExp
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_MapSelect_MapKey::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[92]);
+      file_level_metadata_substrait_2falgebra_2eproto[97]);
 }
 
 // ===================================================================
@@ -30022,7 +32037,7 @@ void Expression_MaskExpression_MapSelect_MapKeyExpression::InternalSwap(Expressi
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_MapSelect_MapKeyExpression::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[93]);
+      file_level_metadata_substrait_2falgebra_2eproto[98]);
 }
 
 // ===================================================================
@@ -30365,7 +32380,7 @@ void Expression_MaskExpression_MapSelect::InternalSwap(Expression_MaskExpression
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression_MapSelect::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[94]);
+      file_level_metadata_substrait_2falgebra_2eproto[99]);
 }
 
 // ===================================================================
@@ -30592,7 +32607,7 @@ void Expression_MaskExpression::InternalSwap(Expression_MaskExpression* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_MaskExpression::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[95]);
+      file_level_metadata_substrait_2falgebra_2eproto[100]);
 }
 
 // ===================================================================
@@ -30631,7 +32646,7 @@ const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Expression_FieldReference_Root
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_FieldReference_RootReference::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[96]);
+      file_level_metadata_substrait_2falgebra_2eproto[101]);
 }
 
 // ===================================================================
@@ -30809,7 +32824,7 @@ void Expression_FieldReference_OuterReference::InternalSwap(Expression_FieldRefe
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_FieldReference_OuterReference::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[97]);
+      file_level_metadata_substrait_2falgebra_2eproto[102]);
 }
 
 // ===================================================================
@@ -31313,7 +33328,7 @@ void Expression_FieldReference::InternalSwap(Expression_FieldReference* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_FieldReference::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[98]);
+      file_level_metadata_substrait_2falgebra_2eproto[103]);
 }
 
 // ===================================================================
@@ -31508,7 +33523,7 @@ void Expression_Subquery_Scalar::InternalSwap(Expression_Subquery_Scalar* other)
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Subquery_Scalar::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[99]);
+      file_level_metadata_substrait_2falgebra_2eproto[104]);
 }
 
 // ===================================================================
@@ -31736,7 +33751,7 @@ void Expression_Subquery_InPredicate::InternalSwap(Expression_Subquery_InPredica
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Subquery_InPredicate::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[100]);
+      file_level_metadata_substrait_2falgebra_2eproto[105]);
 }
 
 // ===================================================================
@@ -31966,7 +33981,7 @@ void Expression_Subquery_SetPredicate::InternalSwap(Expression_Subquery_SetPredi
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Subquery_SetPredicate::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[101]);
+      file_level_metadata_substrait_2falgebra_2eproto[106]);
 }
 
 // ===================================================================
@@ -32266,7 +34281,7 @@ void Expression_Subquery_SetComparison::InternalSwap(Expression_Subquery_SetComp
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Subquery_SetComparison::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[102]);
+      file_level_metadata_substrait_2falgebra_2eproto[107]);
 }
 
 // ===================================================================
@@ -32680,7 +34695,7 @@ void Expression_Subquery::InternalSwap(Expression_Subquery* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression_Subquery::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[103]);
+      file_level_metadata_substrait_2falgebra_2eproto[108]);
 }
 
 // ===================================================================
@@ -33550,7 +35565,7 @@ void Expression::InternalSwap(Expression* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata Expression::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[104]);
+      file_level_metadata_substrait_2falgebra_2eproto[109]);
 }
 
 // ===================================================================
@@ -33844,7 +35859,7 @@ void SortField::InternalSwap(SortField* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata SortField::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[105]);
+      file_level_metadata_substrait_2falgebra_2eproto[110]);
 }
 
 // ===================================================================
@@ -34022,7 +36037,7 @@ void AggregateFunction_ReferenceRel::InternalSwap(AggregateFunction_ReferenceRel
 ::PROTOBUF_NAMESPACE_ID::Metadata AggregateFunction_ReferenceRel::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[106]);
+      file_level_metadata_substrait_2falgebra_2eproto[111]);
 }
 
 // ===================================================================
@@ -34441,7 +36456,7 @@ void AggregateFunction::InternalSwap(AggregateFunction* other) {
 ::PROTOBUF_NAMESPACE_ID::Metadata AggregateFunction::GetMetadata() const {
   return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(
       &descriptor_table_substrait_2falgebra_2eproto_getter, &descriptor_table_substrait_2falgebra_2eproto_once,
-      file_level_metadata_substrait_2falgebra_2eproto[107]);
+      file_level_metadata_substrait_2falgebra_2eproto[112]);
 }
 
 // @@protoc_insertion_point(namespace_scope)
@@ -34516,6 +36531,12 @@ template<> PROTOBUF_NOINLINE ::substrait::AggregateRel_Measure* Arena::CreateMay
 template<> PROTOBUF_NOINLINE ::substrait::AggregateRel* Arena::CreateMaybeMessage< ::substrait::AggregateRel >(Arena* arena) {
   return Arena::CreateMessageInternal< ::substrait::AggregateRel >(arena);
 }
+template<> PROTOBUF_NOINLINE ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* Arena::CreateMaybeMessage< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >(arena);
+}
+template<> PROTOBUF_NOINLINE ::substrait::ConsistentPartitionWindowRel* Arena::CreateMaybeMessage< ::substrait::ConsistentPartitionWindowRel >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::substrait::ConsistentPartitionWindowRel >(arena);
+}
 template<> PROTOBUF_NOINLINE ::substrait::SortRel* Arena::CreateMaybeMessage< ::substrait::SortRel >(Arena* arena) {
   return Arena::CreateMessageInternal< ::substrait::SortRel >(arena);
 }
@@ -34555,6 +36576,15 @@ template<> PROTOBUF_NOINLINE ::substrait::ExchangeRel_ExchangeTarget* Arena::Cre
 template<> PROTOBUF_NOINLINE ::substrait::ExchangeRel* Arena::CreateMaybeMessage< ::substrait::ExchangeRel >(Arena* arena) {
   return Arena::CreateMessageInternal< ::substrait::ExchangeRel >(arena);
 }
+template<> PROTOBUF_NOINLINE ::substrait::ExpandRel_ExpandField* Arena::CreateMaybeMessage< ::substrait::ExpandRel_ExpandField >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::substrait::ExpandRel_ExpandField >(arena);
+}
+template<> PROTOBUF_NOINLINE ::substrait::ExpandRel_SwitchingField* Arena::CreateMaybeMessage< ::substrait::ExpandRel_SwitchingField >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::substrait::ExpandRel_SwitchingField >(arena);
+}
+template<> PROTOBUF_NOINLINE ::substrait::ExpandRel* Arena::CreateMaybeMessage< ::substrait::ExpandRel >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::substrait::ExpandRel >(arena);
+}
 template<> PROTOBUF_NOINLINE ::substrait::RelRoot* Arena::CreateMaybeMessage< ::substrait::RelRoot >(Arena* arena) {
   return Arena::CreateMessageInternal< ::substrait::RelRoot >(arena);
 }
diff --git a/third_party/substrait/substrait/algebra.pb.h b/third_party/substrait/substrait/algebra.pb.h
index 015f1cc..2b850c9 100644
--- a/third_party/substrait/substrait/algebra.pb.h
+++ b/third_party/substrait/substrait/algebra.pb.h
@@ -51,7 +51,7 @@ struct TableStruct_substrait_2falgebra_2eproto {
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::AuxiliaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[108]
+  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[113]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[];
   static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[];
@@ -74,6 +74,12 @@ extern AggregateRel_GroupingDefaultTypeInternal _AggregateRel_Grouping_default_i
 class AggregateRel_Measure;
 struct AggregateRel_MeasureDefaultTypeInternal;
 extern AggregateRel_MeasureDefaultTypeInternal _AggregateRel_Measure_default_instance_;
+class ConsistentPartitionWindowRel;
+struct ConsistentPartitionWindowRelDefaultTypeInternal;
+extern ConsistentPartitionWindowRelDefaultTypeInternal _ConsistentPartitionWindowRel_default_instance_;
+class ConsistentPartitionWindowRel_WindowRelFunction;
+struct ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal;
+extern ConsistentPartitionWindowRel_WindowRelFunctionDefaultTypeInternal _ConsistentPartitionWindowRel_WindowRelFunction_default_instance_;
 class CrossRel;
 struct CrossRelDefaultTypeInternal;
 extern CrossRelDefaultTypeInternal _CrossRel_default_instance_;
@@ -101,6 +107,15 @@ extern ExchangeRel_ScatterFieldsDefaultTypeInternal _ExchangeRel_ScatterFields_d
 class ExchangeRel_SingleBucketExpression;
 struct ExchangeRel_SingleBucketExpressionDefaultTypeInternal;
 extern ExchangeRel_SingleBucketExpressionDefaultTypeInternal _ExchangeRel_SingleBucketExpression_default_instance_;
+class ExpandRel;
+struct ExpandRelDefaultTypeInternal;
+extern ExpandRelDefaultTypeInternal _ExpandRel_default_instance_;
+class ExpandRel_ExpandField;
+struct ExpandRel_ExpandFieldDefaultTypeInternal;
+extern ExpandRel_ExpandFieldDefaultTypeInternal _ExpandRel_ExpandField_default_instance_;
+class ExpandRel_SwitchingField;
+struct ExpandRel_SwitchingFieldDefaultTypeInternal;
+extern ExpandRel_SwitchingFieldDefaultTypeInternal _ExpandRel_SwitchingField_default_instance_;
 class Expression;
 struct ExpressionDefaultTypeInternal;
 extern ExpressionDefaultTypeInternal _Expression_default_instance_;
@@ -390,6 +405,8 @@ template<> ::substrait::AggregateFunction_ReferenceRel* Arena::CreateMaybeMessag
 template<> ::substrait::AggregateRel* Arena::CreateMaybeMessage<::substrait::AggregateRel>(Arena*);
 template<> ::substrait::AggregateRel_Grouping* Arena::CreateMaybeMessage<::substrait::AggregateRel_Grouping>(Arena*);
 template<> ::substrait::AggregateRel_Measure* Arena::CreateMaybeMessage<::substrait::AggregateRel_Measure>(Arena*);
+template<> ::substrait::ConsistentPartitionWindowRel* Arena::CreateMaybeMessage<::substrait::ConsistentPartitionWindowRel>(Arena*);
+template<> ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* Arena::CreateMaybeMessage<::substrait::ConsistentPartitionWindowRel_WindowRelFunction>(Arena*);
 template<> ::substrait::CrossRel* Arena::CreateMaybeMessage<::substrait::CrossRel>(Arena*);
 template<> ::substrait::DdlRel* Arena::CreateMaybeMessage<::substrait::DdlRel>(Arena*);
 template<> ::substrait::ExchangeRel* Arena::CreateMaybeMessage<::substrait::ExchangeRel>(Arena*);
@@ -399,6 +416,9 @@ template<> ::substrait::ExchangeRel_MultiBucketExpression* Arena::CreateMaybeMes
 template<> ::substrait::ExchangeRel_RoundRobin* Arena::CreateMaybeMessage<::substrait::ExchangeRel_RoundRobin>(Arena*);
 template<> ::substrait::ExchangeRel_ScatterFields* Arena::CreateMaybeMessage<::substrait::ExchangeRel_ScatterFields>(Arena*);
 template<> ::substrait::ExchangeRel_SingleBucketExpression* Arena::CreateMaybeMessage<::substrait::ExchangeRel_SingleBucketExpression>(Arena*);
+template<> ::substrait::ExpandRel* Arena::CreateMaybeMessage<::substrait::ExpandRel>(Arena*);
+template<> ::substrait::ExpandRel_ExpandField* Arena::CreateMaybeMessage<::substrait::ExpandRel_ExpandField>(Arena*);
+template<> ::substrait::ExpandRel_SwitchingField* Arena::CreateMaybeMessage<::substrait::ExpandRel_SwitchingField>(Arena*);
 template<> ::substrait::Expression* Arena::CreateMaybeMessage<::substrait::Expression>(Arena*);
 template<> ::substrait::Expression_Cast* Arena::CreateMaybeMessage<::substrait::Expression_Cast>(Arena*);
 template<> ::substrait::Expression_EmbeddedFunction* Arena::CreateMaybeMessage<::substrait::Expression_EmbeddedFunction>(Arena*);
@@ -730,6 +750,32 @@ inline bool MergeJoinRel_JoinType_Parse(
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<MergeJoinRel_JoinType>(
     MergeJoinRel_JoinType_descriptor(), name, value);
 }
+enum Expression_WindowFunction_BoundsType : int {
+  Expression_WindowFunction_BoundsType_BOUNDS_TYPE_UNSPECIFIED = 0,
+  Expression_WindowFunction_BoundsType_BOUNDS_TYPE_ROWS = 1,
+  Expression_WindowFunction_BoundsType_BOUNDS_TYPE_RANGE = 2,
+  Expression_WindowFunction_BoundsType_Expression_WindowFunction_BoundsType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
+  Expression_WindowFunction_BoundsType_Expression_WindowFunction_BoundsType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()
+};
+bool Expression_WindowFunction_BoundsType_IsValid(int value);
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction_BoundsType_BoundsType_MIN = Expression_WindowFunction_BoundsType_BOUNDS_TYPE_UNSPECIFIED;
+constexpr Expression_WindowFunction_BoundsType Expression_WindowFunction_BoundsType_BoundsType_MAX = Expression_WindowFunction_BoundsType_BOUNDS_TYPE_RANGE;
+constexpr int Expression_WindowFunction_BoundsType_BoundsType_ARRAYSIZE = Expression_WindowFunction_BoundsType_BoundsType_MAX + 1;
+
+const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Expression_WindowFunction_BoundsType_descriptor();
+template<typename T>
+inline const std::string& Expression_WindowFunction_BoundsType_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, Expression_WindowFunction_BoundsType>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function Expression_WindowFunction_BoundsType_Name.");
+  return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
+    Expression_WindowFunction_BoundsType_descriptor(), enum_t_value);
+}
+inline bool Expression_WindowFunction_BoundsType_Parse(
+    ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, Expression_WindowFunction_BoundsType* value) {
+  return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Expression_WindowFunction_BoundsType>(
+    Expression_WindowFunction_BoundsType_descriptor(), name, value);
+}
 enum Expression_Cast_FailureBehavior : int {
   Expression_Cast_FailureBehavior_FAILURE_BEHAVIOR_UNSPECIFIED = 0,
   Expression_Cast_FailureBehavior_FAILURE_BEHAVIOR_RETURN_NULL = 1,
@@ -5394,24 +5440,24 @@ class AggregateRel final :
 };
 // -------------------------------------------------------------------
 
-class SortRel final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.SortRel) */ {
+class ConsistentPartitionWindowRel_WindowRelFunction final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.ConsistentPartitionWindowRel.WindowRelFunction) */ {
  public:
-  inline SortRel() : SortRel(nullptr) {}
-  ~SortRel() override;
-  explicit constexpr SortRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  inline ConsistentPartitionWindowRel_WindowRelFunction() : ConsistentPartitionWindowRel_WindowRelFunction(nullptr) {}
+  ~ConsistentPartitionWindowRel_WindowRelFunction() override;
+  explicit constexpr ConsistentPartitionWindowRel_WindowRelFunction(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
 
-  SortRel(const SortRel& from);
-  SortRel(SortRel&& from) noexcept
-    : SortRel() {
+  ConsistentPartitionWindowRel_WindowRelFunction(const ConsistentPartitionWindowRel_WindowRelFunction& from);
+  ConsistentPartitionWindowRel_WindowRelFunction(ConsistentPartitionWindowRel_WindowRelFunction&& from) noexcept
+    : ConsistentPartitionWindowRel_WindowRelFunction() {
     *this = ::std::move(from);
   }
 
-  inline SortRel& operator=(const SortRel& from) {
+  inline ConsistentPartitionWindowRel_WindowRelFunction& operator=(const ConsistentPartitionWindowRel_WindowRelFunction& from) {
     CopyFrom(from);
     return *this;
   }
-  inline SortRel& operator=(SortRel&& from) noexcept {
+  inline ConsistentPartitionWindowRel_WindowRelFunction& operator=(ConsistentPartitionWindowRel_WindowRelFunction&& from) noexcept {
     if (this == &from) return *this;
     if (GetOwningArena() == from.GetOwningArena()
   #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
@@ -5434,20 +5480,20 @@ class SortRel final :
   static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
     return default_instance().GetMetadata().reflection;
   }
-  static const SortRel& default_instance() {
+  static const ConsistentPartitionWindowRel_WindowRelFunction& default_instance() {
     return *internal_default_instance();
   }
-  static inline const SortRel* internal_default_instance() {
-    return reinterpret_cast<const SortRel*>(
-               &_SortRel_default_instance_);
+  static inline const ConsistentPartitionWindowRel_WindowRelFunction* internal_default_instance() {
+    return reinterpret_cast<const ConsistentPartitionWindowRel_WindowRelFunction*>(
+               &_ConsistentPartitionWindowRel_WindowRelFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
     23;
 
-  friend void swap(SortRel& a, SortRel& b) {
+  friend void swap(ConsistentPartitionWindowRel_WindowRelFunction& a, ConsistentPartitionWindowRel_WindowRelFunction& b) {
     a.Swap(&b);
   }
-  inline void Swap(SortRel* other) {
+  inline void Swap(ConsistentPartitionWindowRel_WindowRelFunction* other) {
     if (other == this) return;
   #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
     if (GetOwningArena() != nullptr &&
@@ -5460,7 +5506,7 @@ class SortRel final :
       ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
     }
   }
-  void UnsafeArenaSwap(SortRel* other) {
+  void UnsafeArenaSwap(ConsistentPartitionWindowRel_WindowRelFunction* other) {
     if (other == this) return;
     GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
     InternalSwap(other);
@@ -5468,13 +5514,13 @@ class SortRel final :
 
   // implements Message ----------------------------------------------
 
-  SortRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
-    return CreateMaybeMessage<SortRel>(arena);
+  ConsistentPartitionWindowRel_WindowRelFunction* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<ConsistentPartitionWindowRel_WindowRelFunction>(arena);
   }
   using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
-  void CopyFrom(const SortRel& from);
+  void CopyFrom(const ConsistentPartitionWindowRel_WindowRelFunction& from);
   using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
-  void MergeFrom(const SortRel& from);
+  void MergeFrom(const ConsistentPartitionWindowRel_WindowRelFunction& from);
   private:
   static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
   public:
@@ -5491,15 +5537,15 @@ class SortRel final :
   void SharedCtor();
   void SharedDtor();
   void SetCachedSize(int size) const final;
-  void InternalSwap(SortRel* other);
+  void InternalSwap(ConsistentPartitionWindowRel_WindowRelFunction* other);
 
   private:
   friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
   static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
-    return "substrait.SortRel";
+    return "substrait.ConsistentPartitionWindowRel.WindowRelFunction";
   }
   protected:
-  explicit SortRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+  explicit ConsistentPartitionWindowRel_WindowRelFunction(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                        bool is_message_owned = false);
   private:
   static void ArenaDtor(void* object);
@@ -5516,117 +5562,181 @@ class SortRel final :
   // accessors -------------------------------------------------------
 
   enum : int {
-    kSortsFieldNumber = 3,
-    kCommonFieldNumber = 1,
-    kInputFieldNumber = 2,
-    kAdvancedExtensionFieldNumber = 10,
+    kArgumentsFieldNumber = 9,
+    kOptionsFieldNumber = 11,
+    kUpperBoundFieldNumber = 4,
+    kLowerBoundFieldNumber = 5,
+    kOutputTypeFieldNumber = 7,
+    kFunctionReferenceFieldNumber = 1,
+    kPhaseFieldNumber = 6,
+    kInvocationFieldNumber = 10,
+    kBoundsTypeFieldNumber = 12,
   };
-  // repeated .substrait.SortField sorts = 3;
-  int sorts_size() const;
+  // repeated .substrait.FunctionArgument arguments = 9;
+  int arguments_size() const;
   private:
-  int _internal_sorts_size() const;
+  int _internal_arguments_size() const;
   public:
-  void clear_sorts();
-  ::substrait::SortField* mutable_sorts(int index);
-  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >*
-      mutable_sorts();
+  void clear_arguments();
+  ::substrait::FunctionArgument* mutable_arguments(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionArgument >*
+      mutable_arguments();
   private:
-  const ::substrait::SortField& _internal_sorts(int index) const;
-  ::substrait::SortField* _internal_add_sorts();
+  const ::substrait::FunctionArgument& _internal_arguments(int index) const;
+  ::substrait::FunctionArgument* _internal_add_arguments();
   public:
-  const ::substrait::SortField& sorts(int index) const;
-  ::substrait::SortField* add_sorts();
-  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >&
-      sorts() const;
+  const ::substrait::FunctionArgument& arguments(int index) const;
+  ::substrait::FunctionArgument* add_arguments();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionArgument >&
+      arguments() const;
 
-  // .substrait.RelCommon common = 1;
-  bool has_common() const;
+  // repeated .substrait.FunctionOption options = 11;
+  int options_size() const;
   private:
-  bool _internal_has_common() const;
+  int _internal_options_size() const;
   public:
-  void clear_common();
-  const ::substrait::RelCommon& common() const;
-  PROTOBUF_NODISCARD ::substrait::RelCommon* release_common();
-  ::substrait::RelCommon* mutable_common();
-  void set_allocated_common(::substrait::RelCommon* common);
+  void clear_options();
+  ::substrait::FunctionOption* mutable_options(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionOption >*
+      mutable_options();
   private:
-  const ::substrait::RelCommon& _internal_common() const;
-  ::substrait::RelCommon* _internal_mutable_common();
+  const ::substrait::FunctionOption& _internal_options(int index) const;
+  ::substrait::FunctionOption* _internal_add_options();
   public:
-  void unsafe_arena_set_allocated_common(
-      ::substrait::RelCommon* common);
-  ::substrait::RelCommon* unsafe_arena_release_common();
+  const ::substrait::FunctionOption& options(int index) const;
+  ::substrait::FunctionOption* add_options();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionOption >&
+      options() const;
 
-  // .substrait.Rel input = 2;
-  bool has_input() const;
+  // .substrait.Expression.WindowFunction.Bound upper_bound = 4;
+  bool has_upper_bound() const;
   private:
-  bool _internal_has_input() const;
+  bool _internal_has_upper_bound() const;
   public:
-  void clear_input();
-  const ::substrait::Rel& input() const;
-  PROTOBUF_NODISCARD ::substrait::Rel* release_input();
-  ::substrait::Rel* mutable_input();
-  void set_allocated_input(::substrait::Rel* input);
+  void clear_upper_bound();
+  const ::substrait::Expression_WindowFunction_Bound& upper_bound() const;
+  PROTOBUF_NODISCARD ::substrait::Expression_WindowFunction_Bound* release_upper_bound();
+  ::substrait::Expression_WindowFunction_Bound* mutable_upper_bound();
+  void set_allocated_upper_bound(::substrait::Expression_WindowFunction_Bound* upper_bound);
   private:
-  const ::substrait::Rel& _internal_input() const;
-  ::substrait::Rel* _internal_mutable_input();
+  const ::substrait::Expression_WindowFunction_Bound& _internal_upper_bound() const;
+  ::substrait::Expression_WindowFunction_Bound* _internal_mutable_upper_bound();
   public:
-  void unsafe_arena_set_allocated_input(
-      ::substrait::Rel* input);
-  ::substrait::Rel* unsafe_arena_release_input();
+  void unsafe_arena_set_allocated_upper_bound(
+      ::substrait::Expression_WindowFunction_Bound* upper_bound);
+  ::substrait::Expression_WindowFunction_Bound* unsafe_arena_release_upper_bound();
 
-  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
-  bool has_advanced_extension() const;
+  // .substrait.Expression.WindowFunction.Bound lower_bound = 5;
+  bool has_lower_bound() const;
   private:
-  bool _internal_has_advanced_extension() const;
+  bool _internal_has_lower_bound() const;
   public:
-  void clear_advanced_extension();
-  const ::substrait::extensions::AdvancedExtension& advanced_extension() const;
-  PROTOBUF_NODISCARD ::substrait::extensions::AdvancedExtension* release_advanced_extension();
-  ::substrait::extensions::AdvancedExtension* mutable_advanced_extension();
-  void set_allocated_advanced_extension(::substrait::extensions::AdvancedExtension* advanced_extension);
+  void clear_lower_bound();
+  const ::substrait::Expression_WindowFunction_Bound& lower_bound() const;
+  PROTOBUF_NODISCARD ::substrait::Expression_WindowFunction_Bound* release_lower_bound();
+  ::substrait::Expression_WindowFunction_Bound* mutable_lower_bound();
+  void set_allocated_lower_bound(::substrait::Expression_WindowFunction_Bound* lower_bound);
   private:
-  const ::substrait::extensions::AdvancedExtension& _internal_advanced_extension() const;
-  ::substrait::extensions::AdvancedExtension* _internal_mutable_advanced_extension();
+  const ::substrait::Expression_WindowFunction_Bound& _internal_lower_bound() const;
+  ::substrait::Expression_WindowFunction_Bound* _internal_mutable_lower_bound();
   public:
-  void unsafe_arena_set_allocated_advanced_extension(
-      ::substrait::extensions::AdvancedExtension* advanced_extension);
-  ::substrait::extensions::AdvancedExtension* unsafe_arena_release_advanced_extension();
+  void unsafe_arena_set_allocated_lower_bound(
+      ::substrait::Expression_WindowFunction_Bound* lower_bound);
+  ::substrait::Expression_WindowFunction_Bound* unsafe_arena_release_lower_bound();
 
-  // @@protoc_insertion_point(class_scope:substrait.SortRel)
+  // .substrait.Type output_type = 7;
+  bool has_output_type() const;
+  private:
+  bool _internal_has_output_type() const;
+  public:
+  void clear_output_type();
+  const ::substrait::Type& output_type() const;
+  PROTOBUF_NODISCARD ::substrait::Type* release_output_type();
+  ::substrait::Type* mutable_output_type();
+  void set_allocated_output_type(::substrait::Type* output_type);
+  private:
+  const ::substrait::Type& _internal_output_type() const;
+  ::substrait::Type* _internal_mutable_output_type();
+  public:
+  void unsafe_arena_set_allocated_output_type(
+      ::substrait::Type* output_type);
+  ::substrait::Type* unsafe_arena_release_output_type();
+
+  // uint32 function_reference = 1;
+  void clear_function_reference();
+  uint32_t function_reference() const;
+  void set_function_reference(uint32_t value);
+  private:
+  uint32_t _internal_function_reference() const;
+  void _internal_set_function_reference(uint32_t value);
+  public:
+
+  // .substrait.AggregationPhase phase = 6;
+  void clear_phase();
+  ::substrait::AggregationPhase phase() const;
+  void set_phase(::substrait::AggregationPhase value);
+  private:
+  ::substrait::AggregationPhase _internal_phase() const;
+  void _internal_set_phase(::substrait::AggregationPhase value);
+  public:
+
+  // .substrait.AggregateFunction.AggregationInvocation invocation = 10;
+  void clear_invocation();
+  ::substrait::AggregateFunction_AggregationInvocation invocation() const;
+  void set_invocation(::substrait::AggregateFunction_AggregationInvocation value);
+  private:
+  ::substrait::AggregateFunction_AggregationInvocation _internal_invocation() const;
+  void _internal_set_invocation(::substrait::AggregateFunction_AggregationInvocation value);
+  public:
+
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  void clear_bounds_type();
+  ::substrait::Expression_WindowFunction_BoundsType bounds_type() const;
+  void set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value);
+  private:
+  ::substrait::Expression_WindowFunction_BoundsType _internal_bounds_type() const;
+  void _internal_set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value);
+  public:
+
+  // @@protoc_insertion_point(class_scope:substrait.ConsistentPartitionWindowRel.WindowRelFunction)
  private:
   class _Internal;
 
   template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
-  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField > sorts_;
-  ::substrait::RelCommon* common_;
-  ::substrait::Rel* input_;
-  ::substrait::extensions::AdvancedExtension* advanced_extension_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionArgument > arguments_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionOption > options_;
+  ::substrait::Expression_WindowFunction_Bound* upper_bound_;
+  ::substrait::Expression_WindowFunction_Bound* lower_bound_;
+  ::substrait::Type* output_type_;
+  uint32_t function_reference_;
+  int phase_;
+  int invocation_;
+  int bounds_type_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_substrait_2falgebra_2eproto;
 };
 // -------------------------------------------------------------------
 
-class FilterRel final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.FilterRel) */ {
+class ConsistentPartitionWindowRel final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.ConsistentPartitionWindowRel) */ {
  public:
-  inline FilterRel() : FilterRel(nullptr) {}
-  ~FilterRel() override;
-  explicit constexpr FilterRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  inline ConsistentPartitionWindowRel() : ConsistentPartitionWindowRel(nullptr) {}
+  ~ConsistentPartitionWindowRel() override;
+  explicit constexpr ConsistentPartitionWindowRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
 
-  FilterRel(const FilterRel& from);
-  FilterRel(FilterRel&& from) noexcept
-    : FilterRel() {
+  ConsistentPartitionWindowRel(const ConsistentPartitionWindowRel& from);
+  ConsistentPartitionWindowRel(ConsistentPartitionWindowRel&& from) noexcept
+    : ConsistentPartitionWindowRel() {
     *this = ::std::move(from);
   }
 
-  inline FilterRel& operator=(const FilterRel& from) {
+  inline ConsistentPartitionWindowRel& operator=(const ConsistentPartitionWindowRel& from) {
     CopyFrom(from);
     return *this;
   }
-  inline FilterRel& operator=(FilterRel&& from) noexcept {
+  inline ConsistentPartitionWindowRel& operator=(ConsistentPartitionWindowRel&& from) noexcept {
     if (this == &from) return *this;
     if (GetOwningArena() == from.GetOwningArena()
   #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
@@ -5649,20 +5759,20 @@ class FilterRel final :
   static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
     return default_instance().GetMetadata().reflection;
   }
-  static const FilterRel& default_instance() {
+  static const ConsistentPartitionWindowRel& default_instance() {
     return *internal_default_instance();
   }
-  static inline const FilterRel* internal_default_instance() {
-    return reinterpret_cast<const FilterRel*>(
-               &_FilterRel_default_instance_);
+  static inline const ConsistentPartitionWindowRel* internal_default_instance() {
+    return reinterpret_cast<const ConsistentPartitionWindowRel*>(
+               &_ConsistentPartitionWindowRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
     24;
 
-  friend void swap(FilterRel& a, FilterRel& b) {
+  friend void swap(ConsistentPartitionWindowRel& a, ConsistentPartitionWindowRel& b) {
     a.Swap(&b);
   }
-  inline void Swap(FilterRel* other) {
+  inline void Swap(ConsistentPartitionWindowRel* other) {
     if (other == this) return;
   #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
     if (GetOwningArena() != nullptr &&
@@ -5675,7 +5785,7 @@ class FilterRel final :
       ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
     }
   }
-  void UnsafeArenaSwap(FilterRel* other) {
+  void UnsafeArenaSwap(ConsistentPartitionWindowRel* other) {
     if (other == this) return;
     GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
     InternalSwap(other);
@@ -5683,13 +5793,13 @@ class FilterRel final :
 
   // implements Message ----------------------------------------------
 
-  FilterRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
-    return CreateMaybeMessage<FilterRel>(arena);
+  ConsistentPartitionWindowRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<ConsistentPartitionWindowRel>(arena);
   }
   using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
-  void CopyFrom(const FilterRel& from);
+  void CopyFrom(const ConsistentPartitionWindowRel& from);
   using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
-  void MergeFrom(const FilterRel& from);
+  void MergeFrom(const ConsistentPartitionWindowRel& from);
   private:
   static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
   public:
@@ -5706,15 +5816,15 @@ class FilterRel final :
   void SharedCtor();
   void SharedDtor();
   void SetCachedSize(int size) const final;
-  void InternalSwap(FilterRel* other);
+  void InternalSwap(ConsistentPartitionWindowRel* other);
 
   private:
   friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
   static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
-    return "substrait.FilterRel";
+    return "substrait.ConsistentPartitionWindowRel";
   }
   protected:
-  explicit FilterRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+  explicit ConsistentPartitionWindowRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                        bool is_message_owned = false);
   private:
   static void ArenaDtor(void* object);
@@ -5728,12 +5838,484 @@ class FilterRel final :
 
   // nested types ----------------------------------------------------
 
+  typedef ConsistentPartitionWindowRel_WindowRelFunction WindowRelFunction;
+
   // accessors -------------------------------------------------------
 
   enum : int {
+    kWindowFunctionsFieldNumber = 3,
+    kPartitionExpressionsFieldNumber = 4,
+    kSortsFieldNumber = 5,
     kCommonFieldNumber = 1,
     kInputFieldNumber = 2,
-    kConditionFieldNumber = 3,
+    kAdvancedExtensionFieldNumber = 10,
+  };
+  // repeated .substrait.ConsistentPartitionWindowRel.WindowRelFunction window_functions = 3;
+  int window_functions_size() const;
+  private:
+  int _internal_window_functions_size() const;
+  public:
+  void clear_window_functions();
+  ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* mutable_window_functions(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >*
+      mutable_window_functions();
+  private:
+  const ::substrait::ConsistentPartitionWindowRel_WindowRelFunction& _internal_window_functions(int index) const;
+  ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* _internal_add_window_functions();
+  public:
+  const ::substrait::ConsistentPartitionWindowRel_WindowRelFunction& window_functions(int index) const;
+  ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* add_window_functions();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >&
+      window_functions() const;
+
+  // repeated .substrait.Expression partition_expressions = 4;
+  int partition_expressions_size() const;
+  private:
+  int _internal_partition_expressions_size() const;
+  public:
+  void clear_partition_expressions();
+  ::substrait::Expression* mutable_partition_expressions(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >*
+      mutable_partition_expressions();
+  private:
+  const ::substrait::Expression& _internal_partition_expressions(int index) const;
+  ::substrait::Expression* _internal_add_partition_expressions();
+  public:
+  const ::substrait::Expression& partition_expressions(int index) const;
+  ::substrait::Expression* add_partition_expressions();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >&
+      partition_expressions() const;
+
+  // repeated .substrait.SortField sorts = 5;
+  int sorts_size() const;
+  private:
+  int _internal_sorts_size() const;
+  public:
+  void clear_sorts();
+  ::substrait::SortField* mutable_sorts(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >*
+      mutable_sorts();
+  private:
+  const ::substrait::SortField& _internal_sorts(int index) const;
+  ::substrait::SortField* _internal_add_sorts();
+  public:
+  const ::substrait::SortField& sorts(int index) const;
+  ::substrait::SortField* add_sorts();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >&
+      sorts() const;
+
+  // .substrait.RelCommon common = 1;
+  bool has_common() const;
+  private:
+  bool _internal_has_common() const;
+  public:
+  void clear_common();
+  const ::substrait::RelCommon& common() const;
+  PROTOBUF_NODISCARD ::substrait::RelCommon* release_common();
+  ::substrait::RelCommon* mutable_common();
+  void set_allocated_common(::substrait::RelCommon* common);
+  private:
+  const ::substrait::RelCommon& _internal_common() const;
+  ::substrait::RelCommon* _internal_mutable_common();
+  public:
+  void unsafe_arena_set_allocated_common(
+      ::substrait::RelCommon* common);
+  ::substrait::RelCommon* unsafe_arena_release_common();
+
+  // .substrait.Rel input = 2;
+  bool has_input() const;
+  private:
+  bool _internal_has_input() const;
+  public:
+  void clear_input();
+  const ::substrait::Rel& input() const;
+  PROTOBUF_NODISCARD ::substrait::Rel* release_input();
+  ::substrait::Rel* mutable_input();
+  void set_allocated_input(::substrait::Rel* input);
+  private:
+  const ::substrait::Rel& _internal_input() const;
+  ::substrait::Rel* _internal_mutable_input();
+  public:
+  void unsafe_arena_set_allocated_input(
+      ::substrait::Rel* input);
+  ::substrait::Rel* unsafe_arena_release_input();
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  bool has_advanced_extension() const;
+  private:
+  bool _internal_has_advanced_extension() const;
+  public:
+  void clear_advanced_extension();
+  const ::substrait::extensions::AdvancedExtension& advanced_extension() const;
+  PROTOBUF_NODISCARD ::substrait::extensions::AdvancedExtension* release_advanced_extension();
+  ::substrait::extensions::AdvancedExtension* mutable_advanced_extension();
+  void set_allocated_advanced_extension(::substrait::extensions::AdvancedExtension* advanced_extension);
+  private:
+  const ::substrait::extensions::AdvancedExtension& _internal_advanced_extension() const;
+  ::substrait::extensions::AdvancedExtension* _internal_mutable_advanced_extension();
+  public:
+  void unsafe_arena_set_allocated_advanced_extension(
+      ::substrait::extensions::AdvancedExtension* advanced_extension);
+  ::substrait::extensions::AdvancedExtension* unsafe_arena_release_advanced_extension();
+
+  // @@protoc_insertion_point(class_scope:substrait.ConsistentPartitionWindowRel)
+ private:
+  class _Internal;
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction > window_functions_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression > partition_expressions_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField > sorts_;
+  ::substrait::RelCommon* common_;
+  ::substrait::Rel* input_;
+  ::substrait::extensions::AdvancedExtension* advanced_extension_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_substrait_2falgebra_2eproto;
+};
+// -------------------------------------------------------------------
+
+class SortRel final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.SortRel) */ {
+ public:
+  inline SortRel() : SortRel(nullptr) {}
+  ~SortRel() override;
+  explicit constexpr SortRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+
+  SortRel(const SortRel& from);
+  SortRel(SortRel&& from) noexcept
+    : SortRel() {
+    *this = ::std::move(from);
+  }
+
+  inline SortRel& operator=(const SortRel& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline SortRel& operator=(SortRel&& from) noexcept {
+    if (this == &from) return *this;
+    if (GetOwningArena() == from.GetOwningArena()
+  #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
+        && GetOwningArena() != nullptr
+  #endif  // !PROTOBUF_FORCE_COPY_IN_MOVE
+    ) {
+      InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return default_instance().GetMetadata().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return default_instance().GetMetadata().reflection;
+  }
+  static const SortRel& default_instance() {
+    return *internal_default_instance();
+  }
+  static inline const SortRel* internal_default_instance() {
+    return reinterpret_cast<const SortRel*>(
+               &_SortRel_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    25;
+
+  friend void swap(SortRel& a, SortRel& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(SortRel* other) {
+    if (other == this) return;
+  #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() != nullptr &&
+        GetOwningArena() == other->GetOwningArena()) {
+   #else  // PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() == other->GetOwningArena()) {
+  #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(SortRel* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  SortRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<SortRel>(arena);
+  }
+  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  void CopyFrom(const SortRel& from);
+  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  void MergeFrom(const SortRel& from);
+  private:
+  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
+  public:
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  uint8_t* _InternalSerialize(
+      uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(SortRel* other);
+
+  private:
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "substrait.SortRel";
+  }
+  protected:
+  explicit SortRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                       bool is_message_owned = false);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  static const ClassData _class_data_;
+  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kSortsFieldNumber = 3,
+    kCommonFieldNumber = 1,
+    kInputFieldNumber = 2,
+    kAdvancedExtensionFieldNumber = 10,
+  };
+  // repeated .substrait.SortField sorts = 3;
+  int sorts_size() const;
+  private:
+  int _internal_sorts_size() const;
+  public:
+  void clear_sorts();
+  ::substrait::SortField* mutable_sorts(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >*
+      mutable_sorts();
+  private:
+  const ::substrait::SortField& _internal_sorts(int index) const;
+  ::substrait::SortField* _internal_add_sorts();
+  public:
+  const ::substrait::SortField& sorts(int index) const;
+  ::substrait::SortField* add_sorts();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >&
+      sorts() const;
+
+  // .substrait.RelCommon common = 1;
+  bool has_common() const;
+  private:
+  bool _internal_has_common() const;
+  public:
+  void clear_common();
+  const ::substrait::RelCommon& common() const;
+  PROTOBUF_NODISCARD ::substrait::RelCommon* release_common();
+  ::substrait::RelCommon* mutable_common();
+  void set_allocated_common(::substrait::RelCommon* common);
+  private:
+  const ::substrait::RelCommon& _internal_common() const;
+  ::substrait::RelCommon* _internal_mutable_common();
+  public:
+  void unsafe_arena_set_allocated_common(
+      ::substrait::RelCommon* common);
+  ::substrait::RelCommon* unsafe_arena_release_common();
+
+  // .substrait.Rel input = 2;
+  bool has_input() const;
+  private:
+  bool _internal_has_input() const;
+  public:
+  void clear_input();
+  const ::substrait::Rel& input() const;
+  PROTOBUF_NODISCARD ::substrait::Rel* release_input();
+  ::substrait::Rel* mutable_input();
+  void set_allocated_input(::substrait::Rel* input);
+  private:
+  const ::substrait::Rel& _internal_input() const;
+  ::substrait::Rel* _internal_mutable_input();
+  public:
+  void unsafe_arena_set_allocated_input(
+      ::substrait::Rel* input);
+  ::substrait::Rel* unsafe_arena_release_input();
+
+  // .substrait.extensions.AdvancedExtension advanced_extension = 10;
+  bool has_advanced_extension() const;
+  private:
+  bool _internal_has_advanced_extension() const;
+  public:
+  void clear_advanced_extension();
+  const ::substrait::extensions::AdvancedExtension& advanced_extension() const;
+  PROTOBUF_NODISCARD ::substrait::extensions::AdvancedExtension* release_advanced_extension();
+  ::substrait::extensions::AdvancedExtension* mutable_advanced_extension();
+  void set_allocated_advanced_extension(::substrait::extensions::AdvancedExtension* advanced_extension);
+  private:
+  const ::substrait::extensions::AdvancedExtension& _internal_advanced_extension() const;
+  ::substrait::extensions::AdvancedExtension* _internal_mutable_advanced_extension();
+  public:
+  void unsafe_arena_set_allocated_advanced_extension(
+      ::substrait::extensions::AdvancedExtension* advanced_extension);
+  ::substrait::extensions::AdvancedExtension* unsafe_arena_release_advanced_extension();
+
+  // @@protoc_insertion_point(class_scope:substrait.SortRel)
+ private:
+  class _Internal;
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField > sorts_;
+  ::substrait::RelCommon* common_;
+  ::substrait::Rel* input_;
+  ::substrait::extensions::AdvancedExtension* advanced_extension_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_substrait_2falgebra_2eproto;
+};
+// -------------------------------------------------------------------
+
+class FilterRel final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.FilterRel) */ {
+ public:
+  inline FilterRel() : FilterRel(nullptr) {}
+  ~FilterRel() override;
+  explicit constexpr FilterRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+
+  FilterRel(const FilterRel& from);
+  FilterRel(FilterRel&& from) noexcept
+    : FilterRel() {
+    *this = ::std::move(from);
+  }
+
+  inline FilterRel& operator=(const FilterRel& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline FilterRel& operator=(FilterRel&& from) noexcept {
+    if (this == &from) return *this;
+    if (GetOwningArena() == from.GetOwningArena()
+  #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
+        && GetOwningArena() != nullptr
+  #endif  // !PROTOBUF_FORCE_COPY_IN_MOVE
+    ) {
+      InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return default_instance().GetMetadata().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return default_instance().GetMetadata().reflection;
+  }
+  static const FilterRel& default_instance() {
+    return *internal_default_instance();
+  }
+  static inline const FilterRel* internal_default_instance() {
+    return reinterpret_cast<const FilterRel*>(
+               &_FilterRel_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    26;
+
+  friend void swap(FilterRel& a, FilterRel& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(FilterRel* other) {
+    if (other == this) return;
+  #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() != nullptr &&
+        GetOwningArena() == other->GetOwningArena()) {
+   #else  // PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() == other->GetOwningArena()) {
+  #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(FilterRel* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  FilterRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<FilterRel>(arena);
+  }
+  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  void CopyFrom(const FilterRel& from);
+  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  void MergeFrom(const FilterRel& from);
+  private:
+  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
+  public:
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  uint8_t* _InternalSerialize(
+      uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(FilterRel* other);
+
+  private:
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "substrait.FilterRel";
+  }
+  protected:
+  explicit FilterRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                       bool is_message_owned = false);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  static const ClassData _class_data_;
+  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kCommonFieldNumber = 1,
+    kInputFieldNumber = 2,
+    kConditionFieldNumber = 3,
     kAdvancedExtensionFieldNumber = 10,
   };
   // .substrait.RelCommon common = 1;
@@ -5872,7 +6454,7 @@ class SetRel final :
                &_SetRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    25;
+    27;
 
   friend void swap(SetRel& a, SetRel& b) {
     a.Swap(&b);
@@ -6118,7 +6700,7 @@ class ExtensionSingleRel final :
                &_ExtensionSingleRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    26;
+    28;
 
   friend void swap(ExtensionSingleRel& a, ExtensionSingleRel& b) {
     a.Swap(&b);
@@ -6313,7 +6895,7 @@ class ExtensionLeafRel final :
                &_ExtensionLeafRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    27;
+    29;
 
   friend void swap(ExtensionLeafRel& a, ExtensionLeafRel& b) {
     a.Swap(&b);
@@ -6488,7 +7070,7 @@ class ExtensionMultiRel final :
                &_ExtensionMultiRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    28;
+    30;
 
   friend void swap(ExtensionMultiRel& a, ExtensionMultiRel& b) {
     a.Swap(&b);
@@ -6683,7 +7265,7 @@ class ExchangeRel_ScatterFields final :
                &_ExchangeRel_ScatterFields_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    29;
+    31;
 
   friend void swap(ExchangeRel_ScatterFields& a, ExchangeRel_ScatterFields& b) {
     a.Swap(&b);
@@ -6838,7 +7420,7 @@ class ExchangeRel_SingleBucketExpression final :
                &_ExchangeRel_SingleBucketExpression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    30;
+    32;
 
   friend void swap(ExchangeRel_SingleBucketExpression& a, ExchangeRel_SingleBucketExpression& b) {
     a.Swap(&b);
@@ -6993,7 +7575,7 @@ class ExchangeRel_MultiBucketExpression final :
                &_ExchangeRel_MultiBucketExpression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    31;
+    33;
 
   friend void swap(ExchangeRel_MultiBucketExpression& a, ExchangeRel_MultiBucketExpression& b) {
     a.Swap(&b);
@@ -7158,7 +7740,7 @@ class ExchangeRel_Broadcast final :
                &_ExchangeRel_Broadcast_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    32;
+    34;
 
   friend void swap(ExchangeRel_Broadcast& a, ExchangeRel_Broadcast& b) {
     a.Swap(&b);
@@ -7277,7 +7859,7 @@ class ExchangeRel_RoundRobin final :
                &_ExchangeRel_RoundRobin_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    33;
+    35;
 
   friend void swap(ExchangeRel_RoundRobin& a, ExchangeRel_RoundRobin& b) {
     a.Swap(&b);
@@ -7429,7 +8011,7 @@ class ExchangeRel_ExchangeTarget final :
                &_ExchangeRel_ExchangeTarget_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    34;
+    36;
 
   friend void swap(ExchangeRel_ExchangeTarget& a, ExchangeRel_ExchangeTarget& b) {
     a.Swap(&b);
@@ -7651,7 +8233,7 @@ class ExchangeRel final :
                &_ExchangeRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    35;
+    37;
 
   friend void swap(ExchangeRel& a, ExchangeRel& b) {
     a.Swap(&b);
@@ -7952,24 +8534,24 @@ class ExchangeRel final :
 };
 // -------------------------------------------------------------------
 
-class RelRoot final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.RelRoot) */ {
+class ExpandRel_ExpandField final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.ExpandRel.ExpandField) */ {
  public:
-  inline RelRoot() : RelRoot(nullptr) {}
-  ~RelRoot() override;
-  explicit constexpr RelRoot(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  inline ExpandRel_ExpandField() : ExpandRel_ExpandField(nullptr) {}
+  ~ExpandRel_ExpandField() override;
+  explicit constexpr ExpandRel_ExpandField(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
 
-  RelRoot(const RelRoot& from);
-  RelRoot(RelRoot&& from) noexcept
-    : RelRoot() {
+  ExpandRel_ExpandField(const ExpandRel_ExpandField& from);
+  ExpandRel_ExpandField(ExpandRel_ExpandField&& from) noexcept
+    : ExpandRel_ExpandField() {
     *this = ::std::move(from);
   }
 
-  inline RelRoot& operator=(const RelRoot& from) {
+  inline ExpandRel_ExpandField& operator=(const ExpandRel_ExpandField& from) {
     CopyFrom(from);
     return *this;
   }
-  inline RelRoot& operator=(RelRoot&& from) noexcept {
+  inline ExpandRel_ExpandField& operator=(ExpandRel_ExpandField&& from) noexcept {
     if (this == &from) return *this;
     if (GetOwningArena() == from.GetOwningArena()
   #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
@@ -7992,20 +8574,26 @@ class RelRoot final :
   static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
     return default_instance().GetMetadata().reflection;
   }
-  static const RelRoot& default_instance() {
+  static const ExpandRel_ExpandField& default_instance() {
     return *internal_default_instance();
   }
-  static inline const RelRoot* internal_default_instance() {
-    return reinterpret_cast<const RelRoot*>(
-               &_RelRoot_default_instance_);
+  enum FieldTypeCase {
+    kSwitchingField = 2,
+    kConsistentField = 3,
+    FIELD_TYPE_NOT_SET = 0,
+  };
+
+  static inline const ExpandRel_ExpandField* internal_default_instance() {
+    return reinterpret_cast<const ExpandRel_ExpandField*>(
+               &_ExpandRel_ExpandField_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    36;
+    38;
 
-  friend void swap(RelRoot& a, RelRoot& b) {
+  friend void swap(ExpandRel_ExpandField& a, ExpandRel_ExpandField& b) {
     a.Swap(&b);
   }
-  inline void Swap(RelRoot* other) {
+  inline void Swap(ExpandRel_ExpandField* other) {
     if (other == this) return;
   #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
     if (GetOwningArena() != nullptr &&
@@ -8018,7 +8606,7 @@ class RelRoot final :
       ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
     }
   }
-  void UnsafeArenaSwap(RelRoot* other) {
+  void UnsafeArenaSwap(ExpandRel_ExpandField* other) {
     if (other == this) return;
     GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
     InternalSwap(other);
@@ -8026,13 +8614,13 @@ class RelRoot final :
 
   // implements Message ----------------------------------------------
 
-  RelRoot* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
-    return CreateMaybeMessage<RelRoot>(arena);
+  ExpandRel_ExpandField* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<ExpandRel_ExpandField>(arena);
   }
   using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
-  void CopyFrom(const RelRoot& from);
+  void CopyFrom(const ExpandRel_ExpandField& from);
   using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
-  void MergeFrom(const RelRoot& from);
+  void MergeFrom(const ExpandRel_ExpandField& from);
   private:
   static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
   public:
@@ -8049,15 +8637,15 @@ class RelRoot final :
   void SharedCtor();
   void SharedDtor();
   void SetCachedSize(int size) const final;
-  void InternalSwap(RelRoot* other);
+  void InternalSwap(ExpandRel_ExpandField* other);
 
   private:
   friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
   static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
-    return "substrait.RelRoot";
+    return "substrait.ExpandRel.ExpandField";
   }
   protected:
-  explicit RelRoot(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+  explicit ExpandRel_ExpandField(::PROTOBUF_NAMESPACE_ID::Arena* arena,
                        bool is_message_owned = false);
   private:
   static void ArenaDtor(void* object);
@@ -8074,34 +8662,393 @@ class RelRoot final :
   // accessors -------------------------------------------------------
 
   enum : int {
-    kNamesFieldNumber = 2,
-    kInputFieldNumber = 1,
+    kSwitchingFieldFieldNumber = 2,
+    kConsistentFieldFieldNumber = 3,
   };
-  // repeated string names = 2;
-  int names_size() const;
+  // .substrait.ExpandRel.SwitchingField switching_field = 2;
+  bool has_switching_field() const;
   private:
-  int _internal_names_size() const;
+  bool _internal_has_switching_field() const;
   public:
-  void clear_names();
-  const std::string& names(int index) const;
-  std::string* mutable_names(int index);
-  void set_names(int index, const std::string& value);
-  void set_names(int index, std::string&& value);
-  void set_names(int index, const char* value);
-  void set_names(int index, const char* value, size_t size);
-  std::string* add_names();
-  void add_names(const std::string& value);
-  void add_names(std::string&& value);
-  void add_names(const char* value);
-  void add_names(const char* value, size_t size);
-  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& names() const;
-  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_names();
+  void clear_switching_field();
+  const ::substrait::ExpandRel_SwitchingField& switching_field() const;
+  PROTOBUF_NODISCARD ::substrait::ExpandRel_SwitchingField* release_switching_field();
+  ::substrait::ExpandRel_SwitchingField* mutable_switching_field();
+  void set_allocated_switching_field(::substrait::ExpandRel_SwitchingField* switching_field);
   private:
-  const std::string& _internal_names(int index) const;
-  std::string* _internal_add_names();
+  const ::substrait::ExpandRel_SwitchingField& _internal_switching_field() const;
+  ::substrait::ExpandRel_SwitchingField* _internal_mutable_switching_field();
   public:
+  void unsafe_arena_set_allocated_switching_field(
+      ::substrait::ExpandRel_SwitchingField* switching_field);
+  ::substrait::ExpandRel_SwitchingField* unsafe_arena_release_switching_field();
 
-  // .substrait.Rel input = 1;
+  // .substrait.Expression consistent_field = 3;
+  bool has_consistent_field() const;
+  private:
+  bool _internal_has_consistent_field() const;
+  public:
+  void clear_consistent_field();
+  const ::substrait::Expression& consistent_field() const;
+  PROTOBUF_NODISCARD ::substrait::Expression* release_consistent_field();
+  ::substrait::Expression* mutable_consistent_field();
+  void set_allocated_consistent_field(::substrait::Expression* consistent_field);
+  private:
+  const ::substrait::Expression& _internal_consistent_field() const;
+  ::substrait::Expression* _internal_mutable_consistent_field();
+  public:
+  void unsafe_arena_set_allocated_consistent_field(
+      ::substrait::Expression* consistent_field);
+  ::substrait::Expression* unsafe_arena_release_consistent_field();
+
+  void clear_field_type();
+  FieldTypeCase field_type_case() const;
+  // @@protoc_insertion_point(class_scope:substrait.ExpandRel.ExpandField)
+ private:
+  class _Internal;
+  void set_has_switching_field();
+  void set_has_consistent_field();
+
+  inline bool has_field_type() const;
+  inline void clear_has_field_type();
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  union FieldTypeUnion {
+    constexpr FieldTypeUnion() : _constinit_{} {}
+      ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized _constinit_;
+    ::substrait::ExpandRel_SwitchingField* switching_field_;
+    ::substrait::Expression* consistent_field_;
+  } field_type_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  uint32_t _oneof_case_[1];
+
+  friend struct ::TableStruct_substrait_2falgebra_2eproto;
+};
+// -------------------------------------------------------------------
+
+class ExpandRel_SwitchingField final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.ExpandRel.SwitchingField) */ {
+ public:
+  inline ExpandRel_SwitchingField() : ExpandRel_SwitchingField(nullptr) {}
+  ~ExpandRel_SwitchingField() override;
+  explicit constexpr ExpandRel_SwitchingField(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+
+  ExpandRel_SwitchingField(const ExpandRel_SwitchingField& from);
+  ExpandRel_SwitchingField(ExpandRel_SwitchingField&& from) noexcept
+    : ExpandRel_SwitchingField() {
+    *this = ::std::move(from);
+  }
+
+  inline ExpandRel_SwitchingField& operator=(const ExpandRel_SwitchingField& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline ExpandRel_SwitchingField& operator=(ExpandRel_SwitchingField&& from) noexcept {
+    if (this == &from) return *this;
+    if (GetOwningArena() == from.GetOwningArena()
+  #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
+        && GetOwningArena() != nullptr
+  #endif  // !PROTOBUF_FORCE_COPY_IN_MOVE
+    ) {
+      InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return default_instance().GetMetadata().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return default_instance().GetMetadata().reflection;
+  }
+  static const ExpandRel_SwitchingField& default_instance() {
+    return *internal_default_instance();
+  }
+  static inline const ExpandRel_SwitchingField* internal_default_instance() {
+    return reinterpret_cast<const ExpandRel_SwitchingField*>(
+               &_ExpandRel_SwitchingField_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    39;
+
+  friend void swap(ExpandRel_SwitchingField& a, ExpandRel_SwitchingField& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(ExpandRel_SwitchingField* other) {
+    if (other == this) return;
+  #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() != nullptr &&
+        GetOwningArena() == other->GetOwningArena()) {
+   #else  // PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() == other->GetOwningArena()) {
+  #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(ExpandRel_SwitchingField* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  ExpandRel_SwitchingField* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<ExpandRel_SwitchingField>(arena);
+  }
+  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  void CopyFrom(const ExpandRel_SwitchingField& from);
+  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  void MergeFrom(const ExpandRel_SwitchingField& from);
+  private:
+  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
+  public:
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  uint8_t* _InternalSerialize(
+      uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(ExpandRel_SwitchingField* other);
+
+  private:
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "substrait.ExpandRel.SwitchingField";
+  }
+  protected:
+  explicit ExpandRel_SwitchingField(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                       bool is_message_owned = false);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  static const ClassData _class_data_;
+  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kDuplicatesFieldNumber = 1,
+  };
+  // repeated .substrait.Expression duplicates = 1;
+  int duplicates_size() const;
+  private:
+  int _internal_duplicates_size() const;
+  public:
+  void clear_duplicates();
+  ::substrait::Expression* mutable_duplicates(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >*
+      mutable_duplicates();
+  private:
+  const ::substrait::Expression& _internal_duplicates(int index) const;
+  ::substrait::Expression* _internal_add_duplicates();
+  public:
+  const ::substrait::Expression& duplicates(int index) const;
+  ::substrait::Expression* add_duplicates();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >&
+      duplicates() const;
+
+  // @@protoc_insertion_point(class_scope:substrait.ExpandRel.SwitchingField)
+ private:
+  class _Internal;
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression > duplicates_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_substrait_2falgebra_2eproto;
+};
+// -------------------------------------------------------------------
+
+class ExpandRel final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.ExpandRel) */ {
+ public:
+  inline ExpandRel() : ExpandRel(nullptr) {}
+  ~ExpandRel() override;
+  explicit constexpr ExpandRel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+
+  ExpandRel(const ExpandRel& from);
+  ExpandRel(ExpandRel&& from) noexcept
+    : ExpandRel() {
+    *this = ::std::move(from);
+  }
+
+  inline ExpandRel& operator=(const ExpandRel& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline ExpandRel& operator=(ExpandRel&& from) noexcept {
+    if (this == &from) return *this;
+    if (GetOwningArena() == from.GetOwningArena()
+  #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
+        && GetOwningArena() != nullptr
+  #endif  // !PROTOBUF_FORCE_COPY_IN_MOVE
+    ) {
+      InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return default_instance().GetMetadata().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return default_instance().GetMetadata().reflection;
+  }
+  static const ExpandRel& default_instance() {
+    return *internal_default_instance();
+  }
+  static inline const ExpandRel* internal_default_instance() {
+    return reinterpret_cast<const ExpandRel*>(
+               &_ExpandRel_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    40;
+
+  friend void swap(ExpandRel& a, ExpandRel& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(ExpandRel* other) {
+    if (other == this) return;
+  #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() != nullptr &&
+        GetOwningArena() == other->GetOwningArena()) {
+   #else  // PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() == other->GetOwningArena()) {
+  #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(ExpandRel* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  ExpandRel* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<ExpandRel>(arena);
+  }
+  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  void CopyFrom(const ExpandRel& from);
+  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  void MergeFrom(const ExpandRel& from);
+  private:
+  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
+  public:
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  uint8_t* _InternalSerialize(
+      uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(ExpandRel* other);
+
+  private:
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "substrait.ExpandRel";
+  }
+  protected:
+  explicit ExpandRel(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                       bool is_message_owned = false);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  static const ClassData _class_data_;
+  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  typedef ExpandRel_ExpandField ExpandField;
+  typedef ExpandRel_SwitchingField SwitchingField;
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kFieldsFieldNumber = 4,
+    kCommonFieldNumber = 1,
+    kInputFieldNumber = 2,
+  };
+  // repeated .substrait.ExpandRel.ExpandField fields = 4;
+  int fields_size() const;
+  private:
+  int _internal_fields_size() const;
+  public:
+  void clear_fields();
+  ::substrait::ExpandRel_ExpandField* mutable_fields(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ExpandRel_ExpandField >*
+      mutable_fields();
+  private:
+  const ::substrait::ExpandRel_ExpandField& _internal_fields(int index) const;
+  ::substrait::ExpandRel_ExpandField* _internal_add_fields();
+  public:
+  const ::substrait::ExpandRel_ExpandField& fields(int index) const;
+  ::substrait::ExpandRel_ExpandField* add_fields();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ExpandRel_ExpandField >&
+      fields() const;
+
+  // .substrait.RelCommon common = 1;
+  bool has_common() const;
+  private:
+  bool _internal_has_common() const;
+  public:
+  void clear_common();
+  const ::substrait::RelCommon& common() const;
+  PROTOBUF_NODISCARD ::substrait::RelCommon* release_common();
+  ::substrait::RelCommon* mutable_common();
+  void set_allocated_common(::substrait::RelCommon* common);
+  private:
+  const ::substrait::RelCommon& _internal_common() const;
+  ::substrait::RelCommon* _internal_mutable_common();
+  public:
+  void unsafe_arena_set_allocated_common(
+      ::substrait::RelCommon* common);
+  ::substrait::RelCommon* unsafe_arena_release_common();
+
+  // .substrait.Rel input = 2;
   bool has_input() const;
   private:
   bool _internal_has_input() const;
@@ -8119,38 +9066,220 @@ class RelRoot final :
       ::substrait::Rel* input);
   ::substrait::Rel* unsafe_arena_release_input();
 
-  // @@protoc_insertion_point(class_scope:substrait.RelRoot)
+  // @@protoc_insertion_point(class_scope:substrait.ExpandRel)
  private:
   class _Internal;
 
   template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
-  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> names_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ExpandRel_ExpandField > fields_;
+  ::substrait::RelCommon* common_;
   ::substrait::Rel* input_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_substrait_2falgebra_2eproto;
 };
 // -------------------------------------------------------------------
 
-class Rel final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.Rel) */ {
+class RelRoot final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.RelRoot) */ {
  public:
-  inline Rel() : Rel(nullptr) {}
-  ~Rel() override;
-  explicit constexpr Rel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  inline RelRoot() : RelRoot(nullptr) {}
+  ~RelRoot() override;
+  explicit constexpr RelRoot(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
 
-  Rel(const Rel& from);
-  Rel(Rel&& from) noexcept
-    : Rel() {
+  RelRoot(const RelRoot& from);
+  RelRoot(RelRoot&& from) noexcept
+    : RelRoot() {
     *this = ::std::move(from);
   }
 
-  inline Rel& operator=(const Rel& from) {
+  inline RelRoot& operator=(const RelRoot& from) {
     CopyFrom(from);
     return *this;
   }
-  inline Rel& operator=(Rel&& from) noexcept {
+  inline RelRoot& operator=(RelRoot&& from) noexcept {
+    if (this == &from) return *this;
+    if (GetOwningArena() == from.GetOwningArena()
+  #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
+        && GetOwningArena() != nullptr
+  #endif  // !PROTOBUF_FORCE_COPY_IN_MOVE
+    ) {
+      InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return default_instance().GetMetadata().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return default_instance().GetMetadata().reflection;
+  }
+  static const RelRoot& default_instance() {
+    return *internal_default_instance();
+  }
+  static inline const RelRoot* internal_default_instance() {
+    return reinterpret_cast<const RelRoot*>(
+               &_RelRoot_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    41;
+
+  friend void swap(RelRoot& a, RelRoot& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(RelRoot* other) {
+    if (other == this) return;
+  #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() != nullptr &&
+        GetOwningArena() == other->GetOwningArena()) {
+   #else  // PROTOBUF_FORCE_COPY_IN_SWAP
+    if (GetOwningArena() == other->GetOwningArena()) {
+  #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(RelRoot* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  RelRoot* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+    return CreateMaybeMessage<RelRoot>(arena);
+  }
+  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  void CopyFrom(const RelRoot& from);
+  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  void MergeFrom(const RelRoot& from);
+  private:
+  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from);
+  public:
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  uint8_t* _InternalSerialize(
+      uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(RelRoot* other);
+
+  private:
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "substrait.RelRoot";
+  }
+  protected:
+  explicit RelRoot(::PROTOBUF_NAMESPACE_ID::Arena* arena,
+                       bool is_message_owned = false);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  static const ClassData _class_data_;
+  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kNamesFieldNumber = 2,
+    kInputFieldNumber = 1,
+  };
+  // repeated string names = 2;
+  int names_size() const;
+  private:
+  int _internal_names_size() const;
+  public:
+  void clear_names();
+  const std::string& names(int index) const;
+  std::string* mutable_names(int index);
+  void set_names(int index, const std::string& value);
+  void set_names(int index, std::string&& value);
+  void set_names(int index, const char* value);
+  void set_names(int index, const char* value, size_t size);
+  std::string* add_names();
+  void add_names(const std::string& value);
+  void add_names(std::string&& value);
+  void add_names(const char* value);
+  void add_names(const char* value, size_t size);
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& names() const;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_names();
+  private:
+  const std::string& _internal_names(int index) const;
+  std::string* _internal_add_names();
+  public:
+
+  // .substrait.Rel input = 1;
+  bool has_input() const;
+  private:
+  bool _internal_has_input() const;
+  public:
+  void clear_input();
+  const ::substrait::Rel& input() const;
+  PROTOBUF_NODISCARD ::substrait::Rel* release_input();
+  ::substrait::Rel* mutable_input();
+  void set_allocated_input(::substrait::Rel* input);
+  private:
+  const ::substrait::Rel& _internal_input() const;
+  ::substrait::Rel* _internal_mutable_input();
+  public:
+  void unsafe_arena_set_allocated_input(
+      ::substrait::Rel* input);
+  ::substrait::Rel* unsafe_arena_release_input();
+
+  // @@protoc_insertion_point(class_scope:substrait.RelRoot)
+ private:
+  class _Internal;
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> names_;
+  ::substrait::Rel* input_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_substrait_2falgebra_2eproto;
+};
+// -------------------------------------------------------------------
+
+class Rel final :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:substrait.Rel) */ {
+ public:
+  inline Rel() : Rel(nullptr) {}
+  ~Rel() override;
+  explicit constexpr Rel(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+
+  Rel(const Rel& from);
+  Rel(Rel&& from) noexcept
+    : Rel() {
+    *this = ::std::move(from);
+  }
+
+  inline Rel& operator=(const Rel& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline Rel& operator=(Rel&& from) noexcept {
     if (this == &from) return *this;
     if (GetOwningArena() == from.GetOwningArena()
   #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
@@ -8191,6 +9320,9 @@ class Rel final :
     kCross = 12,
     kHashJoin = 13,
     kMergeJoin = 14,
+    kWindow = 17,
+    kExchange = 15,
+    kExpand = 16,
     REL_TYPE_NOT_SET = 0,
   };
 
@@ -8199,7 +9331,7 @@ class Rel final :
                &_Rel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    37;
+    42;
 
   friend void swap(Rel& a, Rel& b) {
     a.Swap(&b);
@@ -8287,6 +9419,9 @@ class Rel final :
     kCrossFieldNumber = 12,
     kHashJoinFieldNumber = 13,
     kMergeJoinFieldNumber = 14,
+    kWindowFieldNumber = 17,
+    kExchangeFieldNumber = 15,
+    kExpandFieldNumber = 16,
   };
   // .substrait.ReadRel read = 1;
   bool has_read() const;
@@ -8540,6 +9675,60 @@ class Rel final :
       ::substrait::MergeJoinRel* merge_join);
   ::substrait::MergeJoinRel* unsafe_arena_release_merge_join();
 
+  // .substrait.ConsistentPartitionWindowRel window = 17;
+  bool has_window() const;
+  private:
+  bool _internal_has_window() const;
+  public:
+  void clear_window();
+  const ::substrait::ConsistentPartitionWindowRel& window() const;
+  PROTOBUF_NODISCARD ::substrait::ConsistentPartitionWindowRel* release_window();
+  ::substrait::ConsistentPartitionWindowRel* mutable_window();
+  void set_allocated_window(::substrait::ConsistentPartitionWindowRel* window);
+  private:
+  const ::substrait::ConsistentPartitionWindowRel& _internal_window() const;
+  ::substrait::ConsistentPartitionWindowRel* _internal_mutable_window();
+  public:
+  void unsafe_arena_set_allocated_window(
+      ::substrait::ConsistentPartitionWindowRel* window);
+  ::substrait::ConsistentPartitionWindowRel* unsafe_arena_release_window();
+
+  // .substrait.ExchangeRel exchange = 15;
+  bool has_exchange() const;
+  private:
+  bool _internal_has_exchange() const;
+  public:
+  void clear_exchange();
+  const ::substrait::ExchangeRel& exchange() const;
+  PROTOBUF_NODISCARD ::substrait::ExchangeRel* release_exchange();
+  ::substrait::ExchangeRel* mutable_exchange();
+  void set_allocated_exchange(::substrait::ExchangeRel* exchange);
+  private:
+  const ::substrait::ExchangeRel& _internal_exchange() const;
+  ::substrait::ExchangeRel* _internal_mutable_exchange();
+  public:
+  void unsafe_arena_set_allocated_exchange(
+      ::substrait::ExchangeRel* exchange);
+  ::substrait::ExchangeRel* unsafe_arena_release_exchange();
+
+  // .substrait.ExpandRel expand = 16;
+  bool has_expand() const;
+  private:
+  bool _internal_has_expand() const;
+  public:
+  void clear_expand();
+  const ::substrait::ExpandRel& expand() const;
+  PROTOBUF_NODISCARD ::substrait::ExpandRel* release_expand();
+  ::substrait::ExpandRel* mutable_expand();
+  void set_allocated_expand(::substrait::ExpandRel* expand);
+  private:
+  const ::substrait::ExpandRel& _internal_expand() const;
+  ::substrait::ExpandRel* _internal_mutable_expand();
+  public:
+  void unsafe_arena_set_allocated_expand(
+      ::substrait::ExpandRel* expand);
+  ::substrait::ExpandRel* unsafe_arena_release_expand();
+
   void clear_rel_type();
   RelTypeCase rel_type_case() const;
   // @@protoc_insertion_point(class_scope:substrait.Rel)
@@ -8559,6 +9748,9 @@ class Rel final :
   void set_has_cross();
   void set_has_hash_join();
   void set_has_merge_join();
+  void set_has_window();
+  void set_has_exchange();
+  void set_has_expand();
 
   inline bool has_rel_type() const;
   inline void clear_has_rel_type();
@@ -8583,6 +9775,9 @@ class Rel final :
     ::substrait::CrossRel* cross_;
     ::substrait::HashJoinRel* hash_join_;
     ::substrait::MergeJoinRel* merge_join_;
+    ::substrait::ConsistentPartitionWindowRel* window_;
+    ::substrait::ExchangeRel* exchange_;
+    ::substrait::ExpandRel* expand_;
   } rel_type_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   uint32_t _oneof_case_[1];
@@ -8639,7 +9834,7 @@ class NamedObjectWrite final :
                &_NamedObjectWrite_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    38;
+    43;
 
   friend void swap(NamedObjectWrite& a, NamedObjectWrite& b) {
     a.Swap(&b);
@@ -8820,7 +10015,7 @@ class ExtensionObject final :
                &_ExtensionObject_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    39;
+    44;
 
   friend void swap(ExtensionObject& a, ExtensionObject& b) {
     a.Swap(&b);
@@ -8981,7 +10176,7 @@ class DdlRel final :
                &_DdlRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    40;
+    45;
 
   friend void swap(DdlRel& a, DdlRel& b) {
     a.Swap(&b);
@@ -9327,7 +10522,7 @@ class WriteRel final :
                &_WriteRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    41;
+    46;
 
   friend void swap(WriteRel& a, WriteRel& b) {
     a.Swap(&b);
@@ -9645,7 +10840,7 @@ class HashJoinRel final :
                &_HashJoinRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    42;
+    47;
 
   friend void swap(HashJoinRel& a, HashJoinRel& b) {
     a.Swap(&b);
@@ -9975,7 +11170,7 @@ class MergeJoinRel final :
                &_MergeJoinRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    43;
+    48;
 
   friend void swap(MergeJoinRel& a, MergeJoinRel& b) {
     a.Swap(&b);
@@ -10312,7 +11507,7 @@ class FunctionArgument final :
                &_FunctionArgument_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    44;
+    49;
 
   friend void swap(FunctionArgument& a, FunctionArgument& b) {
     a.Swap(&b);
@@ -10521,7 +11716,7 @@ class FunctionOption final :
                &_FunctionOption_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    45;
+    50;
 
   friend void swap(FunctionOption& a, FunctionOption& b) {
     a.Swap(&b);
@@ -10697,7 +11892,7 @@ class Expression_Enum_Empty final :
                &_Expression_Enum_Empty_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    46;
+    51;
 
   friend void swap(Expression_Enum_Empty& a, Expression_Enum_Empty& b) {
     a.Swap(&b);
@@ -10822,7 +12017,7 @@ class Expression_Enum final :
                &_Expression_Enum_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    47;
+    52;
 
   friend void swap(Expression_Enum& a, Expression_Enum& b) {
     a.Swap(&b);
@@ -11012,7 +12207,7 @@ class Expression_Literal_VarChar final :
                &_Expression_Literal_VarChar_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    48;
+    53;
 
   friend void swap(Expression_Literal_VarChar& a, Expression_Literal_VarChar& b) {
     a.Swap(&b);
@@ -11174,7 +12369,7 @@ class Expression_Literal_Decimal final :
                &_Expression_Literal_Decimal_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    49;
+    54;
 
   friend void swap(Expression_Literal_Decimal& a, Expression_Literal_Decimal& b) {
     a.Swap(&b);
@@ -11347,7 +12542,7 @@ class Expression_Literal_Map_KeyValue final :
                &_Expression_Literal_Map_KeyValue_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    50;
+    55;
 
   friend void swap(Expression_Literal_Map_KeyValue& a, Expression_Literal_Map_KeyValue& b) {
     a.Swap(&b);
@@ -11522,7 +12717,7 @@ class Expression_Literal_Map final :
                &_Expression_Literal_Map_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    51;
+    56;
 
   friend void swap(Expression_Literal_Map& a, Expression_Literal_Map& b) {
     a.Swap(&b);
@@ -11679,7 +12874,7 @@ class Expression_Literal_IntervalYearToMonth final :
                &_Expression_Literal_IntervalYearToMonth_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    52;
+    57;
 
   friend void swap(Expression_Literal_IntervalYearToMonth& a, Expression_Literal_IntervalYearToMonth& b) {
     a.Swap(&b);
@@ -11836,7 +13031,7 @@ class Expression_Literal_IntervalDayToSecond final :
                &_Expression_Literal_IntervalDayToSecond_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    53;
+    58;
 
   friend void swap(Expression_Literal_IntervalDayToSecond& a, Expression_Literal_IntervalDayToSecond& b) {
     a.Swap(&b);
@@ -12004,7 +13199,7 @@ class Expression_Literal_Struct final :
                &_Expression_Literal_Struct_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    54;
+    59;
 
   friend void swap(Expression_Literal_Struct& a, Expression_Literal_Struct& b) {
     a.Swap(&b);
@@ -12159,7 +13354,7 @@ class Expression_Literal_List final :
                &_Expression_Literal_List_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    55;
+    60;
 
   friend void swap(Expression_Literal_List& a, Expression_Literal_List& b) {
     a.Swap(&b);
@@ -12314,7 +13509,7 @@ class Expression_Literal_UserDefined final :
                &_Expression_Literal_UserDefined_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    56;
+    61;
 
   friend void swap(Expression_Literal_UserDefined& a, Expression_Literal_UserDefined& b) {
     a.Swap(&b);
@@ -12531,7 +13726,7 @@ class Expression_Literal final :
                &_Expression_Literal_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    57;
+    62;
 
   friend void swap(Expression_Literal& a, Expression_Literal& b) {
     a.Swap(&b);
@@ -13220,7 +14415,7 @@ class Expression_Nested_Map_KeyValue final :
                &_Expression_Nested_Map_KeyValue_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    58;
+    63;
 
   friend void swap(Expression_Nested_Map_KeyValue& a, Expression_Nested_Map_KeyValue& b) {
     a.Swap(&b);
@@ -13395,7 +14590,7 @@ class Expression_Nested_Map final :
                &_Expression_Nested_Map_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    59;
+    64;
 
   friend void swap(Expression_Nested_Map& a, Expression_Nested_Map& b) {
     a.Swap(&b);
@@ -13552,7 +14747,7 @@ class Expression_Nested_Struct final :
                &_Expression_Nested_Struct_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    60;
+    65;
 
   friend void swap(Expression_Nested_Struct& a, Expression_Nested_Struct& b) {
     a.Swap(&b);
@@ -13707,7 +14902,7 @@ class Expression_Nested_List final :
                &_Expression_Nested_List_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    61;
+    66;
 
   friend void swap(Expression_Nested_List& a, Expression_Nested_List& b) {
     a.Swap(&b);
@@ -13869,7 +15064,7 @@ class Expression_Nested final :
                &_Expression_Nested_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    62;
+    67;
 
   friend void swap(Expression_Nested& a, Expression_Nested& b) {
     a.Swap(&b);
@@ -14104,7 +15299,7 @@ class Expression_ScalarFunction final :
                &_Expression_ScalarFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    63;
+    68;
 
   friend void swap(Expression_ScalarFunction& a, Expression_ScalarFunction& b) {
     a.Swap(&b);
@@ -14330,7 +15525,7 @@ class Expression_WindowFunction_Bound_Preceding final :
                &_Expression_WindowFunction_Bound_Preceding_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    64;
+    69;
 
   friend void swap(Expression_WindowFunction_Bound_Preceding& a, Expression_WindowFunction_Bound_Preceding& b) {
     a.Swap(&b);
@@ -14476,7 +15671,7 @@ class Expression_WindowFunction_Bound_Following final :
                &_Expression_WindowFunction_Bound_Following_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    65;
+    70;
 
   friend void swap(Expression_WindowFunction_Bound_Following& a, Expression_WindowFunction_Bound_Following& b) {
     a.Swap(&b);
@@ -14621,7 +15816,7 @@ class Expression_WindowFunction_Bound_CurrentRow final :
                &_Expression_WindowFunction_Bound_CurrentRow_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    66;
+    71;
 
   friend void swap(Expression_WindowFunction_Bound_CurrentRow& a, Expression_WindowFunction_Bound_CurrentRow& b) {
     a.Swap(&b);
@@ -14739,7 +15934,7 @@ class Expression_WindowFunction_Bound_Unbounded final :
                &_Expression_WindowFunction_Bound_Unbounded_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    67;
+    72;
 
   friend void swap(Expression_WindowFunction_Bound_Unbounded& a, Expression_WindowFunction_Bound_Unbounded& b) {
     a.Swap(&b);
@@ -14866,7 +16061,7 @@ class Expression_WindowFunction_Bound final :
                &_Expression_WindowFunction_Bound_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    68;
+    73;
 
   friend void swap(Expression_WindowFunction_Bound& a, Expression_WindowFunction_Bound& b) {
     a.Swap(&b);
@@ -15101,7 +16296,7 @@ class Expression_WindowFunction final :
                &_Expression_WindowFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    69;
+    74;
 
   friend void swap(Expression_WindowFunction& a, Expression_WindowFunction& b) {
     a.Swap(&b);
@@ -15174,6 +16369,38 @@ class Expression_WindowFunction final :
 
   typedef Expression_WindowFunction_Bound Bound;
 
+  typedef Expression_WindowFunction_BoundsType BoundsType;
+  static constexpr BoundsType BOUNDS_TYPE_UNSPECIFIED =
+    Expression_WindowFunction_BoundsType_BOUNDS_TYPE_UNSPECIFIED;
+  static constexpr BoundsType BOUNDS_TYPE_ROWS =
+    Expression_WindowFunction_BoundsType_BOUNDS_TYPE_ROWS;
+  static constexpr BoundsType BOUNDS_TYPE_RANGE =
+    Expression_WindowFunction_BoundsType_BOUNDS_TYPE_RANGE;
+  static inline bool BoundsType_IsValid(int value) {
+    return Expression_WindowFunction_BoundsType_IsValid(value);
+  }
+  static constexpr BoundsType BoundsType_MIN =
+    Expression_WindowFunction_BoundsType_BoundsType_MIN;
+  static constexpr BoundsType BoundsType_MAX =
+    Expression_WindowFunction_BoundsType_BoundsType_MAX;
+  static constexpr int BoundsType_ARRAYSIZE =
+    Expression_WindowFunction_BoundsType_BoundsType_ARRAYSIZE;
+  static inline const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor*
+  BoundsType_descriptor() {
+    return Expression_WindowFunction_BoundsType_descriptor();
+  }
+  template<typename T>
+  static inline const std::string& BoundsType_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, BoundsType>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function BoundsType_Name.");
+    return Expression_WindowFunction_BoundsType_Name(enum_t_value);
+  }
+  static inline bool BoundsType_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+      BoundsType* value) {
+    return Expression_WindowFunction_BoundsType_Parse(name, value);
+  }
+
   // accessors -------------------------------------------------------
 
   enum : int {
@@ -15188,6 +16415,7 @@ class Expression_WindowFunction final :
     kFunctionReferenceFieldNumber = 1,
     kPhaseFieldNumber = 6,
     kInvocationFieldNumber = 10,
+    kBoundsTypeFieldNumber = 12,
   };
   // repeated .substrait.Expression partitions = 2;
   int partitions_size() const;
@@ -15360,6 +16588,15 @@ class Expression_WindowFunction final :
   void _internal_set_invocation(::substrait::AggregateFunction_AggregationInvocation value);
   public:
 
+  // .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+  void clear_bounds_type();
+  ::substrait::Expression_WindowFunction_BoundsType bounds_type() const;
+  void set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value);
+  private:
+  ::substrait::Expression_WindowFunction_BoundsType _internal_bounds_type() const;
+  void _internal_set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value);
+  public:
+
   // @@protoc_insertion_point(class_scope:substrait.Expression.WindowFunction)
  private:
   class _Internal;
@@ -15378,6 +16615,7 @@ class Expression_WindowFunction final :
   uint32_t function_reference_;
   int phase_;
   int invocation_;
+  int bounds_type_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_substrait_2falgebra_2eproto;
 };
@@ -15431,7 +16669,7 @@ class Expression_IfThen_IfClause final :
                &_Expression_IfThen_IfClause_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    70;
+    75;
 
   friend void swap(Expression_IfThen_IfClause& a, Expression_IfThen_IfClause& b) {
     a.Swap(&b);
@@ -15606,7 +16844,7 @@ class Expression_IfThen final :
                &_Expression_IfThen_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    71;
+    76;
 
   friend void swap(Expression_IfThen& a, Expression_IfThen& b) {
     a.Swap(&b);
@@ -15783,7 +17021,7 @@ class Expression_Cast final :
                &_Expression_Cast_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    72;
+    77;
 
   friend void swap(Expression_Cast& a, Expression_Cast& b) {
     a.Swap(&b);
@@ -16001,7 +17239,7 @@ class Expression_SwitchExpression_IfValue final :
                &_Expression_SwitchExpression_IfValue_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    73;
+    78;
 
   friend void swap(Expression_SwitchExpression_IfValue& a, Expression_SwitchExpression_IfValue& b) {
     a.Swap(&b);
@@ -16176,7 +17414,7 @@ class Expression_SwitchExpression final :
                &_Expression_SwitchExpression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    74;
+    79;
 
   friend void swap(Expression_SwitchExpression& a, Expression_SwitchExpression& b) {
     a.Swap(&b);
@@ -16373,7 +17611,7 @@ class Expression_SingularOrList final :
                &_Expression_SingularOrList_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    75;
+    80;
 
   friend void swap(Expression_SingularOrList& a, Expression_SingularOrList& b) {
     a.Swap(&b);
@@ -16548,7 +17786,7 @@ class Expression_MultiOrList_Record final :
                &_Expression_MultiOrList_Record_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    76;
+    81;
 
   friend void swap(Expression_MultiOrList_Record& a, Expression_MultiOrList_Record& b) {
     a.Swap(&b);
@@ -16703,7 +17941,7 @@ class Expression_MultiOrList final :
                &_Expression_MultiOrList_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    77;
+    82;
 
   friend void swap(Expression_MultiOrList& a, Expression_MultiOrList& b) {
     a.Swap(&b);
@@ -16880,7 +18118,7 @@ class Expression_EmbeddedFunction_PythonPickleFunction final :
                &_Expression_EmbeddedFunction_PythonPickleFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    78;
+    83;
 
   friend void swap(Expression_EmbeddedFunction_PythonPickleFunction& a, Expression_EmbeddedFunction_PythonPickleFunction& b) {
     a.Swap(&b);
@@ -17057,7 +18295,7 @@ class Expression_EmbeddedFunction_WebAssemblyFunction final :
                &_Expression_EmbeddedFunction_WebAssemblyFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    79;
+    84;
 
   friend void swap(Expression_EmbeddedFunction_WebAssemblyFunction& a, Expression_EmbeddedFunction_WebAssemblyFunction& b) {
     a.Swap(&b);
@@ -17240,7 +18478,7 @@ class Expression_EmbeddedFunction final :
                &_Expression_EmbeddedFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    80;
+    85;
 
   friend void swap(Expression_EmbeddedFunction& a, Expression_EmbeddedFunction& b) {
     a.Swap(&b);
@@ -17471,7 +18709,7 @@ class Expression_ReferenceSegment_MapKey final :
                &_Expression_ReferenceSegment_MapKey_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    81;
+    86;
 
   friend void swap(Expression_ReferenceSegment_MapKey& a, Expression_ReferenceSegment_MapKey& b) {
     a.Swap(&b);
@@ -17646,7 +18884,7 @@ class Expression_ReferenceSegment_StructField final :
                &_Expression_ReferenceSegment_StructField_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    82;
+    87;
 
   friend void swap(Expression_ReferenceSegment_StructField& a, Expression_ReferenceSegment_StructField& b) {
     a.Swap(&b);
@@ -17812,7 +19050,7 @@ class Expression_ReferenceSegment_ListElement final :
                &_Expression_ReferenceSegment_ListElement_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    83;
+    88;
 
   friend void swap(Expression_ReferenceSegment_ListElement& a, Expression_ReferenceSegment_ListElement& b) {
     a.Swap(&b);
@@ -17985,7 +19223,7 @@ class Expression_ReferenceSegment final :
                &_Expression_ReferenceSegment_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    84;
+    89;
 
   friend void swap(Expression_ReferenceSegment& a, Expression_ReferenceSegment& b) {
     a.Swap(&b);
@@ -18205,7 +19443,7 @@ class Expression_MaskExpression_Select final :
                &_Expression_MaskExpression_Select_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    85;
+    90;
 
   friend void swap(Expression_MaskExpression_Select& a, Expression_MaskExpression_Select& b) {
     a.Swap(&b);
@@ -18414,7 +19652,7 @@ class Expression_MaskExpression_StructSelect final :
                &_Expression_MaskExpression_StructSelect_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    86;
+    91;
 
   friend void swap(Expression_MaskExpression_StructSelect& a, Expression_MaskExpression_StructSelect& b) {
     a.Swap(&b);
@@ -18569,7 +19807,7 @@ class Expression_MaskExpression_StructItem final :
                &_Expression_MaskExpression_StructItem_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    87;
+    92;
 
   friend void swap(Expression_MaskExpression_StructItem& a, Expression_MaskExpression_StructItem& b) {
     a.Swap(&b);
@@ -18735,7 +19973,7 @@ class Expression_MaskExpression_ListSelect_ListSelectItem_ListElement final :
                &_Expression_MaskExpression_ListSelect_ListSelectItem_ListElement_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    88;
+    93;
 
   friend void swap(Expression_MaskExpression_ListSelect_ListSelectItem_ListElement& a, Expression_MaskExpression_ListSelect_ListSelectItem_ListElement& b) {
     a.Swap(&b);
@@ -18881,7 +20119,7 @@ class Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice final :
                &_Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    89;
+    94;
 
   friend void swap(Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice& a, Expression_MaskExpression_ListSelect_ListSelectItem_ListSlice& b) {
     a.Swap(&b);
@@ -19044,7 +20282,7 @@ class Expression_MaskExpression_ListSelect_ListSelectItem final :
                &_Expression_MaskExpression_ListSelect_ListSelectItem_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    90;
+    95;
 
   friend void swap(Expression_MaskExpression_ListSelect_ListSelectItem& a, Expression_MaskExpression_ListSelect_ListSelectItem& b) {
     a.Swap(&b);
@@ -19235,7 +20473,7 @@ class Expression_MaskExpression_ListSelect final :
                &_Expression_MaskExpression_ListSelect_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    91;
+    96;
 
   friend void swap(Expression_MaskExpression_ListSelect& a, Expression_MaskExpression_ListSelect& b) {
     a.Swap(&b);
@@ -19412,7 +20650,7 @@ class Expression_MaskExpression_MapSelect_MapKey final :
                &_Expression_MaskExpression_MapSelect_MapKey_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    92;
+    97;
 
   friend void swap(Expression_MaskExpression_MapSelect_MapKey& a, Expression_MaskExpression_MapSelect_MapKey& b) {
     a.Swap(&b);
@@ -19563,7 +20801,7 @@ class Expression_MaskExpression_MapSelect_MapKeyExpression final :
                &_Expression_MaskExpression_MapSelect_MapKeyExpression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    93;
+    98;
 
   friend void swap(Expression_MaskExpression_MapSelect_MapKeyExpression& a, Expression_MaskExpression_MapSelect_MapKeyExpression& b) {
     a.Swap(&b);
@@ -19720,7 +20958,7 @@ class Expression_MaskExpression_MapSelect final :
                &_Expression_MaskExpression_MapSelect_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    94;
+    99;
 
   friend void swap(Expression_MaskExpression_MapSelect& a, Expression_MaskExpression_MapSelect& b) {
     a.Swap(&b);
@@ -19931,7 +21169,7 @@ class Expression_MaskExpression final :
                &_Expression_MaskExpression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    95;
+    100;
 
   friend void swap(Expression_MaskExpression& a, Expression_MaskExpression& b) {
     a.Swap(&b);
@@ -20102,7 +21340,7 @@ class Expression_FieldReference_RootReference final :
                &_Expression_FieldReference_RootReference_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    96;
+    101;
 
   friend void swap(Expression_FieldReference_RootReference& a, Expression_FieldReference_RootReference& b) {
     a.Swap(&b);
@@ -20221,7 +21459,7 @@ class Expression_FieldReference_OuterReference final :
                &_Expression_FieldReference_OuterReference_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    97;
+    102;
 
   friend void swap(Expression_FieldReference_OuterReference& a, Expression_FieldReference_OuterReference& b) {
     a.Swap(&b);
@@ -20380,7 +21618,7 @@ class Expression_FieldReference final :
                &_Expression_FieldReference_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    98;
+    103;
 
   friend void swap(Expression_FieldReference& a, Expression_FieldReference& b) {
     a.Swap(&b);
@@ -20643,7 +21881,7 @@ class Expression_Subquery_Scalar final :
                &_Expression_Subquery_Scalar_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    99;
+    104;
 
   friend void swap(Expression_Subquery_Scalar& a, Expression_Subquery_Scalar& b) {
     a.Swap(&b);
@@ -20798,7 +22036,7 @@ class Expression_Subquery_InPredicate final :
                &_Expression_Subquery_InPredicate_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    100;
+    105;
 
   friend void swap(Expression_Subquery_InPredicate& a, Expression_Subquery_InPredicate& b) {
     a.Swap(&b);
@@ -20973,7 +22211,7 @@ class Expression_Subquery_SetPredicate final :
                &_Expression_Subquery_SetPredicate_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    101;
+    106;
 
   friend void swap(Expression_Subquery_SetPredicate& a, Expression_Subquery_SetPredicate& b) {
     a.Swap(&b);
@@ -21171,7 +22409,7 @@ class Expression_Subquery_SetComparison final :
                &_Expression_Subquery_SetComparison_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    102;
+    107;
 
   friend void swap(Expression_Subquery_SetComparison& a, Expression_Subquery_SetComparison& b) {
     a.Swap(&b);
@@ -21448,7 +22686,7 @@ class Expression_Subquery final :
                &_Expression_Subquery_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    103;
+    108;
 
   friend void swap(Expression_Subquery& a, Expression_Subquery& b) {
     a.Swap(&b);
@@ -21699,7 +22937,7 @@ class Expression final :
                &_Expression_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    104;
+    109;
 
   friend void swap(Expression& a, Expression& b) {
     a.Swap(&b);
@@ -22119,7 +23357,7 @@ class SortField final :
                &_SortField_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    105;
+    110;
 
   friend void swap(SortField& a, SortField& b) {
     a.Swap(&b);
@@ -22355,7 +23593,7 @@ class AggregateFunction_ReferenceRel final :
                &_AggregateFunction_ReferenceRel_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    106;
+    111;
 
   friend void swap(AggregateFunction_ReferenceRel& a, AggregateFunction_ReferenceRel& b) {
     a.Swap(&b);
@@ -22501,7 +23739,7 @@ class AggregateFunction final :
                &_AggregateFunction_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    107;
+    112;
 
   friend void swap(AggregateFunction& a, AggregateFunction& b) {
     a.Swap(&b);
@@ -27820,6 +29058,826 @@ inline void AggregateRel::set_allocated_advanced_extension(::substrait::extensio
 
 // -------------------------------------------------------------------
 
+// ConsistentPartitionWindowRel_WindowRelFunction
+
+// uint32 function_reference = 1;
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_function_reference() {
+  function_reference_ = 0u;
+}
+inline uint32_t ConsistentPartitionWindowRel_WindowRelFunction::_internal_function_reference() const {
+  return function_reference_;
+}
+inline uint32_t ConsistentPartitionWindowRel_WindowRelFunction::function_reference() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.function_reference)
+  return _internal_function_reference();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::_internal_set_function_reference(uint32_t value) {
+  
+  function_reference_ = value;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_function_reference(uint32_t value) {
+  _internal_set_function_reference(value);
+  // @@protoc_insertion_point(field_set:substrait.ConsistentPartitionWindowRel.WindowRelFunction.function_reference)
+}
+
+// repeated .substrait.FunctionArgument arguments = 9;
+inline int ConsistentPartitionWindowRel_WindowRelFunction::_internal_arguments_size() const {
+  return arguments_.size();
+}
+inline int ConsistentPartitionWindowRel_WindowRelFunction::arguments_size() const {
+  return _internal_arguments_size();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_arguments() {
+  arguments_.Clear();
+}
+inline ::substrait::FunctionArgument* ConsistentPartitionWindowRel_WindowRelFunction::mutable_arguments(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.WindowRelFunction.arguments)
+  return arguments_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionArgument >*
+ConsistentPartitionWindowRel_WindowRelFunction::mutable_arguments() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ConsistentPartitionWindowRel.WindowRelFunction.arguments)
+  return &arguments_;
+}
+inline const ::substrait::FunctionArgument& ConsistentPartitionWindowRel_WindowRelFunction::_internal_arguments(int index) const {
+  return arguments_.Get(index);
+}
+inline const ::substrait::FunctionArgument& ConsistentPartitionWindowRel_WindowRelFunction::arguments(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.arguments)
+  return _internal_arguments(index);
+}
+inline ::substrait::FunctionArgument* ConsistentPartitionWindowRel_WindowRelFunction::_internal_add_arguments() {
+  return arguments_.Add();
+}
+inline ::substrait::FunctionArgument* ConsistentPartitionWindowRel_WindowRelFunction::add_arguments() {
+  ::substrait::FunctionArgument* _add = _internal_add_arguments();
+  // @@protoc_insertion_point(field_add:substrait.ConsistentPartitionWindowRel.WindowRelFunction.arguments)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionArgument >&
+ConsistentPartitionWindowRel_WindowRelFunction::arguments() const {
+  // @@protoc_insertion_point(field_list:substrait.ConsistentPartitionWindowRel.WindowRelFunction.arguments)
+  return arguments_;
+}
+
+// repeated .substrait.FunctionOption options = 11;
+inline int ConsistentPartitionWindowRel_WindowRelFunction::_internal_options_size() const {
+  return options_.size();
+}
+inline int ConsistentPartitionWindowRel_WindowRelFunction::options_size() const {
+  return _internal_options_size();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_options() {
+  options_.Clear();
+}
+inline ::substrait::FunctionOption* ConsistentPartitionWindowRel_WindowRelFunction::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.WindowRelFunction.options)
+  return options_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionOption >*
+ConsistentPartitionWindowRel_WindowRelFunction::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ConsistentPartitionWindowRel.WindowRelFunction.options)
+  return &options_;
+}
+inline const ::substrait::FunctionOption& ConsistentPartitionWindowRel_WindowRelFunction::_internal_options(int index) const {
+  return options_.Get(index);
+}
+inline const ::substrait::FunctionOption& ConsistentPartitionWindowRel_WindowRelFunction::options(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.options)
+  return _internal_options(index);
+}
+inline ::substrait::FunctionOption* ConsistentPartitionWindowRel_WindowRelFunction::_internal_add_options() {
+  return options_.Add();
+}
+inline ::substrait::FunctionOption* ConsistentPartitionWindowRel_WindowRelFunction::add_options() {
+  ::substrait::FunctionOption* _add = _internal_add_options();
+  // @@protoc_insertion_point(field_add:substrait.ConsistentPartitionWindowRel.WindowRelFunction.options)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::FunctionOption >&
+ConsistentPartitionWindowRel_WindowRelFunction::options() const {
+  // @@protoc_insertion_point(field_list:substrait.ConsistentPartitionWindowRel.WindowRelFunction.options)
+  return options_;
+}
+
+// .substrait.Type output_type = 7;
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::_internal_has_output_type() const {
+  return this != internal_default_instance() && output_type_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::has_output_type() const {
+  return _internal_has_output_type();
+}
+inline const ::substrait::Type& ConsistentPartitionWindowRel_WindowRelFunction::_internal_output_type() const {
+  const ::substrait::Type* p = output_type_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::Type&>(
+      ::substrait::_Type_default_instance_);
+}
+inline const ::substrait::Type& ConsistentPartitionWindowRel_WindowRelFunction::output_type() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.output_type)
+  return _internal_output_type();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_set_allocated_output_type(
+    ::substrait::Type* output_type) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(output_type_);
+  }
+  output_type_ = output_type;
+  if (output_type) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.output_type)
+}
+inline ::substrait::Type* ConsistentPartitionWindowRel_WindowRelFunction::release_output_type() {
+  
+  ::substrait::Type* temp = output_type_;
+  output_type_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::Type* ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_release_output_type() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.WindowRelFunction.output_type)
+  
+  ::substrait::Type* temp = output_type_;
+  output_type_ = nullptr;
+  return temp;
+}
+inline ::substrait::Type* ConsistentPartitionWindowRel_WindowRelFunction::_internal_mutable_output_type() {
+  
+  if (output_type_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::Type>(GetArenaForAllocation());
+    output_type_ = p;
+  }
+  return output_type_;
+}
+inline ::substrait::Type* ConsistentPartitionWindowRel_WindowRelFunction::mutable_output_type() {
+  ::substrait::Type* _msg = _internal_mutable_output_type();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.WindowRelFunction.output_type)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_allocated_output_type(::substrait::Type* output_type) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::PROTOBUF_NAMESPACE_ID::MessageLite*>(output_type_);
+  }
+  if (output_type) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<
+            ::PROTOBUF_NAMESPACE_ID::MessageLite>::GetOwningArena(
+                reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(output_type));
+    if (message_arena != submessage_arena) {
+      output_type = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, output_type, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  output_type_ = output_type;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.output_type)
+}
+
+// .substrait.AggregationPhase phase = 6;
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_phase() {
+  phase_ = 0;
+}
+inline ::substrait::AggregationPhase ConsistentPartitionWindowRel_WindowRelFunction::_internal_phase() const {
+  return static_cast< ::substrait::AggregationPhase >(phase_);
+}
+inline ::substrait::AggregationPhase ConsistentPartitionWindowRel_WindowRelFunction::phase() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.phase)
+  return _internal_phase();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::_internal_set_phase(::substrait::AggregationPhase value) {
+  
+  phase_ = value;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_phase(::substrait::AggregationPhase value) {
+  _internal_set_phase(value);
+  // @@protoc_insertion_point(field_set:substrait.ConsistentPartitionWindowRel.WindowRelFunction.phase)
+}
+
+// .substrait.AggregateFunction.AggregationInvocation invocation = 10;
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_invocation() {
+  invocation_ = 0;
+}
+inline ::substrait::AggregateFunction_AggregationInvocation ConsistentPartitionWindowRel_WindowRelFunction::_internal_invocation() const {
+  return static_cast< ::substrait::AggregateFunction_AggregationInvocation >(invocation_);
+}
+inline ::substrait::AggregateFunction_AggregationInvocation ConsistentPartitionWindowRel_WindowRelFunction::invocation() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.invocation)
+  return _internal_invocation();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::_internal_set_invocation(::substrait::AggregateFunction_AggregationInvocation value) {
+  
+  invocation_ = value;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_invocation(::substrait::AggregateFunction_AggregationInvocation value) {
+  _internal_set_invocation(value);
+  // @@protoc_insertion_point(field_set:substrait.ConsistentPartitionWindowRel.WindowRelFunction.invocation)
+}
+
+// .substrait.Expression.WindowFunction.Bound lower_bound = 5;
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::_internal_has_lower_bound() const {
+  return this != internal_default_instance() && lower_bound_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::has_lower_bound() const {
+  return _internal_has_lower_bound();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_lower_bound() {
+  if (GetArenaForAllocation() == nullptr && lower_bound_ != nullptr) {
+    delete lower_bound_;
+  }
+  lower_bound_ = nullptr;
+}
+inline const ::substrait::Expression_WindowFunction_Bound& ConsistentPartitionWindowRel_WindowRelFunction::_internal_lower_bound() const {
+  const ::substrait::Expression_WindowFunction_Bound* p = lower_bound_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::Expression_WindowFunction_Bound&>(
+      ::substrait::_Expression_WindowFunction_Bound_default_instance_);
+}
+inline const ::substrait::Expression_WindowFunction_Bound& ConsistentPartitionWindowRel_WindowRelFunction::lower_bound() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.lower_bound)
+  return _internal_lower_bound();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_set_allocated_lower_bound(
+    ::substrait::Expression_WindowFunction_Bound* lower_bound) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(lower_bound_);
+  }
+  lower_bound_ = lower_bound;
+  if (lower_bound) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.lower_bound)
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::release_lower_bound() {
+  
+  ::substrait::Expression_WindowFunction_Bound* temp = lower_bound_;
+  lower_bound_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_release_lower_bound() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.WindowRelFunction.lower_bound)
+  
+  ::substrait::Expression_WindowFunction_Bound* temp = lower_bound_;
+  lower_bound_ = nullptr;
+  return temp;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::_internal_mutable_lower_bound() {
+  
+  if (lower_bound_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::Expression_WindowFunction_Bound>(GetArenaForAllocation());
+    lower_bound_ = p;
+  }
+  return lower_bound_;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::mutable_lower_bound() {
+  ::substrait::Expression_WindowFunction_Bound* _msg = _internal_mutable_lower_bound();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.WindowRelFunction.lower_bound)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_allocated_lower_bound(::substrait::Expression_WindowFunction_Bound* lower_bound) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete lower_bound_;
+  }
+  if (lower_bound) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::Expression_WindowFunction_Bound>::GetOwningArena(lower_bound);
+    if (message_arena != submessage_arena) {
+      lower_bound = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, lower_bound, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  lower_bound_ = lower_bound;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.lower_bound)
+}
+
+// .substrait.Expression.WindowFunction.Bound upper_bound = 4;
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::_internal_has_upper_bound() const {
+  return this != internal_default_instance() && upper_bound_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel_WindowRelFunction::has_upper_bound() const {
+  return _internal_has_upper_bound();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_upper_bound() {
+  if (GetArenaForAllocation() == nullptr && upper_bound_ != nullptr) {
+    delete upper_bound_;
+  }
+  upper_bound_ = nullptr;
+}
+inline const ::substrait::Expression_WindowFunction_Bound& ConsistentPartitionWindowRel_WindowRelFunction::_internal_upper_bound() const {
+  const ::substrait::Expression_WindowFunction_Bound* p = upper_bound_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::Expression_WindowFunction_Bound&>(
+      ::substrait::_Expression_WindowFunction_Bound_default_instance_);
+}
+inline const ::substrait::Expression_WindowFunction_Bound& ConsistentPartitionWindowRel_WindowRelFunction::upper_bound() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.upper_bound)
+  return _internal_upper_bound();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_set_allocated_upper_bound(
+    ::substrait::Expression_WindowFunction_Bound* upper_bound) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(upper_bound_);
+  }
+  upper_bound_ = upper_bound;
+  if (upper_bound) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.upper_bound)
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::release_upper_bound() {
+  
+  ::substrait::Expression_WindowFunction_Bound* temp = upper_bound_;
+  upper_bound_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::unsafe_arena_release_upper_bound() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.WindowRelFunction.upper_bound)
+  
+  ::substrait::Expression_WindowFunction_Bound* temp = upper_bound_;
+  upper_bound_ = nullptr;
+  return temp;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::_internal_mutable_upper_bound() {
+  
+  if (upper_bound_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::Expression_WindowFunction_Bound>(GetArenaForAllocation());
+    upper_bound_ = p;
+  }
+  return upper_bound_;
+}
+inline ::substrait::Expression_WindowFunction_Bound* ConsistentPartitionWindowRel_WindowRelFunction::mutable_upper_bound() {
+  ::substrait::Expression_WindowFunction_Bound* _msg = _internal_mutable_upper_bound();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.WindowRelFunction.upper_bound)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_allocated_upper_bound(::substrait::Expression_WindowFunction_Bound* upper_bound) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete upper_bound_;
+  }
+  if (upper_bound) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::Expression_WindowFunction_Bound>::GetOwningArena(upper_bound);
+    if (message_arena != submessage_arena) {
+      upper_bound = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, upper_bound, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  upper_bound_ = upper_bound;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.WindowRelFunction.upper_bound)
+}
+
+// .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+inline void ConsistentPartitionWindowRel_WindowRelFunction::clear_bounds_type() {
+  bounds_type_ = 0;
+}
+inline ::substrait::Expression_WindowFunction_BoundsType ConsistentPartitionWindowRel_WindowRelFunction::_internal_bounds_type() const {
+  return static_cast< ::substrait::Expression_WindowFunction_BoundsType >(bounds_type_);
+}
+inline ::substrait::Expression_WindowFunction_BoundsType ConsistentPartitionWindowRel_WindowRelFunction::bounds_type() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.WindowRelFunction.bounds_type)
+  return _internal_bounds_type();
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::_internal_set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value) {
+  
+  bounds_type_ = value;
+}
+inline void ConsistentPartitionWindowRel_WindowRelFunction::set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value) {
+  _internal_set_bounds_type(value);
+  // @@protoc_insertion_point(field_set:substrait.ConsistentPartitionWindowRel.WindowRelFunction.bounds_type)
+}
+
+// -------------------------------------------------------------------
+
+// ConsistentPartitionWindowRel
+
+// .substrait.RelCommon common = 1;
+inline bool ConsistentPartitionWindowRel::_internal_has_common() const {
+  return this != internal_default_instance() && common_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel::has_common() const {
+  return _internal_has_common();
+}
+inline void ConsistentPartitionWindowRel::clear_common() {
+  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
+    delete common_;
+  }
+  common_ = nullptr;
+}
+inline const ::substrait::RelCommon& ConsistentPartitionWindowRel::_internal_common() const {
+  const ::substrait::RelCommon* p = common_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::RelCommon&>(
+      ::substrait::_RelCommon_default_instance_);
+}
+inline const ::substrait::RelCommon& ConsistentPartitionWindowRel::common() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.common)
+  return _internal_common();
+}
+inline void ConsistentPartitionWindowRel::unsafe_arena_set_allocated_common(
+    ::substrait::RelCommon* common) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(common_);
+  }
+  common_ = common;
+  if (common) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.common)
+}
+inline ::substrait::RelCommon* ConsistentPartitionWindowRel::release_common() {
+  
+  ::substrait::RelCommon* temp = common_;
+  common_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::RelCommon* ConsistentPartitionWindowRel::unsafe_arena_release_common() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.common)
+  
+  ::substrait::RelCommon* temp = common_;
+  common_ = nullptr;
+  return temp;
+}
+inline ::substrait::RelCommon* ConsistentPartitionWindowRel::_internal_mutable_common() {
+  
+  if (common_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::RelCommon>(GetArenaForAllocation());
+    common_ = p;
+  }
+  return common_;
+}
+inline ::substrait::RelCommon* ConsistentPartitionWindowRel::mutable_common() {
+  ::substrait::RelCommon* _msg = _internal_mutable_common();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.common)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel::set_allocated_common(::substrait::RelCommon* common) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete common_;
+  }
+  if (common) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::RelCommon>::GetOwningArena(common);
+    if (message_arena != submessage_arena) {
+      common = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, common, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  common_ = common;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.common)
+}
+
+// .substrait.Rel input = 2;
+inline bool ConsistentPartitionWindowRel::_internal_has_input() const {
+  return this != internal_default_instance() && input_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel::has_input() const {
+  return _internal_has_input();
+}
+inline void ConsistentPartitionWindowRel::clear_input() {
+  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
+    delete input_;
+  }
+  input_ = nullptr;
+}
+inline const ::substrait::Rel& ConsistentPartitionWindowRel::_internal_input() const {
+  const ::substrait::Rel* p = input_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::Rel&>(
+      ::substrait::_Rel_default_instance_);
+}
+inline const ::substrait::Rel& ConsistentPartitionWindowRel::input() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.input)
+  return _internal_input();
+}
+inline void ConsistentPartitionWindowRel::unsafe_arena_set_allocated_input(
+    ::substrait::Rel* input) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(input_);
+  }
+  input_ = input;
+  if (input) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.input)
+}
+inline ::substrait::Rel* ConsistentPartitionWindowRel::release_input() {
+  
+  ::substrait::Rel* temp = input_;
+  input_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::Rel* ConsistentPartitionWindowRel::unsafe_arena_release_input() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.input)
+  
+  ::substrait::Rel* temp = input_;
+  input_ = nullptr;
+  return temp;
+}
+inline ::substrait::Rel* ConsistentPartitionWindowRel::_internal_mutable_input() {
+  
+  if (input_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::Rel>(GetArenaForAllocation());
+    input_ = p;
+  }
+  return input_;
+}
+inline ::substrait::Rel* ConsistentPartitionWindowRel::mutable_input() {
+  ::substrait::Rel* _msg = _internal_mutable_input();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.input)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel::set_allocated_input(::substrait::Rel* input) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete input_;
+  }
+  if (input) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::Rel>::GetOwningArena(input);
+    if (message_arena != submessage_arena) {
+      input = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, input, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  input_ = input;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.input)
+}
+
+// repeated .substrait.ConsistentPartitionWindowRel.WindowRelFunction window_functions = 3;
+inline int ConsistentPartitionWindowRel::_internal_window_functions_size() const {
+  return window_functions_.size();
+}
+inline int ConsistentPartitionWindowRel::window_functions_size() const {
+  return _internal_window_functions_size();
+}
+inline void ConsistentPartitionWindowRel::clear_window_functions() {
+  window_functions_.Clear();
+}
+inline ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* ConsistentPartitionWindowRel::mutable_window_functions(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.window_functions)
+  return window_functions_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >*
+ConsistentPartitionWindowRel::mutable_window_functions() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ConsistentPartitionWindowRel.window_functions)
+  return &window_functions_;
+}
+inline const ::substrait::ConsistentPartitionWindowRel_WindowRelFunction& ConsistentPartitionWindowRel::_internal_window_functions(int index) const {
+  return window_functions_.Get(index);
+}
+inline const ::substrait::ConsistentPartitionWindowRel_WindowRelFunction& ConsistentPartitionWindowRel::window_functions(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.window_functions)
+  return _internal_window_functions(index);
+}
+inline ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* ConsistentPartitionWindowRel::_internal_add_window_functions() {
+  return window_functions_.Add();
+}
+inline ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* ConsistentPartitionWindowRel::add_window_functions() {
+  ::substrait::ConsistentPartitionWindowRel_WindowRelFunction* _add = _internal_add_window_functions();
+  // @@protoc_insertion_point(field_add:substrait.ConsistentPartitionWindowRel.window_functions)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ConsistentPartitionWindowRel_WindowRelFunction >&
+ConsistentPartitionWindowRel::window_functions() const {
+  // @@protoc_insertion_point(field_list:substrait.ConsistentPartitionWindowRel.window_functions)
+  return window_functions_;
+}
+
+// repeated .substrait.Expression partition_expressions = 4;
+inline int ConsistentPartitionWindowRel::_internal_partition_expressions_size() const {
+  return partition_expressions_.size();
+}
+inline int ConsistentPartitionWindowRel::partition_expressions_size() const {
+  return _internal_partition_expressions_size();
+}
+inline void ConsistentPartitionWindowRel::clear_partition_expressions() {
+  partition_expressions_.Clear();
+}
+inline ::substrait::Expression* ConsistentPartitionWindowRel::mutable_partition_expressions(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.partition_expressions)
+  return partition_expressions_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >*
+ConsistentPartitionWindowRel::mutable_partition_expressions() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ConsistentPartitionWindowRel.partition_expressions)
+  return &partition_expressions_;
+}
+inline const ::substrait::Expression& ConsistentPartitionWindowRel::_internal_partition_expressions(int index) const {
+  return partition_expressions_.Get(index);
+}
+inline const ::substrait::Expression& ConsistentPartitionWindowRel::partition_expressions(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.partition_expressions)
+  return _internal_partition_expressions(index);
+}
+inline ::substrait::Expression* ConsistentPartitionWindowRel::_internal_add_partition_expressions() {
+  return partition_expressions_.Add();
+}
+inline ::substrait::Expression* ConsistentPartitionWindowRel::add_partition_expressions() {
+  ::substrait::Expression* _add = _internal_add_partition_expressions();
+  // @@protoc_insertion_point(field_add:substrait.ConsistentPartitionWindowRel.partition_expressions)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >&
+ConsistentPartitionWindowRel::partition_expressions() const {
+  // @@protoc_insertion_point(field_list:substrait.ConsistentPartitionWindowRel.partition_expressions)
+  return partition_expressions_;
+}
+
+// repeated .substrait.SortField sorts = 5;
+inline int ConsistentPartitionWindowRel::_internal_sorts_size() const {
+  return sorts_.size();
+}
+inline int ConsistentPartitionWindowRel::sorts_size() const {
+  return _internal_sorts_size();
+}
+inline void ConsistentPartitionWindowRel::clear_sorts() {
+  sorts_.Clear();
+}
+inline ::substrait::SortField* ConsistentPartitionWindowRel::mutable_sorts(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.sorts)
+  return sorts_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >*
+ConsistentPartitionWindowRel::mutable_sorts() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ConsistentPartitionWindowRel.sorts)
+  return &sorts_;
+}
+inline const ::substrait::SortField& ConsistentPartitionWindowRel::_internal_sorts(int index) const {
+  return sorts_.Get(index);
+}
+inline const ::substrait::SortField& ConsistentPartitionWindowRel::sorts(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.sorts)
+  return _internal_sorts(index);
+}
+inline ::substrait::SortField* ConsistentPartitionWindowRel::_internal_add_sorts() {
+  return sorts_.Add();
+}
+inline ::substrait::SortField* ConsistentPartitionWindowRel::add_sorts() {
+  ::substrait::SortField* _add = _internal_add_sorts();
+  // @@protoc_insertion_point(field_add:substrait.ConsistentPartitionWindowRel.sorts)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::SortField >&
+ConsistentPartitionWindowRel::sorts() const {
+  // @@protoc_insertion_point(field_list:substrait.ConsistentPartitionWindowRel.sorts)
+  return sorts_;
+}
+
+// .substrait.extensions.AdvancedExtension advanced_extension = 10;
+inline bool ConsistentPartitionWindowRel::_internal_has_advanced_extension() const {
+  return this != internal_default_instance() && advanced_extension_ != nullptr;
+}
+inline bool ConsistentPartitionWindowRel::has_advanced_extension() const {
+  return _internal_has_advanced_extension();
+}
+inline const ::substrait::extensions::AdvancedExtension& ConsistentPartitionWindowRel::_internal_advanced_extension() const {
+  const ::substrait::extensions::AdvancedExtension* p = advanced_extension_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::extensions::AdvancedExtension&>(
+      ::substrait::extensions::_AdvancedExtension_default_instance_);
+}
+inline const ::substrait::extensions::AdvancedExtension& ConsistentPartitionWindowRel::advanced_extension() const {
+  // @@protoc_insertion_point(field_get:substrait.ConsistentPartitionWindowRel.advanced_extension)
+  return _internal_advanced_extension();
+}
+inline void ConsistentPartitionWindowRel::unsafe_arena_set_allocated_advanced_extension(
+    ::substrait::extensions::AdvancedExtension* advanced_extension) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(advanced_extension_);
+  }
+  advanced_extension_ = advanced_extension;
+  if (advanced_extension) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ConsistentPartitionWindowRel.advanced_extension)
+}
+inline ::substrait::extensions::AdvancedExtension* ConsistentPartitionWindowRel::release_advanced_extension() {
+  
+  ::substrait::extensions::AdvancedExtension* temp = advanced_extension_;
+  advanced_extension_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::extensions::AdvancedExtension* ConsistentPartitionWindowRel::unsafe_arena_release_advanced_extension() {
+  // @@protoc_insertion_point(field_release:substrait.ConsistentPartitionWindowRel.advanced_extension)
+  
+  ::substrait::extensions::AdvancedExtension* temp = advanced_extension_;
+  advanced_extension_ = nullptr;
+  return temp;
+}
+inline ::substrait::extensions::AdvancedExtension* ConsistentPartitionWindowRel::_internal_mutable_advanced_extension() {
+  
+  if (advanced_extension_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::extensions::AdvancedExtension>(GetArenaForAllocation());
+    advanced_extension_ = p;
+  }
+  return advanced_extension_;
+}
+inline ::substrait::extensions::AdvancedExtension* ConsistentPartitionWindowRel::mutable_advanced_extension() {
+  ::substrait::extensions::AdvancedExtension* _msg = _internal_mutable_advanced_extension();
+  // @@protoc_insertion_point(field_mutable:substrait.ConsistentPartitionWindowRel.advanced_extension)
+  return _msg;
+}
+inline void ConsistentPartitionWindowRel::set_allocated_advanced_extension(::substrait::extensions::AdvancedExtension* advanced_extension) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::PROTOBUF_NAMESPACE_ID::MessageLite*>(advanced_extension_);
+  }
+  if (advanced_extension) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<
+            ::PROTOBUF_NAMESPACE_ID::MessageLite>::GetOwningArena(
+                reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(advanced_extension));
+    if (message_arena != submessage_arena) {
+      advanced_extension = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, advanced_extension, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  advanced_extension_ = advanced_extension;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ConsistentPartitionWindowRel.advanced_extension)
+}
+
+// -------------------------------------------------------------------
+
 // SortRel
 
 // .substrait.RelCommon common = 1;
@@ -30597,6 +32655,435 @@ inline ExchangeRel::ExchangeKindCase ExchangeRel::exchange_kind_case() const {
 }
 // -------------------------------------------------------------------
 
+// ExpandRel_ExpandField
+
+// .substrait.ExpandRel.SwitchingField switching_field = 2;
+inline bool ExpandRel_ExpandField::_internal_has_switching_field() const {
+  return field_type_case() == kSwitchingField;
+}
+inline bool ExpandRel_ExpandField::has_switching_field() const {
+  return _internal_has_switching_field();
+}
+inline void ExpandRel_ExpandField::set_has_switching_field() {
+  _oneof_case_[0] = kSwitchingField;
+}
+inline void ExpandRel_ExpandField::clear_switching_field() {
+  if (_internal_has_switching_field()) {
+    if (GetArenaForAllocation() == nullptr) {
+      delete field_type_.switching_field_;
+    }
+    clear_has_field_type();
+  }
+}
+inline ::substrait::ExpandRel_SwitchingField* ExpandRel_ExpandField::release_switching_field() {
+  // @@protoc_insertion_point(field_release:substrait.ExpandRel.ExpandField.switching_field)
+  if (_internal_has_switching_field()) {
+    clear_has_field_type();
+      ::substrait::ExpandRel_SwitchingField* temp = field_type_.switching_field_;
+    if (GetArenaForAllocation() != nullptr) {
+      temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+    }
+    field_type_.switching_field_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::substrait::ExpandRel_SwitchingField& ExpandRel_ExpandField::_internal_switching_field() const {
+  return _internal_has_switching_field()
+      ? *field_type_.switching_field_
+      : reinterpret_cast< ::substrait::ExpandRel_SwitchingField&>(::substrait::_ExpandRel_SwitchingField_default_instance_);
+}
+inline const ::substrait::ExpandRel_SwitchingField& ExpandRel_ExpandField::switching_field() const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.ExpandField.switching_field)
+  return _internal_switching_field();
+}
+inline ::substrait::ExpandRel_SwitchingField* ExpandRel_ExpandField::unsafe_arena_release_switching_field() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:substrait.ExpandRel.ExpandField.switching_field)
+  if (_internal_has_switching_field()) {
+    clear_has_field_type();
+    ::substrait::ExpandRel_SwitchingField* temp = field_type_.switching_field_;
+    field_type_.switching_field_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline void ExpandRel_ExpandField::unsafe_arena_set_allocated_switching_field(::substrait::ExpandRel_SwitchingField* switching_field) {
+  clear_field_type();
+  if (switching_field) {
+    set_has_switching_field();
+    field_type_.switching_field_ = switching_field;
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ExpandRel.ExpandField.switching_field)
+}
+inline ::substrait::ExpandRel_SwitchingField* ExpandRel_ExpandField::_internal_mutable_switching_field() {
+  if (!_internal_has_switching_field()) {
+    clear_field_type();
+    set_has_switching_field();
+    field_type_.switching_field_ = CreateMaybeMessage< ::substrait::ExpandRel_SwitchingField >(GetArenaForAllocation());
+  }
+  return field_type_.switching_field_;
+}
+inline ::substrait::ExpandRel_SwitchingField* ExpandRel_ExpandField::mutable_switching_field() {
+  ::substrait::ExpandRel_SwitchingField* _msg = _internal_mutable_switching_field();
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.ExpandField.switching_field)
+  return _msg;
+}
+
+// .substrait.Expression consistent_field = 3;
+inline bool ExpandRel_ExpandField::_internal_has_consistent_field() const {
+  return field_type_case() == kConsistentField;
+}
+inline bool ExpandRel_ExpandField::has_consistent_field() const {
+  return _internal_has_consistent_field();
+}
+inline void ExpandRel_ExpandField::set_has_consistent_field() {
+  _oneof_case_[0] = kConsistentField;
+}
+inline void ExpandRel_ExpandField::clear_consistent_field() {
+  if (_internal_has_consistent_field()) {
+    if (GetArenaForAllocation() == nullptr) {
+      delete field_type_.consistent_field_;
+    }
+    clear_has_field_type();
+  }
+}
+inline ::substrait::Expression* ExpandRel_ExpandField::release_consistent_field() {
+  // @@protoc_insertion_point(field_release:substrait.ExpandRel.ExpandField.consistent_field)
+  if (_internal_has_consistent_field()) {
+    clear_has_field_type();
+      ::substrait::Expression* temp = field_type_.consistent_field_;
+    if (GetArenaForAllocation() != nullptr) {
+      temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+    }
+    field_type_.consistent_field_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::substrait::Expression& ExpandRel_ExpandField::_internal_consistent_field() const {
+  return _internal_has_consistent_field()
+      ? *field_type_.consistent_field_
+      : reinterpret_cast< ::substrait::Expression&>(::substrait::_Expression_default_instance_);
+}
+inline const ::substrait::Expression& ExpandRel_ExpandField::consistent_field() const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.ExpandField.consistent_field)
+  return _internal_consistent_field();
+}
+inline ::substrait::Expression* ExpandRel_ExpandField::unsafe_arena_release_consistent_field() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:substrait.ExpandRel.ExpandField.consistent_field)
+  if (_internal_has_consistent_field()) {
+    clear_has_field_type();
+    ::substrait::Expression* temp = field_type_.consistent_field_;
+    field_type_.consistent_field_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline void ExpandRel_ExpandField::unsafe_arena_set_allocated_consistent_field(::substrait::Expression* consistent_field) {
+  clear_field_type();
+  if (consistent_field) {
+    set_has_consistent_field();
+    field_type_.consistent_field_ = consistent_field;
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ExpandRel.ExpandField.consistent_field)
+}
+inline ::substrait::Expression* ExpandRel_ExpandField::_internal_mutable_consistent_field() {
+  if (!_internal_has_consistent_field()) {
+    clear_field_type();
+    set_has_consistent_field();
+    field_type_.consistent_field_ = CreateMaybeMessage< ::substrait::Expression >(GetArenaForAllocation());
+  }
+  return field_type_.consistent_field_;
+}
+inline ::substrait::Expression* ExpandRel_ExpandField::mutable_consistent_field() {
+  ::substrait::Expression* _msg = _internal_mutable_consistent_field();
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.ExpandField.consistent_field)
+  return _msg;
+}
+
+inline bool ExpandRel_ExpandField::has_field_type() const {
+  return field_type_case() != FIELD_TYPE_NOT_SET;
+}
+inline void ExpandRel_ExpandField::clear_has_field_type() {
+  _oneof_case_[0] = FIELD_TYPE_NOT_SET;
+}
+inline ExpandRel_ExpandField::FieldTypeCase ExpandRel_ExpandField::field_type_case() const {
+  return ExpandRel_ExpandField::FieldTypeCase(_oneof_case_[0]);
+}
+// -------------------------------------------------------------------
+
+// ExpandRel_SwitchingField
+
+// repeated .substrait.Expression duplicates = 1;
+inline int ExpandRel_SwitchingField::_internal_duplicates_size() const {
+  return duplicates_.size();
+}
+inline int ExpandRel_SwitchingField::duplicates_size() const {
+  return _internal_duplicates_size();
+}
+inline void ExpandRel_SwitchingField::clear_duplicates() {
+  duplicates_.Clear();
+}
+inline ::substrait::Expression* ExpandRel_SwitchingField::mutable_duplicates(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.SwitchingField.duplicates)
+  return duplicates_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >*
+ExpandRel_SwitchingField::mutable_duplicates() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ExpandRel.SwitchingField.duplicates)
+  return &duplicates_;
+}
+inline const ::substrait::Expression& ExpandRel_SwitchingField::_internal_duplicates(int index) const {
+  return duplicates_.Get(index);
+}
+inline const ::substrait::Expression& ExpandRel_SwitchingField::duplicates(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.SwitchingField.duplicates)
+  return _internal_duplicates(index);
+}
+inline ::substrait::Expression* ExpandRel_SwitchingField::_internal_add_duplicates() {
+  return duplicates_.Add();
+}
+inline ::substrait::Expression* ExpandRel_SwitchingField::add_duplicates() {
+  ::substrait::Expression* _add = _internal_add_duplicates();
+  // @@protoc_insertion_point(field_add:substrait.ExpandRel.SwitchingField.duplicates)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::Expression >&
+ExpandRel_SwitchingField::duplicates() const {
+  // @@protoc_insertion_point(field_list:substrait.ExpandRel.SwitchingField.duplicates)
+  return duplicates_;
+}
+
+// -------------------------------------------------------------------
+
+// ExpandRel
+
+// .substrait.RelCommon common = 1;
+inline bool ExpandRel::_internal_has_common() const {
+  return this != internal_default_instance() && common_ != nullptr;
+}
+inline bool ExpandRel::has_common() const {
+  return _internal_has_common();
+}
+inline void ExpandRel::clear_common() {
+  if (GetArenaForAllocation() == nullptr && common_ != nullptr) {
+    delete common_;
+  }
+  common_ = nullptr;
+}
+inline const ::substrait::RelCommon& ExpandRel::_internal_common() const {
+  const ::substrait::RelCommon* p = common_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::RelCommon&>(
+      ::substrait::_RelCommon_default_instance_);
+}
+inline const ::substrait::RelCommon& ExpandRel::common() const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.common)
+  return _internal_common();
+}
+inline void ExpandRel::unsafe_arena_set_allocated_common(
+    ::substrait::RelCommon* common) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(common_);
+  }
+  common_ = common;
+  if (common) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ExpandRel.common)
+}
+inline ::substrait::RelCommon* ExpandRel::release_common() {
+  
+  ::substrait::RelCommon* temp = common_;
+  common_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::RelCommon* ExpandRel::unsafe_arena_release_common() {
+  // @@protoc_insertion_point(field_release:substrait.ExpandRel.common)
+  
+  ::substrait::RelCommon* temp = common_;
+  common_ = nullptr;
+  return temp;
+}
+inline ::substrait::RelCommon* ExpandRel::_internal_mutable_common() {
+  
+  if (common_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::RelCommon>(GetArenaForAllocation());
+    common_ = p;
+  }
+  return common_;
+}
+inline ::substrait::RelCommon* ExpandRel::mutable_common() {
+  ::substrait::RelCommon* _msg = _internal_mutable_common();
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.common)
+  return _msg;
+}
+inline void ExpandRel::set_allocated_common(::substrait::RelCommon* common) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete common_;
+  }
+  if (common) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::RelCommon>::GetOwningArena(common);
+    if (message_arena != submessage_arena) {
+      common = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, common, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  common_ = common;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ExpandRel.common)
+}
+
+// .substrait.Rel input = 2;
+inline bool ExpandRel::_internal_has_input() const {
+  return this != internal_default_instance() && input_ != nullptr;
+}
+inline bool ExpandRel::has_input() const {
+  return _internal_has_input();
+}
+inline void ExpandRel::clear_input() {
+  if (GetArenaForAllocation() == nullptr && input_ != nullptr) {
+    delete input_;
+  }
+  input_ = nullptr;
+}
+inline const ::substrait::Rel& ExpandRel::_internal_input() const {
+  const ::substrait::Rel* p = input_;
+  return p != nullptr ? *p : reinterpret_cast<const ::substrait::Rel&>(
+      ::substrait::_Rel_default_instance_);
+}
+inline const ::substrait::Rel& ExpandRel::input() const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.input)
+  return _internal_input();
+}
+inline void ExpandRel::unsafe_arena_set_allocated_input(
+    ::substrait::Rel* input) {
+  if (GetArenaForAllocation() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(input_);
+  }
+  input_ = input;
+  if (input) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.ExpandRel.input)
+}
+inline ::substrait::Rel* ExpandRel::release_input() {
+  
+  ::substrait::Rel* temp = input_;
+  input_ = nullptr;
+#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
+  auto* old =  reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp);
+  temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  if (GetArenaForAllocation() == nullptr) { delete old; }
+#else  // PROTOBUF_FORCE_COPY_IN_RELEASE
+  if (GetArenaForAllocation() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+#endif  // !PROTOBUF_FORCE_COPY_IN_RELEASE
+  return temp;
+}
+inline ::substrait::Rel* ExpandRel::unsafe_arena_release_input() {
+  // @@protoc_insertion_point(field_release:substrait.ExpandRel.input)
+  
+  ::substrait::Rel* temp = input_;
+  input_ = nullptr;
+  return temp;
+}
+inline ::substrait::Rel* ExpandRel::_internal_mutable_input() {
+  
+  if (input_ == nullptr) {
+    auto* p = CreateMaybeMessage<::substrait::Rel>(GetArenaForAllocation());
+    input_ = p;
+  }
+  return input_;
+}
+inline ::substrait::Rel* ExpandRel::mutable_input() {
+  ::substrait::Rel* _msg = _internal_mutable_input();
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.input)
+  return _msg;
+}
+inline void ExpandRel::set_allocated_input(::substrait::Rel* input) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation();
+  if (message_arena == nullptr) {
+    delete input_;
+  }
+  if (input) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+        ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper<::substrait::Rel>::GetOwningArena(input);
+    if (message_arena != submessage_arena) {
+      input = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, input, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  input_ = input;
+  // @@protoc_insertion_point(field_set_allocated:substrait.ExpandRel.input)
+}
+
+// repeated .substrait.ExpandRel.ExpandField fields = 4;
+inline int ExpandRel::_internal_fields_size() const {
+  return fields_.size();
+}
+inline int ExpandRel::fields_size() const {
+  return _internal_fields_size();
+}
+inline void ExpandRel::clear_fields() {
+  fields_.Clear();
+}
+inline ::substrait::ExpandRel_ExpandField* ExpandRel::mutable_fields(int index) {
+  // @@protoc_insertion_point(field_mutable:substrait.ExpandRel.fields)
+  return fields_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ExpandRel_ExpandField >*
+ExpandRel::mutable_fields() {
+  // @@protoc_insertion_point(field_mutable_list:substrait.ExpandRel.fields)
+  return &fields_;
+}
+inline const ::substrait::ExpandRel_ExpandField& ExpandRel::_internal_fields(int index) const {
+  return fields_.Get(index);
+}
+inline const ::substrait::ExpandRel_ExpandField& ExpandRel::fields(int index) const {
+  // @@protoc_insertion_point(field_get:substrait.ExpandRel.fields)
+  return _internal_fields(index);
+}
+inline ::substrait::ExpandRel_ExpandField* ExpandRel::_internal_add_fields() {
+  return fields_.Add();
+}
+inline ::substrait::ExpandRel_ExpandField* ExpandRel::add_fields() {
+  ::substrait::ExpandRel_ExpandField* _add = _internal_add_fields();
+  // @@protoc_insertion_point(field_add:substrait.ExpandRel.fields)
+  return _add;
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::substrait::ExpandRel_ExpandField >&
+ExpandRel::fields() const {
+  // @@protoc_insertion_point(field_list:substrait.ExpandRel.fields)
+  return fields_;
+}
+
+// -------------------------------------------------------------------
+
 // RelRoot
 
 // .substrait.Rel input = 1;
@@ -31804,6 +34291,228 @@ inline ::substrait::MergeJoinRel* Rel::mutable_merge_join() {
   return _msg;
 }
 
+// .substrait.ConsistentPartitionWindowRel window = 17;
+inline bool Rel::_internal_has_window() const {
+  return rel_type_case() == kWindow;
+}
+inline bool Rel::has_window() const {
+  return _internal_has_window();
+}
+inline void Rel::set_has_window() {
+  _oneof_case_[0] = kWindow;
+}
+inline void Rel::clear_window() {
+  if (_internal_has_window()) {
+    if (GetArenaForAllocation() == nullptr) {
+      delete rel_type_.window_;
+    }
+    clear_has_rel_type();
+  }
+}
+inline ::substrait::ConsistentPartitionWindowRel* Rel::release_window() {
+  // @@protoc_insertion_point(field_release:substrait.Rel.window)
+  if (_internal_has_window()) {
+    clear_has_rel_type();
+      ::substrait::ConsistentPartitionWindowRel* temp = rel_type_.window_;
+    if (GetArenaForAllocation() != nullptr) {
+      temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+    }
+    rel_type_.window_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::substrait::ConsistentPartitionWindowRel& Rel::_internal_window() const {
+  return _internal_has_window()
+      ? *rel_type_.window_
+      : reinterpret_cast< ::substrait::ConsistentPartitionWindowRel&>(::substrait::_ConsistentPartitionWindowRel_default_instance_);
+}
+inline const ::substrait::ConsistentPartitionWindowRel& Rel::window() const {
+  // @@protoc_insertion_point(field_get:substrait.Rel.window)
+  return _internal_window();
+}
+inline ::substrait::ConsistentPartitionWindowRel* Rel::unsafe_arena_release_window() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:substrait.Rel.window)
+  if (_internal_has_window()) {
+    clear_has_rel_type();
+    ::substrait::ConsistentPartitionWindowRel* temp = rel_type_.window_;
+    rel_type_.window_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline void Rel::unsafe_arena_set_allocated_window(::substrait::ConsistentPartitionWindowRel* window) {
+  clear_rel_type();
+  if (window) {
+    set_has_window();
+    rel_type_.window_ = window;
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.Rel.window)
+}
+inline ::substrait::ConsistentPartitionWindowRel* Rel::_internal_mutable_window() {
+  if (!_internal_has_window()) {
+    clear_rel_type();
+    set_has_window();
+    rel_type_.window_ = CreateMaybeMessage< ::substrait::ConsistentPartitionWindowRel >(GetArenaForAllocation());
+  }
+  return rel_type_.window_;
+}
+inline ::substrait::ConsistentPartitionWindowRel* Rel::mutable_window() {
+  ::substrait::ConsistentPartitionWindowRel* _msg = _internal_mutable_window();
+  // @@protoc_insertion_point(field_mutable:substrait.Rel.window)
+  return _msg;
+}
+
+// .substrait.ExchangeRel exchange = 15;
+inline bool Rel::_internal_has_exchange() const {
+  return rel_type_case() == kExchange;
+}
+inline bool Rel::has_exchange() const {
+  return _internal_has_exchange();
+}
+inline void Rel::set_has_exchange() {
+  _oneof_case_[0] = kExchange;
+}
+inline void Rel::clear_exchange() {
+  if (_internal_has_exchange()) {
+    if (GetArenaForAllocation() == nullptr) {
+      delete rel_type_.exchange_;
+    }
+    clear_has_rel_type();
+  }
+}
+inline ::substrait::ExchangeRel* Rel::release_exchange() {
+  // @@protoc_insertion_point(field_release:substrait.Rel.exchange)
+  if (_internal_has_exchange()) {
+    clear_has_rel_type();
+      ::substrait::ExchangeRel* temp = rel_type_.exchange_;
+    if (GetArenaForAllocation() != nullptr) {
+      temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+    }
+    rel_type_.exchange_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::substrait::ExchangeRel& Rel::_internal_exchange() const {
+  return _internal_has_exchange()
+      ? *rel_type_.exchange_
+      : reinterpret_cast< ::substrait::ExchangeRel&>(::substrait::_ExchangeRel_default_instance_);
+}
+inline const ::substrait::ExchangeRel& Rel::exchange() const {
+  // @@protoc_insertion_point(field_get:substrait.Rel.exchange)
+  return _internal_exchange();
+}
+inline ::substrait::ExchangeRel* Rel::unsafe_arena_release_exchange() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:substrait.Rel.exchange)
+  if (_internal_has_exchange()) {
+    clear_has_rel_type();
+    ::substrait::ExchangeRel* temp = rel_type_.exchange_;
+    rel_type_.exchange_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline void Rel::unsafe_arena_set_allocated_exchange(::substrait::ExchangeRel* exchange) {
+  clear_rel_type();
+  if (exchange) {
+    set_has_exchange();
+    rel_type_.exchange_ = exchange;
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.Rel.exchange)
+}
+inline ::substrait::ExchangeRel* Rel::_internal_mutable_exchange() {
+  if (!_internal_has_exchange()) {
+    clear_rel_type();
+    set_has_exchange();
+    rel_type_.exchange_ = CreateMaybeMessage< ::substrait::ExchangeRel >(GetArenaForAllocation());
+  }
+  return rel_type_.exchange_;
+}
+inline ::substrait::ExchangeRel* Rel::mutable_exchange() {
+  ::substrait::ExchangeRel* _msg = _internal_mutable_exchange();
+  // @@protoc_insertion_point(field_mutable:substrait.Rel.exchange)
+  return _msg;
+}
+
+// .substrait.ExpandRel expand = 16;
+inline bool Rel::_internal_has_expand() const {
+  return rel_type_case() == kExpand;
+}
+inline bool Rel::has_expand() const {
+  return _internal_has_expand();
+}
+inline void Rel::set_has_expand() {
+  _oneof_case_[0] = kExpand;
+}
+inline void Rel::clear_expand() {
+  if (_internal_has_expand()) {
+    if (GetArenaForAllocation() == nullptr) {
+      delete rel_type_.expand_;
+    }
+    clear_has_rel_type();
+  }
+}
+inline ::substrait::ExpandRel* Rel::release_expand() {
+  // @@protoc_insertion_point(field_release:substrait.Rel.expand)
+  if (_internal_has_expand()) {
+    clear_has_rel_type();
+      ::substrait::ExpandRel* temp = rel_type_.expand_;
+    if (GetArenaForAllocation() != nullptr) {
+      temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+    }
+    rel_type_.expand_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::substrait::ExpandRel& Rel::_internal_expand() const {
+  return _internal_has_expand()
+      ? *rel_type_.expand_
+      : reinterpret_cast< ::substrait::ExpandRel&>(::substrait::_ExpandRel_default_instance_);
+}
+inline const ::substrait::ExpandRel& Rel::expand() const {
+  // @@protoc_insertion_point(field_get:substrait.Rel.expand)
+  return _internal_expand();
+}
+inline ::substrait::ExpandRel* Rel::unsafe_arena_release_expand() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:substrait.Rel.expand)
+  if (_internal_has_expand()) {
+    clear_has_rel_type();
+    ::substrait::ExpandRel* temp = rel_type_.expand_;
+    rel_type_.expand_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline void Rel::unsafe_arena_set_allocated_expand(::substrait::ExpandRel* expand) {
+  clear_rel_type();
+  if (expand) {
+    set_has_expand();
+    rel_type_.expand_ = expand;
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:substrait.Rel.expand)
+}
+inline ::substrait::ExpandRel* Rel::_internal_mutable_expand() {
+  if (!_internal_has_expand()) {
+    clear_rel_type();
+    set_has_expand();
+    rel_type_.expand_ = CreateMaybeMessage< ::substrait::ExpandRel >(GetArenaForAllocation());
+  }
+  return rel_type_.expand_;
+}
+inline ::substrait::ExpandRel* Rel::mutable_expand() {
+  ::substrait::ExpandRel* _msg = _internal_mutable_expand();
+  // @@protoc_insertion_point(field_mutable:substrait.Rel.expand)
+  return _msg;
+}
+
 inline bool Rel::has_rel_type() const {
   return rel_type_case() != REL_TYPE_NOT_SET;
 }
@@ -38458,6 +41167,26 @@ Expression_WindowFunction::partitions() const {
   return partitions_;
 }
 
+// .substrait.Expression.WindowFunction.BoundsType bounds_type = 12;
+inline void Expression_WindowFunction::clear_bounds_type() {
+  bounds_type_ = 0;
+}
+inline ::substrait::Expression_WindowFunction_BoundsType Expression_WindowFunction::_internal_bounds_type() const {
+  return static_cast< ::substrait::Expression_WindowFunction_BoundsType >(bounds_type_);
+}
+inline ::substrait::Expression_WindowFunction_BoundsType Expression_WindowFunction::bounds_type() const {
+  // @@protoc_insertion_point(field_get:substrait.Expression.WindowFunction.bounds_type)
+  return _internal_bounds_type();
+}
+inline void Expression_WindowFunction::_internal_set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value) {
+  
+  bounds_type_ = value;
+}
+inline void Expression_WindowFunction::set_bounds_type(::substrait::Expression_WindowFunction_BoundsType value) {
+  _internal_set_bounds_type(value);
+  // @@protoc_insertion_point(field_set:substrait.Expression.WindowFunction.bounds_type)
+}
+
 // .substrait.Expression.WindowFunction.Bound lower_bound = 5;
 inline bool Expression_WindowFunction::_internal_has_lower_bound() const {
   return this != internal_default_instance() && lower_bound_ != nullptr;
@@ -45217,6 +47946,16 @@ AggregateFunction::args() const {
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
@@ -45264,6 +48003,11 @@ template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::substrait::MergeJoinRel_JoinType>() {
   return ::substrait::MergeJoinRel_JoinType_descriptor();
 }
+template <> struct is_proto_enum< ::substrait::Expression_WindowFunction_BoundsType> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::substrait::Expression_WindowFunction_BoundsType>() {
+  return ::substrait::Expression_WindowFunction_BoundsType_descriptor();
+}
 template <> struct is_proto_enum< ::substrait::Expression_Cast_FailureBehavior> : ::std::true_type {};
 template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::substrait::Expression_Cast_FailureBehavior>() {